Compare commits

..

427 Commits

Author SHA1 Message Date
Daniel Stenberg
4a9e12542d 7.13 coming up 2005-02-01 07:54:36 +00:00
Daniel Stenberg
21b4105454 somewhat nicer libcurl usage 2005-01-31 20:03:01 +00:00
Daniel Stenberg
d7648d94ca htmltitle 2005-01-31 18:23:42 +00:00
Daniel Stenberg
883343ba63 HTML <head> parsing (with libxml) example code by Lars Nilsson. 2005-01-31 18:22:40 +00:00
Daniel Stenberg
16b5dc710f four changes 2005-01-30 22:57:19 +00:00
Daniel Stenberg
686d767053 if the DO operation returns failure, bail out and close down nicely to
prevent memory leakage
2005-01-30 22:54:06 +00:00
Daniel Stenberg
ed3176dd6b Let's add a cookie interface in 7.14 2005-01-30 13:26:12 +00:00
Daniel Stenberg
6a99ab098c Bugfixed the parser that scans the valgrind report outputs. I noticed that it
previously didn't detect and report the "Conditional jump or move depends on
uninitialised value(s)" error.

When I fixed this, I caught a few curl bugs with it. And then I had to spend
time to make the test suite IGNORE these errors when OpenSSL is used since it
produce massive amounts of valgrind warnings (but only of the "Conditional..."
kind it seems).

So, if a test that requires SSL is run, it ignores the "Conditional..."
errors, and you'll get a "valgrind PARTIAL" output instead of "valgrind OK".
2005-01-30 12:56:36 +00:00
Daniel Stenberg
b03adde546 properly mark tests as requiring feature 'SSL' 2005-01-30 12:53:05 +00:00
Daniel Stenberg
e6034ea299 Use calloc() to save us the memset() call and terminate conn->host.name
properly, to avoid reading uninited variables when using file:// (valgrind)
2005-01-30 12:42:15 +00:00
Daniel Stenberg
c7f51ebeab Clear the urlglob struct when allocated, since we might otherwise use
uninitialized variables. Pointed out to us by the friendly Valgrind.
2005-01-29 23:46:27 +00:00
Daniel Stenberg
9a820d7a98 include "url.h" for the Curl_safefree() proto 2005-01-29 22:38:45 +00:00
Daniel Stenberg
8dbaf534c8 Using the multi interface, and doing a requsted a re-used connection that
gets closed just after the request has been sent failed and did not re-issue
a request on a fresh reconnect like the easy interface did. Now it does!
(define CURL_MULTIEASY, run test case 160)
2005-01-29 22:31:06 +00:00
Daniel Stenberg
91f483c591 Define CURL_MULTIEASY when building this, to use my new curl_easy_perform()
that uses the multi interface to run the request. It is a great testbed for
the multi interface and I believe we shall do it this way for real in the
future when we have a successor to curl_multi_fdset().
2005-01-29 22:26:38 +00:00
Daniel Stenberg
c5b448038f corrected the URL 2005-01-29 13:54:15 +00:00
Daniel Stenberg
c4ff5eb0ca conn->ip_addr MUST NOT be used on re-used connections 2005-01-29 13:07:16 +00:00
Daniel Stenberg
0859cd2444 when using valgrind, include a much longer stack trace 2005-01-29 13:06:31 +00:00
Daniel Stenberg
59b45a90cc multi interface: when a request is denied due to "Maximum redirects followed"
libcurl leaked the last Location: URL.
2005-01-29 12:01:20 +00:00
Daniel Stenberg
f661475962 Connect failures with the multi interface was often returned as "connect()
timed out" even though the reason was different. Fixed this problem by not
setting this timeout to zero when using multi.
2005-01-28 23:21:24 +00:00
Daniel Stenberg
54b02ecf09 adjusted to the moved unlock of the DNS entry 2005-01-28 22:22:59 +00:00
Daniel Stenberg
4551e7ce49 KNOWN_BUGS #17 fixed. A DNS cache entry may not remain locked between two
curl_easy_perform() invokes. It was previously unlocked at disconnect, which
could mean that it remained locked between multiple transfers. The DNS cache
may not live as long as the connection cache does, as they are separate.

To deal with the lack of DNS (host address) data availability in re-used
connections, libcurl now keeps a copy of the IP adress as a string, to be able
to show it even on subsequent requests on the same connection.
2005-01-28 22:14:48 +00:00
Daniel Stenberg
064bc3ecbc Stephen More pointed out that CURLOPT_FTPPORT and the -P option didn't work
when built ipv6-enabled. I've now made a fix for it. Writing test cases for
custom port strings turned too tricky so unfortunately there's none.
2005-01-28 08:26:36 +00:00
Daniel Stenberg
cf38a4c470 test the EPRT/LPRT/PORT somewhat more 2005-01-27 23:03:02 +00:00
Daniel Stenberg
aacc79a3a3 Use the same work-around for the memdebug stuff as in the command line client,
to allow the contents of the env var decide the file name.
2005-01-27 22:40:56 +00:00
Daniel Stenberg
9864bf703d a slightly involved work-around to prevent the debug-tracing from logging
a free-without-alloc as the first call
2005-01-27 15:59:01 +00:00
Daniel Stenberg
289a42f050 Make the debug build get the debug dump file path from the environment
variable to allow the test suite to better control where it ends up.
2005-01-27 15:51:03 +00:00
Daniel Stenberg
ade1e79b37 verify a part of the PORT line 2005-01-27 12:59:40 +00:00
Daniel Stenberg
2415724d5f Make the server ignore the given PORT address, to make it possible to test
curl's -P option easier.
2005-01-26 23:18:31 +00:00
Daniel Stenberg
5463177f1f added more official web and download mirrors 2005-01-26 12:05:33 +00:00
Daniel Stenberg
4efd751eda new curlpp URL 2005-01-26 11:53:49 +00:00
Daniel Stenberg
2337efc3b1 fixed sort, mention C, the java binding is now maintained by Vic Hanson 2005-01-26 11:53:12 +00:00
Daniel Stenberg
b942a25a45 add number to the bugs to make them easier to refer to 2005-01-25 23:40:35 +00:00
Daniel Stenberg
beab9a9696 two known bugs 2005-01-25 22:21:42 +00:00
Daniel Stenberg
177dbc7be0 Ian Ford asked about support for the FTP command ACCT, and I discovered it is
present in RFC959... so now (lib)curl supports it as well. --ftp-account and
CURLOPT_FTP_ACCOUNT set the account string. (The server may ask for an account
string after PASS have been sent away. The client responds with "ACCT [account
string]".) Added test case 228 and 229 to verify the functionality. Updated
the test FTP server to support ACCT somewhat.
2005-01-25 22:13:12 +00:00
Daniel Stenberg
f2e71edcbd A minor "syntax error" in numerous test files corrected 2005-01-25 21:45:03 +00:00
Daniel Stenberg
fad6e5a5bc new web mirror 2005-01-25 13:59:48 +00:00
Daniel Stenberg
52f6c437fe --protocols is added in 7.13.0 2005-01-25 12:06:12 +00:00
Daniel Stenberg
80a8be6319 David Shaw contributed a fairly complete and detailed autoconf macro you can
use to detect libcurl and setup variables for the protocols the installed
libcurl supports: docs/libcurl/libcurl.m4
2005-01-25 09:29:05 +00:00
Daniel Stenberg
043d70fcdf Use plain structs and not typedef'ed ones in the hash and linked-list code. 2005-01-25 00:06:29 +00:00
Daniel Stenberg
4f7e958969 two options less 2005-01-23 00:08:56 +00:00
Daniel Stenberg
53143910a1 \fI marked \fP more function calls etc. 2005-01-22 22:43:04 +00:00
Daniel Stenberg
95656cd7f3 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.
2005-01-22 22:24:17 +00:00
Daniel Stenberg
d8f79b263d next release will be 7.13.0 2005-01-22 19:26:37 +00:00
Daniel Stenberg
51da8552c3 added a few items I plan to do 2005-01-22 09:03:55 +00:00
Daniel Stenberg
7e42cb61f7 FTP third transfer support overhaul. See CHANGES for details. 2005-01-21 09:32:32 +00:00
Daniel Stenberg
6c038680f9 clarify the struct name for CURLOPT_HTTPPOST 2005-01-21 08:56:04 +00:00
Daniel Stenberg
291a908f19 Added support for "verify" => "stripfile" to strip contents of the file that
is being checked.

Also made the server retrying sleep only one second instead of three, to reduce
some waiting when fooling around with the servers.
2005-01-20 22:48:43 +00:00
Daniel Stenberg
b264a03f89 Support file names passed to RETR that don't start with a number. In that
case, all non-numeric prefixing letters are cut off to figure out the test
number.
2005-01-20 22:47:31 +00:00
Daniel Stenberg
7472ede32a Philippe Hameau found out that -Q "+[command]" didn't work, although some code
was written for it. I fixed and added test case 227 to verify it.  The curl.1
man page didn't mention the '+' so I added it.
2005-01-20 22:22:12 +00:00
Daniel Stenberg
b5065e462b add support for NOOP 2005-01-20 22:05:44 +00:00
Daniel Stenberg
8dd799b4bd If you give a *_LARGE option you MUST make sure that the type of the passed-in
argument is a curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you
must make sure that to pass in a type 'long' argument. */
2005-01-20 14:24:56 +00:00
Daniel Stenberg
a38520c90d added test226 too 2005-01-19 22:00:54 +00:00
Daniel Stenberg
3050ae57c0 Stephan Bergmann made libcurl return CURLE_URL_MALFORMAT if an FTP URL
contains %0a or %0d in the user, password or CWD parts. (A future fix would
include doing it for %00 as well - see KNOWN_BUGS for details.) Test case 225
and 226 were added to verify this
2005-01-19 21:56:02 +00:00
Daniel Stenberg
01205f772c today's proxy fixes 2005-01-19 18:05:56 +00:00
Gisle Vanem
06ad5be3af Don't copy 'stderr' for Win-CE in IPv6 code. Don't call
GetCurrentProcess() twice; use a local variable.
2005-01-19 10:20:55 +00:00
Daniel Stenberg
2fe3829e5e add a URL to an article about making Apache support PUT 2005-01-19 10:09:15 +00:00
Daniel Stenberg
a0c8b9bc68 Stephan Bergmann pointed out two flaws in libcurl built with HTTP disabled:
1) the proxy environment variables are still read and used to set HTTP proxy

2) you couldn't disable http proxy with CURLOPT_PROXY (since the option was
   disabled)
2005-01-19 09:36:44 +00:00
Daniel Stenberg
0406b1facf skip sys/socket.h on windows CE 2005-01-18 15:13:23 +00:00
Daniel Stenberg
65dbee01e5 check for errno.h 2005-01-18 14:34:50 +00:00
Daniel Stenberg
b1080f7c9a Cody Jones' enhanced version of Samuel Daz Garca's MSVC makefile patch. 2005-01-18 10:17:34 +00:00
Daniel Stenberg
7bfd58d41f Add support for server 'ftp2' which is a second FTP server. Useful for 3rd
party transfer tests or tests that need two FTP servers.
2005-01-17 20:20:34 +00:00
Daniel Stenberg
3851c6aae2 support the new --id command line option, that allows a second (or third or
whatever) instance to run without overwriting the previous' logfiles
2005-01-17 19:49:12 +00:00
Daniel Stenberg
ae03fa7d8e mention the name-prefix protocol guess thing 2005-01-17 14:57:21 +00:00
Daniel Stenberg
8a14dd25a9 updated the wording for -B/--use-ascii 2005-01-17 09:18:04 +00:00
Daniel Stenberg
e0bea7d541 Alex aka WindEagle pointed out that when doing "curl -v dictionary.com", curl
assumed this used the DICT protocol. While guessing protocols will remain
fuzzy, I've now made sure that the host names must start with "[protocol]."
for them to be a valid guessable name. I also removed "https" as a prefix that
indicates HTTPS, since we hardly ever see any host names using that.
2005-01-16 08:51:52 +00:00
Daniel Stenberg
534a8a05f3 mention --netrc in the -u description 2005-01-16 08:34:18 +00:00
Gisle Vanem
f5b8a26d9a errrno can by freak accident become EINTR on DOS or
Windows (unrelated to select). select() can never set errno
to EINTR on Windows.
2005-01-15 09:26:07 +00:00
Daniel Stenberg
cf51f7fb65 output better error detection, like when ipv6 can't resolve 2005-01-15 09:21:51 +00:00
Daniel Stenberg
4d1f3d3cd0 Added README.hostip 2005-01-14 13:43:29 +00:00
Daniel Stenberg
f70b87b4c5 verify the protocol too 2005-01-14 09:39:20 +00:00
Daniel Stenberg
0e26355348 Inspired by Martijn Koster's patch and example source at
http://www.greenhills.co.uk/mak/gentoo/curl-eintr-bug.c, I now made the
select() and poll() calls properly loop if they return -1 and errno is
EINTR. glibc docs for this is found here:
http://www.gnu.org/software/libc/manual/html_node/Interrupted-Primitives.html

This last link says BSD doesn't have this "effect". Will there be a problem
if we do this unconditionally?
S: ----------------------------------------------------------------------
2005-01-13 21:51:48 +00:00
Gisle Vanem
246ea56eab Added dependencies. 2005-01-12 15:32:41 +00:00
Gisle Vanem
7c1bba315b Added '-bd' option; target is a DLL.
Added dependencies.
2005-01-12 15:32:26 +00:00
Daniel Stenberg
9395cad379 support for retrieving used IP addresses 2005-01-11 22:26:00 +00:00
Daniel Stenberg
c5b2e85b47 Dan Torop cleaned up a few no longer used variables from David Phillips'
select() overhaul fix.
2005-01-11 20:22:44 +00:00
Gisle Vanem
38f8087281 Removed CURLTOOLDEBUG. It caused libcurl_wc.dll
to fail in mysterious ways.
2005-01-11 17:08:47 +00:00
Daniel Stenberg
e3fa7d021e Renamed easy.h and multi.h to easyif.h and multiif.h to make sure they don't
shadow our public headers with the former names.
2005-01-11 15:25:29 +00:00
Gisle Vanem
a1813e2b2d ".\lib\easy.h" shadows for <curl/easy.h> in Watcom.
Force including ../include/curl/easy.h.
2005-01-11 14:59:24 +00:00
Gisle Vanem
2e62458eef Fix '!if' expression. 2005-01-11 14:52:42 +00:00
Gisle Vanem
bb9e5565f2 ".\lib\multi.h" shadows for <curl/multi.h> in Watcom.
Force including ../include/curl/multi.h.
2005-01-11 14:32:09 +00:00
Daniel Stenberg
29102befa6 Cyrill Osterwalder posted a detailed analysis about a bug that occurs when
using a custom Host: header and curl fails to send a request on a re-used
persistent connection and thus creates a new connection and resends it. It
then sent two Host: headers. Cyrill's analysis was posted here:
http://curl.haxx.se/mail/archive-2005-01/0022.html
2005-01-11 14:00:45 +00:00
Daniel Stenberg
9d1145598a Bruce Mitchener identified (bug report #1099640) the never-ending SOCKS5
problem with the version byte and the check for bad versions. Bruce has lots
of clues on this, and based on his suggestion I've now removed the check of
that byte since it seems to be able to contain 1 or 5.
2005-01-10 23:32:14 +00:00
Daniel Stenberg
065e466f1a Use Curl_easy_addmulti() to clear associations from easy handles to multi
handles. Include multi.h to get proto.
2005-01-10 11:42:20 +00:00
Daniel Stenberg
3ac00f32af edited wording 2005-01-10 11:27:02 +00:00
Daniel Stenberg
21bb852750 Pavel Orehov reported memory problems with the multi interface in bug report
#1098843. In short, a shared DNS cache was setup for a multi handle and when
the shared cache was deleted before the individual easy handles, the latter
cleanups caused read/writes to already freed memory.
2005-01-10 10:07:07 +00:00
Daniel Stenberg
83bab78bda Hzhijun reported a memory leak in the SSL certificate code, that leaked the
remote certificate name when it didn't match the used host name.
2005-01-10 09:48:39 +00:00
Gisle Vanem
894ec46ef4 Note about the static lib requirement; -DCURL_STATICLIB. 2005-01-08 16:35:03 +00:00
Gisle Vanem
4eb1d3eb1b Watcom additions. 2005-01-08 16:15:06 +00:00
Gisle Vanem
945423e83a Added Watcom targets. 2005-01-08 16:12:27 +00:00
Gisle Vanem
9fd33c0b96 New file. 2005-01-08 16:06:37 +00:00
Gisle Vanem
3c09f2d2bd Added Makefile.Watcom to EXTRA_DIST. 2005-01-08 16:03:45 +00:00
Daniel Stenberg
7b4bf6a22c three recent bug fixes 2005-01-07 21:14:57 +00:00
Daniel Stenberg
b5b77f6367 disable the valgrind log checking 2005-01-07 21:11:24 +00:00
Daniel Stenberg
5a8097a4d5 fixed the valgrind log check and make it possible to disable it for a specific
test, see test 509
2005-01-07 21:11:13 +00:00
Daniel Stenberg
9cdf6fb64b added test 199 2005-01-07 21:09:50 +00:00
Daniel Stenberg
a137223b4f prevent a single byte read outside the string in test case 39 2005-01-06 22:54:37 +00:00
Daniel Stenberg
52e1ce9518 fixed #1097019, multiple GET posts (-G) error 2005-01-06 22:25:35 +00:00
Daniel Stenberg
8127a34f98 recent events 2005-01-05 14:12:06 +00:00
Gisle Vanem
2dcb8b674f Changed curl.dll to libcurl.dll. 2005-01-04 16:16:03 +00:00
Gisle Vanem
1e3b1b6e47 Minor comment fix. 2005-01-04 16:13:58 +00:00
Daniel Stenberg
9cdaae94cc just narrowed some text to fit within 80 cols 2005-01-04 16:01:34 +00:00
Gisle Vanem
316e74be74 Removed _WIN32_WINNT to support IPv6 under Win-2K. 2005-01-04 16:00:14 +00:00
Daniel Stenberg
af69c4f4f7 Marty Kuhrt's VMS update 2005-01-03 19:17:10 +00:00
Daniel Stenberg
ad9648a215 reverted the bad naming of the implib names 2005-01-02 21:15:29 +00:00
Daniel Stenberg
1576f3319e Alex Neblett's minor update 2005-01-02 19:19:32 +00:00
Daniel Stenberg
8ac90316d9 nah, don't use the system's getpass() function since it too often is limited
to 8(!) or similar lengths passwords
2004-12-26 09:17:38 +00:00
Daniel Stenberg
35ba5c826d issue 54 - this takes sweat 2004-12-25 23:15:45 +00:00
Daniel Stenberg
4f4ffa98b5 Test case 241 fails on all systems that support IPv6 but that don't have the
host name 'ip6-localhost' in /etc/hosts (or similar) since the test case uses
that host name to test the IPv6 name to address resolver.
2004-12-25 22:51:37 +00:00
Daniel Stenberg
b7d92c3e03 --protocols, license, src/config.h.in 2004-12-25 22:30:31 +00:00
Daniel Stenberg
4ecf939452 ./src/config.h.in is now removed from CVS. It is copied from the
lib/config.h.in file by buildconf
2004-12-25 22:10:38 +00:00
Daniel Stenberg
7ef6b05ef1 My reimplementation and cleanup of the getpass source code. We officially no
longer use Angus Mackay's getpass code due to the weirdo license his code was
donated to us under.
2004-12-25 22:08:02 +00:00
Daniel Stenberg
695f95aad1 mention the new --protocols 2004-12-24 09:02:23 +00:00
Daniel Stenberg
2a6ea6d7a7 David Shaw added --protocols, and thus the --feature no longer mentions what
protocols that are disabled.
2004-12-24 08:59:44 +00:00
Dan Fandrich
f5e0ff2170 Added LDAP library issue. 2004-12-23 22:34:00 +00:00
Daniel Stenberg
814d176b86 recent changes
and Merry Christmas!
2004-12-23 22:31:39 +00:00
Daniel Stenberg
3955b31362 David Shaw fixed the disable variables so that curl-config --feature works
correctly!
2004-12-23 08:48:59 +00:00
Daniel Stenberg
4b3fb5a01c issue 47 in next release? 2004-12-22 22:46:05 +00:00
Daniel Stenberg
67abd4cd47 Rune Kleveland fixed a minor memory leak for received cookies with the (rare)
version attribute set.
2004-12-22 22:33:31 +00:00
Daniel Stenberg
58f4af7973 Marcin Konicki provided two configure fixes and a source fix to make curl
build out-of-the-box on BeOS.
2004-12-22 22:28:10 +00:00
Dan Fandrich
99befd3a15 C ensures that static variables are initialized to 0 2004-12-22 20:12:15 +00:00
Daniel Stenberg
3acda85c2b added CURLINFO_HTTP_CONNECTCODE 2004-12-22 12:31:55 +00:00
Daniel Stenberg
dbb69797cf uh, fixed! 2004-12-22 09:21:04 +00:00
Daniel Stenberg
2910880b15 Added: 4 protocols we _could_ support and the CONNECT HTTP/1.0 detail we might
fix one day.
2004-12-22 09:19:29 +00:00
Daniel Stenberg
8b5f0abef1 more about error codes 2004-12-21 21:35:00 +00:00
Daniel Stenberg
10b5327b19 test enforced chunked encoding with PUT on a local file 2004-12-21 20:19:05 +00:00
Daniel Stenberg
4ba1eb26fa Added test case 217 that verified CURLINFO_HTTP_CONNECTCODE, and I made the
-w option support 'http_connect' to make it easier to verify!
2004-12-21 19:59:35 +00:00
Daniel Stenberg
444f6427b8 oops, variables first then code 2004-12-21 14:33:37 +00:00
Daniel Stenberg
a173e07eec Prevent failf() from using the va_list variable more than once.
See bug report #1088962 and  Single Unix Specification:
http://www.opengroup.org/onlinepubs/007908799/xsh/vfprintf.html
2004-12-21 14:22:10 +00:00
Daniel Stenberg
3de85777de mention how the FTP code should be fixed one day 2004-12-21 10:54:21 +00:00
Daniel Stenberg
f4c5314890 include sys/types.h before sys/select.h 2004-12-21 10:11:07 +00:00
Daniel Stenberg
1225ad58bd set debug curl too when -c is used 2004-12-21 10:10:40 +00:00
Daniel Stenberg
951fdeba67 How do I list the root dir of an FTP server? 2004-12-21 09:37:55 +00:00
Dan Fandrich
327b46cced Fixed a compile warning introduced by making the protocol table const. This
involves a binary-compatible change to the API struct curl_version_info_data
2004-12-20 21:14:45 +00:00
Dan Fandrich
80d301257c Make some more arrays of pointers const. 2004-12-20 18:23:43 +00:00
Dan Fandrich
0e59182945 gcc 2.7 can't handle a few warning options that gcc 2.95 can. 2004-12-20 18:20:17 +00:00
Daniel Stenberg
7270d5ce26 start working on 7.12.4 2004-12-20 13:09:38 +00:00
Daniel Stenberg
a142d419d2 and we start all over again 2004-12-20 12:51:14 +00:00
Daniel Stenberg
23cf63f550 7.12.3 2004-12-20 12:35:02 +00:00
Gisle Vanem
13ee90bbd4 OpenSSL updates; get CA_BUNDLE from env. Assume no
Kerberos, have <pkcs12.h>, <engine.h> and built-in engines.
2004-12-19 11:52:31 +00:00
Gisle Vanem
754d6c3abd Remove 'data' initialiser. 2004-12-19 11:39:34 +00:00
Daniel Stenberg
c6f6e81238 clarified a few changes 2004-12-19 10:11:03 +00:00
Daniel Stenberg
7803a1a28a fixed the solaris pkcs12 build problem 2004-12-19 09:37:58 +00:00
Daniel Stenberg
3d647b9a98 if the pkcs12.h header exists, include it already in urldata.h to work around
a precedence problem with the zlib header. See CHANGES for details.
2004-12-19 09:37:32 +00:00
Daniel Stenberg
090a7f38be check for openssl/pkcs12.h 2004-12-19 09:36:54 +00:00
Daniel Stenberg
8ad47a13e5 Samuel Listopad added support for PKCS12 formatted certificates. 2004-12-18 10:42:48 +00:00
Daniel Stenberg
497cc6bfaf Samuel Listopad fixed -E to support "C:/path" (with forward slash) as well. 2004-12-18 10:28:31 +00:00
Daniel Stenberg
d5be114c07 mention the new cookie api plans 2004-12-18 10:28:04 +00:00
Daniel Stenberg
6e43a4ccce Jean-Marc Ranger pointed out that the returned data doesn't survive a call
to curl_multi_remove_handle() either.
2004-12-18 10:24:49 +00:00
Dan Fandrich
a07dcfd850 Renamed a variable to avoid conflict with a C++ reserved word. 2004-12-17 20:18:53 +00:00
Gisle Vanem
321511a5be Watcom has strtoll(). 2004-12-17 19:57:50 +00:00
Gisle Vanem
c5297b9fd9 Watcom uses 'i64' suffix. 2004-12-17 18:33:09 +00:00
Gisle Vanem
7e00076586 <windows.h> required for Watcom. 2004-12-17 18:32:41 +00:00
Gisle Vanem
9a8ba19b73 s/_write/write/g 2004-12-17 18:31:40 +00:00
Gisle Vanem
41e776f9db Fix calling convention of wlap32.dll function. Watcom
uses fastcall by default, so force cdecl.
2004-12-17 17:54:21 +00:00
Gisle Vanem
5c2d4a6bdd Watcom has 'struct timeval'. 2004-12-17 17:49:10 +00:00
Gisle Vanem
83b709401c Add libidn.a and iconv libraries if USE_IDNA=1. 2004-12-17 12:43:02 +00:00
Gisle Vanem
3590fffeae Added option for using C-ares and libidn.
Dependencies generated from $(CSOURCES).
2004-12-17 12:38:06 +00:00
Gisle Vanem
5e2e87cc8d getdate.c is gone. 2004-12-17 12:28:04 +00:00
Gisle Vanem
b1bdba7db5 Print true netrc name (.netrc/_netrc). 2004-12-17 12:26:18 +00:00
Daniel Stenberg
e3d342df96 avoid an extra malloc 2004-12-17 10:09:32 +00:00
Daniel Stenberg
ff54a74b4d duplicate ! typo 2004-12-17 10:09:06 +00:00
Daniel Stenberg
ccf65be0a4 fixed minor memory leak when running out of memory 2004-12-17 09:00:19 +00:00
Daniel Stenberg
7dfef13224 oops, add missing return keyword 2004-12-17 08:58:48 +00:00
Daniel Stenberg
0b85e53af2 fix skip-reason 2004-12-16 22:45:06 +00:00
Daniel Stenberg
26cfb21c00 several windows large-file fixes 2004-12-16 22:22:26 +00:00
Daniel Stenberg
b7acdbcb4c two more ftp directory re-use tests added 2004-12-16 22:22:11 +00:00
Daniel Stenberg
6e1e9caa32 Based on Gisle Vanem's patch: make sure the directory re-use works even when
a URL-encoded path is used.
2004-12-16 22:20:33 +00:00
Gisle Vanem
f71725de6e Must include <io.h> and <sys/stat.h> before redefining
stat(), fstat() and lseek().
2004-12-16 21:27:29 +00:00
Dan Fandrich
26fe6da93b Renamed a struct member to avoid conflict with a C++ reserved word. 2004-12-16 21:27:23 +00:00
Daniel Stenberg
8d4ac69175 reduced the number of sub-blocks 2004-12-16 18:18:23 +00:00
Daniel Stenberg
4f5a6a33b4 moved the lseek() and stat() magic defines to setup.h and now take advantage
of struct_stat in formdata.c as well, to support formpost uploads of large
files on Windows too
2004-12-16 18:09:27 +00:00
Gisle Vanem
ec8ee4404b Support uploading and resuming of >2GB files.
Ref. lib/file.c.
2004-12-16 16:49:14 +00:00
Daniel Stenberg
e47b5d4e6c Provide better reasons for why test cases are skipped. Also, don't show the
SKIPPED stuff in the short output. Some platforms get quite a lot of SKIPPED
and they don't add much value and only clutter screen space.
2004-12-16 14:18:11 +00:00
Daniel Stenberg
494c40fd98 NULL the fp pointer after it has been fclosed() 2004-12-16 13:55:19 +00:00
Daniel Stenberg
d3b414724b Dinar in bug report #1086121, found a file handle leak when a multipart
formpost (including a file upload part) was aborted before the whole file was
sent.
2004-12-16 09:52:36 +00:00
Dan Fandrich
38181fbc74 Fix the --enable-debug compiler warning options for older versions of gcc. 2004-12-15 21:09:53 +00:00
Daniel Stenberg
8847e61fca yet another mirror! 2004-12-15 14:09:52 +00:00
Daniel Stenberg
95b84adb9b precaution to prevent double typedefs of the bool 2004-12-15 14:05:07 +00:00
Daniel Stenberg
b34d161703 moved the bool typedef to setup.h 2004-12-15 10:33:51 +00:00
Daniel Stenberg
d88b3d3d5d fixed how backslashes are treated in glob strings 2004-12-15 09:23:24 +00:00
Dan Fandrich
f2fb9039bd Make some arrays of pointers const, too. 2004-12-15 03:03:45 +00:00
Dan Fandrich
a28b32aa45 Make some arrays of pointers const, too. 2004-12-15 02:32:04 +00:00
Dan Fandrich
1ba47e7af9 Add 'const' to immutable arrays. 2004-12-15 01:38:25 +00:00
Daniel Stenberg
9359498b06 clarify that the app must free the engine list 2004-12-14 22:47:13 +00:00
Daniel Stenberg
553082e24a prevent compiler warning when built without engine support 2004-12-14 22:06:25 +00:00
Daniel Stenberg
dc28a9c0c1 make sure the ipv6 http server gets its pid stored in a separate file 2004-12-14 21:52:16 +00:00
Daniel Stenberg
1faef62d59 use the correct variables, not fixed values 2004-12-14 21:25:23 +00:00
Daniel Stenberg
0d0d5e7ee3 Harshal Pradhan fixed changing username/password on a persitent HTTP
connection.
2004-12-14 21:22:51 +00:00
Daniel Stenberg
4f567d0f81 mistake 2004-12-14 21:22:12 +00:00
Dan Fandrich
f23d923fd3 Only declare static variables if they're needed. Fixed some compile warnings. 2004-12-14 20:44:36 +00:00
Dan Fandrich
10d6d8b2ae Header files are in openssl/ only if USE_OPENSSL is set. 2004-12-14 20:25:23 +00:00
Dan Fandrich
358e08b95d Removed fputc() prototype since it's already in stdio.h 2004-12-14 20:17:58 +00:00
Gisle Vanem
e181eda253 Caller must free 'engines' list. 2004-12-14 14:24:04 +00:00
Gisle Vanem
7d3f5d7ac1 urldata.h: Removed engine_list.
ssluse.*: Added SSL_strerror(). Curl_SSL_engines_list() now returns a slist
which must be freed by caller.
2004-12-14 14:20:21 +00:00
Daniel Stenberg
37c7a695a2 Moved the CURLE_SSL_ENGINE_INITFAILED error code last in the list so that
the others remain at previous values.
2004-12-14 09:58:45 +00:00
Daniel Stenberg
07f107ae20 Moved the engine stuff from the root-level of the SessionHandle struct to the
UrlState sub-struct. Also made the engine_list exist for non-ssl builds to
make curl build.
2004-12-14 09:36:22 +00:00
Gisle Vanem
5c14b3be6d Document CURLINFO_SSL_ENGINES and "--engine". 2004-12-13 20:14:04 +00:00
Gisle Vanem
1dc15ec1bc Set 'data->state.os_errno = error' in some places.
Needed elsewhere too?
2004-12-13 17:52:55 +00:00
Gisle Vanem
6a9ed44088 Support for "--engine list" option.
Moved CURLOPT_SSLENGINE* options to after verbose mode is set.
Added a goto. Eek!
2004-12-13 16:47:36 +00:00
Gisle Vanem
bdb0620529 Added handling of CURLINFO_SSL_ENGINES;
Added Curl_SSL_engines_list(), cleanup SSL in url.c
(no HAVE_OPENSSL_x etc.).
2004-12-13 16:43:00 +00:00
Gisle Vanem
be9ea07e87 Handle new type CURLINFO_SLIST.
Handle new info list CURLINFO_SSL_ENGINES.
2004-12-13 16:37:27 +00:00
Gisle Vanem
4cf14e9f85 Added CURLcode CURLE_SSL_ENGINE_INITFAILED,
Added CURLINFO_SLIST type for returing a 'struct slist' in
curl_easy_getinfo().
Added CURLINFO_SSL_ENGINES.
2004-12-13 16:35:56 +00:00
Gisle Vanem
d02b2c4308 Fixed missing braces warning. 2004-12-13 11:31:01 +00:00
Daniel Stenberg
1687a9eb94 large file file:// resumes on windows 2004-12-13 10:58:37 +00:00
Daniel Stenberg
344c6a3725 Gisle's fix for resuming large file:// files on windows - slightly edited
by me.
2004-12-13 10:25:26 +00:00
Daniel Stenberg
f966dad306 Dan Fandrich did minor corrections to his SSL cleanup patch 2004-12-13 08:34:46 +00:00
Daniel Stenberg
887f41c062 Dan Fandrich added libcurl.pc.in to the dist 2004-12-13 08:34:17 +00:00
Daniel Stenberg
4b1350e467 when failing to verify a HTTP server, display what curl said on stderr to
help debugging. (when using ipv6 I fell over this server that didn't have
the ipv6 module loaded)
2004-12-12 23:31:45 +00:00
Gisle Vanem
22a0c57746 Missing 'in6addr_any' in MingW's lib. ld bug? 2004-12-12 20:14:25 +00:00
Daniel Stenberg
fec571f5b0 modified to use the current error code name, not the obsolete one 2004-12-11 22:18:11 +00:00
Daniel Stenberg
976285ccbc undef more obsolete defines if CURL_NO_OLDIES is defined 2004-12-11 22:17:47 +00:00
Daniel Stenberg
9b3b7ad22e HTTP IPv6 support added to the test suite 2004-12-11 21:41:00 +00:00
Daniel Stenberg
1b8ac7c6b5 provide an error string when resuming fails - and use the proper error code,
not the former one
2004-12-11 18:55:51 +00:00
Daniel Stenberg
bd2db87237 fixed error message 2004-12-11 18:55:23 +00:00
Daniel Stenberg
df3ca59116 Dan Fandrich:
Here's a stab at a consolidation of the SSL detection heuristics into
configure. Source files aren't changed by this patch, except for setup.h and
the various config*.h files.  Within the configure script, OPENSSL_ENABLED is
used to determine if SSL is being used or not, and outside configure,
USE_SSLEAY means the same thing; this could be even further unified some day.

Now, when SSL is not detected, configure skips the various checks that are
dependent on SSL, speeding up the configure process and avoiding complications
with cross compiles.  I also updated all the architecture- specific config
files I could see, but I couldn't test them.
2004-12-11 18:47:22 +00:00
Daniel Stenberg
3ca4509ae9 Dan F's initial pkg-config file (not installed yet) 2004-12-11 18:46:40 +00:00
Daniel Stenberg
d531926246 mention the maybe-missing initial zero in the vernum output 2004-12-11 18:38:47 +00:00
Daniel Stenberg
357fdb60b6 Dan Fandrich: added some missing files. "I can't try them so they might still
be broken, but at least they'll be less broken than they are now."
2004-12-10 21:58:11 +00:00
Daniel Stenberg
b6f855cb9b Dan Fandrich corrects spelling mistakes 2004-12-10 21:56:35 +00:00
Daniel Stenberg
b6646310e8 Dan Fandrich extended the cross compile section and corrected spelling errors 2004-12-10 21:55:05 +00:00
Daniel Stenberg
070da3c08f untabified 2004-12-10 21:46:00 +00:00
Daniel Stenberg
6b7f6369ec username and IPv6 numerical address URL parser fix 2004-12-10 21:42:55 +00:00
Daniel Stenberg
309e3ce4f9 David Byron's debug build fix 2004-12-10 19:16:51 +00:00
Daniel Stenberg
8a4eb8ed45 move the port number extraction to after the extraction of user name/password,
as suggested by Kai Sommerfeld
2004-12-10 15:11:11 +00:00
Daniel Stenberg
eee70dcf8e two new test cases for proxy-CONNECT with NTLM (one doing GET, one doing POST) 2004-12-10 14:48:03 +00:00
Daniel Stenberg
c0c885a1f3 don't try the rewind if no http struct is allocated yet 2004-12-10 14:45:35 +00:00
Daniel Stenberg
a7488672bf configure and curl-config fixes 2004-12-10 09:46:14 +00:00
Daniel Stenberg
c1312cab1f Added two chapters: Custom Request Elements and Debug. 2004-12-10 09:45:55 +00:00
Daniel Stenberg
8c833d375a ignore the getpart tool 2004-12-09 09:58:45 +00:00
Daniel Stenberg
18f14ae23d close the connection when a bad test number was requested 2004-12-09 09:58:25 +00:00
Daniel Stenberg
98adcdd466 Ton Voon provided a configure fix that should fix the notorious (mostly
reported on Solaris) problem where the size_t check fails due to the SSL libs
being found in a dir not searched through by the run-time linker.
patch-tracker entry #1081707.
2004-12-09 09:27:30 +00:00
Daniel Stenberg
a2bd47c567 Bryan Henderson pointed out in bug report #1081788 that the curl-config
--vernum output wasn't zero prefixed properly (as claimed in documentation).
This is fixed in maketgz now.
2004-12-09 08:06:59 +00:00
Daniel Stenberg
7b3c308eb0 update the version numbers in the libcurl.plist automaticly on release 2004-12-08 23:09:46 +00:00
Daniel Stenberg
1be1d3cfb8 Matt Veenstra updated to 7.12.3. Starting now, we'll update the version number
in this file automatically on releases using the maketgz script.
2004-12-08 23:09:23 +00:00
Daniel Stenberg
b970469df9 Matt Veenstra:
- removal of getdate.c
- Added hostares.c, hostasyn.c, hostip4.c, hostip6.c, hostsync.c,
hostthre.c, inet_ntop.c, nwlib.c, parsedate.c, sterror.c, strtoofft.c

I have tested the build on 10.3, and will build on 10.2.8 in the next days.
2004-12-08 23:02:55 +00:00
Daniel Stenberg
80a324386b Rene Bernhardt found and fixed a buffer overrun in the NTLM code, where
libcurl always and unconditionally overwrote a stack-based array with 3 zero
bytes. I edited the fix to make it less likely to occur again (and added
a comment explaining the reason to the buffer size).
2004-12-07 23:09:41 +00:00
Daniel Stenberg
163518778c minor updates 2004-12-07 23:08:28 +00:00
Daniel Stenberg
7fd1ce4dc3 NORECURSE clarification, minor formatting update 2004-12-07 10:43:21 +00:00
Daniel Stenberg
c78ee11c41 CURLFTPSSL_ALL should make sure that the transfer fails if the data connection
isn't set to encrypted properly
2004-12-07 10:00:20 +00:00
Daniel Stenberg
4435e3b269 Fixed so that the final error message is sent to the verbose info "stream"
even if no errorbuffer is set.
2004-12-06 23:04:30 +00:00
Daniel Stenberg
b96a0dba90 Gisle Vanem's fix for better info messages when failing to connect using
the multi interface
2004-12-06 22:45:45 +00:00
Gisle Vanem
30dfc00a54 'crypto_engine' not used. 2004-12-06 16:36:50 +00:00
Gisle Vanem
fe5979cfdb Replace MINGW32 with built-in __MINGW32__. 2004-12-06 14:43:04 +00:00
Daniel Stenberg
a1f7987ad8 HTTP PUT a to a FTP URL with username+password - over HTTP proxy 2004-12-06 12:54:50 +00:00
Daniel Stenberg
ac269a8f68 Dan Fandrich added the --disable-cookies option to configure to build
libcurl without cookie support. This is mainly useful if you want to build a
minimalistic libcurl with no cookies support at all. Like for embedded
systems or similar.
2004-12-05 23:59:32 +00:00
Daniel Stenberg
35944744f8 Richard Atterer fixed libcurl's way of dealing with the EPSV
response. Previously, libcurl would re-resolve the host name with the new
port number and attempt to connect to that, while it should use the IP from
the control channel. This bug made it hard to EPSV from an FTP server with
multiple IP addresses!
2004-12-05 23:33:33 +00:00
Daniel Stenberg
4b1c0bd1e7 CURLOPT_FTPSSLAUTH was added in 7.12.2 2004-12-03 11:25:06 +00:00
Daniel Stenberg
b7ff86fa2b credit where credit is due 2004-12-03 11:06:05 +00:00
Daniel Stenberg
2c27e4ee76 Bug report #1078066: when a chunked transfer was pre-maturely closed exactly
at a chunk boundary it was not considered an error and thus went unnoticed.
Added test case 207 to verify.
2004-12-03 09:31:25 +00:00
Daniel Stenberg
6ac9e67bd7 made the intended one hour default timeout in the CONNECT loop actually work 2004-12-02 23:30:13 +00:00
Daniel Stenberg
8726a6b6ed comment cleanup 2004-12-02 22:52:14 +00:00
Daniel Stenberg
2f26069a41 test 206 - HTTP proxy CONNECT auth Digest 2004-12-02 17:11:19 +00:00
Daniel Stenberg
d6c155ff47 added comment about port number in CONNECT string being used as test number 2004-12-02 17:11:09 +00:00
Daniel Stenberg
15360e5e51 prevent an initial "(nil)" to get sent in the initial request when doing
CONNECT to a proxy with digest
2004-12-02 17:08:37 +00:00
Gisle Vanem
e587a56fc0 Use "HAVE_SYS_TYPES_H". 2004-12-01 13:41:22 +00:00
Daniel Stenberg
113531432a make the "check" actually open all those file desciptors as well to make sure
it works, as it has proved to not work in some cases (like on Tor Arntsen's
AIX 5100-06 xlc 5.0 --disable-shared runs).
2004-12-01 10:34:46 +00:00
Gisle Vanem
bfa74c2649 alarm() works unreliable on djgpp 2.03. Don't use it. 2004-11-30 14:59:24 +00:00
Daniel Stenberg
6bb215f56c recent changes 2004-11-30 10:21:25 +00:00
Daniel Stenberg
8b37844e5f fixed test case errors 2004-11-30 10:20:59 +00:00
Daniel Stenberg
1445e62312 three new compress test cases 2004-11-30 09:54:16 +00:00
Daniel Stenberg
4781ff88fd Fixed the array comparison function even more, made the temporary files used
for diff output get created in the log/ dir and no longer deletes them since
they help in understanding the problem, fixing the test case and fixing curl
problems.
2004-11-30 09:53:53 +00:00
Daniel Stenberg
c28e15c682 Dan Fandrich's fix for libz 1.1 and "extra field" usage in a gzip stream 2004-11-30 09:44:54 +00:00
Daniel Stenberg
fe0585ec91 no longer use the MIME::Base64.pm package as it seems to not be standard
on lots of perl versions, provide our own base64 decoder
2004-11-30 09:27:11 +00:00
Daniel Stenberg
18c0b49f3d added test 221 to test a broken gzip content download 2004-11-29 22:37:52 +00:00
Daniel Stenberg
5d69c956ee added test 220 - simple gzip auto decompress 2004-11-29 22:15:42 +00:00
Daniel Stenberg
93aa22ea08 --disable-epsv when connecting to an IPv6 ftp server 2004-11-29 21:45:25 +00:00
Daniel Stenberg
b7c6bc20be removed comment 2004-11-29 21:44:40 +00:00
Daniel Stenberg
9bb4a95e08 include setup.h first 2004-11-29 21:44:23 +00:00
Daniel Stenberg
0966ddafaa As reported in Mandrake's bug tracker bug 12285
(http://qa.mandrakesoft.com/show_bug.cgi?id=12285), when connecting to an
IPv6 host with FTP, --disable-epsv (or --disable-eprt) effectively disables
the ability to transfer a file. Now, when connected to an FTP server with
IPv6, these FTP commands can't be disabled even if asked to with the
available libcurl options.
2004-11-29 21:25:07 +00:00
Daniel Stenberg
c073625fb9 zero terminate the buffer spitout() returns, as the sws.c code depends on
that!
2004-11-29 18:26:09 +00:00
Daniel Stenberg
85dd4bfb8d make it possible for a test case to depend on the feature 'libz' 2004-11-29 12:23:02 +00:00
Daniel Stenberg
5ae34aa8e1 killed trailing whitespace 2004-11-29 12:11:46 +00:00
Daniel Stenberg
0eb8414750 Enable test cases to provide sections base64-encoded to be able to test
with binary data.
2004-11-29 12:10:09 +00:00
Daniel Stenberg
09717d3fc8 utility to base encode data passed on stdin 2004-11-29 12:09:05 +00:00
Daniel Stenberg
81a3246a56 stricter newline policy 2004-11-29 12:01:07 +00:00
Daniel Stenberg
4c8fbe9abf spell 2004-11-29 08:47:33 +00:00
Daniel Stenberg
c0d448f778 if gmtime() returns NULL, this returns -1 to bail out nicely 2004-11-29 08:10:10 +00:00
Daniel Stenberg
16e9a9eaef removed one we won't do, removed the CWD optimize as it is (partly) done 2004-11-28 13:04:34 +00:00
Daniel Stenberg
0d7446c134 add more info to the stderr output 2004-11-28 08:57:03 +00:00
Daniel Stenberg
a4752673bb typecast the coversion from long to int 2004-11-27 09:27:48 +00:00
Daniel Stenberg
9a0d5c4ed8 progress meter newline 2004-11-26 21:35:14 +00:00
Gisle Vanem
d85bc18178 I changed my mind. Remove ioctl() macro in setup.h instead. 2004-11-26 16:08:15 +00:00
Gisle Vanem
f0e66d8c76 Added anyauthput.exe. 2004-11-26 15:04:15 +00:00
Gisle Vanem
af114358c8 Renamed urldata.h members 'ioctl*' to 'ioctrl*' due to
clash with djgpp ioctl() macro in setup.h.
2004-11-26 14:57:01 +00:00
Daniel Stenberg
ffe17a8197 As reported in Mandrake's bug tracker bug 12289
(http://qa.mandrakesoft.com/show_bug.cgi?id=12289), curl would print a newline
to "finish" the progress meter after each redirect and not only after a
completed transfer.
2004-11-26 14:33:13 +00:00
Daniel Stenberg
2459e1e268 removed no longer used variable 2004-11-26 08:52:18 +00:00
Daniel Stenberg
a34a4af36a last-second-before-commit changes corrected 2004-11-26 08:41:39 +00:00
Daniel Stenberg
bf51f05a50 FTP improvements:
If EPSV, EPRT or LPRT is tried and doesn't work, it will not be retried on
the same server again even if a following request is made using a persistent
connection.

If a second request is made to a server, requesting a file from the same
directory as the previous request operated on, libcurl will no longer make
that long series of CWD commands just to end up on the same spot. Note that
this is only for *exactly* the same dir. There is still room for improvements
to optimize the CWD-sending when the dirs are only slightly different.

Added test 210, 211 and 212 to verify these changes. Had to improve the
test script too and added a new primitive to the test file format.
2004-11-25 22:21:49 +00:00
Daniel Stenberg
5d94ff5974 made the code fit within 80 cols 2004-11-25 16:49:14 +00:00
Daniel Stenberg
0d4ddfa743 mingw _has_ a ftruncate() but it doesn't work with 64bit file sizes so we
can just safely pretend we don't have one
2004-11-24 22:11:18 +00:00
Gisle Vanem
56c9899832 Provide a 64-bit capable ftruncate(). MingW has one, but
it takes only 32-bit offsets.
2004-11-24 19:34:25 +00:00
Daniel Stenberg
7b3fba1ad5 added missing new error string 2004-11-24 18:25:33 +00:00
Daniel Stenberg
700e3b685a mingw has a ftruncate() function 2004-11-24 16:16:36 +00:00
Daniel Stenberg
3e1caa6185 HTTP "auth done right". See lib/README.httpauth 2004-11-24 16:11:35 +00:00
Daniel Stenberg
50eafb7668 decided to skip the MSVC makefile fixes, nobody seems to really want them
and they are rather excessive
2004-11-24 16:08:41 +00:00
Daniel Stenberg
25559ac02e Andrs Garca fixed the configure script to detect select properly when run
with Msys/Mingw on Windows.
2004-11-24 15:49:43 +00:00
Gisle Vanem
51a87fa652 Clarify the static vs. import lib issue on Win32. 2004-11-24 15:14:42 +00:00
Daniel Stenberg
b2dad0342f added a bunch of people who really deserve to be here 2004-11-23 22:15:49 +00:00
Daniel Stenberg
a5abce7982 oops, use the precheck too! 2004-11-23 10:05:10 +00:00
Daniel Stenberg
de3f22b288 cut out release with no issue to fix 2004-11-23 09:52:56 +00:00
Daniel Stenberg
be5cc378c8 introducing the client/precheck concept to allow test 518 to *only* run when
it actually can run and test the FD_SETSIZE stuff it is meant to test
2004-11-23 09:50:16 +00:00
Daniel Stenberg
4afc4aed73 yet another binding 2004-11-23 09:22:23 +00:00
Daniel Stenberg
a4e1ac7952 David Phillips fix for test 518 and my extension to make it not run on
systems that can't run it fine.
2004-11-22 22:26:46 +00:00
Daniel Stenberg
f84d2b4d36 trying a version with URLs for all function calls 2004-11-22 16:24:46 +00:00
Daniel Stenberg
b4c7876e4b issue 52 is fixed, I work on 51 2004-11-22 15:49:17 +00:00
Daniel Stenberg
4207ef3d27 removed trailing whitespace 2004-11-22 14:41:36 +00:00
Daniel Stenberg
b3572269a4 removed unused variable and trailing whitespace 2004-11-22 14:41:24 +00:00
Daniel Stenberg
097d449cc1 remove curl_ prefix from functions not present in libcurl 2004-11-22 14:07:23 +00:00
Daniel Stenberg
7f44713487 re-indented to curl style 2004-11-22 13:48:35 +00:00
Daniel Stenberg
b7a6b78e0c renamed curl_thread to my_thread to avoid confusion 2004-11-22 13:43:52 +00:00
Daniel Stenberg
855a9eff76 add URLs in comments for all libcurl function calls 2004-11-22 13:39:23 +00:00
Daniel Stenberg
8e34e75100 Curl_select's timeout arg is an int 2004-11-22 13:28:44 +00:00
Daniel Stenberg
4be60ac155 the FD_SETSIZE problem is fixed 2004-11-21 23:13:13 +00:00
Daniel Stenberg
5ec4501b9d The FD_SETSIZE issue is already sorted, at least internally. We still need
to provide a better multi-API to allow apps to avoid select().
2004-11-21 13:18:36 +00:00
Daniel Stenberg
e80f566a14 added comment for windows people about READFUNCTION being needed 2004-11-21 12:42:28 +00:00
Daniel Stenberg
1729918777 Dan Fandrich fix to compile with libc5 2004-11-20 08:57:56 +00:00
Gisle Vanem
cef290c6b4 Enable >2GB files for MingW. 2004-11-19 15:15:52 +00:00
Gisle Vanem
539e34b5df Suppress signed vs. unsigned warnings on Win32 2004-11-19 14:38:02 +00:00
Daniel Stenberg
765683403f Curl_select() now uses curl_socket_t on socket arguments 2004-11-19 14:03:19 +00:00
Gisle Vanem
cca9fca894 ifdef for portable "/dev/null". 2004-11-19 13:50:41 +00:00
Gisle Vanem
2b403db811 Winsock sockets are not in range 0..FD_SETSIZE.
Shouldn't Curl_select() use curl_socket_t ?
2004-11-19 13:46:58 +00:00
Daniel Stenberg
03e7b7c95f add select.obj 2004-11-19 13:45:46 +00:00
Daniel Stenberg
1a05a90f1c David Phillips' FD_SETSIZE fix 2004-11-19 08:52:33 +00:00
Daniel Stenberg
dcea109bb5 Dan Fandrich fix: eliminates some pedantic CodeWarrior compiler warnings and
errors.
2004-11-18 14:04:40 +00:00
Gisle Vanem
d46a573bbe Added revision tag. 2004-11-16 17:15:07 +00:00
Daniel Stenberg
7d0d19708a Added README.httpauth to the dist 2004-11-16 14:24:54 +00:00
Daniel Stenberg
09f14efade saved for the future 2004-11-16 14:02:24 +00:00
Daniel Stenberg
87753cda49 mention the openssl callbacks for SSL multithread 2004-11-16 08:49:51 +00:00
Daniel Stenberg
66f6f43056 added test case 517: 22 tests of the curl_getdate() function 2004-11-15 21:49:35 +00:00
Daniel Stenberg
86f059dcfb tiny format fix for nicer man output 2004-11-15 21:41:21 +00:00
Daniel Stenberg
5931d43a36 clean up start time and t_startsingle use so that redirect_time works properly 2004-11-15 11:27:03 +00:00
Daniel Stenberg
8475a0df2f new -w variables supported 2004-11-15 11:25:39 +00:00
Gisle Vanem
ccc4c9c02c Added top_srcdir. 2004-11-15 10:41:58 +00:00
Gisle Vanem
16edb15600 Added revision id, test for USE_ARES.
Uses Makefile.inc.
2004-11-15 10:38:34 +00:00
Daniel Stenberg
9e7534a46e binding for R 2004-11-15 08:54:29 +00:00
Gisle Vanem
737dddaec0 Changes for static/dynamic linking of libcurl.
No need to generate a dummy sys/utime.h. Cleanup.
2004-11-14 13:51:33 +00:00
Gisle Vanem
b5c90c9b05 Borland doesn't have <sys/utime.h>, utime() nor
_lseeki64().
2004-11-14 13:50:21 +00:00
Gisle Vanem
c3ecd552f5 Borland doesn't have <sys/utime.h> nor utime(). 2004-11-14 13:49:09 +00:00
Gisle Vanem
56f0227c92 Static lib is libcurl.lib and import lib libcurl_imp.lib.
Added implib command. Cleanup
2004-11-14 13:48:15 +00:00
Daniel Stenberg
dcb5a4df01 Dan fixed the CURL_DISABLE_VERBOSE_STRINGS stuff for older gcc versions since
they don't support C99 varargs macros.
2004-11-13 21:57:33 +00:00
Gisle Vanem
fd64213c2f MingW/djgpp: Use GNU make's internal 'cd' to avoid shell-troubles. 2004-11-13 16:57:56 +00:00
Gisle Vanem
fc2c06754c Fix location of timeval.c. 2004-11-13 16:55:53 +00:00
Gisle Vanem
7ec200f4d1 Update comment. 2004-11-13 16:54:26 +00:00
Gisle Vanem
e53f139925 Add "-DCURL_STATICLIB" for static build.
Add ../lib/timeval.c for objects.
2004-11-13 15:47:17 +00:00
Gisle Vanem
61599ceb7b Renamed import lib to "libcurl_imp.lib".
Some cleanup and making it more readable.
2004-11-13 14:17:41 +00:00
Gisle Vanem
6f8e3f106a Set OpenSSL path to same as in ../lib/Makefile.vc6.
Import lib is now "libcurl_imp.lib".
Some cleanup and making it more readable.
2004-11-13 14:17:24 +00:00
Gisle Vanem
8fd676f73e MSVC with static link must define CURL_STATICLIB.
zlib path set to same as in lib/Makefile.vc6.
2004-11-12 11:48:02 +00:00
Gisle Vanem
98a8103a3b Netware target (hosted on Linux gcc) doesn't support
or need __declspec.
2004-11-12 11:45:05 +00:00
Daniel Stenberg
94043b1150 Dan Fandrich added the --disable-crypto-auth option to configure to allow
libcurl to build without Digest support. (I figure it should also explicitly
disable Negotiate and NTLM.)
2004-11-12 09:18:14 +00:00
Daniel Stenberg
1b02ad5e8a format mistake fixed 2004-11-12 06:42:30 +00:00
Daniel Stenberg
4897587615 Dan Fandrich can spell, I cannot 2004-11-11 23:13:59 +00:00
Daniel Stenberg
8e2f57c82e Dan Fandrich: make --disable-dict actually disable dict 2004-11-11 23:13:06 +00:00
Daniel Stenberg
c3323b1902 clarify and update according to commit made just now 2004-11-11 23:11:32 +00:00
Daniel Stenberg
59c063dfd3 Fix behaviour when passing NULL to CURLOPT_POSTFIELDS and CURLOPT_HTTPPOST. 2004-11-11 23:11:04 +00:00
Daniel Stenberg
8c16696f47 fix a IDN detect/use mistake 2004-11-11 22:01:53 +00:00
Daniel Stenberg
f68950db67 added some details on what to come 2004-11-11 16:56:34 +00:00
Daniel Stenberg
710e370c34 Dan Fandrich added --disable-verbose 2004-11-11 16:34:24 +00:00
Daniel Stenberg
7bb6d76d14 When libidn is detected without explicitly told to, we provide -L/lib and
-I/include options. Not anymore.
2004-11-11 14:41:37 +00:00
Daniel Stenberg
2467f814a8 fix the -I path to the proper include dir when --enable-debug is used 2004-11-11 14:15:41 +00:00
Gisle Vanem
a654ef9ee6 Adapted for C++. 2004-11-11 12:25:40 +00:00
Daniel Stenberg
c1688733c1 recent fixes 2004-11-11 09:51:12 +00:00
Daniel Stenberg
cd73a733c7 dates from 2038 or later now return 0x7fffffff when 32 bit time_t is used 2004-11-11 09:26:09 +00:00
Daniel Stenberg
8ef8e949bd fix curl.h include 2004-11-11 08:03:43 +00:00
Daniel Stenberg
49111a63e6 configure --with-gssapi fix 2004-11-10 21:43:41 +00:00
Daniel Stenberg
ee4ecf5155 Gisle's CURL_EXTERN fix 2004-11-10 15:50:33 +00:00
Gisle Vanem
3478253e5a Replace IsNT with IS_NT(). 2004-11-10 14:30:25 +00:00
Gisle Vanem
6ddc59dadf Replace IsNT with IS_NT().
Return correct timeval in windows_port.c.
Squelch gcc warnings:
  use 'ares_socket_t' in ares_fds.c.
  Don't cast a 'lvalue' in ares_init.c.
2004-11-10 14:23:20 +00:00
Daniel Stenberg
dc8688b8dc fix CURL_EXTERN for debug builds 2004-11-09 18:10:51 +00:00
Gisle Vanem
865e495188 Handle drive-letter on MS-DOS. 2004-11-09 14:57:11 +00:00
Gisle Vanem
d3c0ed007e Removed libcurl.def 2004-11-09 14:55:23 +00:00
Daniel Stenberg
0dc79376e7 with all external functions marked with CURL_EXTERN it is easy to count them
and... yes, they are 46!
2004-11-09 14:42:04 +00:00
Gisle Vanem
3ccbed1022 Changes for removing libcurl.def file on Win32.
Mark public functions with "CURL_EXTERN".
2004-11-09 14:02:58 +00:00
Gisle Vanem
377e43fbb9 Changes for removing libcurl.def file on Win32.
Added "CURL_EXTERN" to memdebug.h functions.
Cleaned up Makefile.vc6.
2004-11-09 14:00:56 +00:00
Daniel Stenberg
1f2b042b95 today's work 2004-11-08 21:39:18 +00:00
Daniel Stenberg
fd49ba6c18 another lame change in an attempt to fix the moot gcc 3.4 warning 2004-11-08 21:31:57 +00:00
Daniel Stenberg
facfa19cdd weirdo hack to fix debian bug report 278691:
'curl -v writes debugging to its network socket if stderr is closed'
2004-11-08 19:41:28 +00:00
Daniel Stenberg
3347ced899 added a default in the switch in an attempt to avoid the moot "will never be
executed" warning by gcc 3.4.0
2004-11-08 14:46:05 +00:00
Gisle Vanem
592686bee9 Change OS name. Fix header guard. 2004-11-08 14:21:24 +00:00
Gisle Vanem
f471a293ea Un-do changes for WinCE; cdecl decoration is not needed.
Confirmed by Paul Nolan.
2004-11-08 14:20:14 +00:00
Daniel Stenberg
c688166066 check for and require tld.h to be present before libidn usage is activated
in the build, since libidn 0.3.X didn't have the header and we don't support
that old libidn versions anyway.

This was mentioned on the list by Jean-Philippe Barrette-LaPierre and in bug
report #1062264.
2004-11-08 07:47:08 +00:00
Daniel Stenberg
5dcd2710d4 two post-1.2.1 changes 2004-11-07 23:48:42 +00:00
Daniel Stenberg
16d8383625 added ares_cancel and ares_version 2004-11-07 13:37:07 +00:00
Daniel Stenberg
6b49fd7483 Tim Sneddon's VMS fix for huge HTTP POSTs 2004-11-05 14:43:35 +00:00
Daniel Stenberg
f10985fc50 removed errno, added EAGAIN 2004-11-05 08:22:46 +00:00
Daniel Stenberg
edeac97773 it has a sys/stat.h file, according to Paul Nolan 2004-11-05 08:19:34 +00:00
Daniel Stenberg
40498ffdd0 update 2004-11-04 16:18:50 +00:00
Daniel Stenberg
fd884a3cd2 more retry stuff 2004-11-04 16:17:23 +00:00
Daniel Stenberg
1887629c5c test server port numbers are now easily changed 2004-11-04 16:15:26 +00:00
Daniel Stenberg
d3be5b2725 delete trailing whitespace 2004-11-04 16:14:33 +00:00
Daniel Stenberg
2e973684c0 based Andres Garcia's patch, added for mingw build 2004-11-04 14:19:22 +00:00
Daniel Stenberg
ab909fc4c2 recent changes 2004-11-02 21:46:27 +00:00
Daniel Stenberg
4cd5220d27 use ifdef not if 2004-11-02 14:02:29 +00:00
Daniel Stenberg
24d47a6e07 Paul Nolan fix to make libcurl build nicely on Windows CE 2004-11-02 10:12:22 +00:00
Daniel Stenberg
8a66584db4 documented the current --retry options 2004-11-02 09:43:50 +00:00
Daniel Stenberg
186f433e40 modified to not use realloc() on a NULL pointer 2004-11-02 08:26:55 +00:00
Daniel Stenberg
736a40fec9 When cross-compiling, the configure script no longer attempts to use
pkg-config on the build host in order to detect OpenSSL compiler options.
2004-11-01 22:50:59 +00:00
Gisle Vanem
4245400ae4 Fixed _write() arguments. 2004-10-28 13:18:09 +00:00
Gisle Vanem
629bba6b35 *** empty log message *** 2004-10-28 13:13:29 +00:00
Daniel Stenberg
f6f2a9e4be use longs 2004-10-28 07:23:19 +00:00
Daniel Stenberg
8bfcae65ef Dan Fandrich's gzip handling fix 2004-10-27 21:46:11 +00:00
Daniel Stenberg
96cf615e9d Added --retry and --retry-delay first attempt with four related test cases. 2004-10-27 21:29:55 +00:00
Daniel Stenberg
e9b3e1d031 log client disconnects 2004-10-27 14:18:57 +00:00
Daniel Stenberg
7167cde020 Testing to define _REENTRANT unconditionally in here. 2004-10-26 13:31:55 +00:00
Daniel Stenberg
2a80a4c521 mention how LDFLAGS=-R can be used (or LD_LIBRARY_PATH or ld.so.conf) 2004-10-26 08:09:16 +00:00
Daniel Stenberg
83f11b1c9b mention incompatibilities with ares 2004-10-26 08:08:41 +00:00
Daniel Stenberg
a00e7f0f5e Tomas Pospisek filed bug report #1053287 that proved -C - and --fail on a
file that was already completely downloaded caused an error, while it
doesn't if you don't use --fail! I added test case 194 to verify the fix.
Grrr. CURLOPT_FAILONERROR is now added to the list stuff to remove in
libcurl v8 due to all the kludges needed to support it.
2004-10-25 11:28:40 +00:00
Daniel Stenberg
e1607f5705 just nicer output when this is seen 2004-10-25 11:28:15 +00:00
Daniel Stenberg
cce931f27d the array sizes _can_ differ and the arrays can still match, since chomp
is used at times but it doesn't decrease the array size
2004-10-25 11:28:01 +00:00
Daniel Stenberg
34089c93bb format update 2004-10-25 11:05:37 +00:00
Daniel Stenberg
beb61ef429 Mohun Biswas found out that formposting a zero-byte file didn't work very
good. I fixed.
2004-10-24 22:31:40 +00:00
Daniel Stenberg
72aff74798 ignore this 2004-10-24 13:02:46 +00:00
Daniel Stenberg
8e715af480 maketgz now creates a ares_version.h.dist file with the given version data
properly set, and the Makefile.am is now fixed to use that when building
a new package with make dist.
2004-10-24 13:02:09 +00:00
Daniel Stenberg
2730842559 Dan Fandrich's better ifdef for include fix 2004-10-21 08:22:07 +00:00
Daniel Stenberg
cac269cf91 1.2.1 release time 2004-10-20 08:01:38 +00:00
Daniel Stenberg
249036ada0 this change was reverted since it broke on solaris 2004-10-19 18:50:46 +00:00
Daniel Stenberg
18d80b9e8f iconv 2.1.3 is considered bad for test case 165 2004-10-19 18:49:31 +00:00
Daniel Stenberg
b2d8e0b476 revert the charset fix as it broke the solaris tests (native iconv doesn't
like that name)
2004-10-19 18:46:12 +00:00
Daniel Stenberg
225a652021 Ralph Mitchell fixed: input field with NAME= and VALUE= weren't processed
properly case insensitive
2004-10-19 18:36:17 +00:00
Daniel Stenberg
38b1d96750 Alexander Krasnostavsky made it possible to make FTP 3rd party transfers with
both source and destination being the same host. It can be useful if you want
to move a file on a server or similar.
2004-10-19 18:26:35 +00:00
Daniel Stenberg
2f069ad3e2 snart isn't really used these days so we cut out the reference to it 2004-10-19 15:34:05 +00:00
Daniel Stenberg
a3dbe03e80 added num_connects 2004-10-19 15:32:31 +00:00
Daniel Stenberg
f4bef25b5e CURLINFO_NUM_CONNECTS and more 2004-10-19 15:30:08 +00:00
Gisle Vanem
ebf7d22503 djgpp has locale.h and setlocale(). 2004-10-19 10:14:06 +00:00
Gisle Vanem
9296d9deb8 All Win compilers have locale.h + setlocale(). 2004-10-19 10:13:26 +00:00
Daniel Stenberg
7b95a25adc bug 1049275 fixes test 165 2004-10-19 06:04:25 +00:00
Daniel Stenberg
82d6cfa7fc Peter Wullinger pointed out that curl should call setlocale() properly to
initiate the specific language operations, to make the IDN stuff work better.
2004-10-18 13:37:18 +00:00
Daniel Stenberg
48750d5fc7 start over on 7.12.3 2004-10-18 08:42:44 +00:00
399 changed files with 11462 additions and 3553 deletions

585
CHANGES
View File

@@ -6,6 +6,591 @@
Changelog Changelog
Version 7.13.0 (1 February 2005)
Daniel (31 January 2005)
- Added Lars Nilsson's htmltitle.cc example
Daniel (30 January 2005)
- Fixed a memory leak when using the multi interface and the DO operation
failed (as in test case 205).
- Fixed a valgrind warning for file:// operations.
- Fixed a valgrind report in the url globbing code for the curl command line
tool.
- Bugfixed the parser that scans the valgrind report outputs (in runtests.pl).
I noticed that it previously didn't detect and report the "Conditional jump
or move depends on uninitialised value(s)" error. When I fixed this, I
caught a few curl bugs with it. And then I had to spend time to make the
test suite IGNORE these errors when OpenSSL is used since it produce massive
amounts of valgrind warnings (but only of the "Conditional..." kind it
seems). So, if a test that requires SSL is run, it ignores the
"Conditional..." errors, and you'll get a "valgrind PARTIAL" output instead
of "valgrind OK".
Daniel (29 January 2005)
- Using the multi interface, and doing a requsted a re-used connection that
gets closed just after the request has been sent failed and did not re-issue
a request on a fresh reconnect like the easy interface did. Now it does!
- Define CURL_MULTIEASY when building libcurl (lib/easy.c to be exact), to use
my new curl_easy_perform() that uses the multi interface to run the
request. It is a great testbed for the multi interface and I believe we
shall do it this way for real in the future when we have a successor to
curl_multi_fdset(). I've used this approach to detect and fix several of the
recent multi-interfaces issues.
- Adjusted the KNOWN_BUGS #17 fix a bit more since the FTP code also did some
bad assumptions.
- multi interface: when a request is denied due to "Maximum redirects
followed" libcurl leaked the last Location: URL.
- Connect failures with the multi interface was often returned as "connect()
timed out" even though the reason was different.
Daniel (28 January 2005)
- KNOWN_BUGS #17 fixed. A DNS cache entry may not remain locked between two
curl_easy_perform() invokes. It was previously unlocked at disconnect, which
could mean that it remained locked between multiple transfers. The DNS cache
may not live as long as the connection cache does, as they are separate.
To deal with the lack of DNS (host address) data availability in re-used
connections, libcurl now keeps a copy of the IP adress as a string, to be
able to show it even on subsequent requests on the same connection.
The problem could be made to appear with this stunt:
1. create a multi handle
2. add an easy handle
3. fetch a URL that is persistent (leaves the connection alive)
4. remove the easy handle from the multi
5. kill the multi handle
6. create a multi handle
7. add the same easy handle to the new multi handle
8. fetch a URL from the same server as before (re-using the connection)
- Stephen More pointed out that CURLOPT_FTPPORT and the -P option didn't work
when built ipv6-enabled. I've now made a fix for it. Writing test cases for
custom port hosts turned too tricky so unfortunately there's none.
Daniel (25 January 2005)
- Ian Ford asked about support for the FTP command ACCT, and I discovered it
is present in RFC959... so now (lib)curl supports it as well. --ftp-account
and CURLOPT_FTP_ACCOUNT set the account string. (The server may ask for an
account string after PASS have been sent away. The client responds
with "ACCT [account string]".) Added test case 228 and 229 to verify the
functionality. Updated the test FTP server to support ACCT somewhat.
- David Shaw contributed a fairly complete and detailed autoconf test you can
use to detect libcurl and setup variables for the protocols the installed
libcurl supports: docs/libcurl/libcurl.m4
Daniel (21 January 2005)
- Major FTP third party transfer overhaul.
These four options are now obsolete: CURLOPT_SOURCE_HOST,
CURLOPT_SOURCE_PATH, CURLOPT_SOURCE_PORT (this option didn't work before)
and CURLOPT_PASV_HOST.
These two options are added: CURLOPT_SOURCE_URL and CURLOPT_SOURCE_QUOTE.
The target-side didn't use the proper path with RETR, and thus this only
worked correctly in the login path (i.e without doing any CWD). The source-
side still uses a wrong path, but the fix for this will need to wait. Verify
the flaw by using a source URL with included %XX-codes.
Made CURLOPT_FTPPORT control weather the target operation should use PORT
(or not). The other side thus uses passive (PASV) mode.
Updated the ftp3rdparty.c example source to use the updated options.
Added support for a second FTP server in the test suite. Named... ftp2.
Added test cases 230, 231 and 232 as a few first basic tests of very simple
3rd party transfers.
Changed the debug output to include 'target' and 'source' when a 3rd party
is being made, to make it clearer what commands/responses came on what
connection.
Added three new command line options: --3p-url, --3p-user and --3p-quote.
Documented the command line options and the curl_easy_setopt options related
to third party transfers.
(Temporarily) disabled the ability to re-use an existing connection for the
source connection. This is because it needs to force a new in case the
source and target is the same host, and the host name check is trickier now
when the source is identified with a full URL instead of a plain host name
like before.
TODO (short-term) for 3rd party transfers: quote support. The options are
there, we need to add test cases to verify their functionality.
TODO (long-term) for 3rd party transfers: IPv6 support (EPRT and EPSV etc)
and SSL/TSL support.
Daniel (20 January 2005)
- Philippe Hameau found out that -Q "+[command]" didn't work, although some
code was written for it. I fixed and added test case 227 to verify it.
The curl.1 man page didn't mention the '+' so I added it.
Daniel (19 January 2005)
- Stephan Bergmann made libcurl return CURLE_URL_MALFORMAT if an FTP URL
contains %0a or %0d in the user, password or CWD parts. (A future fix would
include doing it for %00 as well - see KNOWN_BUGS for details.) Test case
225 and 226 were added to verify this
- Stephan Bergmann pointed out two flaws in libcurl built with HTTP disabled:
1) the proxy environment variables are still read and used to set HTTP proxy
2) you couldn't disable http proxy with CURLOPT_PROXY (since the option was
disabled). This is important since apps may want to disable HTTP proxy
without actually knowing if libcurl was built to disable HTTP or not.
Based on Stephan's patch, both these issues should now be fixed.
Daniel (18 January 2005)
- Cody Jones' enhanced version of Samuel D<>az Garc<72>a's MSVC makefile patch was
applied.
Daniel (16 January 2005)
- Alex aka WindEagle pointed out that when doing "curl -v dictionary.com", curl
assumed this used the DICT protocol. While guessing protocols will remain
fuzzy, I've now made sure that the host names must start with "[protocol]."
for them to be a valid guessable name. I also removed "https" as a prefix
that indicates HTTPS, since we hardly ever see any host names using that.
Daniel (13 January 2005)
- Inspired by Martijn Koster's patch and example source at
http://www.greenhills.co.uk/mak/gentoo/curl-eintr-bug.c, I now made the
select() and poll() calls properly loop if they return -1 and errno is
EINTR. glibc docs for this is found here:
http://www.gnu.org/software/libc/manual/html_node/Interrupted-Primitives.html
This last link says BSD doesn't have this "effect". Will there be a problem
if we do this unconditionally?
Daniel (11 January 2005)
- Dan Torop cleaned up a few no longer used variables from David Phillips'
select() overhaul fix.
- Cyrill Osterwalder posted a detailed analysis about a bug that occurs when
using a custom Host: header and curl fails to send a request on a re-used
persistent connection and thus creates a new connection and resends it. It
then sent two Host: headers. Cyrill's analysis was posted here:
http://curl.haxx.se/mail/archive-2005-01/0022.html
- Bruce Mitchener identified (bug report #1099640) the never-ending SOCKS5
problem with the version byte and the check for bad versions. Bruce has lots
of clues on this, and based on his suggestion I've now removed the check of
that byte since it seems to be able to contain 1 or 5.
Daniel (10 January 2005)
- Pavel Orehov reported memory problems with the multi interface in bug report
#1098843. In short, a shared DNS cache was setup for a multi handle and when
the shared cache was deleted before the individual easy handles, the latter
cleanups caused read/writes to already freed memory.
- Hzhijun reported a memory leak in the SSL certificate code, that leaked the
remote certificate name when it didn't match the used host name.
Gisle (8 January 2005)
- Added Makefile.Watcom files (src/lib). Updated Makefile.dist.
Daniel (7 January 2005)
- Improved the test script's valgrind log parser to actually work! Also added
the ability to disable the log scanner for specific test cases. Test case
509 results in numerous problems and leaks in OpenSSL and has to get it
disabled.
Daniel (6 January 2005)
- Fixed a single-byte read out of bounds in test case 39 in the curl tool code
(i.e not in the library).
- Bug report #1097019 identified a problem when doing -d "data" with -G and
sending it to two URLs with {}. Added test 199 to verify the fix.
Daniel (4 January 2005)
- Marty Kuhrt adjusted a VMS build script slightly
- Kai Sommerfeld and Gisle Vanem fixed libcurl to build with IPv6 support on
Win2000.
Daniel (2 January 2005)
- Alex Neblett updated the MSVC makefiles slightly.
Daniel (25 December 2004)
- Removed src/config.h.in from CVS, it is now copied from the (generated)
lib/config.h.in instead, as they can very well be the same. This removes a
"manual hassle". You may want to re-run buildconf now.
- Werner Koch filed Debian bug report #286794, mentioning that curl contained
non-free (by Debian's view) source code. This was Angus Mackay's
src/getpass.c source code. I tried to contact him about it to quickly solve
this issue, but his email addresses bounce and I got some time "over" and
reimplemented the functionality once brought by Angus. We no longer use any
of Angus' original code and the new function is much simpler (IMO). Issue
solved.
Daniel (24 December 2004)
- David Shaw added --protocols to curl-config, so that it now lists all
protocols libcurl was built to support. --feature no longer lists disabled
protocols.
Daniel (23 December 2004)
- David Shaw fixed the configure --disable-[protocol] variables so that
curl-config --feature now works correctly!
Daniel (22 December 2004)
- Rune Kleveland fixed a minor memory leak for received cookies with the
(rare) version attribute set.
- Marcin Konicki provided two configure fixes and a source fix to make curl
build out-of-the-box on BeOS.
Daniel (21 December 2004)
- Added test case 217 that verified CURLINFO_HTTP_CONNECTCODE, and I made the
-w option support 'http_connect' to make it easier to verify!
- Fixed lib/select.c include order to build fine on FreeBSD
- Fixed failf()'s reuse of the va_list variable that crashed on FreeBSD.
Pointed out by Peter Pentchev.
Version 7.12.3 (20 December 2004)
Daniel (19 December 2004)
- I investigated our PKCS12 build problem on Solaris 2.7 with OpenSSL 0.9.7e,
and it turned out to be the fault of the zlib 1.1.4 headers doing a typedef
named 'free_func' and the OpenSSL headers have a prototype that uses
'free_func' in one of its arguments. This is why the compile errors out.
In other words, we need to include the openssl/pkcs12.h header before the
zlib.h header and it builds fine. The configure script now checks for this
file and it then gets included early in lib/urldata.h.
Daniel (18 December 2004)
- Samuel Listopad added support for PKCS12 formatted certificates.
- Samuel Listopad fixed -E to support "C:/path" (with forward slash) as well.
Daniel (16 December 2004)
- Gisle found and fixed a problem in the directory re-use for FTP.
I added test case 215 and 216 to better verify the functionality.
- Dinar in bug report #1086121, found a file handle leak when a multipart
formpost (including a file upload part) was aborted before the whole file
was sent.
Daniel (15 December 2004)
- Tom Lee found out that globbing of strings with backslashes didn't work as
you'd expect. Backslashes are such a central part of windows file names that
forcing backslashes to have to be escaped with backslashes is a bit too
awkward to users. Starting now, you only need to escape globbing characters
such as the five letters: "[]{},". Added test case 214 to verify this.
Daniel (14 December 2004)
- Harshal Pradhan patched a HTTP persistent connection flaw: if the user name
and/or password were modified between two requests on a persistent
connection, the second request were still made with the first setup!
I added test case 519 to verify the fix.
Daniel (13 December 2004)
- Gisle added CURLINFO_SSL_ENGINES to curl_easy_getinfo() to allow an app
to list all available crypto ENGINES.
- Gisle fixed bug report #1083542, which pointed out a problem with resuming
large file (>4GB) file:// transfers on windows.
Daniel (11 December 2004)
- Made the test suite HTTP server (sws) capable of using IPv6, and then
extended the test environment to support that and also added three test
cases (240, 241, 242) that run tests using IPv6. Test 242 uses a URL that
didn't work before the 10 dec fix by Kai Sommerfeld.
- Made a failed file:// resume output an error message
- Corrected the CURLE_BAD_DOWNLOAD_RESUME error message in lib/strerror.c
- Dan Fandrich:
simplified and consolidated the SSL checks in configure and the usage of the
defines in lib/setup.h
provided a first libcurl.pc.in file for pkg-config (but the result is not
installed anywhere at this point)
extended the cross compile section in the docs/INSTALL file
Daniel (10 December 2004)
- When providing user name in the URL and a IPv6-style IP-address (like in
"ftp://user@[::1]/tmp"), the URL parser didn't get the host extracted
properly. Reported and fixed by Kai Sommerfeld.
Daniel (9 December 2004)
- Ton Voon provided a configure fix that should fix the notorious (mostly
reported on Solaris) problem where the size_t check fails due to the SSL
libs being found in a dir not searched through by the run-time linker.
patch-tracker entry #1081707.
- Bryan Henderson pointed out in bug report #1081788 that the curl-config
--vernum output wasn't zero prefixed properly (as claimed in documentation).
This is fixed in maketgz now.
Daniel (8 December 2004)
- Matt Veenstra updated the mach-O framework files for Mac OS X.
- Rene Bernhardt found and fixed a buffer overrun in the NTLM code, where
libcurl always and unconditionally overwrote a stack-based array with 3 zero
bytes. This is not an exploitable buffer overflow. No need to get alarmed.
Daniel (7 December 2004)
- Fixed so that the final error message is sent to the verbose info "stream"
even if no errorbuffer is set.
Daniel (6 December 2004)
- Dan Fandrich added the --disable-cookies option to configure to build
libcurl without cookie support. This is mainly useful if you want to build a
minimalistic libcurl with no cookies support at all. Like for embedded
systems or similar.
- Richard Atterer fixed libcurl's way of dealing with the EPSV
response. Previously, libcurl would re-resolve the host name with the new
port number and attempt to connect to that, while it should use the IP from
the control channel. This bug made it hard to EPSV from an FTP server with
multiple IP addresses!
Daniel (3 December 2004)
- Bug report #1078066: when a chunked transfer was pre-maturely closed exactly
at a chunk boundary it was not considered an error and thus went unnoticed.
Fixed by Maurice Barnum.
Added test case 207 to verify.
Daniel (2 December 2004)
- Fixed the CONNECT loop to default timeout to 3600 seconds.
Added test case 206 that makes CONNECT with Digest.
Fixed a flaw that prepended "(nil)" to the initial CONNECT rqeuest's user-
agent field.
Daniel (30 November 2004)
- Dan Fandrich's fix for libz 1.1 and "extra field" usage in a gzip stream
- Dan also helped me with input data to create three more test cases for the
--compressed option.
Daniel (29 November 2004)
- I improved the test suite to enable binary contents in the tests (by proving
it base64 encoded), like for testing decompress etc. Added test 220 and 221
for this purpose. Tests can now also depend on libz to run.
- As reported by Reinout van Schouwen in Mandrake's bug tracker bug 12285
(http://qa.mandrakesoft.com/show_bug.cgi?id=12285), when connecting to an
IPv6 host with FTP, --disable-epsv (or --disable-eprt) effectively disables
the ability to transfer a file. Now, when connected to an FTP server with
IPv6, these FTP commands can't be disabled even if asked to with the
available libcurl options.
Daniel (26 November 2004)
- As reported in Mandrake's bug tracker bug 12289
(http://qa.mandrakesoft.com/show_bug.cgi?id=12289), curl would print a
newline to "finish" the progress meter after each redirect and not only
after a completed transfer.
Daniel (25 November 2004)
- FTP improvements:
If EPSV, EPRT or LPRT is tried and doesn't work, it will not be retried on
the same server again even if a following request is made using a persistent
connection.
If a second request is made to a server, requesting a file from the same
directory as the previous request operated on, libcurl will no longer make
that long series of CWD commands just to end up on the same spot. Note that
this is only for *exactly* the same dir. There is still room for improvements
to optimize the CWD-sending when the dirs are only slightly different.
Added test 210, 211 and 212 to verify these changes. Had to improve the
test script too and added a new primitive to the test file format.
Daniel (24 November 2004)
- Andr<64>s Garc<72>a fixed the configure script to detect select properly when run
with Msys/Mingw on Windows.
Daniel (22 November 2004)
- Made HTTP PUT and POST requests no longer use HEAD when doing multi-pass
auth negotiation (NTLM, Digest and Negotiate), but instead use the request
keyword "properly". Details in lib/README.httpauth. This also introduces
CURLOPT_IOCTLFUNCTION and CURLOPT_IOCTLDATA, to be used by apps that use the
"any" auth alternative as then libcurl may need to send the PUT/POST data
more than once and thus may need to ask the app to "rewind" the read data
stream to start.
See also the new example using this: docs/examples/anyauthput.c
- David Phillips enhanced test 518. I made it depend on a "feature" so that
systems without getrlimit() won't attempt to test 518. configure now checks
for getrlimit() and setrlimit() for this test case.
Daniel (18 November 2004)
- David Phillips fixed libcurl to not crash anymore when more than FD_SETSIZE
file descriptors are in use. Test case 518 added to verify.
Daniel (15 November 2004)
- To test my fix for the CURLINFO_REDIRECT_TIME bug, I added time_redirect and
num_redirects support to the -w writeout option for the command line tool.
- Wojciech Zwiefka found out that CURLINFO_REDIRECT_TIME didn't work as
documented.
Daniel (12 November 2004)
- Gisle Vanem modigied the MSVC and Netware makefiles to build without
libcurl.def
- Dan Fandrich added the --disable-crypto-auth option to configure to allow
libcurl to build without Digest support. (I figure it should also explicitly
disable Negotiate and NTLM.)
- *** Modified Behaviour Alert ***
Setting CURLOPT_POSTFIELDS to NULL will no longer do a GET.
Setting CURLOPT_POSTFIELDS to "" will send a zero byte POST and setting
CURLOPT_POSTFIELDS to NULL and CURLOPT_POSTFIELDSIZE to zero will also make
a zero byte POST. Added test case 515 to verify this.
Setting CURLOPT_HTTPPOST to NULL makes a zero byte post. Added test case 516
to verify this.
CURLOPT_POSTFIELDSIZE must now be set to -1 to signal "we don't know".
Setting it to zero simply says this is a zero byte POST.
When providing POST data with a read callback, setting the size up front
is now made with CURLOPT_POSTFIELDSIZE and not with CURLOPT_INFILESIZE.
Daniel (11 November 2004)
- Dan Fandrich added --disable-verbose to the configure script to allow builds
without verbose strings in the code, to save some 12KB space. Makes sense
only for systems with very little memory resources.
- Jeff Phillips found out that a date string with a year beyond 2038 could
crash the new date parser on systems with 32bit time_t. We now check for
this case and deal with it.
Daniel (10 November 2004)
- I installed Heimdal on my Debian box (using the debian package) and noticed
that configure --with-gssapi failed to create a nice build. Fixed now.
Daniel (9 November 2004)
- Gisle Vanem marked all external function calls with CURL_EXTERN so that now
the Windows, Netware and other builds no longer need libcurl.def or similar
files.
Daniel (8 November 2004)
- Made the configure script check for tld.h if libidn was detected, since
libidn 0.3.X didn't have such a header and we don't work with anything
before libidn 0.4.1 anyway! Suse 9.1 apparently ships with a 0.3.X version
of libidn which makes the curl 7.12.2 build fail. Jean-Philippe
Barrette-LaPierre helped pointing this out.
- Ian Gulliver reported in debian bug report #278691: if curl is invoked in an
environment where stderr is closed the -v output will still be sent to file
descriptor 2 which then might be the network socket handle! Now we have a
weird hack instead that attempts to make sure that file descriptor 2 is
opened (with a call to pipe()) before libcurl is called to do the transfer.
configure now checks for pipe() and systems without pipe don't get the weird
hack done.
Daniel (5 November 2004)
- Tim Sneddon made libcurl send no more than 64K in a single first chunk when
doing a huge POST on VMS, as this is a system limitation. Default on general
systems is 100K.
Daniel (4 November 2004)
- Andres Garcia made it build on mingw againa, my --retry code broke the build.
Daniel (2 November 2004)
- Added --retry-max-time that allows a maximum time that may not have been
reached for a retry to be made. If not set there is no maximum time, only
the amount of retries set with --retry.
- Paul Nolan provided a patch to make libcurl build nicely on Windows CE.
Daniel (1 November 2004)
- When cross-compiling, the configure script no longer attempts to use
pkg-config on the build host in order to detect OpenSSL compiler options.
Daniel (27 October 2004)
- Dan Fandrich:
An improvement to the gzip handling of libcurl. There were two problems with
the old version: it was possible for a malicious gzip file to cause libcurl
to leak memory, as a buffer was malloced to hold the header and never freed
if the header ended with no file contents. The second problem is that the
64 KiB decompression buffer was allocated on the stack, which caused
unexpectedly high stack usage and overflowed the stack on some systems
(someone complained about that in the mailing list about a year ago).
Both problems are fixed by this patch. The first one is fixed when a recent
(1.2) version of zlib is used, as it takes care of gzip header parsing
itself. A check for the version number is done at run-time and libcurl uses
that feature if it's present. I've created a define OLD_ZLIB_SUPPORT that
can be commented out to save some code space if libcurl is guaranteed to be
using a 1.2 version of zlib.
The second problem is solved by dynamically allocating the memory buffer
instead of storing it on the stack. The allocation/free is done for every
incoming packet, which is suboptimal, but should be dwarfed by the actual
decompression computation.
I've also factored out some common code between deflate and gzip to reduce
the code footprint somewhat. I've tested the gzip code on a few test files
and I tried deflate using the freshmeat.net server, and it all looks OK. I
didn't try running it with valgrind, however.
- Added a --retry option to curl that takes a numerical option for the number
of times the operation should be retried. It is retried if a transient error
is detected or if a timeout occurred. By default, it will first wait one
second between the retries and then double the delay time between each retry
until the delay time is ten minutes which then will be the delay time
between all forthcoming retries. You can set a static delay time with
"--retry-delay [num]" where [num] is the number of seconds to wait between
each retry.
Daniel (25 October 2004)
- Tomas Pospisek filed bug report #1053287 that proved -C - and --fail on a
file that was already completely downloaded caused an error, while it
doesn't if you don't use --fail! I added test case 194 to verify the fix.
Grrr. CURLOPT_FAILONERROR is now added to the list stuff to remove in
libcurl v8 due to all the kludges needed to support it.
- Mohun Biswas found out that formposting a zero-byte file didn't work very
good. I fixed.
Daniel (19 October 2004)
- Alexander Krasnostavsky made it possible to make FTP 3rd party transfers
with both source and destination being the same host. It can be useful if
you want to move a file on a server or similar.
- Guillaume Arluison added CURLINFO_NUM_CONNECTS to allow an app to figure
out how many new connects a previous transfer required.
I added %{num_connects} to the curl tool and added test case 192 and 193
to verify the new code.
Daniel (18 October 2004)
- Peter Wullinger pointed out that curl should call setlocale() properly to
initiate the specific language operations, to make the IDN stuff work
better.
Version 7.12.2 (18 October 2004) Version 7.12.2 (18 October 2004)
Daniel (16 October 2004) Daniel (16 October 2004)

View File

@@ -24,7 +24,7 @@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist curl-config.in \ EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist curl-config.in \
curl-style.el sample.emacs RELEASE-NOTES buildconf buildconf.bat curl-style.el sample.emacs RELEASE-NOTES buildconf buildconf.bat libcurl.pc.in
bin_SCRIPTS = curl-config bin_SCRIPTS = curl-config

View File

@@ -53,17 +53,60 @@ borland-clean:
cd ..\src cd ..\src
make -f Makefile.b32 clean make -f Makefile.b32 clean
watcom:
cd lib
wmake -f Makefile.Watcom
cd ..\src
wmake -f Makefile.Watcom
watcom-clean:
cd lib
wmake -f Makefile.Watcom clean
cd ..\src
wmake -f Makefile.Watcom clean
mingw32: mingw32:
cd lib & make -f Makefile.m32 ZLIB=1 $(MAKE) -C lib -f Makefile.m32 ZLIB=1
cd src & make -f Makefile.m32 ZLIB=1 $(MAKE) -C src -f Makefile.m32 ZLIB=1
mingw32-ssl: mingw32-ssl:
cd lib & make -f Makefile.m32 SSL=1 ZLIB=1 $(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1
cd src & make -f Makefile.m32 SSL=1 ZLIB=1 $(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1
mingw32-clean: mingw32-clean:
cd lib & make -f Makefile.m32 clean $(MAKE) -C lib -f Makefile.m32 clean
cd src & make -f Makefile.m32 clean $(MAKE) -C src -f Makefile.m32 clean
vc-clean:
cd lib
nmake -f Makefile.vc6 clean
cd ..\src
nmake -f Makefile.vc6 clean
vc-all:
cd lib
nmake -f Makefile.vc6 cfg=release
nmake -f Makefile.vc6 cfg=release-ssl
nmake -f Makefile.vc6 cfg=release-zlib
nmake -f Makefile.vc6 cfg=release-ssl-zlib
nmake -f Makefile.vc6 cfg=release-ssl-dll
nmake -f Makefile.vc6 cfg=release-zlib-dll
nmake -f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
nmake -f Makefile.vc6 cfg=release-dll
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll
nmake -f Makefile.vc6 cfg=release-dll-zlib-dll
nmake -f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
nmake -f Makefile.vc6 cfg=debug
nmake -f Makefile.vc6 cfg=debug-ssl
nmake -f Makefile.vc6 cfg=debug-zlib
nmake -f Makefile.vc6 cfg=debug-ssl-zlib
nmake -f Makefile.vc6 cfg=debug-ssl-dll
nmake -f Makefile.vc6 cfg=debug-zlib-dll
nmake -f Makefile.vc6 cfg=debug-ssl-dll-zlib-dll
nmake -f Makefile.vc6 cfg=debug-dll
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll
nmake -f Makefile.vc6 cfg=debug-dll-zlib-dll
nmake -f Makefile.vc6 cfg=debug-dll-ssl-dll-zlib-dll
vc: vc:
cd lib cd lib
@@ -93,17 +136,47 @@ vc-ssl-dll:
cd lib cd lib
nmake /f Makefile.vc6 cfg=release-ssl-dll nmake /f Makefile.vc6 cfg=release-ssl-dll
cd ..\src cd ..\src
nmake /f Makefile.vc6 nmake /f Makefile.vc6 cfg=release-ssl-dll
vc-libcurl-ssl-dll: vc-dll-ssl-dll:
cd lib cd lib
nmake /f Makefile.vc6 cfg=release-libcurl-ssl-dll nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
cd ..\src cd ..\src
nmake /f Makefile.vc6 nmake /f Makefile.vc6 cfg=release-dll-ssl-dll
vc-dll:
cd lib
nmake /f Makefile.vc6 cfg=release-dll
cd ..\src
nmake /f Makefile.vc6 cfg=release-dll
vc-dll-zlib-dll:
cd lib
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
cd ..\src
nmake /f Makefile.vc6 cfg=release-dll-zlib-dll
vc-dll-ssl-dll-zlib-dll:
cd lib
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
cd ..\src
nmake /f Makefile.vc6 cfg=release-dll-ssl-dll-zlib-dll
vc-ssl-dll-zlib-dll:
cd lib
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
cd ..\src
nmake /f Makefile.vc6 cfg=release-ssl-dll-zlib-dll
vc-zlib-dll:
cd lib
nmake /f Makefile.vc6 cfg=release-zlib-dll
cd ..\src
nmake /f Makefile.vc6 cfg=release-zlib-dll
djgpp: djgpp:
make -C lib -f Makefile.dj $(MAKE) -C lib -f Makefile.dj
make -C src -f Makefile.dj $(MAKE) -C src -f Makefile.dj
cygwin: cygwin:
./configure ./configure

13
README
View File

@@ -34,20 +34,27 @@ WEB SITE
Sweden -- http://curl.haxx.se/ Sweden -- http://curl.haxx.se/
Australia -- http://curl.planetmirror.com/ Australia -- http://curl.planetmirror.com/
Austria -- http://curl.gds.tuwien.ac.at/
Denmark -- http://curl.cofman.dk/ Denmark -- http://curl.cofman.dk/
Estonia -- http://curl.wildyou.net/ Estonia -- http://curl.wildyou.net/
France -- http://curl.mirror.internet.tp/
Germany -- http://curl.kgt.org/
Germany -- http://curl.mirror.at.stealer.net/ Germany -- http://curl.mirror.at.stealer.net/
Germany -- http://curl.netmirror.org/ Germany -- http://curl.netmirror.org/
Russia -- http://curl.tsuren.net/ Russia -- http://curl.tsuren.net/
Taiwan -- http://curl.cs.pu.edu.tw/
Thailand -- http://curl.siamu.ac.th/ Thailand -- http://curl.siamu.ac.th/
US (CA) -- http://curl.mirror.redwire.net/ US (CA) -- http://curl.mirror.redwire.net/
US -- http://curl.signal42.com/ US (CA) -- http://curl.mirrormonster.com/
US (CA) -- http://curl.signal42.com/
US (TX) -- http://curl.109k.com/
DOWNLOAD DOWNLOAD
The official download mirror sites are: The official download mirror sites are:
Australia -- http://curl.planetmirror.com/download.html Australia -- http://curl.planetmirror.com/download.html
Austria -- http://curl.gds.tuwien.ac.at/download.html
Estonia -- http://curl.wildyou.net/download.html Estonia -- http://curl.wildyou.net/download.html
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/ Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
Germany -- http://curl.mirror.at.stealer.net/download.html Germany -- http://curl.mirror.at.stealer.net/download.html
@@ -57,8 +64,12 @@ DOWNLOAD
Russia -- http://curl.tsuren.net/download.html Russia -- http://curl.tsuren.net/download.html
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/ Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
Sweden -- http://cool.haxx.se/curl/ Sweden -- http://cool.haxx.se/curl/
Taiwan -- http://curl.cs.pu.edu.tw/download.html
Thailand -- http://curl.siamu.ac.th/download.html Thailand -- http://curl.siamu.ac.th/download.html
US (CA) -- http://curl.mirror.redwire.net/download.html US (CA) -- http://curl.mirror.redwire.net/download.html
US (CA) -- http://curl.mirrormonster.com/download.html
US (CA) -- http://curl.signal42.com/download.html
US (TX) -- http://curl.109k.com/download.html
CVS CVS

View File

@@ -1,84 +1,60 @@
Curl and libcurl 7.12.2 Curl and libcurl 7.13.0
Public curl release number: 83 Public curl release number: 85
Releases counted from the very beginning: 110 Releases counted from the very beginning: 112
Available command line options: 96 Available command line options: 104
Available curl_easy_setopt() options: 121 Available curl_easy_setopt() options: 122
Number of public functions in libcurl: 36 Number of public functions in libcurl: 46
Amount of public web site mirrors: 13 Amount of public web site mirrors: 15
Number of known libcurl bindings: 27 Number of known libcurl bindings: 29
This release includes the following changes: This release includes the following changes:
o the IDN code now verifies that only TLD-legitmate letters are used in the o added --ftp-account and CURLOPT_FTP_ACCOUNT
name or a warning is displayed (when verbose is enabled) o added CURLOPT_SOURCE_URL and CURLOPT_SOURCE_QUOTE
o provides error texts for IDN errors o obsoleted CURLOPT_SOURCE_HOST, CURLOPT_SOURCE_PATH, CURLOPT_SOURCE_PORT
o file upload parts in formposts now get their directory names cut off and CURLOPT_PASV_HOST
o added CURLINFO_OS_ERRNO o added --3p-url, --3p-user and --3p-quote
o added CURLOPT_FTPSSLAUTH to allow ftp connects to attempt "AUTH TLS" instead o -Q "+[command]" was added
before "AUTH SSL" o src/getpass.c license issue sorted (code was rewritten)
o curl_getdate() completely rewritten: may affect rare curl -z use cases o curl -w now supports 'http_connect' for the proxy's response to CONNECT
o introducing "curl-config --protocols"
This release includes the following bugfixes: This release includes the following bugfixes:
o CURLOPT_FTP_CREATE_MISSING_DIRS works for third party transfers o re-sending a request when retrying on a fresh connection with multi
o memory leak for cookies received with max-age set interface
o potential memory leaks in the window name resolver o improved valgrind report parser in the test suite
o URLs with ?-letters in the user name or password fields o several valgrind reports
o libcurl error message is now provided when send() fails o CURLOPT_FTPPORT and -P work when built ipv6-enabled
o no more SIGPIPE on Mac OS X and other SO_NOSIGPIPE-supporting platforms o FTP third party transfers was much improved
o HTTP resume was refused if redirected o proxy environment variables are now ignored when built HTTP-disabled
o configure's gethostbyname check when both nsl and socket libs are required o CURLOPT_PROXY can now disable HTTP proxy even when built HTTP-disabled
o configure --with-libidn now checks the given path before defaults o "curl dictionary.com" no longer assumes DICT protocol
o a race condition sometimes resulting in CURLE_COULDNT_RESOLVE_HOST in the o re-invoke some system calls on EINTR
windows threaded name resolver code o duplicate Host: when failed connection re-use
o isspace() invokes with negative values in the cookie code o SOCKS5 version check
o a case of read-already-freed-data when CURLOPT_VERBOSE is used and a (very) o memory problem with cleaning up multi interface
persistent connection o SSL certificate name memory leak
o now includes descriptive error messages for IDN errors o -d with -G to multiple URLs crashed
o more forgivning PASS response code check for better working with proftpd o double va_list access crash fixed
o curl/multi.h works better included in winsock-using apps o minor memory leak when "version" is set in a cookie header
o curl_easy_reset() no longer enables the progress meter o builds fine on BeOS and NetBSD
o build fix for SSL disabled curl with SSL Engine support present o builds and runs fine on FreeBSD
o configure --with-ssl=PATH now ignores pkg-config path info
o CURLOPT_SSLENGINE can be set to NULL even if no engine support is available
o LDAP crash when more than one record was received
o connect failures properly stores an error message in the errorbuffer
o Rare Location:-following problem with bad original URL
o -F can now add Content-Type on non-file sections
o double Host: header when following Location: with replaced Host:
o curl_multi_add_handle() return code
o "Proxy-Connection: close" is now understood and properly dealt with
o curl_getdate() crash
o downloading empty files now calls the write callback properly
o no reverse DNS lookups for ip-only addresses with ipv6-enabled libcurl
o file handler leak when getting an empty file:// URL
o libcurl works better multi-threaded on AIX (when built with xlc)
o cookies over proxy didn't match the path properly
o MSVC makefile fixes to build better
o FTP response 530 on 'PASS' now sends back a better error message
Other curl-related news since the previous public release: Other curl-related news since the previous public release:
o AdacURL version 7.12.1 http://www.almroth.com/adacurl/index.html o cURLpp 0.3.2 - https://rrette.com/curlpp.html
o pycurl version 7.12.1 http://pycurl.sourceforge.net/ o pycURL 7.12.3 - http://pycurl.sourceforge.net/
o tclcurl version 0.12.1 o new web mirror: http://curl.mirrormonster.com/ (US, California)
http://personal1.iddeo.es/andresgarci/tclcurl/english/
o libcurl.NET was announce: http://www.seasideresearch.com/downloads.html
o Get your fresh Mozilla-extracted ca cert bundle here:
http://curl.haxx.se/docs/caextract.html
o New web mirror in Taiwan: http://curl.cs.pu.edu.tw/
This release would not have looked like this without help, code, reports and This release would not have looked like this without help, code, reports and
advice from friends like these: advice from friends like these:
Casey O'Donnell, Roland Krikava, Alex, Alexander Krasnostavsky, Kjetil Dan Fandrich, Peter Pentchev, Marcin Konicki, Rune Kleveland, David Shaw,
Jacobsen, Ling Thio, Roman Koifman, Harshal Pradhan, Jonas Forsman, David Werner Koch, Gisle Vanem, Alex Neblett, Kai Sommerfeld, Marty Kuhrt,
Tarendash, Daniel at touchtunes, Bertrand Demiddelaer, Andreas Rieke, Hzhijun, Pavel Orehov, Bruce Mitchener, Cyrill Osterwalder, Dan Torop,
Jean-Claude Chauve, Dan Fandrich, Peter Sylvester, "Mekonikum", Jean-Philippe Martijn Koster, Alex aka WindEagle, Cody Jones, Samuel D<>az Garc<72>a,
Barrette-LaPierre, G<>nter Knauf, Larry Campbell, Fedor Karpelevitch, Stephan Bergmann, Philippe Hameau, Ian Ford, Stephen More, Lars Nilsson
Aleksandar Milivojevic, Gisle Vanem, Chris "Bob Bob", Chih-Chung Chang, Andy
Cedilnik, Alan Pinstein, Eric Vergnaud, Traian Nicolescu, runekl at
opoint.com
Thanks! (and sorry if I forgot to mention someone) Thanks! (and sorry if I forgot to mention someone)

View File

@@ -1,11 +1,36 @@
Issues not sorted in any particular order. Issues not sorted in any particular order.
To get fixed in 7.12.2 (planned release: mid October 2004) To get fixed in 7.13.1 (planned release: April 2005)
====================== ======================
To get fixed in 7.12.3 (planned release: December 2004) 58 - Fix KNOWN_BUGS #19: "FTP 3rd party transfers with the multi interface
====================== doesn't work"
59 - Figure out a fix for David Byron's SSL problems:
http://curl.haxx.se/mail/lib-2005-01/0240.html
47 - Peter Sylvester's patch for SRP on the TLS layer 47 - Peter Sylvester's patch for SRP on the TLS layer
Awaits OpenSSL support for this, no need to support this in libcurl before
there's an OpenSSL release that does it.
48 - MSVC Makefile improvements by Samuel D<>az Garc<72>a 54 - Turn the FTP code into a state machine to support the multi interface
100% non-blocking.
To get fixed in 7.14.0
======================
55 - Add a function to the multi interface that gets file descriptors, as an
alternative to the curl_multi_fdset(). This is necessary to allow apps to
properly avoid the FD_SETSIZE problem.
56 - Make curl_easy_perform() a wrapper-function that simply creates a multi
handle, adds the easy handle to it, runs curl_multi_perform() until the
transfer is done, then detach the easy handle, destroy the multi handle
and return the easy handle's return code. This will thus make everything
internally use and assume the multi interface. The select()-loop should
use the new function from (55).
57 - Add an interface to libcurl for getting and setting cookies from an easy
handle. One idea: http://curl.haxx.se/mail/lib-2004-12/0195.html the
older idea: http://curl.haxx.se/dev/COOKIES. We need to settle on some
middle ground I guess.

View File

@@ -87,9 +87,7 @@ AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets]
dnl Ioctlsocket didnt compile, do test 5! dnl Ioctlsocket didnt compile, do test 5!
AC_TRY_COMPILE([ AC_TRY_COMPILE([
/* headers for SO_NONBLOCK test (BeOS) */ /* headers for SO_NONBLOCK test (BeOS) */
#include <sys/types.h> #include <socket.h>
#include <unistd.h>
#include <fcntl.h>
],[ ],[
/* SO_NONBLOCK source code */ /* SO_NONBLOCK source code */
long b = 1; long b = 1;
@@ -690,15 +688,20 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
fi fi
else dnl $ICC = yes else dnl $ICC = yes
dnl this is a set of options we believe *ALL* gcc versions support: dnl this is a set of options we believe *ALL* gcc versions support:
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare" WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
dnl -Wcast-align is a bit too annoying on all gcc versions ;-) dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
if test "$gccnum" -ge "207"; then
dnl gcc 2.7 or later
WARN="$WARN -Wmissing-declarations"
fi
if test "$gccnum" -gt "295"; then if test "$gccnum" -gt "295"; then
dnl only if the compiler is newer than 2.95 since we got lots of dnl only if the compiler is newer than 2.95 since we got lots of
dnl "`_POSIX_C_SOURCE' is not defined" in system headers with dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
dnl gcc 2.95.4 on FreeBSD 4.9! dnl gcc 2.95.4 on FreeBSD 4.9!
WARN="$WARN -Wundef" WARN="$WARN -Wundef -Wno-long-long -Wsign-compare"
fi fi
if test "$gccnum" -ge "296"; then if test "$gccnum" -ge "296"; then

View File

@@ -20,3 +20,4 @@ stamp-h1
depcomp depcomp
libcares.la libcares.la
missing missing
ares_version.h.dist

View File

@@ -1,5 +1,16 @@
Changelog for the c-ares project Changelog for the c-ares project
* November 7
- Fixed the VC project and makefile to use ares_cancel and ares_version
* October 24
- The released ares_version.h from 1.2.1 says 1.2.0 due to a maketgz flaw.
This is now fixed.
Version 1.2.1 (October 20, 2004)
* September 29 * September 29
- Henrik Stoerner fix: got a report that Tru64 Unix (the unix from Digital - Henrik Stoerner fix: got a report that Tru64 Unix (the unix from Digital

View File

@@ -55,3 +55,12 @@ libcares_la_SOURCES = $(CSOURCES) $(HHEADERS)
libcares_ladir = $(includedir) libcares_ladir = $(includedir)
# what headers to install on 'make install': # what headers to install on 'make install':
libcares_la_HEADERS = ares.h ares_version.h libcares_la_HEADERS = ares.h ares_version.h
# Make files named *.dist replace the file without .dist extension
dist-hook:
find $(distdir) -name "*.dist" -exec rm {} \;
(distit=`find $(srcdir) -name "*.dist"`; \
for file in $$distit; do \
strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\.dist//`; \
cp $$file $(distdir)$$strip; \
done)

View File

@@ -37,6 +37,10 @@
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
#ifdef __cplusplus
extern "C" {
#endif
#define ARES_SUCCESS 0 #define ARES_SUCCESS 0
/* Server error codes (ARES_ENODATA indicates no relevant answer) */ /* Server error codes (ARES_ENODATA indicates no relevant answer) */
@@ -140,4 +144,8 @@ void ares_free_hostent(struct hostent *host);
const char *ares_strerror(int code); const char *ares_strerror(int code);
void ares_free_errmem(char *mem); void ares_free_errmem(char *mem);
#ifdef __cplusplus
}
#endif
#endif /* ARES__H */ #endif /* ARES__H */

View File

@@ -33,5 +33,7 @@ might have been stored in their arguments.
.SH SEE ALSO .SH SEE ALSO
.BR ares_init (3) .BR ares_init (3)
.BR ares_destroy (3) .BR ares_destroy (3)
.SH NOTES
This function is not compatible with ares.
.SH AUTHOR .SH AUTHOR
Dirk Manske Dirk Manske

View File

@@ -14,14 +14,14 @@
.\" this software for any purpose. It is provided "as is" .\" this software for any purpose. It is provided "as is"
.\" without express or implied warranty. .\" without express or implied warranty.
.\" .\"
.TH ARES_DESTROY 3 "23 July 1998" .TH ARES_DESTROY 3 "7 December 2004"
.SH NAME .SH NAME
ares_destroy \- Destroy a resolver channel ares_destroy \- Destroy a resolver channel
.SH SYNOPSIS .SH SYNOPSIS
.nf .nf
.B #include <ares.h> .B #include <ares.h>
.PP .PP
.B int ares_destroy(ares_channel \fIchannel\fP) .B void ares_destroy(ares_channel \fIchannel\fP)
.fi .fi
.SH DESCRIPTION .SH DESCRIPTION
The The

View File

@@ -26,7 +26,8 @@
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds) int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
{ {
struct server_state *server; struct server_state *server;
int i, nfds; ares_socket_t nfds;
int i;
/* No queries, no file descriptors. */ /* No queries, no file descriptors. */
if (!channel->queries) if (!channel->queries)
@@ -51,5 +52,5 @@ int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
nfds = server->tcp_socket + 1; nfds = server->tcp_socket + 1;
} }
} }
return nfds; return (int)nfds;
} }

View File

@@ -149,7 +149,7 @@ static int file_lookup(struct in_addr *addr, struct hostent **host)
#ifdef WIN32 #ifdef WIN32
char PATH_HOSTS[MAX_PATH]; char PATH_HOSTS[MAX_PATH];
if (IsNT) { if (IS_NT()) {
char tmp[MAX_PATH]; char tmp[MAX_PATH];
HKEY hkeyHosts; HKEY hkeyHosts;

View File

@@ -221,7 +221,7 @@ static int file_lookup(const char *name, struct hostent **host)
#ifdef WIN32 #ifdef WIN32
char PATH_HOSTS[MAX_PATH]; char PATH_HOSTS[MAX_PATH];
if (IsNT) { if (IS_NT()) {
char tmp[MAX_PATH]; char tmp[MAX_PATH];
HKEY hkeyHosts; HKEY hkeyHosts;

View File

@@ -14,7 +14,7 @@
.\" this software for any purpose. It is provided "as is" .\" this software for any purpose. It is provided "as is"
.\" without express or implied warranty. .\" without express or implied warranty.
.\" .\"
.TH ARES_INIT 3 "21 July 1998" .TH ARES_INIT 3 "7 December 2004"
.SH NAME .SH NAME
ares_init, ares_init_options \- Initialize a resolver channel ares_init, ares_init_options \- Initialize a resolver channel
.SH SYNOPSIS .SH SYNOPSIS
@@ -25,31 +25,20 @@ ares_init, ares_init_options \- Initialize a resolver channel
.B int ares_init_options(ares_channel *\fIchannel\fP, .B int ares_init_options(ares_channel *\fIchannel\fP,
.B struct ares_options *\fIoptions\fP, int \fIoptmask\fP) .B struct ares_options *\fIoptions\fP, int \fIoptmask\fP)
.PP .PP
.B cc file.c -lares .B cc file.c -lcares
.fi .fi
.SH DESCRIPTION .SH DESCRIPTION
The The \fBares_init\fP function initializes a communications channel for name
.B ares_init service lookups. If it returns successfully, \fBares_init\fP will set the
function initializes a communications channel for name service variable pointed to by \fIchannel\fP to a handle used to identify the name
lookups. If it returns successfully, service channel. The caller should invoke
.B ares_init
will set the variable pointed to by
.I channel
to a handle used to identify the name service channel. The caller
should invoke
.BR ares_destroy (3) .BR ares_destroy (3)
on the handle when the channel is no longer needed. on the handle when the channel is no longer needed.
.PP .PP
The The \fBares_init_options\fP function also initializes a name service channel,
.B ares_init_options with additional options useful for applications requiring more control over
function also initializes a name service channel, with additional name service configuration. The \fIoptmask\fP parameter specifies which fields
options useful for applications requiring more control over name in the structure pointed to by \fIoptions\fP are set, as follows:
service configuration. The
.I optmask
parameter specifies which fields in the structure pointed to by
.I options
are set, as follows:
.PP
.TP 18 .TP 18
.B ARES_OPT_FLAGS .B ARES_OPT_FLAGS
.B int \fIflags\fP; .B int \fIflags\fP;
@@ -127,9 +116,11 @@ If a truncated response to a UDP query is received, do not fall back
to TCP; simply continue on with the truncated response. to TCP; simply continue on with the truncated response.
.TP 23 .TP 23
.B ARES_FLAG_NORECURSE .B ARES_FLAG_NORECURSE
Do not set the "recursion desired" bit on outgoing queries, so that Do not set the "recursion desired" bit on outgoing queries, so that the name
the name server being contacted will not try to fetch the answer from server being contacted will not try to fetch the answer from other servers if
other servers if it doesn't know the answer locally. it doesn't know the answer locally. Be aware that ares will not do the
recursion for you. Recursion must be handled by the application calling ares
if \fIARES_FLAG_NORECURSE\fP is set.
.TP 23 .TP 23
.B ARES_FLAG_STAYOPEN .B ARES_FLAG_STAYOPEN
Do not close communciations sockets when the number of active queries Do not close communciations sockets when the number of active queries

View File

@@ -305,7 +305,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
{ {
FIXED_INFO *fi = alloca (sizeof(*fi)); FIXED_INFO *fi = alloca (sizeof(*fi));
DWORD size = sizeof (*fi); DWORD size = sizeof (*fi);
DWORD (WINAPI *GetNetworkParams) (FIXED_INFO*, DWORD*); /* available only on Win-98/2000+ */ typedef DWORD (WINAPI* get_net_param_func) (FIXED_INFO*, DWORD*);
get_net_param_func GetNetworkParams; /* available only on Win-98/2000+ */
HMODULE handle; HMODULE handle;
IP_ADDR_STRING *ipAddr; IP_ADDR_STRING *ipAddr;
int i, count = 0; int i, count = 0;
@@ -321,7 +322,7 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
if (!handle) if (!handle)
return (0); return (0);
(void*)GetNetworkParams = GetProcAddress (handle, "GetNetworkParams"); GetNetworkParams = (get_net_param_func) GetProcAddress (handle, "GetNetworkParams");
if (!GetNetworkParams) if (!GetNetworkParams)
goto quit; goto quit;
@@ -375,7 +376,7 @@ quit:
static int init_by_resolv_conf(ares_channel channel) static int init_by_resolv_conf(ares_channel channel)
{ {
char *line = NULL; char *line = NULL;
int status, nservers = 0, nsort = 0; int status = -1, nservers = 0, nsort = 0;
struct server_state *servers = NULL; struct server_state *servers = NULL;
struct apattern *sortlist = NULL; struct apattern *sortlist = NULL;
@@ -421,7 +422,7 @@ DhcpNameServer
goto okay; goto okay;
} }
if (IsNT) if (IS_NT())
{ {
if (RegOpenKeyEx( if (RegOpenKeyEx(
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,

View File

@@ -41,7 +41,7 @@
#if defined(WIN32) && !defined(WATT32) #if defined(WIN32) && !defined(WATT32)
#define IsNT ((int)GetVersion()>0) #define IS_NT() ((int)GetVersion() > 0)
#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP" #define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters" #define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
#define NAMESERVER "NameServer" #define NAMESERVER "NameServer"
@@ -164,5 +164,9 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize);
libcurl lowlevel code from within library is ugly and only works when libcurl lowlevel code from within library is ugly and only works when
c-ares is built and linked with a similarly debug-build libcurl, but we do c-ares is built and linked with a similarly debug-build libcurl, but we do
this anyway for convenience. */ this anyway for convenience. */
#ifndef CURL_EXTERN
/* ugly hack to make this compile */
#define CURL_EXTERN
#endif
#include "../lib/memdebug.h" #include "../lib/memdebug.h"
#endif #endif

View File

@@ -30,7 +30,8 @@ function gets the description of the ares library error code
.IR code , .IR code ,
returning the result as a NUL-terminated C string. returning the result as a NUL-terminated C string.
.SH NOTES .SH NOTES
This function is not compatible with ares. This function is not compatible with ares, it takes a different set of
arguments.
.SH AUTHOR .SH AUTHOR
Greg Hudson, MIT Information Systems Greg Hudson, MIT Information Systems
.br .br

View File

@@ -41,7 +41,7 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
dnl Checks for standard header files, to make memdebug.h inclusions bettter dnl Checks for standard header files, to make memdebug.h inclusions bettter
AC_HEADER_STDC AC_HEADER_STDC
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I../include" CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include"
CFLAGS="$CFLAGS -g" CFLAGS="$CFLAGS -g"
dnl set compiler "debug" options to become more picky, and remove dnl set compiler "debug" options to become more picky, and remove

View File

@@ -12,6 +12,27 @@ if(!-f "ares.h") {
exit; exit;
} }
my ($major, $minor, $patch)=split(/\./, $version);
$major += 0;
$minor += 0;
$patch += 0;
open(VER, "<ares_version.h") ||
die "can't open ares_version.h";
open(NEWV, ">ares_version.h.dist");
while(<VER>) {
$_ =~ s/^\#define ARES_VERSION_MAJOR .*/\#define ARES_VERSION_MAJOR $major/;
$_ =~ s/^\#define ARES_VERSION_MINOR .*/\#define ARES_VERSION_MINOR $minor/;
$_ =~ s/^\#define ARES_VERSION_PATCH .*/\#define ARES_VERSION_PATCH $patch/;
$_ =~ s/^\#define ARES_VERSION_STR .*/\#define ARES_VERSION_STR \"$version\"/;
print NEWV $_;
}
close(VER);
close(NEWV);
print "ares_version.h.dist created\n";
if(!-f "configure") { if(!-f "configure") {
print "running buildconf\n"; print "running buildconf\n";
`./buildconf`; `./buildconf`;

View File

@@ -153,6 +153,14 @@ SOURCE=..\..\ares_search.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\ares_cancel.c
# End Source File
# Begin Source File
SOURCE=..\..\ares_version.c
# End Source File
# Begin Source File
SOURCE=..\..\ares_send.c SOURCE=..\..\ares_send.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@@ -181,6 +189,10 @@ SOURCE=..\..\ares_dns.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\ares_version.h
# End Source File
# Begin Source File
SOURCE=..\..\ares_private.h SOURCE=..\..\ares_private.h
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@@ -92,6 +92,8 @@ LIB32_OBJS= \
"$(INTDIR)\ares_process.obj" \ "$(INTDIR)\ares_process.obj" \
"$(INTDIR)\ares_query.obj" \ "$(INTDIR)\ares_query.obj" \
"$(INTDIR)\ares_search.obj" \ "$(INTDIR)\ares_search.obj" \
"$(INTDIR)\ares_cancel.obj" \
"$(INTDIR)\ares_version.obj" \
"$(INTDIR)\ares_send.obj" \ "$(INTDIR)\ares_send.obj" \
"$(INTDIR)\ares_strerror.obj" \ "$(INTDIR)\ares_strerror.obj" \
"$(INTDIR)\ares_timeout.obj" \ "$(INTDIR)\ares_timeout.obj" \
@@ -131,6 +133,8 @@ CLEAN :
-@erase "$(INTDIR)\ares_process.obj" -@erase "$(INTDIR)\ares_process.obj"
-@erase "$(INTDIR)\ares_query.obj" -@erase "$(INTDIR)\ares_query.obj"
-@erase "$(INTDIR)\ares_search.obj" -@erase "$(INTDIR)\ares_search.obj"
-@erase "$(INTDIR)\ares_cancel.obj"
-@erase "$(INTDIR)\ares_version.obj"
-@erase "$(INTDIR)\ares_send.obj" -@erase "$(INTDIR)\ares_send.obj"
-@erase "$(INTDIR)\ares_strerror.obj" -@erase "$(INTDIR)\ares_strerror.obj"
-@erase "$(INTDIR)\ares_timeout.obj" -@erase "$(INTDIR)\ares_timeout.obj"
@@ -322,6 +326,18 @@ SOURCE=..\..\ares_search.c
$(CPP) $(CPP_PROJ) $(SOURCE) $(CPP) $(CPP_PROJ) $(SOURCE)
SOURCE=..\..\ares_version.c
"$(INTDIR)\ares_version.obj" : $(SOURCE) "$(INTDIR)"
$(CPP) $(CPP_PROJ) $(SOURCE)
SOURCE=..\..\ares_cancel.c
"$(INTDIR)\ares_cancel.obj" : $(SOURCE) "$(INTDIR)"
$(CPP) $(CPP_PROJ) $(SOURCE)
SOURCE=..\..\ares_send.c SOURCE=..\..\ares_send.c
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"

View File

@@ -39,28 +39,34 @@ ares_strcasecmp(const char *a, const char *b)
} }
#endif #endif
/*
* Number of micro-seconds between the beginning of the Windows epoch
* (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970).
*/
#if defined(_MSC_VER) || defined(__WATCOMC__)
#define EPOCH_FILETIME 11644473600000000Ui64
#else
#define EPOCH_FILETIME 11644473600000000ULL
#endif
int int
ares_gettimeofday(struct timeval *tv, struct timezone *tz) ares_gettimeofday(struct timeval *tv, struct timezone *tz)
{ {
FILETIME ft; FILETIME ft;
LARGE_INTEGER li; LARGE_INTEGER li;
__int64 t; __int64 t;
static int tzflag;
if (tv) if (tv)
{ {
GetSystemTimeAsFileTime(&ft); GetSystemTimeAsFileTime(&ft);
li.LowPart = ft.dwLowDateTime; li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime; li.HighPart = ft.dwHighDateTime;
t = li.QuadPart; /* In 100-nanosecond intervals */ t = li.QuadPart / 10; /* In micro-second intervals */
#if 0 t -= EPOCH_FILETIME; /* Offset to the Epoch time */
t -= EPOCHFILETIME; /* Offset to the Epoch time */
#endif
t /= 10; /* In microseconds */
tv->tv_sec = (long)(t / 1000000); tv->tv_sec = (long)(t / 1000000);
tv->tv_usec = (long)(t % 1000000); tv->tv_usec = (long)(t % 1000000);
} }
(void) tz;
return 0; return 0;
} }

View File

@@ -168,6 +168,8 @@ echo "buildconf: running aclocal hack to convert all mv to mv -f"
perl -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4 perl -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4
echo "buildconf: running autoheader" echo "buildconf: running autoheader"
${AUTOHEADER:-autoheader} || die "The autoheader command failed" ${AUTOHEADER:-autoheader} || die "The autoheader command failed"
echo "buildconf: cp lib/config.h.in src/config.h.in"
cp lib/config.h.in src/config.h.in
echo "buildconf: running autoconf" echo "buildconf: running autoconf"
${AUTOCONF:-autoconf} || die "The autoconf command failed" ${AUTOCONF:-autoconf} || die "The autoconf command failed"

View File

@@ -55,7 +55,7 @@ AC_SUBST(PKGADD_NAME)
AC_SUBST(PKGADD_VENDOR) AC_SUBST(PKGADD_VENDOR)
dnl dnl
dnl initialize all the info variables to 'no' dnl initialize all the info variables
curl_ssl_msg="no (--with-ssl)" curl_ssl_msg="no (--with-ssl)"
curl_zlib_msg="no (--with-zlib)" curl_zlib_msg="no (--with-zlib)"
curl_krb4_msg="no (--with-krb4*)" curl_krb4_msg="no (--with-krb4*)"
@@ -65,6 +65,7 @@ dnl initialize all the info variables to 'no'
curl_ipv6_msg="no (--enable-ipv6)" curl_ipv6_msg="no (--enable-ipv6)"
curl_idn_msg="no (--with-libidn)" curl_idn_msg="no (--with-libidn)"
curl_manual_msg="no (--enable-manual)" curl_manual_msg="no (--enable-manual)"
curl_verbose_msg="enabled (--disable-verbose)"
dnl dnl
dnl Detect the canonical host and target build environment dnl Detect the canonical host and target build environment
@@ -132,8 +133,8 @@ AC_HELP_STRING([--disable-http],[Disable HTTP support]),
AC_DEFINE(CURL_DISABLE_HTTP, 1, [to disable HTTP]) AC_DEFINE(CURL_DISABLE_HTTP, 1, [to disable HTTP])
AC_MSG_WARN([disable HTTP disables FTP over proxy and GOPHER too]) AC_MSG_WARN([disable HTTP disables FTP over proxy and GOPHER too])
AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER]) AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER])
AC_SUBST(CURL_DISABLE_HTTP) AC_SUBST(CURL_DISABLE_HTTP, [1])
AC_SUBST(CURL_DISABLE_GOPHER) AC_SUBST(CURL_DISABLE_GOPHER, [1])
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -148,7 +149,7 @@ AC_HELP_STRING([--disable-ftp],[Disable FTP support]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_FTP, 1, [to disable FTP]) AC_DEFINE(CURL_DISABLE_FTP, 1, [to disable FTP])
AC_SUBST(CURL_DISABLE_FTP) AC_SUBST(CURL_DISABLE_FTP, [1])
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -163,7 +164,7 @@ AC_HELP_STRING([--disable-gopher],[Disable GOPHER support]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER]) AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable GOPHER])
AC_SUBST(CURL_DISABLE_GOPHER) AC_SUBST(CURL_DISABLE_GOPHER, [1])
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -178,7 +179,7 @@ AC_HELP_STRING([--disable-file],[Disable FILE support]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_FILE, 1, [to disable FILE]) AC_DEFINE(CURL_DISABLE_FILE, 1, [to disable FILE])
AC_SUBST(CURL_DISABLE_FILE) AC_SUBST(CURL_DISABLE_FILE, [1])
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -193,7 +194,7 @@ AC_HELP_STRING([--disable-ldap],[Disable LDAP support]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP]) AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
AC_SUBST(CURL_DISABLE_LDAP) AC_SUBST(CURL_DISABLE_LDAP, [1])
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -208,7 +209,7 @@ AC_HELP_STRING([--disable-dict],[Disable DICT support]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_DICT, 1, [to disable DICT]) AC_DEFINE(CURL_DISABLE_DICT, 1, [to disable DICT])
AC_SUBST(CURL_DISABLE_DICT) AC_SUBST(CURL_DISABLE_DICT, [1])
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -223,7 +224,7 @@ AC_HELP_STRING([--disable-telnet],[Disable TELNET support]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_TELNET, 1, [to disable TELNET]) AC_DEFINE(CURL_DISABLE_TELNET, 1, [to disable TELNET])
AC_SUBST(CURL_DISABLE_TELNET) AC_SUBST(CURL_DISABLE_TELNET, [1])
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -313,6 +314,16 @@ then
) )
fi fi
if test "$HAVE_GETHOSTBYNAME" != "1"
then
dnl gethostbyname in the net lib - for BeOS
AC_CHECK_LIB(net, gethostbyname,
[HAVE_GETHOSTBYNAME="1"
LIBS="$LIBS -lnet"
])
fi
if test "$HAVE_GETHOSTBYNAME" = "1"; then if test "$HAVE_GETHOSTBYNAME" = "1"; then
AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [If you have gethostbyname]) AC_DEFINE(HAVE_GETHOSTBYNAME, 1, [If you have gethostbyname])
else else
@@ -432,35 +443,6 @@ AC_HELP_STRING([--disable-nonblocking],[Disable non-blocking socket detection]),
CURL_CHECK_NONBLOCKING_SOCKET CURL_CHECK_NONBLOCKING_SOCKET
]) ])
dnl **********************************************************************
dnl Check for the random seed preferences
dnl **********************************************************************
AC_ARG_WITH(egd-socket,
AC_HELP_STRING([--with-egd-socket=FILE],
[Entropy Gathering Daemon socket pathname]),
[ EGD_SOCKET="$withval" ]
)
if test -n "$EGD_SOCKET" ; then
AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET",
[your Entropy Gathering Daemon socket pathname] )
fi
dnl Check for user-specified random device
AC_ARG_WITH(random,
AC_HELP_STRING([--with-random=FILE],[read randomness from FILE (default=/dev/urandom)]),
[ RANDOM_FILE="$withval" ],
[
dnl Check for random device
AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
]
)
if test -n "$RANDOM_FILE" ; then
AC_SUBST(RANDOM_FILE)
AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
[a suitable file to read random data from])
fi
dnl ********************************************************************** dnl **********************************************************************
dnl Check if the operating system allows programs to write to their own argv[] dnl Check if the operating system allows programs to write to their own argv[]
dnl ********************************************************************** dnl **********************************************************************
@@ -647,7 +629,7 @@ if test x"$want_gss" = xyes; then
if test -z "$GSSAPI_INCS"; then if test -z "$GSSAPI_INCS"; then
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
else elif test "$GSSAPI_ROOT" != "yes"; then
GSSAPI_INCS="-I$GSSAPI_ROOT/include" GSSAPI_INCS="-I$GSSAPI_ROOT/include"
fi fi
fi fi
@@ -657,8 +639,10 @@ if test x"$want_gss" = xyes; then
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi` gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
LDFLAGS="$LDFLAGS $gss_ldflags" LDFLAGS="$LDFLAGS $gss_ldflags"
else elif test "$GSSAPI_ROOT" != "yes"; then
LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff -lgssapi" LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff -lgssapi"
else
LDFLAGS="$LDFLAGS -lgssapi"
fi fi
else else
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR" LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR"
@@ -669,16 +653,20 @@ if test x"$want_gss" = xyes; then
curl_gss_msg="enabled" curl_gss_msg="enabled"
if test -n "$GSSAPI_INCS"; then AC_CHECK_HEADER(gssapi.h,
# cut off the preceding -I from the include path [
GSSAPI_INCS=`echo $GSSAPI_INCS | sed -e s/^-I//g` dnl found in the given dirs
fi
if test -f "$GSSAPI_INCS/gssapi.h"; then
AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries]) AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries])
else ],
[
dnl not found, check in gssapi/ subdir
AC_CHECK_HEADER(gssapi/gssapi.h,
dnl found
AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries]) AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries])
fi )
]
)
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -710,11 +698,17 @@ else
case "$OPT_SSL" in case "$OPT_SSL" in
yes) yes)
dnl --with-ssl (without path) used dnl --with-ssl (without path) used
if test x$cross_compiling != xyes; then
dnl only do pkg-config magic when not cross-compiling
PKGTEST="yes" PKGTEST="yes"
fi
EXTRA_SSL=/usr/local/ssl ;; EXTRA_SSL=/usr/local/ssl ;;
off) off)
dnl no --with-ssl option given, just check default places dnl no --with-ssl option given, just check default places
if test x$cross_compiling != xyes; then
dnl only do pkg-config magic when not cross-compiling
PKGTEST="yes" PKGTEST="yes"
fi
EXTRA_SSL= ;; EXTRA_SSL= ;;
*) *)
dnl check the given --with-ssl spot dnl check the given --with-ssl spot
@@ -768,7 +762,10 @@ else
]) ])
if test "$HAVECRYPTO" = "yes"; then if test X"$HAVECRYPTO" != X"yes"; then
AC_MSG_WARN([crypto lib was not found; SSL will be disabled])
else
dnl This is only reasonable to do if crypto actually is there: check for dnl This is only reasonable to do if crypto actually is there: check for
dnl SSL libs NOTE: it is important to do this AFTER the crypto lib dnl SSL libs NOTE: it is important to do this AFTER the crypto lib
@@ -802,27 +799,48 @@ else
else else
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
fi fi
fi
else
dnl Check for SSLeay headers dnl Have the libraries--check for SSLeay/OpenSSL headers
AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \ AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \
openssl/pem.h openssl/ssl.h openssl/err.h, openssl/pem.h openssl/ssl.h openssl/err.h,
curl_ssl_msg="enabled" curl_ssl_msg="enabled"
OPENSSL_ENABLED=1) OPENSSL_ENABLED=1
AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use]))
if test $ac_cv_header_openssl_x509_h = no; then if test $ac_cv_header_openssl_x509_h = no; then
AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h, AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h,
curl_ssl_msg="enabled" curl_ssl_msg="enabled"
OPENSSL_ENABLED=1) OPENSSL_ENABLED=1)
fi fi
fi
if test X"$OPENSSL_ENABLED" = X"1"; then
AC_DEFINE(USE_SSLEAY, 1, [if SSL is enabled])
dnl is there a pkcs12.h header present?
AC_CHECK_HEADERS(openssl/pkcs12.h)
fi
USE_SSLEAY="$OPENSSL_ENABLED"
AC_SUBST(USE_SSLEAY)
if test X"$OPT_SSL" != Xoff &&
test "$OPENSSL_ENABLED" != "1"; then
AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!])
fi
fi
dnl **********************************************************************
dnl Check for the CA bundle
dnl **********************************************************************
if test X"$OPENSSL_ENABLED" = X"1"; then
dnl If the ENGINE library seems to be around, check for the OpenSSL engine dnl If the ENGINE library seems to be around, check for the OpenSSL engine
dnl header, it is kind of "separated" from the main SSL check dnl header, it is kind of "separated" from the main SSL check
AC_CHECK_FUNC(ENGINE_init, [ AC_CHECK_HEADERS(openssl/engine.h) ]) AC_CHECK_FUNC(ENGINE_init, [ AC_CHECK_HEADERS(openssl/engine.h) ])
AC_SUBST(OPENSSL_ENABLED)
AC_MSG_CHECKING([CA cert bundle install path]) AC_MSG_CHECKING([CA cert bundle install path])
AC_ARG_WITH(ca-bundle, AC_ARG_WITH(ca-bundle,
@@ -856,15 +874,50 @@ AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]),
fi fi
if test X"$OPT_SSL" != Xoff && if test "$OPENSSL_ENABLED" = "1"; then
test "$OPENSSL_ENABLED" != "1"; then dnl when the ssl shared libs were found in a path that the run-time linker
AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!]) dnl doesn't search through, we need to add it to LD_LIBRARY_PATH to
dnl prevent further configure tests to fail due to this
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$EXTRA_SSL/lib$libsuff"
export LD_LIBRARY_PATH
fi fi
fi fi
AM_CONDITIONAL(CABUNDLE, test x$ca != xno) AM_CONDITIONAL(CABUNDLE, test x$ca != xno)
dnl **********************************************************************
dnl Check for the random seed preferences
dnl **********************************************************************
if test X"$OPENSSL_ENABLED" = X"1"; then
AC_ARG_WITH(egd-socket,
AC_HELP_STRING([--with-egd-socket=FILE],
[Entropy Gathering Daemon socket pathname]),
[ EGD_SOCKET="$withval" ]
)
if test -n "$EGD_SOCKET" ; then
AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET",
[your Entropy Gathering Daemon socket pathname] )
fi
dnl Check for user-specified random device
AC_ARG_WITH(random,
AC_HELP_STRING([--with-random=FILE],
[read randomness from FILE (default=/dev/urandom)]),
[ RANDOM_FILE="$withval" ],
[
dnl Check for random device
AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
]
)
if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then
AC_SUBST(RANDOM_FILE)
AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
[a suitable file to read random data from])
fi
fi
dnl ********************************************************************** dnl **********************************************************************
dnl Check for the presence of ZLIB libraries and headers dnl Check for the presence of ZLIB libraries and headers
dnl ********************************************************************** dnl **********************************************************************
@@ -956,7 +1009,9 @@ case "$LIBIDN" in
idn="" idn=""
dnl if there is a given path, check that FIRST dnl if there is a given path, check that FIRST
if test -n "$LIBIDN"; then
if test "x$LIBIDN" != "xyes"; then if test "x$LIBIDN" != "xyes"; then
AC_MSG_WARN([moo moo $LIBIDN])
oldLDFLAGS=$LDFLAGS oldLDFLAGS=$LDFLAGS
oldCPPFLAGS=$CPPFLAGS oldCPPFLAGS=$CPPFLAGS
LDFLAGS="$LDFLAGS -L$LIBIDN/lib" LDFLAGS="$LDFLAGS -L$LIBIDN/lib"
@@ -967,9 +1022,11 @@ case "$LIBIDN" in
LDFLAGS=$oldLDFLAGS LDFLAGS=$oldLDFLAGS
CPPFLAGS=$oldCPPFLAGS) CPPFLAGS=$oldCPPFLAGS)
fi fi
fi
if test "x$idn" != "xyes"; then if test "x$idn" != "xyes"; then
dnl check with default paths dnl check with default paths
idn="yes"
AC_CHECK_LIB(idn, idna_to_ascii_lz, , AC_CHECK_LIB(idn, idna_to_ascii_lz, ,
idn="") idn="")
fi fi
@@ -978,7 +1035,7 @@ case "$LIBIDN" in
curl_idn_msg="enabled" curl_idn_msg="enabled"
dnl different versions of libidn have different setups of these: dnl different versions of libidn have different setups of these:
AC_CHECK_FUNCS( idn_free idna_strerror tld_strerror) AC_CHECK_FUNCS( idn_free idna_strerror tld_strerror)
AC_CHECK_HEADERS( idn-free.h ) AC_CHECK_HEADERS( idn-free.h tld.h )
fi fi
;; ;;
@@ -1114,13 +1171,17 @@ AC_CHECK_HEADERS(
dlfcn.h \ dlfcn.h \
alloca.h \ alloca.h \
winsock.h \ winsock.h \
winsock2.h \
time.h \ time.h \
io.h \ io.h \
pwd.h \ pwd.h \
utime.h \ utime.h \
sys/utime.h \ sys/utime.h \
sys/poll.h \ sys/poll.h \
sys/resource.h \
libgen.h \ libgen.h \
locale.h \
errno.h \
setjmp.h, setjmp.h,
dnl to do if not found dnl to do if not found
[], [],
@@ -1157,6 +1218,7 @@ AC_CHECK_SIZEOF(curl_off_t, ,[
]) ])
AC_CHECK_SIZEOF(size_t) AC_CHECK_SIZEOF(size_t)
AC_CHECK_SIZEOF(long) AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(time_t)
AC_CHECK_TYPE(long long, AC_CHECK_TYPE(long long,
[AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])] [AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])]
@@ -1202,8 +1264,6 @@ AC_CHECK_FUNCS( strtoll \
inet_addr \ inet_addr \
inet_ntoa \ inet_ntoa \
inet_pton \ inet_pton \
tcsetattr \
tcgetattr \
perror \ perror \
closesocket \ closesocket \
siginterrupt \ siginterrupt \
@@ -1217,7 +1277,12 @@ AC_CHECK_FUNCS( strtoll \
utime \ utime \
sigsetjmp \ sigsetjmp \
basename \ basename \
poll, setlocale \
ftruncate \
pipe \
poll \
getrlimit \
setrlimit,
dnl if found dnl if found
[], [],
dnl if not found, $ac_func is the name we check for dnl if not found, $ac_func is the name we check for
@@ -1234,6 +1299,20 @@ dnl if not found, $ac_func is the name we check for
) )
dnl For some reason, the check above doesn't properly detect select() with
dnl Msys/Mingw
if test "$ac_cv_func_select" != "yes"; then
AC_MSG_CHECKING([for select in ws2_32])
AC_TRY_LINK([#include <winsock2.h>],
[select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);],
[ dnl worked!
AC_MSG_RESULT([yes])
HAVE_SELECT="1"
AC_DEFINE_UNQUOTED(HAVE_SELECT,1)],
[AC_MSG_ERROR(You can't compile without a select)]
)
fi
dnl sigsetjmp() might be a macro and no function so if it isn't found already dnl sigsetjmp() might be a macro and no function so if it isn't found already
dnl we make an extra check here! dnl we make an extra check here!
if test "$ac_cv_func_sigsetjmp" != "yes"; then if test "$ac_cv_func_sigsetjmp" != "yes"; then
@@ -1405,6 +1484,26 @@ int main(void)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
) )
dnl ************************************************************
dnl disable verbose text strings
dnl
AC_MSG_CHECKING([whether to enable verbose strings])
AC_ARG_ENABLE(verbose,
AC_HELP_STRING([--enable-verbose],[Enable verbose strings])
AC_HELP_STRING([--disable-verbose],[Disable verbose strings]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_VERBOSE_STRINGS, 1, [to disable verbose strings])
AC_SUBST(CURL_DISABLE_VERBOSE_STRINGS)
curl_verbose_msg="no"
;;
*) AC_MSG_RESULT(yes)
;;
esac ],
AC_MSG_RESULT(yes)
)
dnl ************************************************************ dnl ************************************************************
dnl lame option to switch on debug options dnl lame option to switch on debug options
dnl dnl
@@ -1430,6 +1529,44 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
) )
dnl ************************************************************
dnl disable cryptographic authentication
dnl
AC_MSG_CHECKING([whether to enable cryptographic authentication methods])
AC_ARG_ENABLE(crypto-auth,
AC_HELP_STRING([--enable-crypto-auth],[Enable cryptographic authentication])
AC_HELP_STRING([--disable-crypto-auth],[Disable cryptographic authentication]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_CRYPTO_AUTH, 1, [to disable cryptographic authentication])
AC_SUBST(CURL_DISABLE_CRYPTO_AUTH)
;;
*) AC_MSG_RESULT(yes)
;;
esac ],
AC_MSG_RESULT(yes)
)
dnl ************************************************************
dnl disable cookies support
dnl
AC_MSG_CHECKING([whether to enable support for cookies])
AC_ARG_ENABLE(cookies,
AC_HELP_STRING([--enable-cookies],[Enable cookies support])
AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_COOKIES, 1, [to disable cookies support])
AC_SUBST(CURL_DISABLE_COOKIES)
;;
*) AC_MSG_RESULT(yes)
;;
esac ],
AC_MSG_RESULT(yes)
)
AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes) AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes)
AC_CONFIG_FILES([Makefile \ AC_CONFIG_FILES([Makefile \
@@ -1456,7 +1593,8 @@ AC_CONFIG_FILES([Makefile \
packages/EPM/curl.list \ packages/EPM/curl.list \
packages/EPM/Makefile \ packages/EPM/Makefile \
packages/vms/Makefile \ packages/vms/Makefile \
curl-config curl-config \
libcurl.pc
]) ])
AC_OUTPUT AC_OUTPUT
@@ -1470,10 +1608,11 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
zlib support: ${curl_zlib_msg} zlib support: ${curl_zlib_msg}
krb4 support: ${curl_krb4_msg} krb4 support: ${curl_krb4_msg}
GSSAPI support: ${curl_gss_msg} GSSAPI support: ${curl_gss_msg}
SNPEGO support: ${curl_spnego_msg} SPNEGO support: ${curl_spnego_msg}
c-ares support: ${curl_ares_msg} c-ares support: ${curl_ares_msg}
ipv6 support: ${curl_ipv6_msg} ipv6 support: ${curl_ipv6_msg}
IDN support: ${curl_idn_msg} IDN support: ${curl_idn_msg}
Build libcurl: Shared=${enable_shared}, Static=${enable_static} Build libcurl: Shared=${enable_shared}, Static=${enable_static}
Built-in manual: ${curl_manual_msg} Built-in manual: ${curl_manual_msg}
Verbose errors: ${curl_verbose_msg}
]) ])

View File

@@ -19,7 +19,8 @@ Available values for OPTION include:
--ca ca bundle install path --ca ca bundle install path
--cc compiler --cc compiler
--cflags pre-processor and compiler flags --cflags pre-processor and compiler flags
--feature newline separated list of enabled features --features newline separated list of enabled features
--protocols newline separated list of enabled protocols
--help display this help and exit --help display this help and exit
--libs library linking information --libs library linking information
--prefix curl install prefix --prefix curl install prefix
@@ -45,19 +46,19 @@ while test $# -gt 0; do
case "$1" in case "$1" in
--ca) --ca)
echo @CURL_CA_BUNDLE@ echo "@CURL_CA_BUNDLE@"
;; ;;
--cc) --cc)
echo @CC@ echo "@CC@"
;; ;;
--prefix) --prefix)
echo $prefix echo "$prefix"
;; ;;
--feature) --feature|--features)
if test "@OPENSSL_ENABLED@" = "1"; then if test "@USE_SSLEAY@" = "1"; then
echo "SSL" echo "SSL"
fi fi
if test "@KRB4_ENABLED@" = "1"; then if test "@KRB4_ENABLED@" = "1"; then
@@ -69,32 +70,40 @@ while test $# -gt 0; do
if test "@HAVE_LIBZ@" = "1"; then if test "@HAVE_LIBZ@" = "1"; then
echo "libz" echo "libz"
fi fi
if test "@CURL_DISABLE_HTTP@" = "1"; then
echo "HTTP-disabled"
fi
if test "@CURL_DISABLE_FTP@" = "1"; then
echo "FTP-disabled"
fi
if test "@CURL_DISABLE_GOPHER@" = "1"; then
echo "GOPHER-disabled"
fi
if test "@CURL_DISABLE_FILE@" = "1"; then
echo "FILE-disabled"
fi
if test "@CURL_DISABLE_TELNET@" = "1"; then
echo "TELNET-disabled"
fi
if test "@CURL_DISABLE_LDAP@" = "1"; then
echo "LDAP-disabled"
fi
if test "@CURL_DISABLE_DICT@" = "1"; then
echo "DICT-disabled"
fi
if test "@HAVE_ARES@" = "1"; then if test "@HAVE_ARES@" = "1"; then
echo "AsynchDNS" echo "AsynchDNS"
fi fi
;; ;;
--protocols)
if test "@CURL_DISABLE_HTTP@" != "1"; then
echo "HTTP"
if test "@USE_SSLEAY@" = "1"; then
echo "HTTPS"
fi
fi
if test "@CURL_DISABLE_FTP@" != "1"; then
echo "FTP"
if test "@USE_SSLEAY@" = "1"; then
echo "FTPS"
fi
fi
if test "@CURL_DISABLE_GOPHER@" != "1"; then
echo "GOPHER"
fi
if test "@CURL_DISABLE_FILE@" != "1"; then
echo "FILE"
fi
if test "@CURL_DISABLE_TELNET@" != "1"; then
echo "TELNET"
fi
if test "@CURL_DISABLE_LDAP@" != "1"; then
echo "LDAP"
fi
if test "@CURL_DISABLE_DICT@" != "1"; then
echo "DICT"
fi
;;
--version) --version)
echo libcurl @VERSION@ echo libcurl @VERSION@
exit 0 exit 0
@@ -123,8 +132,7 @@ while test $# -gt 0; do
*) *)
echo "unknown option: $1" echo "unknown option: $1"
usage usage 1
exit 1
;; ;;
esac esac
shift shift

View File

@@ -25,10 +25,14 @@ Basic
ScriptBasic bindings to libcurl. Writtten by Peter Verhas ScriptBasic bindings to libcurl. Writtten by Peter Verhas
http://scriptbasic.com/ http://scriptbasic.com/
C
libcurl is a C library in itself!
http://curl.haxx.se/libcurl/
C++ C++
Written by Jean-Philippe Barrette-LaPierre Written by Jean-Philippe Barrette-LaPierre
http://www.sourceforge.net/projects/curlpp http://rrette.com/curlpp.html
Ch Ch
@@ -68,7 +72,7 @@ glib/GTK+
Java Java
Written by Daniel Stenberg Maintained by Vic Hanson
http://curl.haxx.se/libcurl/java/ http://curl.haxx.se/libcurl/java/
Lua Lua
@@ -76,6 +80,16 @@ Lua
Written by Steve Dekorte Written by Steve Dekorte
http://curl.haxx.se/libcurl/lua/ http://curl.haxx.se/libcurl/lua/
Mono
Written by Jeffrey Phillips
http://forge.novell.com/modules/xfmod/project/?libcurl-mono
.NET
Written by Jeffrey Phillips
http://www.seasideresearch.com/downloads.html
Object-Pascal Object-Pascal
Free Pascal, Delphi and Kylix binding written by Christophe Espern. Free Pascal, Delphi and Kylix binding written by Christophe Espern.
@@ -108,9 +122,14 @@ PostgreSQL
Python Python
Written by Kjetil Jacobsen PycURL is written by Kjetil Jacobsen
http://pycurl.sourceforge.net/ http://pycurl.sourceforge.net/
R
RCurl is written by Duncan Temple Lang
http://www.omegahat.org/RCurl/
Rexx Rexx
Written Mark Hessling Written Mark Hessling
@@ -128,7 +147,7 @@ Scheme
Tcl Tcl
Written by Andr<64>s Garc<72>a Tclcurl is written by Andr<64>s Garc<72>a
http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html
Q Q

View File

@@ -1,4 +1,4 @@
Updated: August 18, 2004 (http://curl.haxx.se/docs/faq.html) Updated: December 21, 2004 (http://curl.haxx.se/docs/faq.html)
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@@ -42,6 +42,7 @@ FAQ
3.14 Does curl support javascript or pac (automated proxy config)? 3.14 Does curl support javascript or pac (automated proxy config)?
3.15 Can I do recursive fetches with curl? 3.15 Can I do recursive fetches with curl?
3.16 What certificates do I need when I use SSL? 3.16 What certificates do I need when I use SSL?
3.17 How do I list the root dir of an FTP server?
4. Running Problems 4. Running Problems
4.1 Problems connecting to SSL servers. 4.1 Problems connecting to SSL servers.
@@ -520,6 +521,18 @@ FAQ
that was signed by one of the authorities in the bundle. curl comes with a that was signed by one of the authorities in the bundle. curl comes with a
default CA cert bundle. You can override the default. default CA cert bundle. You can override the default.
3.17 How do I list the root dir of an FTP server?
There are two ways. The way defined in the RFC is to use an encoded slash
in the first path part. List the "/tmp" dir like this:
curl ftp://ftp.sunet.se/%2ftmp/
or the not-quite-kosher-but-more-readable way, by simply starting the path
section of the URL with a slash:
curl ftp://ftp.sunet.se//tmp/
4. Running Problems 4. Running Problems
@@ -623,7 +636,10 @@ FAQ
4.6 Can you tell me what error code 142 means? 4.6 Can you tell me what error code 142 means?
All error codes that are larger than the highest documented error code means All curl error codes are described at the end of the man page, in the
section called "EXIT CODES".
Error codes that are larger than the highest documented error code means
that curl has exited due to a crash. This is a serious error, and we that curl has exited due to a crash. This is a serious error, and we
appreciate a detailed bug report from you that describes how we could go appreciate a detailed bug report from you that describes how we could go
ahead and repeat this! ahead and repeat this!
@@ -803,6 +819,22 @@ FAQ
(Provided by Andrew Francis) (Provided by Andrew Francis)
When building an application that uses the static libcurl library, you must
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
dynamic import symbols. If you get linker error like "unknown symbol
__imp__curl_easy_init ..." you have linked against the wrong (static)
library. If you want to use the libcurl.dll and import lib, you don't need
any extra CFLAGS, but use one of the import libraries below. These are the
libraries produced by the various lib/Makefile.* files:
Target: static lib. import lib for libcurl*.dll.
-----------------------------------------------------------
MingW: libcurl.a libcurldll.a
MSVC (release): libcurl.lib libcurl_imp.lib
MSVC (debug): libcurld.lib libcurld_imp.lib
Borland: libcurl.lib libcurl_imp.lib
5.8 libcurl.so.3: open failed: No such file or directory 5.8 libcurl.so.3: open failed: No such file or directory
This is an error message you might get when you try to run a program linked This is an error message you might get when you try to run a program linked

View File

@@ -79,8 +79,18 @@ UNIX
env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \ env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
./configure ./configure
If your SSL library was compiled with rsaref (usually for use in the United If you have shared SSL libs installed in a directory where your run-time
States), you may also need to set: linker doesn't find them (which usually causes configure failures), you can
provide the -R option to ld on some operating systems to set a hard-coded
path to the run-time linker:
LDFLAGS=-R/usr/local/ssl/lib ./configure --with-ssl
Another option to the previous trick, is to set LD_LIBRARY_PATH or edit the
/etc/ld.so.conf file.
If your SSL library was compiled with rsaref (this was common in the past
when used in the United States), you may also need to set:
LIBS=-lRSAglue -lrsaref LIBS=-lRSAglue -lrsaref
(as suggested by Doug Kaufman) (as suggested by Doug Kaufman)
@@ -92,7 +102,7 @@ UNIX
CC=cc ./configure CC=cc ./configure
or or
env Cc=cc ./configure env CC=cc ./configure
To force a static library compile, disable the shared library creation To force a static library compile, disable the shared library creation
by running configure like: by running configure like:
@@ -283,6 +293,13 @@ Win32
- Add defines to Project/Settings/C/C++/General/Preprocessor Definitions - Add defines to Project/Settings/C/C++/General/Preprocessor Definitions
in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project. in the curllib.dsw/curllib.dsp Visual C++ 6 IDE project.
Important (with SSL or not):
When building an application that uses the static libcurl library, you
must add '-DCURL_STATICLIB' to your CFLAGS. Otherwise the linker will
look for dynamic import symbols.
IBM OS/2 IBM OS/2
======== ========
@@ -353,9 +370,9 @@ VMS
+----+------------+-------------+---+ +----+------------+-------------+---+
With the Ctrl-bits an application can tell if part or the whole message has With the Ctrl-bits an application can tell if part or the whole message has
allready been printed from the program, DCL doesn't need to print it again. already been printed from the program, DCL doesn't need to print it again.
Facility - basicaly the program ID. A code assigned to the program Facility - basically the program ID. A code assigned to the program
the name can be fetched from external or internal message libraries the name can be fetched from external or internal message libraries
Errorcode - the errodes assigned by the application Errorcode - the errodes assigned by the application
Sev. - severity: Even = error, off = non error Sev. - severity: Even = error, off = non error
@@ -387,7 +404,7 @@ QNX
=== ===
(This section was graciously brought to us by David Bentham) (This section was graciously brought to us by David Bentham)
As QNX is targetted for resource constrained environments, the QNX headers As QNX is targeted for resource constrained environments, the QNX headers
set conservative limits. This includes the FD_SETSIZE macro, set by default set conservative limits. This includes the FD_SETSIZE macro, set by default
to 32. Socket descriptors returned within the CURL library may exceed this, to 32. Socket descriptors returned within the CURL library may exceed this,
resulting in memory faults/SIGSEGV crashes when passed into select(..) resulting in memory faults/SIGSEGV crashes when passed into select(..)
@@ -397,44 +414,6 @@ QNX
libcurl, by overriding CFLAGS during configure, example libcurl, by overriding CFLAGS during configure, example
# configure CFLAGS='-DFD_SETSIZE=64 -g -O2' # configure CFLAGS='-DFD_SETSIZE=64 -g -O2'
CROSS COMPILE
=============
(This section was graciously brought to us by Jim Duey, 23-oct-2001)
Download and unpack the cURL package. Version should be 7.9.1 or later.
'cd' to the new directory. (ie. curl-7.9.1-pre4)
Set environment variables to point to the cross-compile toolchain and call
configure with any options you need. Be sure and specify the '--host' and
'--build' parameters at configuration time. The following script is an
example of cross-compiling for the IBM 405GP PowerPC processor using the
toolchain from MonteVista for Hardhat Linux.
(begin script)
#! /bin/sh
export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin
export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include"
export AR=ppc_405-ar
export AS=ppc_405-as
export LD=ppc_405-ld
export RANLIB=ppc_405-ranlib
export CC=ppc_405-gcc
export NM=ppc_405-nm
configure --target=powerpc-hardhat-linux \
--host=powerpc-hardhat-linux \
--build=i586-pc-linux-gnu \
--prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \
--exec-prefix=/usr/local
(end script)
The '--prefix' parameter specifies where cURL will be installed. If
'configure' completes successfully, do 'make' and 'make install' as usual.
RISC OS RISC OS
======= =======
@@ -478,31 +457,107 @@ NetWare
- gnu make and awk running on the platform you compile on; - gnu make and awk running on the platform you compile on;
native Win32 versions can be downloaded from: native Win32 versions can be downloaded from:
http://www.gknw.com/development/prgtools/ http://www.gknw.com/development/prgtools/
- recent Novell LibC SDK availabable from: - recent Novell LibC SDK available from:
http://developer.novell.com/ndk/libc.htm http://developer.novell.com/ndk/libc.htm
- optional zlib sources (at the moment only dynamic linking with zlib.imp); - optional zlib sources (at the moment only dynamic linking with zlib.imp);
sources with NetWare Makefile can be optained from: sources with NetWare Makefile can be obtained from:
http://www.gknw.com/mirror/zlib/ http://www.gknw.com/mirror/zlib/
Set a search path to your compiler, linker and tools; if you want to have Set a search path to your compiler, linker and tools; if you want to have
zlib support then set the environment var ZLIB_PATH pointing to your zlib zlib support then set the environment var ZLIB_PATH pointing to your zlib
sources, on Linux make sure the var OSTYPE contains the string 'linux'; sources, on Linux make sure the var OSTYPE contains the string 'linux';
and finally type 'make netware' from the top source directory... and finally type 'make netware' from the top source directory...
I found on some Linux systems (RH9) that OS detection didnt work although I found on some Linux systems (RH9) that OS detection didnlt work although
a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...; with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...;
other options are currently not supported, although partly prepared. other options are currently not supported, although partly prepared.
The Ares lib builds arlready fine, and both test tools work fine at least The Ares lib builds arlready fine, and both test tools work fine at least
when build with CodeWarrior...; dont know yet why they fail when build with when build with CodeWarrior...; don't know yet why they fail when build with
gcc though; if you want to compile with Ares support then set an env var gcc though; if you want to compile with Ares support then set an env var
WITH_ARES=1; I've not tested yet including libcares into curl. WITH_ARES=1; I've not tested yet including libares into curl.
Any help in testing appreciated! Any help in testing appreciated!
Buils automatically created 4 times a day from current CVS are here: Builds automatically created 4 times a day from current CVS are here:
http://www.gknw.com/mirror/curl/autobuilds/ http://www.gknw.com/mirror/curl/autobuilds/
the status of these buids can be viewed at the autobuild table: the status of these builds can be viewed at the autobuild table:
http://curl.haxx.se/auto/ http://curl.haxx.se/auto/
CROSS COMPILE
=============
(This section was graciously brought to us by Jim Duey, with additions by
Dan Fandrich)
Download and unpack the cURL package. Version should be 7.9.1 or later.
'cd' to the new directory. (e.g. cd curl-7.12.3)
Set environment variables to point to the cross-compile toolchain and call
configure with any options you need. Be sure and specify the '--host' and
'--build' parameters at configuration time. The following script is an
example of cross-compiling for the IBM 405GP PowerPC processor using the
toolchain from MonteVista for Hardhat Linux.
(begin script)
#! /bin/sh
export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin
export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include"
export AR=ppc_405-ar
export AS=ppc_405-as
export LD=ppc_405-ld
export RANLIB=ppc_405-ranlib
export CC=ppc_405-gcc
export NM=ppc_405-nm
./configure --target=powerpc-hardhat-linux \
--host=powerpc-hardhat-linux \
--build=i586-pc-linux-gnu \
--prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \
--exec-prefix=/usr/local
(end script)
You may also need to provide a parameter like '--with-random=/dev/urandom'
to configure as it cannot detect the presence of a random number
generating device for a target system. The '--prefix' parameter
specifies where cURL will be installed. If 'configure' completes
successfully, do 'make' and 'make install' as usual.
In some cases, you may be able to simplify the above commands to as
little as:
./configure --host=ARCH-OS
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 environment variable
when configuring with any compiler optimization flags to reduce the
size of the binary. For gcc, this would mean at minimum:
env CFLAGS='-Os' ./configure ...
Be sure to specify as many --disable- and --without- flags on the configure
command-line as you can to disable all the libcurl features that you
know your application is not going to need. Besides specifying the
--disable-PROTOCOL flags for all the types of URLs your application
will not use, here are some other flags that can reduce the size of the
library:
--disable-ares (disables support for the ARES DNS library)
--disable-cookies (disables support for HTTP cookies)
--disable-crypto-auth (disables HTTP cryptographic authentication)
--disable-ipv6 (disables support for IPv6)
--disable-verbose (eliminates debugging strings and error code strings)
--without-libidn (disables support for the libidn DNS library)
--without-ssl (disables support for SSL/TLS)
--without-zlib (disables support for on-the-fly decompression)
You may find that statically linking libcurl to your application will
result in a lower total size.
PORTS PORTS
===== =====
This is a probably incomplete list of known hardware and operating systems This is a probably incomplete list of known hardware and operating systems
@@ -538,6 +593,7 @@ PORTS
- Ultrix 4.3a - Ultrix 4.3a
- i386 BeOS - i386 BeOS
- i386 DOS - i386 DOS
- i386 Esix 4.1
- i386 FreeBSD - i386 FreeBSD
- i386 HURD - i386 HURD
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4 - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4

View File

@@ -3,56 +3,78 @@ 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 changelog of the current development status, as one or more of these problems
may have been fixed since this was written! may have been fixed since this was written!
* curl version 7.12.2 fails on AIX if compiled with --enable-ares. 19. FTP 3rd party transfers with the multi interface doesn't work. Test:
define CURL_MULTIEASY, rebuild curl, run test case 230 - 232.
18. test case 57 has </test> that should be </client> but when corrected, the
test case fails!
16. FTP URLs passed to curl may contain NUL (0x00) in the RFC 1738 <user>,
<password>, and <fpath> components, encoded as "%00". The problem is that
curl_unescape does not detect this, but instead returns a shortened C
string. From a strict FTP protocol standpoint, NUL is a valid character
within RFC 959 <string>, so the way to handle this correctly in curl would
be to use a data structure other than a plain C string, one that can handle
embedded NUL characters. From a practical standpoint, most FTP servers
would not meaningfully support NUL characters within RFC 959 <string>,
anyway (e.g., UNIX pathnames may not contain NUL).
15. Test case 241 fails on all systems that support IPv6 but that don't have
the host name 'ip6-localhost' in /etc/hosts (or similar) since the test case
uses that host name to test the IPv6 name to address resolver.
14. Test case 165 might fail on system which has libidn present, but with an
old iconv version (2.1.3 is a known bad version), since it doesn't recognize
the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the
test pass, but instead makes it fail on Solaris hosts that use its native
iconv.
13. curl version 7.12.2 fails on AIX if compiled with --enable-ares.
The workaround is to combine --enable-ares with --disable-shared The workaround is to combine --enable-ares with --disable-shared
* When connecting to a SOCKS proxy, the (connect) timeout is not properly 12. When connecting to a SOCKS proxy, the (connect) timeout is not properly
acknowledged after the actual TCP connect (during the SOCKS "negotiate" acknowledged after the actual TCP connect (during the SOCKS "negotiate"
phase). Pointed out by Lucas. Fix: need to select() and timeout properly. phase). Pointed out by Lucas. Fix: need to select() and timeout properly.
* Using configure --disable-[protocol] may cause 'make test' to fail for 11. Using configure --disable-[protocol] may cause 'make test' to fail for
tests using the disabled protocol(s). tests using the disabled protocol(s).
* To get HTTP Negotiate authentication to work fine, you need to provide a 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 (fake) user name (this concerns both curl and the lib) because the code
wrongly only considers authentication if there's a user name provided. wrongly only considers authentication if there's a user name provided.
Bug report #1004841. How? http://curl.haxx.se/mail/lib-2004-08/0182.html Bug report #1004841. How? http://curl.haxx.se/mail/lib-2004-08/0182.html
* If you use a very large amount of file descriptors (more than FD_SETSIZE) 9. --limit-rate using -d or -F does not work. This is because the limit logic
and then use libcurl, it might crash on its use of select() which then
stores data out of bounds. Bug report #948950.
* --limit-rate using -d or -F does not work. This is because the limit logic
is provided by the curl app in its read/write callbacks, and when doing is provided by the curl app in its read/write callbacks, and when doing
-d/-F the callbacks aren't used! Bug report #921395. -d/-F the callbacks aren't used! Bug report #921395.
* Doing resumed upload over HTTP does not work with '-C -', because curl 8. Doing resumed upload over HTTP does not work with '-C -', because curl
doesn't do a HEAD first to get the initial size. This needs to be done doesn't do a HEAD first to get the initial size. This needs to be done
manually for HTTP PUT resume to work, and then '-C [index]'. manually for HTTP PUT resume to work, and then '-C [index]'.
* CURLOPT_USERPWD and CURLOPT_PROXYUSERPWD have no way of providing user names 7. CURLOPT_USERPWD and CURLOPT_PROXYUSERPWD have no way of providing user names
that contain a colon. This can't be fixed easily in a backwards compatible that contain a colon. This can't be fixed easily in a backwards compatible
way without adding new options (and then, they should most probably allow way without adding new options (and then, they should most probably allow
setting user name and password separately). setting user name and password separately).
* libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that 6. libcurl ignores empty path parts in FTP URLs, whereas RFC1738 states that
such parts should be sent to the server as 'CWD ' (without an argument). such parts should be sent to the server as 'CWD ' (without an argument).
The only exception to this rule, is that we knowingly break this if the The only exception to this rule, is that we knowingly break this if the
empty part is first in the path, as then we use the double slashes to empty part is first in the path, as then we use the double slashes to
indicate that the user wants to reach the root dir (this exception SHALL indicate that the user wants to reach the root dir (this exception SHALL
remain even when this bug is fixed). remain even when this bug is fixed).
* libcurl doesn't treat the content-length of compressed data properly, as 5. libcurl doesn't treat the content-length of compressed data properly, as
it seems HTTP servers send the *uncompressed* length in that header and it seems HTTP servers send the *uncompressed* length in that header and
libcurl thinks of it as the *compressed* lenght. Some explanations are here: libcurl thinks of it as the *compressed* length. Some explanations are here:
http://curl.haxx.se/mail/lib-2003-06/0146.html http://curl.haxx.se/mail/lib-2003-06/0146.html
* IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage 4. IPv6 support on AIX 4.3.3 doesn't work due to a missing sockaddr_storage
struct. It has been reported to work on AIX 5.1 though. struct. It has been reported to work on AIX 5.1 though.
* GOPHER transfers seem broken 3. GOPHER transfers seem broken
* If a HTTP server responds to a HEAD request and includes a body (thus 2. If a HTTP server responds to a HEAD request and includes a body (thus
violating the RFC2616), curl won't wait to read the response but just stop violating the RFC2616), curl won't wait to read the response but just stop
reading and return back. If a second request (let's assume a GET) is then reading and return back. If a second request (let's assume a GET) is then
immediately made to the same server again, the connection will be re-used immediately made to the same server again, the connection will be re-used
@@ -61,3 +83,7 @@ may have been fixed since this was written!
and havoc is what happens. and havoc is what happens.
More details on this is found in this libcurl mailing list thread: More details on this is found in this libcurl mailing list thread:
http://curl.haxx.se/mail/lib-2002-08/0000.html http://curl.haxx.se/mail/lib-2002-08/0000.html
1. LDAP support requires that not only the OpenLDAP shared libraries be
present at run time, but the development libraries (liblber.so and
libldap.so) as well (not applicable to Windows).

View File

@@ -170,8 +170,8 @@ UPLOADING
curl -T - http://www.upload.com/myfile curl -T - http://www.upload.com/myfile
Note that the http server must've been configured to accept PUT before this Note that the http server must have been configured to accept PUT before
can be done successfully. this can be done successfully.
For other ways to do http data upload, see the POST section below. For other ways to do http data upload, see the POST section below.
@@ -370,7 +370,7 @@ COOKIES
curl -b headers www.example.com curl -b headers www.example.com
While saving headers to a file is a working way to store cookies, it is While saving headers to a file is a working way to store cookies, it is
however error-prone and not the prefered way to do this. Instead, make curl however error-prone and not the preferred way to do this. Instead, make curl
save the incoming cookies using the well-known netscape cookie format like save the incoming cookies using the well-known netscape cookie format like
this: this:
@@ -388,7 +388,7 @@ COOKIES
file contents. In the above command, curl will parse the header and store file contents. In the above command, curl will parse the header and store
the cookies received from www.example.com. curl will send to the server the the cookies received from www.example.com. curl will send to the server the
stored cookies which match the request as it follows the location. The stored cookies which match the request as it follows the location. The
file "empty.txt" may be a non-existant file. file "empty.txt" may be a nonexistent file.
Alas, to both read and write cookies from a netscape cookie file, you can Alas, to both read and write cookies from a netscape cookie file, you can
set both -b and -c to use the same file: set both -b and -c to use the same file:
@@ -417,7 +417,7 @@ PROGRESS METER
Upload - the average transfer speed of the upload Upload - the average transfer speed of the upload
Time Total - expected time to complete the operation Time Total - expected time to complete the operation
Time Current - time passed since the invoke Time Current - time passed since the invoke
Time Left - expected time left to completetion Time Left - expected time left to completion
Curr.Speed - the average transfer speed the last 5 seconds (the first Curr.Speed - the average transfer speed the last 5 seconds (the first
5 seconds of a transfer is based on less time of course.) 5 seconds of a transfer is based on less time of course.)
@@ -437,14 +437,14 @@ SPEED LIMIT
curl -Y 3000 -y 60 www.far-away-site.com curl -Y 3000 -y 60 www.far-away-site.com
This can very well be used in combination with the overall time limit, so This can very well be used in combination with the overall time limit, so
that the above operatioin must be completed in whole within 30 minutes: that the above operation must be completed in whole within 30 minutes:
curl -m 1800 -Y 3000 -y 60 www.far-away-site.com curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
Forcing curl not to transfer data faster than a given rate is also possible, Forcing curl not to transfer data faster than a given rate is also possible,
which might be useful if you're using a limited bandwidth connection and you which might be useful if you're using a limited bandwidth connection and you
don't want your transfer to use all of it (sometimes referred to as don't want your transfer to use all of it (sometimes referred to as
"bandwith throttle"). "bandwidth throttle").
Make curl transfer data no faster than 10 kilobytes per second: Make curl transfer data no faster than 10 kilobytes per second:
@@ -590,7 +590,7 @@ HTTPS
Secure HTTP requires SSL libraries to be installed and used when curl is Secure HTTP requires SSL libraries to be installed and used when curl is
built. If that is done, curl is capable of retrieving and posting documents built. If that is done, curl is capable of retrieving and posting documents
using the HTTPS procotol. using the HTTPS protocol.
Example: Example:
@@ -765,7 +765,7 @@ NETRC
to specify name and password for commonly visited ftp sites in a file so to specify name and password for commonly visited ftp sites in a file so
that you don't have to type them in each time you visit those sites. You that you don't have to type them in each time you visit those sites. You
realize this is a big security risk if someone else gets hold of your realize this is a big security risk if someone else gets hold of your
passwords, so therefor most unix programs won't read this file unless it is passwords, so therefore most unix programs won't read this file unless it is
only readable by yourself (curl doesn't care though). only readable by yourself (curl doesn't care though).
Curl supports .netrc files if told so (using the -n/--netrc and Curl supports .netrc files if told so (using the -n/--netrc and
@@ -830,22 +830,22 @@ TELNET
to track when the login prompt is received and send the username and to track when the login prompt is received and send the username and
password accordingly. password accordingly.
PERSISTANT CONNECTIONS PERSISTENT CONNECTIONS
Specifying multiple files on a single command line will make curl transfer Specifying multiple files on a single command line will make curl transfer
all of them, one after the other in the specified order. all of them, one after the other in the specified order.
libcurl will attempt to use persistant connections for the transfers so that libcurl will attempt to use persistent connections for the transfers so that
the second transfer to the same host can use the same connection that was the second transfer to the same host can use the same connection that was
already initiated and was left open in the previous transfer. This greatly already initiated and was left open in the previous transfer. This greatly
decreases connection time for all but the first transfer and it makes a far decreases connection time for all but the first transfer and it makes a far
better use of the network. better use of the network.
Note that curl cannot use persistant connections for transfers that are used Note that curl cannot use persistent connections for transfers that are used
in subsequence curl invokes. Try to stuff as many URLs as possible on the in subsequence curl invokes. Try to stuff as many URLs as possible on the
same command line if they are using the same host, as that'll make the same command line if they are using the same host, as that'll make the
transfers faster. If you use a http proxy for file transfers, practicly transfers faster. If you use a http proxy for file transfers, practically
all transfers will be persistant. all transfers will be persistent.
MAILING LISTS MAILING LISTS

View File

@@ -98,3 +98,13 @@ Gisle Vanem <gvanem@broadpark.no>
Giuseppe Attardi <attardi@di.unipi.it> Giuseppe Attardi <attardi@di.unipi.it>
Tor Arntsen <tor@spacetec.no> Tor Arntsen <tor@spacetec.no>
David Byron <DByron@everdreamcorp.com> David Byron <DByron@everdreamcorp.com>
David Phillips
Alexander Krasnostavsky
G<EFBFBD>nter Knauf
Bertrand Demiddelaer
Peter Sylvester
Alexis S. L. Carvalho
Casey O'Donnell
Marty Kuhrt
James Bursa
Greg Hewgill

View File

@@ -15,10 +15,10 @@ TODO
LIBCURL LIBCURL
* Introduce an interface to libcurl that allows applications to easier get to * Introduce an interface to libcurl that allows applications to easier get to
know what cookies that are received. Pushing interface that calls a know what cookies that are received. CURLINFO_COOKIELIST to get a
callback on each received cookie? Querying interface that asks about curl_slist with cookies (netscape/mozilla cookie file formatted), and
existing cookies? We probably need both. Enable applications to modify CURLOPT_COOKIELIST to set a list of cookies (using the same format).
existing cookies as well. http://curl.haxx.se/dev/COOKIES http://curl.haxx.se/mail/lib-2004-12/0195.html
* Introduce another callback interface for upload/download that makes one * Introduce another callback interface for upload/download that makes one
less copy of data and thus a faster operation. less copy of data and thus a faster operation.
@@ -36,8 +36,16 @@ TODO
* Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and * Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
* Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan.
LIBCURL - multi interface LIBCURL - multi interface
* Add a curl_multi_fdset() alternative that returns only two arrays with file
desrciptors for reading and writing to allow the app to use whatever
function it prefers. Plus, this allows apps to avoid the FD_SETSIZE problem
with select().
* Add curl_multi_timeout() to make libcurl's ares-functionality better. * Add curl_multi_timeout() to make libcurl's ares-functionality better.
* Make sure we don't ever loop because of non-blocking sockets return * Make sure we don't ever loop because of non-blocking sockets return
@@ -57,24 +65,20 @@ TODO
FTP FTP
* "PASV IP override" - When an FTPS host is behind a NAT firewall, passive * Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in
mode fails. The PASV response from the host ["227 PASV Entering passive the process to avoid doing a resolve and connect in vain.
mode (_ip_address_, _port_)."] contains the private network IP address of
the host, which since it is encrypted, cannot be modified by the firewall * Code overhaul to make it more state-machine like and to _never_ block on
to the public IP address. What is needed is a cURL option to override the waiting for server responses when used with the multi interface.
IP address passed by the host "227 PASV" response. Requested by Ed
Hingsbergen
* Support GSS/Kerberos 5 for ftp file transfer. This will allow user * Support GSS/Kerberos 5 for ftp file transfer. This will allow user
authentication and file encryption. Possible libraries and example clients authentication and file encryption. Possible libraries and example clients
are available from MIT or Heimdal. Requsted by Markus Moeller. are available from MIT or Heimdal. Requsted by Markus Moeller.
* Optimize the way libcurl uses CWD on each new request over a persistent
connection (on FTP) even if it doesn't have to.
* REST fix for servers not behaving well on >2GB requests. This should fail * REST fix for servers not behaving well on >2GB requests. This should fail
if the server doesn't set the pointer to the requested index. The tricky if the server doesn't set the pointer to the requested index. The tricky
part is to figure out if the server did the right thing or not. (impossible?) part is to figure out if the server did the right thing or
not.
* Support the most common FTP proxies, Philip Newton provided a list * Support the most common FTP proxies, Philip Newton provided a list
allegedly from ncftp: allegedly from ncftp:
@@ -101,6 +105,10 @@ TODO
This could possibly be implemented using the multi interface to queue This could possibly be implemented using the multi interface to queue
requests and the response data. requests and the response data.
* When doing CONNECT to a HTTP proxy, libcurl always uses HTTP/1.0. This has
never been reported as causing trouble to anyone, but should be considered
to use the HTTP version the user has chosen.
TELNET TELNET
* Reading input (to send to the remote server) on stdin is a crappy solution * Reading input (to send to the remote server) on stdin is a crappy solution
@@ -153,6 +161,22 @@ TODO
lib/ldap.c source file and get moved to the main network code so that the lib/ldap.c source file and get moved to the main network code so that the
multi interface and friends will work for LDAP as well. multi interface and friends will work for LDAP as well.
NEW PROTOCOLS
* TFTP - RFC1350 (protocol) and RFC3617 (URI format)
Dan Fandrich: I wrote a tftp protocol module as part of the I-Boot
bootloader under a BSD-style license with attribution clause
http://download.intrinsyc.com/supported/tools/i-boot-lite/i-boot-lite-1.8/src/libs/net/tftp.c
* RTSP - RFC2326 (protocol - very HTTP-like, also contains URL description)
* SFTP/SCP/SSH (no RFCs for protocol nor URI/URL format). An implementation
should most probably use an existing ssh library, such as OpenSSH.
* RSYNC (no RFCs for protocol nor URI/URL format). An implementation should
most probably use an existing rsync library, such as librsync.
CLIENT CLIENT
* "curl --sync http://example.com/feed[1-100].rss" or * "curl --sync http://example.com/feed[1-100].rss" or
@@ -221,9 +245,6 @@ TODO
* Make the test servers able to serve multiple running test suites. Like if * Make the test servers able to serve multiple running test suites. Like if
two users run 'make test' at once. two users run 'make test' at once.
* Make runtests.pl capable of changing port numbers for the servers. This was
the intention from the start, but in practise it is now hard.
* If perl wasn't found by the configure script, don't attempt to run the * If perl wasn't found by the configure script, don't attempt to run the
tests but explain something nice why it doesn't. tests but explain something nice why it doesn't.
@@ -250,3 +271,6 @@ TODO
They will instead become curlx_ - alternatives. That makes the curl app They will instead become curlx_ - alternatives. That makes the curl app
still capable of building with them from source. still capable of building with them from source.
* Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
internally. Let the app judge success or not for itself.

View File

@@ -1,7 +1,5 @@
Online: http://curl.haxx.se/docs/httpscripting.shtml Online: http://curl.haxx.se/docs/httpscripting.html
Author: Daniel Stenberg <daniel@haxx.se> Date: December 9, 2004
Date: November 6, 2001
Version: 0.6
The Art Of Scripting HTTP Requests Using Curl The Art Of Scripting HTTP Requests Using Curl
============================================= =============================================
@@ -139,11 +137,11 @@ Version: 0.6
you need to replace that space with %20 etc. Failing to comply with this you need to replace that space with %20 etc. Failing to comply with this
will most likely cause your data to be received wrongly and messed up. will most likely cause your data to be received wrongly and messed up.
4.3 FILE UPLOAD POST 4.3 File Upload POST
Back in late 1995 they defined a new way to post data over HTTP. It was Back in late 1995 they defined an additional way to post data over HTTP. It
documented in the RFC 1867, why this method sometimes is referred to as is documented in the RFC 1867, why this method sometimes is referred to as
a RFC1867-posting. RFC1867-posting.
This method is mainly designed to better support file uploads. A form that This method is mainly designed to better support file uploads. A form that
allows a user to upload a file could be written like this in HTML: allows a user to upload a file could be written like this in HTML:
@@ -160,7 +158,7 @@ Version: 0.6
curl -F upload=@localfilename -F press=OK [URL] curl -F upload=@localfilename -F press=OK [URL]
4.4 HIDDEN FIELDS 4.4 Hidden Fields
A very common way for HTML based application to pass state information 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 between pages is to add hidden fields to the forms. Hidden fields are
@@ -181,7 +179,7 @@ Version: 0.6
curl -d "birthyear=1905&press=OK&person=daniel" [URL] curl -d "birthyear=1905&press=OK&person=daniel" [URL]
4.5 FIGURE OUT WHAT A POST LOOKS LIKE 4.5 Figure Out What A POST Looks Like
When you're about fill in a form and send to a server by using curl instead 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 of a browser, you're of course very interested in sending a POST exactly the
@@ -204,7 +202,7 @@ Version: 0.6
curl -T uploadfile www.uploadhttp.com/receive.cgi curl -T uploadfile www.uploadhttp.com/receive.cgi
6. AUTHENTICATION 6. Authentication
Authentication is the ability to tell the server your username and password 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 so that it can verify that you're allowed to do the request you're doing. The
@@ -229,31 +227,31 @@ Version: 0.6
curl -U proxyuser:proxypassword curl.haxx.se curl -U proxyuser:proxypassword curl.haxx.se
If your proxy requires the authentication to be done using the NTLM method, If your proxy requires the authentication to be done using the NTLM method,
use --proxy-ntlm. use --proxy-ntlm, if it requires Digest use --proxy-digest.
If you use any one these user+password options but leave out the password If you use any one these user+password options but leave out the password
part, curl will prompt for the password interactively. part, curl will prompt for the password interactively.
Do note that when a program is run, its parameters are possible to see when Do note that when a program is run, its parameters might be possible to see
listing the running processes of the system. Thus, other users may be able to when listing the running processes of the system. Thus, other users may be
watch your passwords if you pass them as plain command line options. There able to watch your passwords if you pass them as plain command line
are ways to circumvent this. options. There are ways to circumvent this.
7. REFERER 7. Referer
A HTTP request may include a 'referer' field, which can be used to tell from A HTTP request may include a 'referer' field (yes it is misspelled), which
which URL the client got to this particular resource. Some programs/scripts can be used to tell from which URL the client got to this particular
check the referer field of requests to verify that this wasn't arriving from resource. Some programs/scripts check the referer field of requests to verify
an external site or an unknown page. While this is a stupid way to check that this wasn't arriving from an external site or an unknown page. While
something so easily forged, many scripts still do it. Using curl, you can put this is a stupid way to check something so easily forged, many scripts still
anything you want in the referer-field and thus more easily be able to fool do it. Using curl, you can put anything you want in the referer-field and
the server into serving your request. thus more easily be able to fool the server into serving your request.
Use curl to set the referer field with: Use curl to set the referer field with:
curl -e http://curl.haxx.se daniel.haxx.se curl -e http://curl.haxx.se daniel.haxx.se
8. USER AGENT 8. User Agent
Very similar to the referer field, all HTTP requests may set the 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 field. It names what user agent (client) that is being used. Many
@@ -275,7 +273,7 @@ Version: 0.6
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL] curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
9. REDIRECTS 9. Redirects
When a resource is requested from a server, the reply from the server may 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 include a hint about where the browser should go next to find this page, or a
@@ -294,7 +292,7 @@ Version: 0.6
page, you can safely use -L and -d/-F together. Curl will only use POST in page, you can safely use -L and -d/-F together. Curl will only use POST in
the first request, and then revert to GET in the following operations. the first request, and then revert to GET in the following operations.
10. COOKIES 10. Cookies
The way the web browsers do "client side state control" is by using The way the web browsers do "client side state control" is by using
cookies. Cookies are just names with associated contents. The cookies are cookies. Cookies are just names with associated contents. The cookies are
@@ -366,7 +364,7 @@ Version: 0.6
curl https://that.secure.server.com curl https://that.secure.server.com
11.1 CERTIFICATES 11.1 Certificates
In the HTTPS world, you use certificates to validate that you are the one In the HTTPS world, you use certificates to validate that you are the one
you you claim to be, as an addition to normal passwords. Curl supports you you claim to be, as an addition to normal passwords. Curl supports
@@ -379,11 +377,67 @@ Version: 0.6
curl -E mycert.pem https://that.secure.server.com curl -E mycert.pem https://that.secure.server.com
curl also tries to verify that the server is who it claims to be, by curl also tries to verify that the server is who it claims to be, by
verifying the server's certificate against a CA cert bundle. Failing the verifying the server's certificate against a locally stored CA cert
verification will cause curl to deny the connection. You must then use -k in bundle. Failing the verification will cause curl to deny the connection. You
case you want to tell curl to ignore that the server can't be verified. must then use -k in case you want to tell curl to ignore that the server
can't be verified.
12. REFERENCES More about server certificate verification and ca cert bundles can be read
in the SSLCERTS document, available online here:
http://curl.haxx.se/docs/sslcerts.html
12. Custom Request Elements
Doing fancy stuff, you may need to add or change elements of a single curl
request.
For example, you can change the POST request to a PROPFIND and send the data
as "Content-Type: text/xml" (instead of the default Content-Type) like this:
curl -d "<xml>" -H "Content-Type: text/xml" -X PROPFIND url.com
You can delete a default header by providing one without content. Like you
can ruin the request by chopping off the Host: header:
curl -H "Host:" http://mysite.com
You can add headers the same way. Your server may want a "Destination:"
header, and you can add it:
curl -H "Destination: http://moo.com/nowhere" http://url.com
13. Debug
Many times when you run curl on a site, you'll notice that the site doesn't
seem to respond the same way to your curl requests as it does to your
browser's.
Then you need to start making your curl requests more similar to your
browser's requests:
* Use the --trace-ascii option to store fully detailed logs of the requests
for easier analyzing and better understanding
* Make sure you check for and use cookies when needed (both reading with -b
and writing with -c)
* 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)
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).
A more raw approach is to capture the HTTP traffic on the network with tools
such as ethereal or tcpdump and check what headers that were sent and
received by the browser. (HTTPS makes this technique inefficient.)
14. References
RFC 2616 is a must to read if you want in-depth understanding of the HTTP RFC 2616 is a must to read if you want in-depth understanding of the HTTP
protocol. protocol.

View File

@@ -1,8 +1,27 @@
.\" You can view this file with: .\" **************************************************************************
.\" nroff -man curl-config.1 .\" * _ _ ____ _
.\" Written by Daniel Stenberg .\" * Project ___| | | | _ \| |
.\" * / __| | | | |_) | |
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at http://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" * $Id$
.\" **************************************************************************
.\" .\"
.TH curl-config 1 "8 Oct 2002" "Curl 7.10" "curl-config manual" .TH curl-config 1 "25 Jan 2004" "Curl 7.13.0" "curl-config manual"
.SH NAME .SH NAME
curl-config \- Get information about a libcurl installation curl-config \- Get information about a libcurl installation
.SH SYNOPSIS .SH SYNOPSIS
@@ -32,13 +51,20 @@ to link your application with libcurl.
This is the prefix used when libcurl was installed. Libcurl is then installed This is the prefix used when libcurl was installed. Libcurl is then installed
in $prefix/lib and its header files are installed in $prefix/include and so in $prefix/lib and its header files are installed in $prefix/include and so
on. The prefix is set with "configure --prefix". on. The prefix is set with "configure --prefix".
.IP "--protocols"
Lists what particular protocols the installed libcurl was built to support. At
the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, GOPHER,
FILE, TELNET, LDAP, DICT. Do not assume any particular order. The protocols
will be listed using uppercase and are separated by newlines. There may be
none, one or several protocols in the list. (Added in 7.13.0)
.IP "--version" .IP "--version"
Outputs version information about the installed libcurl. Outputs version information about the installed libcurl.
.IP "--vernum" .IP "--vernum"
Outputs version information about the installed libcurl, in numerical mode. Outputs version information about the installed libcurl, in numerical mode.
This outputs the version number, in hexadecimal, with 8 bits for each part; This outputs the version number, in hexadecimal, with 8 bits for each part;
major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl
12.13.14 would appear as 0c0d0e... 12.13.14 would appear as 0c0d0e... Note that the initial zero might be
omitted.
.SH "EXAMPLES" .SH "EXAMPLES"
What linker options do I need when I link with libcurl? What linker options do I need when I link with libcurl?

View File

@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___ .\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____| .\" * \___|\___/|_| \_\_____|
.\" * .\" *
.\" * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. .\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * .\" *
.\" * This software is licensed as described in the file COPYING, which .\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms .\" * you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
.\" * $Id$ .\" * $Id$
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH curl 1 "3 May 2004" "Curl 7.12" "Curl Manual" .TH curl 1 "25 Jan 2005" "Curl 7.13.0" "Curl Manual"
.SH NAME .SH NAME
curl \- transfer a URL curl \- transfer a URL
.SH SYNOPSIS .SH SYNOPSIS
@@ -91,6 +91,11 @@ network round-trip. This is used instead of setting a specific authentication
method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and
\fI--negotiate\fP. (Added in 7.10.6) \fI--negotiate\fP. (Added in 7.10.6)
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.
If this option is used several times, the following occurrences make no If this option is used several times, the following occurrences make no
difference. difference.
.IP "-b/--cookie <name=data>" .IP "-b/--cookie <name=data>"
@@ -115,9 +120,9 @@ using \fI-D/--dump-header\fP!
If this option is set more than once, the last one will be the one that's If this option is set more than once, the last one will be the one that's
used. used.
.IP "-B/--use-ascii" .IP "-B/--use-ascii"
Use ASCII transfer when getting an FTP file or LDAP info. For FTP, this can Enable ASCII transfer when using FTP or LDAP. For FTP, this can also be
also be enforced by using an URL that ends with ";type=A". This option causes enforced by using an URL that ends with ";type=A". This option causes data
data sent to stdout to be in text mode for win32 systems. sent to stdout to be in text mode for win32 systems.
If this option is used twice, the second one will disable ASCII usage. If this option is used twice, the second one will disable ASCII usage.
.IP "--basic" .IP "--basic"
@@ -160,12 +165,12 @@ 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 displayed, but that is the only visible feedback you get about this possibly
lethal situation. lethal situation.
If this option is used several times, the last specfied file name will be If this option is used several times, the last specified file name will be
used. used.
.IP "-C/--continue-at <offset>" .IP "-C/--continue-at <offset>"
Continue/Resume a previous file transfer at the given offset. The given offset Continue/Resume a previous file transfer at the given offset. The given offset
is the exact number of bytes that will be skipped counted from the beginning is the exact number of bytes that will be skipped counted from the beginning
of the source file before it is transfered to the destination. If used with of the source file before it is transferred to the destination. If used with
uploads, the ftp server command SIZE will not be used by curl. uploads, the ftp server command SIZE will not be used by curl.
Use "-C -" to tell curl to automatically find out where/how to resume the Use "-C -" to tell curl to automatically find out where/how to resume the
@@ -236,7 +241,7 @@ active FTP transfers. Curl will normally always first attempt to use EPRT,
then LPRT before using PORT, but with this option, it will use PORT right then LPRT before using PORT, but with this option, it will use PORT right
away. EPRT and LPRT are extensions to the original FTP protocol, may not work away. EPRT and LPRT are extensions to the original FTP protocol, may not work
on all servers but enable more functionality in a better way than the on all servers but enable more functionality in a better way than the
traditional PORT command. (Aded in 7.10.5) traditional PORT command. (Added in 7.10.5)
If this option is used several times, each occurrence will toggle this on/off. If this option is used several times, each occurrence will toggle this on/off.
.IP "--disable-epsv" .IP "--disable-epsv"
@@ -265,6 +270,11 @@ 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. ";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. If this option is used several times, the last one will be used.
.IP "--engine <name>"
Select the OpenSSL crypto engine to use for cipher
operations. Use \fI--engine list\fP to print a list of build-time supported
engines. Note that not all (or none) of the engines may be available at
run-time.
.IP "--environment" .IP "--environment"
(RISC OS ONLY) Sets a range of environment variables, using the names the -w (RISC OS ONLY) Sets a range of environment variables, using the names the -w
option supports, to easier allow extraction of useful information after having option supports, to easier allow extraction of useful information after having
@@ -320,6 +330,12 @@ document stating so (which often also describes why and more). This flag will
prevent curl from outputting that and fail silently instead. prevent curl from outputting that and fail silently instead.
If this option is used twice, the second will again disable silent failure. If this option is used twice, the second will again disable silent failure.
.IP "--ftp-account [data]"
(FTP) 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)
If this option is used twice, the second will override the previous use.
.IP "--ftp-create-dirs" .IP "--ftp-create-dirs"
(FTP) When an FTP URL/operation uses a path that doesn't currently exist on (FTP) When an FTP URL/operation uses a path that doesn't currently exist on
the server, the standard behavior of curl is to fail. Using this option, curl the server, the standard behavior of curl is to fail. Using this option, curl
@@ -328,7 +344,7 @@ will instead attempt to create missing directories. (Added in 7.10.7)
If this option is used twice, the second will again disable silent failure. If this option is used twice, the second will again disable silent failure.
.IP "--ftp-pasv" .IP "--ftp-pasv"
(FTP) Use PASV when transfering. PASV is the internal default behavior, but (FTP) Use PASV when transfering. PASV is the internal default behavior, but
using this option can be used to override a previos --ftp-port option. (Added using this option can be used to override a previous --ftp-port option. (Added
in 7.11.0) in 7.11.0)
If this option is used twice, the second will again disable silent failure. If this option is used twice, the second will again disable silent failure.
@@ -340,7 +356,7 @@ If this option is used twice, the second will again disable this.
(HTTP) This lets curl emulate a filled in form in which a user has pressed the (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 submit button. This causes curl to POST data using the Content-Type
multipart/form-data according to RFC1867. This enables uploading of binary multipart/form-data according to RFC1867. This enables uploading of binary
files etc. To force the 'content' part to be be a file, prefix the file name 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 an @ sign. To just get the content part from a file, prefix the file name
with the letter <. The difference between @ and < is then that @ makes a file with the letter <. 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 get attached in the post as a file upload, while the < makes a text field and
@@ -352,7 +368,7 @@ input:
\fBcurl\fP -F password=@/etc/passwd www.mypasswords.com \fBcurl\fP -F password=@/etc/passwd www.mypasswords.com
To read the file's content from stdin insted of a file, use - where the file To read the file's content from stdin instead of a file, use - where the file
name should've been. This goes for both @ and < constructs. name should've been. This goes for both @ and < constructs.
You can also tell curl what Content-Type to use by using 'type=', in a manner You can also tell curl what Content-Type to use by using 'type=', in a manner
@@ -420,7 +436,7 @@ time only.
If this option is used twice, the second will again disable header only. If this option is used twice, the second will again disable header only.
.IP "-j/--junk-session-cookies" .IP "-j/--junk-session-cookies"
(HTTP) When curl is told to read cookies from a given file, this option will (HTTP) When curl is told to read cookies from a given file, this option will
make it discard all "session cookies". This will basicly have the same effect 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 as if a new session is started. Typical browsers always discard session
cookies when they're closed down. (Added in 7.9.7) cookies when they're closed down. (Added in 7.9.7)
@@ -448,7 +464,7 @@ 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 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. a level that is not one of these, 'private' will instead be used.
This option requiures that the library was built with kerberos4 support. This This option requires that the library was built with kerberos4 support. This
is not very common. Use \fI-V/--version\fP to see if your curl supports it. 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. If this option is used several times, the last one will be used.
@@ -558,12 +574,12 @@ Very similar to \fI--netrc\fP, but this option makes the .netrc usage
\fBoptional\fP and not mandatory as the \fI--netrc\fP does. \fBoptional\fP and not mandatory as the \fI--netrc\fP does.
.IP "--negotiate" .IP "--negotiate"
(HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate method was (HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate method was
designed by Microsoft and is used in their web aplications. It is primarily 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 meant as a support for Kerberos5 authentication but may be also used along
with another authentication methods. For more information see IETF draft with another authentication methods. For more information see IETF draft
draft-brezak-spnego-http-04.txt. (Added in 7.10.6) draft-brezak-spnego-http-04.txt. (Added in 7.10.6)
This option requiures that the library was built with GSSAPI support. This is This option requires that the library was built with GSSAPI support. This is
not very common. Use \fI-V/--version\fP to see if your version supports not very common. Use \fI-V/--version\fP to see if your version supports
GSS-Negotiate. GSS-Negotiate.
@@ -587,7 +603,7 @@ authentication method instead. Such as Digest. (Added in 7.10.6)
If you want to enable NTLM for your proxy authentication, then use If you want to enable NTLM for your proxy authentication, then use
\fI--proxy-ntlm\fP. \fI--proxy-ntlm\fP.
This option requiures that the library was built with SSL support. Use This option requires that the library was built with SSL support. Use
\fI-V/--version\fP to see if your curl supports NTLM. \fI-V/--version\fP to see if your curl supports NTLM.
If this option is used several times, the following occurrences make no If this option is used several times, the following occurrences make no
@@ -667,9 +683,11 @@ If used as the first parameter on the command line, the \fI$HOME/.curlrc\fP
file will not be read and used as a config file. file will not be read and used as a config file.
.IP "-Q/--quote <comand>" .IP "-Q/--quote <comand>"
(FTP) Send an arbitrary command to the remote FTP server. Quote commands are (FTP) Send an arbitrary command to the remote FTP server. Quote commands are
sent BEFORE the transfer is taking place. To make commands take place after a sent BEFORE the transfer is taking place (just after the initial PWD command
successful transfer, prefix them with a dash '-'. You may specify any amount to be exact). To make commands take place after a successful transfer, prefix
of commands to be run before and after the transfer. If the server returns them with a dash '-'. To make commands get sent after libcurl has changed
working directory, just before the transfer command(s), prefix the command
with '+'. You may specify any amount of commands. If the server returns
failure for one of the commands, the entire operation will be aborted. You failure for one of the commands, the entire operation will be aborted. You
must send syntactically correct FTP commands as RFC959 defines. must send syntactically correct FTP commands as RFC959 defines.
@@ -723,6 +741,37 @@ remote file, and if that is available make the local file get that same
timestamp. timestamp.
If this option is used twice, the second time disables this again. If this option is used twice, the second time disables this again.
.IP "--retry <num>"
If a transient error is returned when curl tries to perform a transfer, it
will retry this number of times before giving up. Setting the number to 0
makes curl do no retries (which is the default). Transient error means either:
a timeout, an FTP 5xx response code or an HTTP 5xx response code.
When curl is about to retry a transfer, it will first wait one second and then
for all forthcoming retries it will double the waiting time until it reaches
10 minutes which then will be the delay between the rest of the retries. By
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See
also \fI--retry-max-time\fP to limit the total time allowed for
retries. (Option added in 7.12.3)
If this option is used multiple times, the last occurrence decide the amount.
.IP "--retry-delay <seconds>"
Make curl sleep this amount of time between each retry when a transfer has
failed with a transient error (it changes the default backoff time algorithm
between retries). This option is only interesting if \fI--retry\fP is also
used. Setting this delay to zero will make curl use the default backoff time.
(Option added in 7.12.3)
If this option is used multiple times, the last occurrence decide the amount.
.IP "--retry-max-time <seconds>"
The retry timer is reset before the first transfer attempt. Retries will be
done as usual (see \fI--retry\fP) as long as the timer hasn't reached this
given limit. Notice that if the timer hasn't reached the limit, the request
will be made and while performing, it may take longer than this given time
period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP.
Set this option to zero to not timeout retries. (Option added in 7.12.3)
If this option is used multiple times, the last occurrence decide the amount.
.IP "-s/--silent" .IP "-s/--silent"
Silent mode. Don't show progress meter or error messages. Makes Silent mode. Don't show progress meter or error messages. Makes
Curl mute. Curl mute.
@@ -750,7 +799,7 @@ If this option is used several times, the last one will be used.
Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for
details about this option. (Added in 7.11.2) details about this option. (Added in 7.11.2)
If this option is used several times, each occurance toggles this on/off. If this option is used several times, each occurrence toggles this on/off.
.IP "-t/--telnet-option <OPT=val>" .IP "-t/--telnet-option <OPT=val>"
Pass options to the telnet protocol. Supported options are: Pass options to the telnet protocol. Supported options are:
@@ -801,7 +850,8 @@ to read for untrained humans.
If this option is used several times, the last one will be used. (Added in If this option is used several times, the last one will be used. (Added in
7.9.7) 7.9.7)
.IP "-u/--user <user:password>" .IP "-u/--user <user:password>"
Specify user and password to use for server authentication. Specify user and password to use for server authentication. Overrides
\fI-n/--netrc\fP and \fI--netrc-optional\fP.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "-U/--proxy-user <user:password>" .IP "-U/--proxy-user <user:password>"
@@ -820,7 +870,7 @@ starting with '>' means data sent by curl, '<' means data received by curl
that is hidden in normal cases and lines starting with '*' means additional that is hidden in normal cases and lines starting with '*' means additional
info provided by curl. info provided by curl.
Note that if you want to see HTTP headers in the output, \fI-i/--include\fP Note that if you only want HTTP headers in the output, \fI-i/--include\fP
might be option you're looking for. might be option you're looking for.
If you think this option still doesn't give you enough details, consider using If you think this option still doesn't give you enough details, consider using
@@ -848,16 +898,16 @@ HTTPS and FTPS are supported.
.IP "libz" .IP "libz"
Automatic decompression of compressed files over HTTP is supported. Automatic decompression of compressed files over HTTP is supported.
.IP "NTLM" .IP "NTLM"
NTLM authenticaion is supported. NTLM authentication is supported.
.IP "GSS-Negotiate" .IP "GSS-Negotiate"
Negotiate authenticaion is supported. Negotiate authentication is supported.
.IP "Debug" .IP "Debug"
This curl uses a libcurl built with Debug. This enables more error-tracking This curl uses a libcurl built with Debug. This enables more error-tracking
and memory debugging etc. For curl-developers only! and memory debugging etc. For curl-developers only!
.IP "AsynchDNS" .IP "AsynchDNS"
This curl uses asynchronous name resolves. This curl uses asynchronous name resolves.
.IP "SPNEGO" .IP "SPNEGO"
SPNEGO Negotiate authenticaion is supported. SPNEGO Negotiate authentication is supported.
.IP "Largefile" .IP "Largefile"
This curl supports transfers of large files, files larger than 2GB. This curl supports transfers of large files, files larger than 2GB.
.IP "IDN" .IP "IDN"
@@ -890,6 +940,10 @@ to follow location: headers.
.B http_code .B http_code
The numerical code that was found in the last retrieved HTTP(S) page. The numerical code that was found in the last retrieved HTTP(S) page.
.TP .TP
.B http_connect
The numerical code that was found in the last response (from a proxy) to a
curl CONNECT request. (Added in 7.12.4)
.TP
.B time_total .B time_total
The total time, in seconds, that the full operation lasted. The time will be The total time, in seconds, that the full operation lasted. The time will be
displayed with millisecond resolution. displayed with millisecond resolution.
@@ -907,9 +961,15 @@ 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 about to begin. This includes all pre-transfer commands and negotiations that
are specific to the particular protocol(s) involved. are specific to the particular protocol(s) involved.
.TP .TP
.B time_redirect
The time, in seconds, it took for all redirection steps include name lookup,
connect, pretransfer and transfer before final transaction was
started. time_redirect shows the complete execution time for multiple
redirections. (Added in 7.12.3)
.TP
.B time_starttransfer .B time_starttransfer
The time, in seconds, it took from the start until the first byte is just about The time, in seconds, it took from the start until the first byte is just about
to be transfered. This includes time_pretransfer and also the time the to be transferred. This includes time_pretransfer and also the time the
server needs to calculate the result. server needs to calculate the result.
.TP .TP
.B size_download .B size_download
@@ -932,6 +992,12 @@ The average upload speed that curl measured for the complete upload.
.TP .TP
.B content_type .B content_type
The Content-Type of the requested document, if there was any. (Added in 7.9.5) The Content-Type of the requested document, if there was any. (Added in 7.9.5)
.TP
.B num_connects
Number of new connects made in the recent transfer. (Added in 7.12.3)
.TP
.B num_redirects
Number of redirects that were followed in the request. (Added in 7.12.3)
.RE .RE
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
@@ -944,7 +1010,7 @@ use. If there's an environment variable setting a proxy, you can set proxy to
\&"" to override it. \&"" to override it.
\fBNote\fP that all operations that are performed over a HTTP proxy will \fBNote\fP that all operations that are performed over a HTTP proxy will
transparantly be converted to HTTP. It means that certain protocol specific 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 operations might not be available. This is not the case if you can tunnel
through the proxy, as done with the \fI-p/--proxytunnel\fP option. through the proxy, as done with the \fI-p/--proxytunnel\fP option.
@@ -1005,6 +1071,17 @@ Forces curl to use SSL version 2 when negotiating with a remote SSL server.
.IP "-3/--sslv3" .IP "-3/--sslv3"
(HTTPS) (HTTPS)
Forces curl to use SSL version 3 when negotiating with a remote SSL server. Forces curl to use SSL version 3 when negotiating with a remote SSL server.
.IP "--3p-quote"
(FTP) Specify arbitrary commands to send to the source server. See the
\fI-Q/--quote\fP option for details. (Added in 7.13.0)
.IP "--3p-url"
(FTP) Activates a FTP 3rd party transfer. Specifies the source URL to get a
file from, while the "normal" URL will be used as target URL, the file that
will be written/created.
Note that not all FTP server allow 3rd party transfers. (Added in 7.13.0)
.IP "--3p-user"
(FTP) Specify user:password for the source URL transfer. (Added in 7.13.0)
.IP "-4/--ipv4" .IP "-4/--ipv4"
If libcurl is capable of resolving an address to multiple IP versions (which If libcurl is capable of resolving an address to multiple IP versions (which
it is if it is ipv6-capable), this option tells libcurl to resolve names to it is if it is ipv6-capable), this option tells libcurl to resolve names to
@@ -1077,7 +1154,7 @@ FTP can't reconnect. Couldn't connect to the host we got in the 227-line.
.IP 17 .IP 17
FTP couldn't set binary. Couldn't change transfer method to binary. FTP couldn't set binary. Couldn't change transfer method to binary.
.IP 18 .IP 18
Partial file. Only a part of the file was transfered. Partial file. Only a part of the file was transferred.
.IP 19 .IP 19
FTP couldn't download/access the given file, the RETR (or similar) command FTP couldn't download/access the given file, the RETR (or similar) command
failed. failed.
@@ -1187,4 +1264,4 @@ ftp://ftp.sunet.se/pub/www/utilities/curl/
.SH "SEE ALSO" .SH "SEE ALSO"
.BR ftp (1), .BR ftp (1),
.BR wget (1), .BR wget (1),
.BR snarf (1)

View File

@@ -9,7 +9,8 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \
ftpupload.c httpput.c simplessl.c ftpgetresp.c http-post.c \ ftpupload.c httpput.c simplessl.c ftpgetresp.c http-post.c \
post-callback.c multi-app.c multi-double.c multi-single.c \ post-callback.c multi-app.c multi-double.c multi-single.c \
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \ multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
anyauthput.c htmltitle.cc
all: all:
@echo "done" @echo "done"

View File

@@ -1,4 +1,8 @@
EXAMPLES _ _ ____ _
___| | | | _ \| |
/ __| | | | |_) | |
| (__| |_| | _ <| |___
\___|\___/|_| \_\_____|
This directory is for libcurl programming examples. They are meant to show This directory is for libcurl programming examples. They are meant to show
some simple steps on how you can build your own application to take full some simple steps on how you can build your own application to take full
@@ -7,6 +11,8 @@ advantage of libcurl.
If you end up with other small but still useful example sources, please mail If you end up with other small but still useful example sources, please mail
them for submission in future packages and on the web site. them for submission in future packages and on the web site.
BUILDING
The Makefile.example is an example makefile that could be used to build these The Makefile.example is an example makefile that could be used to build these
examples. Just edit the file according to your system and requirements first. examples. Just edit the file according to your system and requirements first.
@@ -23,3 +29,36 @@ want you do reorganize them like:
applications/experiments. Even if the examples in this directory use that site applications/experiments. Even if the examples in this directory use that site
as an example URL at some places, it doesn't mean that the URLs work or that as an example URL at some places, it doesn't mean that the URLs work or that
we expect you to actually torture our web site with your tests! Thanks. we expect you to actually torture our web site with your tests! Thanks.
EXAMPLES
anyauthput.c - HTTP PUT using "any" authentication method
curlgtk.c - download using a GTK progress bar
curlx.c - getting file info from the remote cert data
debug.c - showing how to use the debug callback
fileupload.c - uploading to a file:// URL
fopen.c - fopen() layer that supports opening URLs and files
ftp3rdparty.c - FTP 3rd party transfer
ftpget.c - simple getting a file from FTP
ftpgetresp.c - get the response strings from the FTP server
ftpupload.c - upload a file to a FTP server
getinfo.c - get the Content-Type from the recent transfer
getinmemory.c - download a file to memory only
htmltitle.cc - download a HTML file and extract the <title> tag from a HTML
page using libxml
http-post.c - HTTP POST
httpput.c - HTTP PUT a local file
https.c - simple HTTPS transfer
multi-app.c - a multi-interface app
multi-debugcallback.c - a multi-interface app using the debug callback
multi-double.c - a multi-interface app doing two simultaneous transfers
multi-post.c - a multi-interface app doing a multipart formpost
multi-single.c - a multi-interface app getting a single file
multithread.c - an example using multi-treading transfering multiple files
persistant.c - request two URLs with a persistant connection
post-callback.c - send a HTTP POST using a callback
postit2.c - send a HTTP multipart formpost
sepheaders.c - download headers to a separate file
simple.c - the most simple download a URL source
simplepost.c - HTTP POST
simplessl.c - HTTPS example with certificates many options set

35
docs/examples/adddocsref.pl Executable file
View File

@@ -0,0 +1,35 @@
#!/usr/bin/perl
# pass files as argument(s)
my $docroot="http://curl.haxx.se/libcurl/c";
for $f (@ARGV) {
open(NEW, ">$f.new");
open(F, "<$f");
while(<F>) {
my $l = $_;
if($l =~ /\/* $docroot/) {
# just ignore preciously added refs
}
elsif($l =~ /^( *).*curl_easy_setopt\([^,]*, *([^ ,]*) *,/) {
my ($prefix, $anc) = ($1, $2);
$anc =~ s/_//g;
print NEW "$prefix/* $docroot/curl_easy_setopt.html#$anc */\n";
print NEW $l;
}
elsif($l =~ /^( *).*(curl_([^\(]*))\(/) {
my ($prefix, $func) = ($1, $2);
print NEW "$prefix/* $docroot/$func.html */\n";
print NEW $l;
}
else {
print NEW $l;
}
}
close(F);
close(NEW);
system("mv $f $f.org");
system("mv $f.new $f");
}

135
docs/examples/anyauthput.c Normal file
View File

@@ -0,0 +1,135 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* $Id$
*/
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <curl/curl.h>
#if LIBCURL_VERSION_NUM < 0x070c03
#error "upgrade your libcurl to no less than 7.12.3"
#endif
/*
* This example shows a HTTP PUT operation with authentiction using "any"
* type. It PUTs a file given as a command line argument to the URL also given
* on the command line.
*
* Since libcurl 7.12.3, using "any" auth and POST/PUT requires a set ioctl
* function.
*
* This example also uses its own read callback.
*/
/* ioctl callback function */
static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
{
int fd = (int)userp;
(void)handle; /* not used in here */
switch(cmd) {
case CURLIOCMD_RESTARTREAD:
/* mr libcurl kindly asks as to rewind the read data stream to start */
if(-1 == lseek(fd, 0, SEEK_SET))
/* couldn't rewind */
return CURLIOE_FAILRESTART;
break;
default: /* ignore unknown commands */
return CURLIOE_UNKNOWNCMD;
}
return CURLIOE_OK; /* success! */
}
/* read callback function, fread() look alike */
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
size_t retcode;
int fd = (int)stream;
retcode = read(fd, ptr, size * nmemb);
fprintf(stderr, "*** We read %d bytes from file\n", retcode);
return retcode;
}
int main(int argc, char **argv)
{
CURL *curl;
CURLcode res;
int hd ;
struct stat file_info;
char *file;
char *url;
if(argc < 3)
return 1;
file= argv[1];
url = argv[2];
/* get the file size of the local file */
hd = open(file, O_RDONLY) ;
fstat(hd, &file_info);
/* In windows, this will init the winsock stuff */
curl_global_init(CURL_GLOBAL_ALL);
/* get a curl handle */
curl = curl_easy_init();
if(curl) {
/* we want to use our own read function */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
/* which file to upload */
curl_easy_setopt(curl, CURLOPT_READDATA, hd);
/* set the ioctl function */
curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, my_ioctl);
/* pass the file descriptor to the ioctl callback as well */
curl_easy_setopt(curl, CURLOPT_IOCTLDATA, hd);
/* enable "uploading" (which means PUT when doing HTTP) */
curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ;
/* specify target URL, and note that this URL should also include a file
name, not only a directory (as you can do with GTP uploads) */
curl_easy_setopt(curl,CURLOPT_URL, url);
/* and give the size of the upload, this supports large file sizes
on systems that have general support for it */
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_info.st_size);
/* tell libcurl we can use "any" auth, which lets the lib pick one, but it
also costs one extra round-trip and possibly sending of all the PUT
data twice!!! */
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
/* set user name and password for the authentication */
curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
/* Now run off and do what you've been told! */
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
close(hd); /* close the local file */
curl_global_cleanup();
return 0;
}

View File

@@ -42,7 +42,7 @@ int my_progress_func(GtkWidget *Bar,
return 0; return 0;
} }
void *curl_thread(void *ptr) void *my_thread(void *ptr)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
@@ -94,7 +94,7 @@ int main(int argc, char **argv)
gtk_container_add(GTK_CONTAINER(Frame2), Bar); gtk_container_add(GTK_CONTAINER(Frame2), Bar);
gtk_widget_show_all(Window); gtk_widget_show_all(Window);
if (!g_thread_create(&curl_thread, argv[1], FALSE, NULL) != 0) if (!g_thread_create(&my_thread, argv[1], FALSE, NULL) != 0)
g_warning("can't create the thread"); g_warning("can't create the thread");

View File

@@ -135,7 +135,8 @@ typedef struct sslctxparm_st {
static char *i2s_ASN1_IA5STRING( ASN1_IA5STRING *ia5) static char *i2s_ASN1_IA5STRING( ASN1_IA5STRING *ia5)
{ {
char *tmp; char *tmp;
if(!ia5 || !ia5->length) return NULL; if(!ia5 || !ia5->length)
return NULL;
tmp = OPENSSL_malloc(ia5->length + 1); tmp = OPENSSL_malloc(ia5->length + 1);
memcpy(tmp, ia5->data, ia5->length); memcpy(tmp, ia5->data, ia5->length);
tmp[ia5->length] = 0; tmp[ia5->length] = 0;
@@ -150,7 +151,8 @@ static unsigned char *my_get_ext(X509 * cert, const int type, int extensiontype)
STACK_OF(ACCESS_DESCRIPTION) * accessinfo ; STACK_OF(ACCESS_DESCRIPTION) * accessinfo ;
accessinfo = X509_get_ext_d2i(cert, extensiontype, NULL, NULL) ; accessinfo = X509_get_ext_d2i(cert, extensiontype, NULL, NULL) ;
if (!sk_ACCESS_DESCRIPTION_num(accessinfo)) return NULL; if (!sk_ACCESS_DESCRIPTION_num(accessinfo))
return NULL;
for (i = 0; i < sk_ACCESS_DESCRIPTION_num(accessinfo); i++) { for (i = 0; i < sk_ACCESS_DESCRIPTION_num(accessinfo); i++) {
ACCESS_DESCRIPTION * ad = sk_ACCESS_DESCRIPTION_value(accessinfo, i); ACCESS_DESCRIPTION * ad = sk_ACCESS_DESCRIPTION_value(accessinfo, i);
if (OBJ_obj2nid(ad->method) == type) { if (OBJ_obj2nid(ad->method) == type) {
@@ -169,23 +171,35 @@ static unsigned char *my_get_ext(X509 * cert, const int type, int extensiontype)
the URL to be used in the POST. the URL to be used in the POST.
*/ */
static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg) { static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg)
{
sslctxparm * p = (sslctxparm *) arg; sslctxparm * p = (sslctxparm *) arg;
int ok; int ok;
if (p->verbose > 2) BIO_printf(p->errorbio,"entering ssl_app_verify_callback\n"); if (p->verbose > 2)
BIO_printf(p->errorbio,"entering ssl_app_verify_callback\n");
if ((ok= X509_verify_cert(ctx)) && ctx->cert) { if ((ok= X509_verify_cert(ctx)) && ctx->cert) {
unsigned char * accessinfo ; unsigned char * accessinfo ;
if (p->verbose > 1) X509_print_ex(p->errorbio,ctx->cert,0,0); if (p->verbose > 1)
X509_print_ex(p->errorbio,ctx->cert,0,0);
if (accessinfo = my_get_ext(ctx->cert,p->accesstype ,NID_sinfo_access)) { if (accessinfo = my_get_ext(ctx->cert,p->accesstype ,NID_sinfo_access)) {
if (p->verbose) BIO_printf(p->errorbio,"Setting URL from SIA to: %s\n",accessinfo); if (p->verbose)
BIO_printf(p->errorbio,"Setting URL from SIA to: %s\n", accessinfo);
curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo); curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo);
} else if (accessinfo = my_get_ext(ctx->cert,p->accesstype ,NID_info_access)) { }
if (p->verbose) BIO_printf(p->errorbio,"Setting URL from AIA to: %s\n",accessinfo); else if (accessinfo = my_get_ext(ctx->cert,p->accesstype,
NID_info_access)) {
if (p->verbose)
BIO_printf(p->errorbio,"Setting URL from AIA to: %s\n", accessinfo);
curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo); curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo);
} }
} }
if (p->verbose > 2) BIO_printf(p->errorbio,"leaving ssl_app_verify_callback with %d\n",ok); if (p->verbose > 2)
BIO_printf(p->errorbio,"leaving ssl_app_verify_callback with %d\n", ok);
return(ok); return(ok);
} }
@@ -217,7 +231,8 @@ static CURLcode sslctxfun(CURL * curl, void * sslctx, void * parm) {
SSL_CTX_set_cipher_list(ctx,"RC4-MD5"); SSL_CTX_set_cipher_list(ctx,"RC4-MD5");
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
X509_STORE_add_cert(ctx->cert_store,sk_X509_value(p->ca,sk_X509_num(p->ca)-1)); X509_STORE_add_cert(ctx->cert_store,sk_X509_value(p->ca,
sk_X509_num(p->ca)-1));
SSL_CTX_set_verify_depth(ctx,2); SSL_CTX_set_verify_depth(ctx,2);
@@ -238,7 +253,6 @@ int main(int argc, char **argv) {
BIO* in=NULL; BIO* in=NULL;
BIO* out=NULL; BIO* out=NULL;
char * outfile = NULL; char * outfile = NULL;
char * infile = NULL ; char * infile = NULL ;
@@ -375,30 +389,42 @@ int main(int argc, char **argv) {
BIO_printf(p.errorbio,"No trustworthy CA given.%s\n", p.p12file); goto err; BIO_printf(p.errorbio,"No trustworthy CA given.%s\n", p.p12file); goto err;
} }
if (p.verbose > 1) X509_print_ex(p.errorbio,p.usercert,0,0); if (p.verbose > 1)
X509_print_ex(p.errorbio,p.usercert,0,0);
/* determine URL to go */ /* determine URL to go */
if (hostporturl) { if (hostporturl) {
serverurl=(char*) malloc(9+strlen(hostporturl)); serverurl=(char*) malloc(9+strlen(hostporturl));
sprintf(serverurl,"https://%s",hostporturl); sprintf(serverurl,"https://%s",hostporturl);
} else if (p.accesstype != 0) { /* see whether we can find an AIA or SIA for a given access type */ }
else if (p.accesstype != 0) { /* see whether we can find an AIA or SIA for a given access type */
if (!(serverurl = my_get_ext(p.usercert,p.accesstype,NID_info_access))) { if (!(serverurl = my_get_ext(p.usercert,p.accesstype,NID_info_access))) {
BIO_printf(p.errorbio,"no service URL in user cert cherching in others certificats\n"); BIO_printf(p.errorbio,"no service URL in user cert "
"cherching in others certificats\n");
int j=0; int j=0;
int find=0; int find=0;
for (j=0;j<sk_X509_num(p.ca);j++) { for (j=0;j<sk_X509_num(p.ca);j++) {
if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,NID_info_access))) break; if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,
if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,NID_sinfo_access))) break; NID_info_access)))
break;
if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,
NID_sinfo_access)))
break;
} }
} }
} }
if (!serverurl) { if (!serverurl) {
BIO_printf(p.errorbio, "no service URL in certificats, check '-accesstype (AD_DVCS | ad_timestamping)' or use '-connect'\n"); goto err; BIO_printf(p.errorbio, "no service URL in certificats,"
" check '-accesstype (AD_DVCS | ad_timestamping)'"
" or use '-connect'\n");
goto err;
} }
if (p.verbose) BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl); if (p.verbose)
BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
curl_easy_setopt(p.curl, CURLOPT_URL, serverurl); curl_easy_setopt(p.curl, CURLOPT_URL, serverurl);
/* Now specify the POST binary data */ /* Now specify the POST binary data */
@@ -413,7 +439,8 @@ int main(int argc, char **argv) {
headers = curl_slist_append(headers,contenttype); headers = curl_slist_append(headers,contenttype);
curl_easy_setopt(p.curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(p.curl, CURLOPT_HTTPHEADER, headers);
if (p.verbose) BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl); if (p.verbose)
BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
{ {
FILE *outfp; FILE *outfp;
@@ -447,14 +474,18 @@ int main(int argc, char **argv) {
/* Perform the request, res will get the return code */ /* Perform the request, res will get the return code */
BIO_printf(p.errorbio,"%d %s %d\n", __LINE__, "curl_easy_perform", res = curl_easy_perform(p.curl)); BIO_printf(p.errorbio,"%d %s %d\n", __LINE__, "curl_easy_perform",
res = curl_easy_perform(p.curl));
{ {
int result =curl_easy_getinfo(p.curl,CURLINFO_CONTENT_TYPE,&response); int result =curl_easy_getinfo(p.curl,CURLINFO_CONTENT_TYPE,&response);
if( mimetypeaccept && p.verbose) if( mimetypeaccept && p.verbose)
if(!strcmp(mimetypeaccept,response)) if(!strcmp(mimetypeaccept,response))
BIO_printf(p.errorbio,"the response has a correct mimetype : %s\n",response); BIO_printf(p.errorbio,"the response has a correct mimetype : %s\n",
response);
else else
BIO_printf(p.errorbio,"the reponse doesn\'t has an acceptable mime type, it is %s instead of %s\n",response,mimetypeaccept); BIO_printf(p.errorbio,"the reponse doesn\'t has an acceptable "
"mime type, it is %s instead of %s\n",
response,mimetypeaccept);
} }
/*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/ /*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/
@@ -470,11 +501,6 @@ int main(int argc, char **argv) {
BIO_free(out); BIO_free(out);
return (EXIT_SUCCESS); return (EXIT_SUCCESS);
err: BIO_printf(p.errorbio,"error"); err: BIO_printf(p.errorbio,"error");
exit(1); exit(1);
} }

View File

@@ -124,7 +124,7 @@ write_callback(char *buffer,
/* use to attempt to fill the read buffer up to requested number of bytes */ /* use to attempt to fill the read buffer up to requested number of bytes */
static int static int
curl_fill_buffer(URL_FILE *file,int want,int waittime) fill_buffer(URL_FILE *file,int want,int waittime)
{ {
fd_set fdread; fd_set fdread;
fd_set fdwrite; fd_set fdwrite;
@@ -179,7 +179,7 @@ curl_fill_buffer(URL_FILE *file,int want,int waittime)
/* use to remove want bytes from the front of a files buffer */ /* use to remove want bytes from the front of a files buffer */
static int static int
curl_use_buffer(URL_FILE *file,int want) use_buffer(URL_FILE *file,int want)
{ {
/* sort out buffer */ /* sort out buffer */
if((file->buffer_pos - want) <=0) if((file->buffer_pos - want) <=0)
@@ -333,9 +333,9 @@ url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
case CFTYPE_CURL: case CFTYPE_CURL:
want = nmemb * size; want = nmemb * size;
curl_fill_buffer(file,want,1); fill_buffer(file,want,1);
/* check if theres data in the buffer - if not curl_fill_buffer() /* check if theres data in the buffer - if not fill_buffer()
* either errored or EOF */ * either errored or EOF */
if(!file->buffer_pos) if(!file->buffer_pos)
return 0; return 0;
@@ -347,7 +347,7 @@ url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
/* xfer data to caller */ /* xfer data to caller */
memcpy(ptr, file->buffer, want); memcpy(ptr, file->buffer, want);
curl_use_buffer(file,want); use_buffer(file,want);
want = want / size; /* number of items - nb correct op - checked want = want / size; /* number of items - nb correct op - checked
* with glibc code*/ * with glibc code*/
@@ -377,7 +377,7 @@ url_fgets(char *ptr, int size, URL_FILE *file)
break; break;
case CFTYPE_CURL: case CFTYPE_CURL:
curl_fill_buffer(file,want,1); fill_buffer(file,want,1);
/* check if theres data in the buffer - if not fill either errored or /* check if theres data in the buffer - if not fill either errored or
* EOF */ * EOF */
@@ -403,7 +403,7 @@ url_fgets(char *ptr, int size, URL_FILE *file)
memcpy(ptr, file->buffer, want); memcpy(ptr, file->buffer, want);
ptr[want]=0;/* allways null terminate */ ptr[want]=0;/* allways null terminate */
curl_use_buffer(file,want); use_buffer(file,want);
/*printf("(fgets) return %d bytes %d left\n", want,file->buffer_pos);*/ /*printf("(fgets) return %d bytes %d left\n", want,file->buffer_pos);*/
break; break;

View File

@@ -16,18 +16,16 @@
/* /*
* This is an example showing how to transfer a file between two remote hosts. * This is an example showing how to transfer a file between two remote hosts.
* 7.13.0 or later required.
*/ */
int main(void) int main(void)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
char sourceFileName[] = "/tmp/file"; char source_url[] = "ftp://remotehost.com/path/to/source";
char targetFileName[] = "/tmp/curlTargetTest.dat"; char target_url[] = "ftp://aotherserver.com/path/to/dest";
char sourceHost[] = "source";
char targetHost[] = "target";
char sourceUserPass[] = "user:pass"; char sourceUserPass[] = "user:pass";
char targetUserPass[] = "user:pass"; char targetUserPass[] = "user:pass";
char url[100]; char url[100];
@@ -42,21 +40,22 @@ int main(void)
curl = curl_easy_init(); curl = curl_easy_init();
if (curl) { if (curl) {
sprintf(url, "ftp://%s@%s/%s", targetUserPass, targetHost, targetFileName); /* The ordinary URL is the target when speaking 3rd party transfers */
printf("%s\n", url); curl_easy_setopt(curl, CURLOPT_URL, target_url);
curl_easy_setopt(curl, CURLOPT_URL, url);
/* Set a proxy host */ /* Set a source URL */
curl_easy_setopt(curl, CURLOPT_SOURCE_HOST, sourceHost); curl_easy_setopt(curl, CURLOPT_SOURCE_URL, source_url);
/* Set a proxy user and password */ /* Set target user and password */
curl_easy_setopt(curl, CURLOPT_USERPWD, targetUserPass);
/* Set source user and password */
curl_easy_setopt(curl, CURLOPT_SOURCE_USERPWD, sourceUserPass); curl_easy_setopt(curl, CURLOPT_SOURCE_USERPWD, sourceUserPass);
/* Set a proxy full file name */ #if 0
curl_easy_setopt(curl, CURLOPT_SOURCE_PATH, sourceFileName); /* FTPPORT enables PORT on the target side, instead of PASV. */
curl_easy_setopt(curl, CURLOPT_FTPPORT, ""); /* optional */
/* Set a proxy passive host */ #endif
curl_easy_setopt(curl, CURLOPT_PASV_HOST, 0); /* optional */
/* build a list of commands to pass to libcurl */ /* build a list of commands to pass to libcurl */
source_pre_cmd = curl_slist_append(source_pre_cmd, cmd); source_pre_cmd = curl_slist_append(source_pre_cmd, cmd);

View File

@@ -72,8 +72,18 @@ int main(int argc, char **argv)
/* now specify which file to upload */ /* now specify which file to upload */
curl_easy_setopt(curl, CURLOPT_READDATA, hd_src); curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
/* and give the size of the upload (optional) */ /* NOTE: if you want this example to work on Windows with libcurl as a
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_info.st_size); DLL, you MUST also provide a read callback with
CURLOPT_READFUNCTION. Failing to do so will give you a crash since a
DLL may not use the variable's memory when passed in to it from an app
like this. */
/* Set the size of the file to upload (optional). If you give a *_LARGE
option you MUST make sure that the type of the passed-in argument is a
curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you must
make sure that to pass in a type 'long' argument. */
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
(curl_off_t)file_info.st_size);
/* Now run off and do what you've been told! */ /* Now run off and do what you've been told! */
res = curl_easy_perform(curl); res = curl_easy_perform(curl);

View File

@@ -16,14 +16,18 @@ int main(void)
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
/* http://curl.haxx.se/libcurl/c/curl_easy_init.html */
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
/* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTURL */
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
/* http://curl.haxx.se/libcurl/c/curl_easy_perform.html */
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
if(CURLE_OK == res) { if(CURLE_OK == res) {
char *ct; char *ct;
/* ask for the content-type */ /* ask for the content-type */
/* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct); res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
if((CURLE_OK == res) && ct) if((CURLE_OK == res) && ct)
@@ -31,6 +35,7 @@ int main(void)
} }
/* always cleanup */ /* always cleanup */
/* http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html */
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
} }
return 0; return 0;

View File

@@ -24,13 +24,23 @@ struct MemoryStruct {
size_t size; size_t size;
}; };
void *myrealloc(void *ptr, size_t size)
{
/* There might be a realloc() out there that doesn't like reallocing
NULL pointers, so we take care of it here */
if(ptr)
return realloc(ptr, size);
else
return malloc(size);
}
size_t size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{ {
register int realsize = size * nmemb; register int realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)data; struct MemoryStruct *mem = (struct MemoryStruct *)data;
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1);
if (mem->memory) { if (mem->memory) {
memcpy(&(mem->memory[mem->size]), ptr, realsize); memcpy(&(mem->memory[mem->size]), ptr, realsize);
mem->size += realsize; mem->size += realsize;

301
docs/examples/htmltitle.cc Normal file
View File

@@ -0,0 +1,301 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* $Id$
*/
// Get a web page, parse it with libxml.
//
// Written by Lars Nilsson
//
// GNU C++ compile command line suggestion (edit paths accordingly):
//
// g++ -Wall -I/opt/curl/include -I/opt/libxml/include/libxml2 htmltitle.cc \
// -o htmltitle -L/opt/curl/lib -L/opt/libxml/lib -lcurl -lxml2
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <curl/curl.h>
#include <libxml/HTMLparser.h>
//
// Case-insensitive string comparison
//
#ifdef _MSC_VER
#define COMPARE(a, b) (!stricmp((a), (b)))
#else
#define COMPARE(a, b) (!strcasecmp((a), (b)))
#endif
//
// libxml callback context structure
//
struct Context
{
Context(): addTitle(false) { }
bool addTitle;
std::string title;
};
//
// libcurl variables for error strings and returned data
static char errorBuffer[CURL_ERROR_SIZE];
static std::string buffer;
//
// libcurl write callback function
//
static int writer(char *data, size_t size, size_t nmemb,
std::string *writerData)
{
if (writerData == NULL)
return 0;
writerData->append(data, size*nmemb);
return size * nmemb;
}
//
// libcurl connection initialization
//
static bool init(CURL *&conn, char *url)
{
CURLcode code;
conn = curl_easy_init();
if (conn == NULL)
{
fprintf(stderr, "Failed to create CURL connection\n");
exit(EXIT_FAILURE);
}
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set error buffer [%d]\n", code);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_URL, url);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set URL [%s]\n", errorBuffer);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_FOLLOWLOCATION, 1);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set redirect option [%s]\n", errorBuffer);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, writer);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set writer [%s]\n", errorBuffer);
return false;
}
code = curl_easy_setopt(conn, CURLOPT_WRITEDATA, &buffer);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to set write data [%s]\n", errorBuffer);
return false;
}
return true;
}
//
// libxml start element callback function
//
static void startElement(void *voidContext,
const xmlChar *name,
const xmlChar **attributes)
{
Context *context = (Context *)voidContext;
if (COMPARE((char *)name, "TITLE"))
{
context->title = "";
context->addTitle = true;
}
}
//
// libxml end element callback function
//
static void endElement(void *voidContext,
const xmlChar *name)
{
Context *context = (Context *)voidContext;
if (COMPARE((char *)name, "TITLE"))
context->addTitle = false;
}
//
// Text handling helper function
//
static void handleCharacters(Context *context,
const xmlChar *chars,
int length)
{
if (context->addTitle)
context->title.append((char *)chars, length);
}
//
// libxml PCDATA callback function
//
static void characters(void *voidContext,
const xmlChar *chars,
int length)
{
Context *context = (Context *)voidContext;
handleCharacters(context, chars, length);
}
//
// libxml CDATA callback function
//
static void cdata(void *voidContext,
const xmlChar *chars,
int length)
{
Context *context = (Context *)voidContext;
handleCharacters(context, chars, length);
}
//
// libxml SAX callback structure
//
static htmlSAXHandler saxHandler =
{
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
startElement,
endElement,
NULL,
characters,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
cdata,
NULL
};
//
// Parse given (assumed to be) HTML text and return the title
//
static void parseHtml(const std::string &html,
std::string &title)
{
htmlParserCtxtPtr ctxt;
Context context;
ctxt = htmlCreatePushParserCtxt(&saxHandler, &context, "", 0, "",
XML_CHAR_ENCODING_NONE);
htmlParseChunk(ctxt, html.c_str(), html.size(), 0);
htmlParseChunk(ctxt, "", 0, 1);
htmlFreeParserCtxt(ctxt);
title = context.title;
}
int main(int argc, char *argv[])
{
CURL *conn = NULL;
CURLcode code;
std::string title;
// Ensure one argument is given
if (argc != 2)
{
fprintf(stderr, "Usage: %s <url>\n", argv[0]);
exit(EXIT_FAILURE);
}
curl_global_init(CURL_GLOBAL_DEFAULT);
// Initialize CURL connection
if (!init(conn, argv[1]))
{
fprintf(stderr, "Connection initializion failed\n");
exit(EXIT_FAILURE);
}
// Retrieve content for the URL
code = curl_easy_perform(conn);
curl_easy_cleanup(conn);
if (code != CURLE_OK)
{
fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer);
exit(EXIT_FAILURE);
}
// Parse the (assumed) HTML code
parseHtml(buffer, title);
// Display the extracted title
printf("Title: %s\n", title.c_str());
return EXIT_SUCCESS;
}

View File

@@ -19,6 +19,9 @@
* line argument to the URL also given on the command line. * line argument to the URL also given on the command line.
* *
* This example also uses its own read callback. * This example also uses its own read callback.
*
* Here's an article on how to setup a PUT handler for Apache:
* http://www.apacheweek.com/features/put
*/ */
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
@@ -39,7 +42,6 @@ int main(int argc, char **argv)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
FILE *ftpfile;
FILE * hd_src ; FILE * hd_src ;
int hd ; int hd ;
struct stat file_info; struct stat file_info;

View File

@@ -20,7 +20,7 @@ PROGRAMS = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \
multi-double.exe multi-post.exe multi-single.exe \ multi-double.exe multi-post.exe multi-single.exe \
persistant.exe post-callback.exe postit2.exe \ persistant.exe post-callback.exe postit2.exe \
sepheaders.exe simple.exe simplessl.exe https.exe \ sepheaders.exe simple.exe simplessl.exe https.exe \
ftp3rdparty.exe getinfo.exe ftp3rdparty.exe getinfo.exe anyauthput.exe
all: $(PROGRAMS) all: $(PROGRAMS)

View File

@@ -15,7 +15,15 @@
#include <pthread.h> #include <pthread.h>
#include <curl/curl.h> #include <curl/curl.h>
/* silly list of test-URLs */ /*
List of URLs to fetch.
If you intend to use a SSL-based protocol here you MUST setup the OpenSSL
callback functions as described here:
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
*/
char *urls[]= { char *urls[]= {
"http://curl.haxx.se/", "http://curl.haxx.se/",
"ftp://cool.haxx.se/", "ftp://cool.haxx.se/",
@@ -28,10 +36,8 @@ void *pull_one_url(void *url)
CURL *curl; CURL *curl;
curl = curl_easy_init(); curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_perform(curl); curl_easy_perform(curl); /* ignores error */
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
return NULL; return NULL;

View File

@@ -52,7 +52,7 @@ PDFPAGES = curl_easy_cleanup.pdf curl_easy_getinfo.pdf \
CLEANFILES = $(HTMLPAGES) $(PDFPAGES) CLEANFILES = $(HTMLPAGES) $(PDFPAGES)
EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) EXTRA_DIST = $(man_MANS) $(HTMLPAGES) index.html $(PDFPAGES) libcurl.m4
MAN2HTML= roffit --mandir=. < $< >$@ MAN2HTML= roffit --mandir=. < $< >$@

View File

@@ -2,7 +2,7 @@
.\" nroff -man [file] .\" nroff -man [file]
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_easy_getinfo 3 "20 Aug 2003" "libcurl 7.10.8" "libcurl Manual" .TH curl_easy_getinfo 3 "22 Dec 2004" "libcurl 7.12.3" "libcurl Manual"
.SH NAME .SH NAME
curl_easy_getinfo - extract information from a curl handle curl_easy_getinfo - extract information from a curl handle
.SH SYNOPSIS .SH SYNOPSIS
@@ -12,13 +12,12 @@ curl_easy_getinfo - extract information from a curl handle
.SH DESCRIPTION .SH DESCRIPTION
Request internal information from the curl session with this function. The Request internal information from the curl session with this function. The
third argument third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a
.B MUST pointer to a struct curl_slist * or a pointer to a double (as this
be a pointer to a long, a pointer to a char * or a pointer to a double (as documentation describes further down). The data pointed-to will be filled in
this documentation describes further down). The data pointed-to will be accordingly and can be relied upon only if the function returns CURLE_OK.
filled in accordingly and can be relied upon only if the function returns This function is intended to get used AFTER a performed transfer, all results
CURLE_OK. This function is intended to get used *AFTER* a performed transfer, from this function are undefined until the transfer is completed.
all results from this function are undefined until the transfer is completed.
You should not free the memory returned by this function unless it is You should not free the memory returned by this function unless it is
explictly mentioned below. explictly mentioned below.
@@ -28,7 +27,13 @@ The following information can be extracted:
Pass a pointer to a 'char *' to receive the last used effective URL. Pass a pointer to a 'char *' to receive the last used effective URL.
.IP CURLINFO_RESPONSE_CODE .IP CURLINFO_RESPONSE_CODE
Pass a pointer to a long to receive the last received HTTP or FTP code. This Pass a pointer to a long to receive the last received HTTP or FTP code. This
option was known as CURLINFO_HTTP_CODE in libcurl 7.10.7 and earlier. option was known as CURLINFO_HTTP_CODE in libcurl 7.10.7 and earlier. This
will be zero if no server response code has been received. Note that a proxy's
CONNECT response should be read with \fICURLINFO_HTTP_CONNECTCODE\fP and not
this.
.IP CURLINFO_HTTP_CONNECTCODE
Pass a pointer to a long to receive the last received proxy response code to a
CONNECT request.
.IP CURLINFO_FILETIME .IP CURLINFO_FILETIME
Pass a pointer to a long to receive the remote time of the retrieved Pass a pointer to a long to receive the remote time of the retrieved
document. If you get -1, it can be because of many reasons (unknown, the document. If you get -1, it can be because of many reasons (unknown, the
@@ -89,6 +94,13 @@ than one request if FOLLOWLOCATION is true.
Pass a pointer to a long to receive the result of the certification Pass a pointer to a long to receive the result of the certification
verification that was requested (using the CURLOPT_SSL_VERIFYPEER option to verification that was requested (using the CURLOPT_SSL_VERIFYPEER option to
\fIcurl_easy_setopt(3)\fP). \fIcurl_easy_setopt(3)\fP).
.IP CURLINFO_SSL_ENGINES
Pass the address of a 'struct curl_slist *' to receive a linked-list of
OpenSSL crypto-engines supported. Note that engines are normally implemented
in separate dynamic libraries. Hence not all the returned engines may be
available at run-time. \fBNOTE:\fP you must call \fIcurl_slist_free_all(3)\fP
on the list pointer once you're done with it, as libcurl will not free the
data for you. (Added in 7.12.3)
.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD .IP CURLINFO_CONTENT_LENGTH_DOWNLOAD
Pass a pointer to a double to receive the content-length of the download. This Pass a pointer to a double to receive the content-length of the download. This
is the value read from the Content-Length: field. is the value read from the Content-Length: field.
@@ -113,6 +125,13 @@ method(s) available for your proxy authentication. (Added in 7.10.8)
.IP CURLINFO_OS_ERRNO .IP CURLINFO_OS_ERRNO
Pass a pointer to a long to receive the errno variable from a connect failure. Pass a pointer to a long to receive the errno variable from a connect failure.
(Added in 7.12.2) (Added in 7.12.2)
.IP CURLINFO_NUM_CONNECTS
Pass a pointer to a long to receive how many new connections libcurl had to
create to achieve the previous transfer (only the successful connects are
counted). Combined with \fICURLINFO_REDIRECT_COUNT\fP you are able to know
how many times libcurl successfully reused existing connection(s) or not. See
the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries
to make persistent connections to save time. (Added in 7.12.3)
.SH RETURN VALUE .SH RETURN VALUE
If the operation was successful, CURLE_OK is returned. Otherwise an If the operation was successful, CURLE_OK is returned. Otherwise an
appropriate error code will be returned. appropriate error code will be returned.

View File

@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___ .\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____| .\" * \___|\___/|_| \_\_____|
.\" * .\" *
.\" * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. .\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * .\" *
.\" * This software is licensed as described in the file COPYING, which .\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms .\" * you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
.\" * $Id$ .\" * $Id$
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH curl_easy_setopt 3 "12 Mar 2004" "libcurl 7.11.1" "libcurl Manual" .TH curl_easy_setopt 3 "25 Jan 2005" "libcurl 7.13.0" "libcurl Manual"
.SH NAME .SH NAME
curl_easy_setopt - set options for a curl easy handle curl_easy_setopt - set options for a curl easy handle
.SH SYNOPSIS .SH SYNOPSIS
@@ -142,6 +142,18 @@ don't specify a read callback, this must be a valid FILE *.
This option is also known with the older name \fICURLOPT_INFILE\fP, the name This option is also known with the older name \fICURLOPT_INFILE\fP, the name
\fICURLOPT_READDATA\fP was introduced in 7.9.7. \fICURLOPT_READDATA\fP was introduced in 7.9.7.
.IP CURLOPT_IOCTLFUNCTION
Function pointer that should match the \fIcurl_ioctl_callback\fP prototype
found in \fI<curl/curl.h>\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. (Opion added in
7.12.3)
.IP CURLOPT_IOCTLDATA
Pass a pointer that will be untouched by libcurl and passed as the 3rd
argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION\fP. (Option
added in 7.12.3)
.IP CURLOPT_PROGRESSFUNCTION .IP CURLOPT_PROGRESSFUNCTION
Function pointer that should match the \fIcurl_progress_callback\fP prototype Function pointer that should match the \fIcurl_progress_callback\fP prototype
found in \fI<curl/curl.h>\fP. This function gets called by libcurl instead of found in \fI<curl/curl.h>\fP. This function gets called by libcurl instead of
@@ -479,9 +491,13 @@ application/x-www-form-urlencoded" header. (This is by far the most commonly
used POST method). used POST method).
Use the \fICURLOPT_POSTFIELDS\fP option to specify what data to post and Use the \fICURLOPT_POSTFIELDS\fP option to specify what data to post and
\fICURLOPT_POSTFIELDSIZE\fP to set the data size. Optionally, you can provide \fICURLOPT_POSTFIELDSIZE\fP to set the data size.
data to POST using the \fICURLOPT_READFUNCTION\fP and \fICURLOPT_READDATA\fP
options. 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 option.
You can override the default POST Content-Type: header by setting your own You can override the default POST Content-Type: header by setting your own
with \fICURLOPT_HTTPHEADER\fP. with \fICURLOPT_HTTPHEADER\fP.
@@ -518,7 +534,7 @@ the \fICURLOPT_HTTPPOST\fP option.
If you want to post data to the server without letting libcurl do a strlen() 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 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 you can post fully binary data, which otherwise is likely to fail. If this
size is set to zero, the library will use strlen() to get the size. size is set to -1, the library will use strlen() to get the size.
.IP CURLOPT_POSTFIELDSIZE_LARGE .IP CURLOPT_POSTFIELDSIZE_LARGE
Pass a curl_off_t as parameter. Use this to set the size of the 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 \fICURLOPT_POSTFIELDS\fP data to prevent libcurl from doing strlen() on the
@@ -527,11 +543,10 @@ data to figure out the size. This is the large file version of the
.IP CURLOPT_HTTPPOST .IP CURLOPT_HTTPPOST
Tells libcurl you want a multipart/formdata HTTP POST to be made and you 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 instruct what data to pass on to the server. Pass a pointer to a linked list
of HTTP post structs as parameter. The linked list should be a fully valid of curl_httppost structs as parameter. . The easiest way to create such a
list of 'struct HttpPost' structs properly filled in. The best and most list, is to use \fIcurl_formadd(3)\fP as documented. The data in this list
elegant way to do this, is to use \fIcurl_formadd(3)\fP as documented. The must remain intact until you close this curl handle again with
data in this list must remain intact until you close this curl handle again \fIcurl_easy_cleanup(3)\fP.
with \fIcurl_easy_cleanup(3)\fP.
Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. 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\fP as usual.
@@ -690,11 +705,15 @@ LPRT) command when doing active FTP downloads (which is enabled by
\fICURLOPT_FTPPORT\fP). Using EPRT means that it will first attempt to use \fICURLOPT_FTPPORT\fP). Using EPRT means that it will first attempt to use
EPRT and then LPRT before using PORT, but if you pass FALSE (zero) to this EPRT and then LPRT before using PORT, but if you pass FALSE (zero) to this
option, it will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5) option, it will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5)
If the server is an IPv6 host, this option will have no effect as of 7.12.3.
.IP CURLOPT_FTP_USE_EPSV .IP CURLOPT_FTP_USE_EPSV
Pass a long. If the value is non-zero, it tells curl to use the EPSV command Pass a long. If the value is non-zero, it tells curl to use the EPSV command
when doing passive FTP downloads (which it always does by default). Using EPSV 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 means that it will first attempt to use EPSV before using PASV, but if you
pass FALSE (zero) to this option, it will not try using EPSV, only plain PASV. pass FALSE (zero) to this option, it will not try using EPSV, only plain PASV.
If the server is an IPv6 host, this option will have no effect as of 7.12.3.
.IP CURLOPT_FTP_CREATE_MISSING_DIRS .IP CURLOPT_FTP_CREATE_MISSING_DIRS
Pass a long. If the value is non-zero, curl will attempt to create any remote Pass a long. If the value is non-zero, curl will attempt to create any remote
directory that it fails to CWD into. CWD is the command that changes working directory that it fails to CWD into. CWD is the command that changes working
@@ -723,7 +742,7 @@ Require SSL for all communication or fail with \fICURLE_FTP_SSL_FAILED\fP.
.IP CURLOPT_FTPSSLAUTH .IP CURLOPT_FTPSSLAUTH
Pass a long using one of the values from below, to alter how libcurl issues 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 \&"AUTH TLS" or "AUTH SSL" when FTP over SSL is activated (see
\fICURLOPT_FTP_SSL\fP). \fICURLOPT_FTP_SSL\fP). (Added in 7.12.2)
.RS .RS
.IP CURLFTPAUTH_DEFAULT .IP CURLFTPAUTH_DEFAULT
Allow libcurl to decide Allow libcurl to decide
@@ -732,6 +751,22 @@ Try "AUTH SSL" first, and only if that fails try "AUTH TLS"
.IP CURLFTPAUTH_TLS .IP CURLFTPAUTH_TLS
Try "AUTH TLS" first, and only if that fails try "AUTH SSL" Try "AUTH TLS" first, and only if that fails try "AUTH SSL"
.RE .RE
.IP CURLOPT_SOURCE_URL
When set, it enables a FTP third party transfer, using the set URL as source,
while \fICURLOPT_URL\fP is the target.
.IP CURLOPT_SOURCE_USERPWD
Set "username:password" to use for the source connection when doing FTP third
party transfers.
.IP CURLOPT_SOURCE_QUOTE
Exactly like \fICURLOPT_QUOTE\fP, but for the source host.
.IP CURLOPT_SOURCE_PREQUOTE
Exactly like \fICURLOPT_PREQUOTE\fP, but for the source host.
.IP CURLOPT_SOURCE_POSTQUOTE
Exactly like \fICURLOPT_POSTQUOTE\fP, but for the source host.
.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)
.SH PROTOCOL OPTIONS .SH PROTOCOL OPTIONS
.IP CURLOPT_TRANSFERTEXT .IP CURLOPT_TRANSFERTEXT
A non-zero parameter tells the library to use ASCII mode for ftp transfers, A non-zero parameter tells the library to use ASCII mode for ftp transfers,

View File

@@ -35,28 +35,28 @@ is made for file upload, there are also a stored CONTENT-TYPE and a
FILENAME. Below here, we'll discuss on what options you use to set these FILENAME. Below here, we'll discuss on what options you use to set these
properties in the parts you want to add to your post. properties in the parts you want to add to your post.
.SH OPTIONS .SH OPTIONS
.B CURLFORM_COPYNAME .IP CURLFORM_COPYNAME
followed by string is used to set the name of this part. libcurl copies the followed by string is used to set the name of this part. libcurl copies the
given data, so your application doesn't need to keep it around after this given data, so your application doesn't need to keep it around after this
function call. If the name isn't zero terminated properly, or if you'd like it function call. If the name isn't zero terminated properly, or if you'd like it
to contain zero bytes, you need to set the length of the name with to contain zero bytes, you need to set the length of the name with
\fBCURLFORM_NAMELENGTH\fP. \fBCURLFORM_NAMELENGTH\fP.
.B CURLFORM_PTRNAME .IP CURLFORM_PTRNAME
followed by a string is used for the name of this part. libcurl will use the followed by a string is used for the name of this part. libcurl will use the
pointer and refer to the data in your application, you must make sure it pointer and refer to the data in your application, you must make sure it
remains until curl no longer needs it. If the name isn't zero terminated remains until curl no longer needs it. If the name isn't zero terminated
properly, or if you'd like it to contain zero bytes, you need to set the properly, or if you'd like it to contain zero bytes, you need to set the
length of the name with \fBCURLFORM_NAMELENGTH\fP. length of the name with \fBCURLFORM_NAMELENGTH\fP.
.B CURLFORM_COPYCONTENTS .IP CURLFORM_COPYCONTENTS
followed by a string is used for the contents of this part, the actual data to followed by a string is used for the contents of this part, the actual data to
send away. libcurl copies the given data, so your application doesn't need to send away. libcurl copies the given data, so your application doesn't need to
keep it around after this function call. If the data isn't zero terminated keep it around after this function call. If the data isn't zero terminated
properly, or if you'd like it to contain zero bytes, you need to set the properly, or if you'd like it to contain zero bytes, you need to set the
length of the name with \fBCURLFORM_CONTENTSLENGTH\fP. length of the name with \fBCURLFORM_CONTENTSLENGTH\fP.
.B CURLFORM_PTRCONTENTS .IP CURLFORM_PTRCONTENTS
followed by a string is used for the contents of this part, the actual data to followed by a string is used for the contents of this part, the actual data to
send away. libcurl will use the pointer and refer to the data in your send away. libcurl will use the pointer and refer to the data in your
application, you must make sure it remains until curl no longer needs it. If application, you must make sure it remains until curl no longer needs it. If
@@ -64,11 +64,14 @@ the data isn't zero terminated properly, or if you'd like it to contain zero
bytes, you need to set the length of the name with bytes, you need to set the length of the name with
\fBCURLFORM_CONTENTSLENGTH\fP. \fBCURLFORM_CONTENTSLENGTH\fP.
.B CURLFORM_FILECONTENT .IP CURLFORM_CONTENTSLENGTH
followed by a long setting the length of the contents.
.IP CURLFORM_FILECONTENT
followed by a file name, makes that file read and the contents will be used in followed by a file name, makes that file read and the contents will be used in
as data in this part. as data in this part.
.B CURLFORM_FILE .IP CURLFORM_FILE
followed by a file name, makes this part a file upload part. It sets the file followed by a file name, makes this part a file upload part. It sets the file
name field to the actual file name used here, it gets the contents of the file name field to the actual file name used here, it gets the contents of the file
and passes as data and sets the content-type if the given file match one of and passes as data and sets the content-type if the given file match one of
@@ -77,32 +80,33 @@ send one or more files in one part by providing multiple \fBCURLFORM_FILE\fP
arguments each followed by the filename (and each CURLFORM_FILE is allowed to arguments each followed by the filename (and each CURLFORM_FILE is allowed to
have a CURLFORM_CONTENTTYPE). have a CURLFORM_CONTENTTYPE).
.B CURLFORM_CONTENTTYPE .IP CURLFORM_CONTENTTYPE
followed by a pointer to a string with a content-type will make curl use this followed by a pointer to a string with a content-type will make curl use this
given content-type for this file upload part, possibly instead of an given content-type for this file upload part, possibly instead of an
internally chosen one. internally chosen one.
.B CURLFORM_FILENAME .IP CURLFORM_FILENAME
followed by a pointer to a string to a name, will make libcurl use the given followed by a pointer to a string to a name, will make libcurl use the given
name in the file upload part, instead of the actual file name given to name in the file upload part, instead of the actual file name given to
\fICURLFORM_FILE\fP. \fICURLFORM_FILE\fP.
.B BCURLFORM_BUFFER .IP BCURLFORM_BUFFER
followed by a string, tells libcurl that a buffer is to be used to upload data followed by a string, tells libcurl that a buffer is to be used to upload data
instead of using a file. The given string is used as the value of the file instead of using a file. The given string is used as the value of the file
name field in the content header. name field in the content header.
.B CURLFORM_BUFFERPTR .IP CURLFORM_BUFFERPTR
followed by a pointer to a data area, tells libcurl the address of the buffer followed by a pointer to a data area, tells libcurl the address of the buffer
containing data to upload (as indicated with \fICURLFORM_BUFFER\fP). The containing data to upload (as indicated with \fICURLFORM_BUFFER\fP). The
buffer containing this data must not be freed until after buffer containing this data must not be freed until after
\fIcurl_easy_cleanup(3)\fP is called. \fIcurl_easy_cleanup(3)\fP is called. You must also use
\fICURLFORM_BUFFERLENGTH\fP to set the length of the given buffer area.
.B CURLFORM_BUFFERLENGTH .IP CURLFORM_BUFFERLENGTH
followed by a long with the size of the \fICURLFORM_BUFFERPTR\fP data area, followed by a long with the size of the \fICURLFORM_BUFFERPTR\fP data area,
tells libcurl the length of the buffer to upload. tells libcurl the length of the buffer to upload.
.B CURLFORM_ARRAY .IP CURLFORM_ARRAY
Another possibility to send options to curl_formadd() is the Another possibility to send options to curl_formadd() is the
\fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as \fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as
its value. Each curl_forms structure element has a CURLformoption and a char its value. Each curl_forms structure element has a CURLformoption and a char
@@ -110,7 +114,7 @@ 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 options can be used in an array, except the CURLFORM_ARRAY option itself! The
last argument in such an array must always be \fBCURLFORM_END\fP. last argument in such an array must always be \fBCURLFORM_END\fP.
.B CURLFORM_CONTENTHEADER .IP CURLFORM_CONTENTHEADER
specifies extra headers for the form POST section. This takes a curl_slist specifies extra headers for the form POST section. This takes a curl_slist
prepared in the usual way using \fBcurl_slist_append\fP and appends the list prepared in the usual way using \fBcurl_slist_append\fP and appends the list
of headers to those libcurl automatically generates. The list must exist while of headers to those libcurl automatically generates. The list must exist while

View File

@@ -83,6 +83,9 @@ only ones RFC2616 says HTTP applications may use.
.SH RETURN VALUE .SH RETURN VALUE
This function returns -1 when it fails to parse the date string. Otherwise it This function returns -1 when it fails to parse the date string. Otherwise it
returns the number of seconds as described. 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 31 bit number).
.SH REWRITE .SH REWRITE
The former version of this function was built with yacc and was not only very 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 large, it was also never quite understood and it wasn't possible to build with

View File

@@ -16,13 +16,9 @@ CURLMcode curl_multi_fdset(CURLM *multi_handle,
.SH DESCRIPTION .SH DESCRIPTION
This function extracts file descriptor information from a given multi_handle. This function extracts file descriptor information from a given multi_handle.
libcurl returns its fd_set sets. The application can use these to select() libcurl returns its fd_set sets. The application can use these to select()
on. The \fIcurl_multi_perform(3)\fI function should be called as soon as one on. The \fIcurl_multi_perform(3)\fP function should be called as soon as one
of them are ready to be read from or written to. of them are ready to be read from or written to.
NOTE that once this call is made, you must not remove the sets you point to,
as libcurl will need to be able to read them. It needs them after select()
calls, to know if certain sockets are readable or writable.
You should also be aware that when doing select(), you should consider using a You should also be aware that when doing select(), you should consider using a
rather small (single-digit number of seconds) timeout and call rather small (single-digit number of seconds) timeout and call
\fIcurl_multi_perform\fP regularly - even if no activity has been seen on the \fIcurl_multi_perform\fP regularly - even if no activity has been seen on the

View File

@@ -1,6 +1,6 @@
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_multi_info_read 3 "27 Feb 2002" "libcurl 7.10.3" "libcurl Manual" .TH curl_multi_info_read 3 "18 Dec 2004" "libcurl 7.10.3" "libcurl Manual"
.SH NAME .SH NAME
curl_multi_info_read - read multi stack informationals curl_multi_info_read - read multi stack informationals
.SH SYNOPSIS .SH SYNOPSIS
@@ -21,7 +21,7 @@ integer pointed to with \fImsgs_in_queue\fP will contain the number of
remaining messages after this function was called. remaining messages after this function was called.
The data the returned pointer points to will not survive calling The data the returned pointer points to will not survive calling
\fIcurl_multi_cleanup(3)\fP. \fIcurl_multi_cleanup(3)\fP or \fIcurl_multi_remove_handle(3)\fP.
The 'CURLMsg' struct is very simple and only contain very basic information. The 'CURLMsg' struct is very simple and only contain very basic information.
If more involved information is wanted, the particular "easy handle" in If more involved information is wanted, the particular "easy handle" in

View File

@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___ .\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____| .\" * \___|\___/|_| \_\_____|
.\" * .\" *
.\" * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. .\" * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * .\" *
.\" * This software is licensed as described in the file COPYING, which .\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms .\" * you should have received as part of this distribution. The terms
@@ -21,7 +21,7 @@
.\" * $Id$ .\" * $Id$
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH libcurl-tutorial 3 "18 Jun 2004" "libcurl" "libcurl programming" .TH libcurl-tutorial 3 "25 Jan 2005" "libcurl" "libcurl programming"
.SH NAME .SH NAME
libcurl-tutorial \- libcurl programming tutorial libcurl-tutorial \- libcurl programming tutorial
.SH "Objective" .SH "Objective"
@@ -76,6 +76,11 @@ possibly together with a few other features that can be on and off on
different libcurls. different libcurls.
See also the "Features libcurl Provides" further down. See also the "Features libcurl Provides" further down.
.IP "autoconf macro"
When you write your configure script to detect libcurl and setup variables
accordingly, we offer a prewritten macro that probably does everything you
need in this area. See docs/libcurl/libcurl.m4 file - it includes docs on how
to use it.
.SH "Portable Code in a Portable World" .SH "Portable Code in a Portable World"
The people behind libcurl have put a considerable effort to make libcurl work The people behind libcurl have put a considerable effort to make libcurl work
@@ -94,9 +99,9 @@ use the library. Once for your program's entire life time. This is done using
curl_global_init() curl_global_init()
and it takes one parameter which is a bit pattern that tells libcurl what to and it takes one parameter which is a bit pattern that tells libcurl what to
initialize. Using CURL_GLOBAL_ALL will make it initialize all known internal initialize. Using \fICURL_GLOBAL_ALL\fP will make it initialize all known
sub modules, and might be a good default option. The current two bits that internal sub modules, and might be a good default option. The current two bits
are specified are: that are specified are:
.RS .RS
.IP "CURL_GLOBAL_WIN32" .IP "CURL_GLOBAL_WIN32"
which only does anything on Windows machines. When used on which only does anything on Windows machines. When used on
@@ -113,17 +118,19 @@ application so if your program or another library already does this, this
bit should not be needed. bit should not be needed.
.RE .RE
libcurl has a default protection mechanism that detects if curl_global_init() libcurl has a default protection mechanism that detects if
hasn't been called by the time curl_easy_perform() is called and if that is \fIcurl_global_init(3)\fP hasn't been called by the time
the case, libcurl runs the function itself with a guessed bit pattern. Please \fIcurl_easy_perform(3)\fP is called and if that is the case, libcurl runs the
note that depending solely on this is not considered nice nor very good. 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(), When the program no longer uses libcurl, it should call
which is the opposite of the init call. It will then do the reversed \fIcurl_global_cleanup(3)\fP, which is the opposite of the init call. It will
operations to cleanup the resources the curl_global_init() call initialized. then do the reversed operations to cleanup the resources the
\fIcurl_global_init(3)\fP call initialized.
Repeated calls to curl_global_init() and curl_global_cleanup() should be Repeated calls to \fIcurl_global_init(3)\fP and \fIcurl_global_cleanup(3)\fP
avoided. They should only be called once each. should be avoided. They should only be called once each.
.SH "Features libcurl Provides" .SH "Features libcurl Provides"
It is considered best-practice to determine libcurl features run-time rather It is considered best-practice to determine libcurl features run-time rather
@@ -153,17 +160,18 @@ 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 up your preferred actions. A handle is just a logic entity for the upcoming
transfer or series of transfers. transfer or series of transfers.
You set properties and options for this handle using curl_easy_setopt(). They You set properties and options for this handle using
control how the subsequent transfer or transfers will be made. Options remain \fIcurl_easy_setopt(3)\fP. They control how the subsequent transfer or
set in the handle until set again to something different. Alas, multiple transfers will be made. Options remain set in the handle until set again to
requests using the same handle will use the same options. 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 Many of the options you set in libcurl are "strings", pointers to data
terminated with a zero byte. Keep in mind that when you set strings with terminated with a zero byte. Keep in mind that when you set strings with
curl_easy_setopt(), libcurl will not copy the data. It will merely point to \fIcurl_easy_setopt(3)\fP, libcurl will not copy the data. It will merely
the data. You MUST make sure that the data remains available for libcurl to point to the data. You MUST make sure that the data remains available for
use until finished or until you use the same option again to point to libcurl to use until finished or until you use the same option again to point
something else. to something else.
One of the most basic properties to set in the handle is the URL. You set 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: your preferred URL to transfer with CURLOPT_URL in a manner similar to:
@@ -192,37 +200,40 @@ another property:
Using that property, you can easily pass local data between your application 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 and the function that gets invoked by libcurl. libcurl itself won't touch the
data you pass with CURLOPT_WRITEDATA. data you pass with \fICURLOPT_WRITEDATA\fP.
libcurl offers its own default internal callback that'll take care of the data libcurl offers its own default internal callback that'll take care of the data
if you don't set the callback with CURLOPT_WRITEFUNCTION. It will then simply if you don't set the callback with \fICURLOPT_WRITEFUNCTION\fP. It will then
output the received data to stdout. You can have the default callback write simply output the received data to stdout. You can have the default callback
the data to a different file handle by passing a 'FILE *' to a file opened for write the data to a different file handle by passing a 'FILE *' to a file
writing with the CURLOPT_WRITEDATA option. opened for writing with the \fICURLOPT_WRITEDATA\fP option.
Now, we need to take a step back and have a deep breath. Here's one of those 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], 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 libcurl won't be able to operate on files opened by the program. Thus, if you
use the default callback and pass in a an open file with CURLOPT_WRITEDATA, it use the default callback and pass in a an open file with
will crash. You should therefore avoid this to make your program run fine \fICURLOPT_WRITEDATA\fP, it will crash. You should therefore avoid this to
virtually everywhere. make your program run fine virtually everywhere.
(CURLOPT_WRITEDATA was formerly known as CURLOPT_FILE. Both names still work (\fICURLOPT_WRITEDATA\fP was formerly known as \fICURLOPT_FILE\fP. Both names
and do the same thing). still work and do the same thing).
If you're using libcurl as a win32 DLL, you MUST use the
\fICURLOPT_WRITEFUNCTION\fP if you set \fICURLOPT_WRITEDATA\fP - or you will
experience crashes.
There are of course many more options you can set, and we'll get back to a few 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: of them later. Let's instead continue to the actual transfer:
success = curl_easy_perform(easyhandle); success = curl_easy_perform(easyhandle);
The \fIcurl_easy_perform(3)\fP will connect to the remote site, do the \fIcurl_easy_perform(3)\fP will connect to the remote site, do the necessary
necessary commands and receive the transfer. Whenever it receives data, it commands and receive the transfer. Whenever it receives data, it calls the
calls the callback function we previously set. The function may get one byte callback function we previously set. The function may get one byte at a time,
at a time, or it may get many kilobytes at once. libcurl delivers as much as or it may get many kilobytes at once. libcurl delivers as much as possible as
possible as often as possible. Your callback function should return the number often as possible. Your callback function should return the number of bytes it
of bytes it "took care of". If that is not the exact same amount of bytes that \&"took care of". If that is not the exact same amount of bytes that was
was passed to it, libcurl will abort the operation and return with an error passed to it, libcurl will abort the operation and return with an error code.
code.
When the transfer is complete, the function returns a return code that informs 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 if it succeeded in its mission or not. If a return code isn't enough for
@@ -236,12 +247,12 @@ previous
.SH "Multi-threading Issues" .SH "Multi-threading Issues"
libcurl is completely thread safe, except for two issues: signals and alarm libcurl is completely thread safe, except for two issues: signals and alarm
handlers. Signals are needed for a SIGPIPE handler, and the alarm() Bacall handlers. Signals are needed for a SIGPIPE handler, and the alarm() call is
is used to catch timeouts (mostly during ENS lookup). used to deal with timeouts (during DNS lookup).
If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are
then of course using OpenSSL multi-threaded and it has itself a few then of course using OpenSSL multi-threaded and it has itself a few
requirements on this. Basilio, you need to provide one or two functions to requirements on this. Basically, you need to provide one or two functions to
allow it to function properly. For all details, see this: allow it to function properly. For all details, see this:
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
@@ -322,12 +333,12 @@ CURLOPT_INFILESIZE_LARGE for all known file sizes like this[1]:
curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE_LARGE, file_size); curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE_LARGE, file_size);
.fi .fi
When you call curl_easy_perform() this time, it'll perform all the necessary When you call \fIcurl_easy_perform(3)\fP this time, it'll perform all the
operations and when it has invoked the upload it'll call your supplied necessary operations and when it has invoked the upload it'll call your
callback to get the data to upload. The program should return as much data as supplied callback to get the data to upload. The program should return as much
possible in every invoke, as that is likely to make the upload perform as data as possible in every invoke, as that is likely to make the upload perform
fast as possible. The callback should return the number of bytes it wrote in as fast as possible. The callback should return the number of bytes it wrote
the buffer. Returning 0 will signal the end of the upload. in the buffer. Returning 0 will signal the end of the upload.
.SH "Passwords" .SH "Passwords"
Many protocols use or even require that user name and password are provided Many protocols use or even require that user name and password are provided
@@ -466,15 +477,14 @@ then passing that list to libcurl.
While the simple examples above cover the majority of all cases where HTTP 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 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 formposts were introduced as a better way to post (possibly large) binary data
data and was first documented in the RFC1867. They're called multi-part and was first documented in the RFC1867. They're called multi-part because
because they're built by a chain of parts, each being a single unit. Each they're built by a chain of parts, each being a single unit. Each part has its
part has its own name and contents. You can in fact create and post a own name and contents. You can in fact create and post a multi-part formpost
multi-part formpost with the regular libcurl POST support described above, but with the regular libcurl POST support described above, but that would require
that would require that you build a formpost yourself and provide to that you build a formpost yourself and provide to libcurl. To make that
libcurl. To make that easier, libcurl provides curl_formadd(). Using this easier, libcurl provides \fIcurl_formadd(3)\fP. Using this function, you add
function, you add parts to the form. When you're done adding parts, you post parts to the form. When you're done adding parts, you post the whole form.
the whole form.
The following example sets two simple text parts with plain textual contents, The following example sets two simple text parts with plain textual contents,
and then a file with binary contents and upload the whole thing. and then a file with binary contents and upload the whole thing.
@@ -527,10 +537,10 @@ post handle:
.fi .fi
Since all options on an easyhandle are "sticky", they remain the same until 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 changed even if you do call \fIcurl_easy_perform(3)\fP, you may need to tell
go back to a plain GET request if you intend to do such a one as your next curl to go back to a plain GET request if you intend to do such a one as your
request. You force an easyhandle to back to GET by using the CURLOPT_HTTPGET next request. You force an easyhandle to back to GET by using the
option: CURLOPT_HTTPGET option:
curl_easy_setopt(easyhandle, CURLOPT_HTTPGET, TRUE); curl_easy_setopt(easyhandle, CURLOPT_HTTPGET, TRUE);
@@ -719,7 +729,7 @@ Mozilla javascript engine in the past.
Re-cycling the same easy handle several times when doing multiple requests is Re-cycling the same easy handle several times when doing multiple requests is
the way to go. the way to go.
After each single curl_easy_perform() operation, libcurl will keep the After each single \fIcurl_easy_perform(3)\fP operation, libcurl will keep the
connection alive and open. A subsequent request using the same easy handle to 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 the same host might just be able to use the already open connection! This
reduces network impact a lot. reduces network impact a lot.
@@ -903,8 +913,8 @@ A little example that deletes a given file before an operation:
.fi .fi
If you would instead want this operation (or chain of operations) to happen 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 _after_ the data transfer took place the option to \fIcurl_easy_setopt(3)\fP
instead be called CURLOPT_POSTQUOTE and used the exact same way. 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 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 added to the list, and if a command gets an error code returned back from the
@@ -973,9 +983,9 @@ The perhaps most advanced cookie operation libcurl offers, is saving the
entire internal cookie state back into a Netscape/Mozilla formatted cookie 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 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 CURLOPT_COOKIEJAR, that file name will be created and all received cookies
will be stored in it when curl_easy_cleanup() is called. This enabled cookies will be stored in it when \fIcurl_easy_cleanup(3)\fP is called. This enabled
to get passed on properly between multiple handles without any information cookies to get passed on properly between multiple handles without any
getting lost. information getting lost.
.SH "FTP Peculiarities We Need" .SH "FTP Peculiarities We Need"
@@ -1103,46 +1113,47 @@ 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 in to multiple transfers at the same time, by adding up multiple easy handles in to
a "multi stack". a "multi stack".
You create the easy handles you want and you set all the options just like You create the easy handles you want and you set all the options just like you
you have been told above, and then you create a multi handle with have been told above, and then you create a multi handle with
curl_multi_init() and add all those easy handles to that multi handle with \fIcurl_multi_init(3)\fP and add all those easy handles to that multi handle
curl_multi_add_handle(). with \fIcurl_multi_add_handle(3)\fP.
When you've added the handles you have for the moment (you can still add new 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 call curl_multi_perform(). ones at any time), you start the transfers by call
\fIcurl_multi_perform(3)\fP.
curl_multi_perform() is asynchronous. It will only execute as little as \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 possible and then return back control to your program. It is designed to never
never block. If it returns CURLM_CALL_MULTI_PERFORM you better call it again block. If it returns CURLM_CALL_MULTI_PERFORM you better call it again soon,
soon, as that is a signal that it still has local data to send or remote data as that is a signal that it still has local data to send or remote data to
to receive. receive.
The best usage of this interface is when you do a select() on all possible 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 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 makes it easy for you to wait and respond to actions on your own application's
application's sockets/handles. You figure out what to select() for by using 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 \fIcurl_multi_fdset(3)\fP, that fills in a set of fd_set variables for you
particular file descriptors libcurl uses for the moment. 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 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 action and you then call \fIcurl_multi_perform(3)\fP to allow libcurl to do
wants to do. Take note that libcurl does also feature some time-out code so what it wants to do. Take note that libcurl does also feature some time-out
we advice you to never use very long timeouts on select() before you call code so we advice you to never use very long timeouts on select() before you
curl_multi_perform(), which thus should be called unconditionally every now call \fIcurl_multi_perform(3)\fP, which thus should be called unconditionally
and then even if none of its file descriptors have signaled ready. Another every now and then even if none of its file descriptors have signaled
precaution you should use: always call curl_multi_fdset() immediately before ready. Another precaution you should use: always call
the select() call since the current set of file descriptors may change when \fIcurl_multi_fdset(3)\fP immediately before the select() call since the
calling a curl function. 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 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 can use \fIcurl_multi_remove_handle(3)\fP to remove individual easy
handles. Remember that easy handles should be curl_easy_cleanup()ed. handles. Remember that easy handles should be \fIcurl_easy_cleanup(3)\fPed.
When a transfer within the multi stack has finished, the counter of running 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 transfers (as filled in by \fIcurl_multi_perform(3)\fP) will decrease. When
number reaches zero, all transfers are done. the number reaches zero, all transfers are done.
curl_multi_info_read() can be used to get information about completed \fIcurl_multi_info_read(3)\fP can be used to get information about completed
transfers. It then returns the CURLcode for each easy transfer, to allow you transfers. It then returns the CURLcode for each easy transfer, to allow you
to figure out success on each individual transfer. to figure out success on each individual transfer.

209
docs/libcurl/libcurl.m4 Normal file
View File

@@ -0,0 +1,209 @@
# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
# [ACTION-IF-YES], [ACTION-IF-NO])
# ----------------------------------------------------------
# David Shaw <dshaw@jabberwocky.com> Jan-23-2005
#
# Checks for libcurl. DEFAULT-ACTION is the string yes or no to
# specify whether to default to --with-libcurl or --without-libcurl.
# If not supplied, DEFAULT-ACTION is yes. MINIMUM-VERSION is the
# minimum version of libcurl to accept. Pass the version as a regular
# version number like 7.10.1. If not supplied, any version is
# accepted. ACTION-IF-YES is a list of shell commands to run if
# libcurl was successfully found and passed the various tests.
# ACTION-IF-NO is a list of shell commands that are run otherwise.
# Note that using --without-libcurl does run ACTION-IF-NO.
#
# This macro defines HAVE_LIBCURL if a working libcurl setup is found,
# and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary values.
# Other useful defines are LIBCURL_FEATURE_xxx where xxx are the
# various features supported by libcurl, and LIBCURL_PROTOCOL_yyy
# where yyy are the various protocols supported by libcurl. Both xxx
# and yyy are capitalized. See the list of AH_TEMPLATEs at the top of
# the macro for the complete list of possible defines. Shell
# variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also
# defined to 'yes' for those features and protocols that were found.
# Note that xxx and yyy keep the same capitalization as in the
# curl-config list (e.g. it's "HTTP" and not "http").
#
# Users may override the detected values by doing something like:
# LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure
#
# For the sake of sanity, this macro assumes that any libcurl that is
# found is after version 7.7.2, the first version that included the
# curl-config script. Note that it is very important for people
# packaging binary versions of libcurl to include this script!
# Without curl-config, we can only make educated guesses as to what
# protocols are available. Specifically, we assume that all of HTTP,
# FTP, GOPHER, FILE, TELNET, LDAP, and DICT exist, and (if SSL exists)
# HTTPS is present. All of these protocols existed when libcurl was
# first created in version 7, so this is a safe assumption. If the
# version is 7.11.0 or later, FTPS is assumed to be present as well.
# FTPS existed before then, but was not yet fully standards compliant.
AC_DEFUN([LIBCURL_CHECK_CONFIG],
[
AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL])
AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4])
AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6])
AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz])
AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS])
AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP])
AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS])
AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP])
AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS])
AH_TEMPLATE([LIBCURL_PROTOCOL_GOPHER],[Defined if libcurl supports GOPHER])
AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE])
AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET])
AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP])
AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT])
AC_ARG_WITH(libcurl,
AC_HELP_STRING([--with-libcurl=DIR],[look for the curl library in DIR]),
[_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])])
if test "$_libcurl_with" != "no" ; then
AC_PROG_AWK
_libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'"
_libcurl_try_link=yes
if test -d "$_libcurl_with" ; then
CPPFLAGS="${CPPFLAGS} -I$withval/include"
LDFLAGS="${LDFLAGS} -L$withval/lib"
fi
AC_PATH_PROG([_libcurl_config],[curl-config])
if test x$_libcurl_config != "x" ; then
AC_CACHE_CHECK([for the version of libcurl],
[libcurl_cv_lib_curl_version],
[libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $[]2}'`])
_libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse`
_libcurl_wanted=`echo ifelse([$2],,[0],[$2]) | $_libcurl_version_parse`
if test $_libcurl_wanted -gt 0 ; then
AC_CACHE_CHECK([for libcurl >= version $2],
[libcurl_cv_lib_version_ok],
[
if test $_libcurl_version -ge $_libcurl_wanted ; then
libcurl_cv_lib_version_ok=yes
else
libcurl_cv_lib_version_ok=no
fi
])
fi
if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then
if test x"$LIBCURL_CPPFLAGS" = "x" ; then
LIBCURL_CPPFLAGS=`$_libcurl_config --cflags`
fi
if test x"$LIBCURL" = "x" ; then
LIBCURL=`$_libcurl_config --libs`
fi
# All curl-config scripts support --feature
_libcurl_features=`$_libcurl_config --feature`
# Is it modern enough to have --protocols? (7.12.4)
if test $_libcurl_version -ge 461828 ; then
_libcurl_protocols=`$_libcurl_config --protocols`
fi
else
_libcurl_try_link=no
fi
unset _libcurl_wanted
fi
if test $_libcurl_try_link = yes ; then
# we didn't find curl-config, so let's see if the user-supplied
# link line (or failing that, "-lcurl") is enough.
LIBCURL=${LIBCURL-"-lcurl"}
AC_CACHE_CHECK([whether libcurl is usable],
[libcurl_cv_lib_curl_usable],
[
_libcurl_save_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
_libcurl_save_ldflags=$LDFLAGS
LDFLAGS="$LDFLAGS $LIBCURL"
AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[
/* Try and use a few common options to force a failure if we are
missing symbols or can't link. */
int x;
curl_easy_setopt(NULL,CURLOPT_URL,NULL);
x=CURL_ERROR_SIZE;
x=CURLOPT_WRITEFUNCTION;
x=CURLOPT_FILE;
x=CURLOPT_ERRORBUFFER;
x=CURLOPT_STDERR;
x=CURLOPT_VERBOSE;
]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no)
CPPFLAGS=$_libcurl_save_cppflags
LDFLAGS=$_libcurl_save_ldflags
unset _libcurl_save_cppflags
unset _libcurl_save_ldflags
])
if test $libcurl_cv_lib_curl_usable = yes ; then
AC_DEFINE(HAVE_LIBCURL,1,
[Define to 1 if you have a functional curl library.])
AC_SUBST(LIBCURL_CPPFLAGS)
AC_SUBST(LIBCURL)
for _libcurl_feature in $_libcurl_features ; do
AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1])
eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes
done
if test "x$_libcurl_protocols" = "x" ; then
# We don't have --protocols, so just assume that all
# protocols are available
_libcurl_protocols="HTTP FTP GOPHER FILE TELNET LDAP DICT"
if test x$libcurl_feature_SSL = xyes ; then
_libcurl_protocols="$_libcurl_protocols HTTPS"
# FTPS wasn't standards-compliant until version
# 7.11.0
if test $_libcurl_version -ge 461568; then
_libcurl_protocols="$_libcurl_protocols FTPS"
fi
fi
fi
for _libcurl_protocol in $_libcurl_protocols ; do
AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1])
eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes
done
fi
fi
unset _libcurl_try_link
unset _libcurl_version_parse
unset _libcurl_config
unset _libcurl_feature
unset _libcurl_features
unset _libcurl_protocol
unset _libcurl_protocols
unset _libcurl_version
fi
if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then
# This is the IF-NO path
ifelse([$4],,:,[$4])
else
# This is the IF-YES path
ifelse([$3],,:,[$3])
fi
unset _libcurl_with
])dnl

View File

@@ -47,15 +47,35 @@ typedef void CURL;
extern "C" { extern "C" {
#endif #endif
/*
* Decorate exportable functions for Win32 DLL linking.
* This avoids using a .def file for building libcurl.dll.
*/
#if (defined(WIN32) || defined(_WIN32)) && !defined(CURL_STATICLIB)
#if defined(BUILDING_LIBCURL)
#define CURL_EXTERN __declspec(dllexport)
#else
#define CURL_EXTERN __declspec(dllimport)
#endif
#else
#define CURL_EXTERN
#endif
/* /*
* We want the typedef curl_off_t setup for large file support on all * We want the typedef curl_off_t setup for large file support on all
* platforms. We also provide a CURL_FORMAT_OFF_T define to use in *printf * platforms. We also provide a CURL_FORMAT_OFF_T define to use in *printf
* format strings when outputting a variable of type curl_off_t. * format strings when outputting a variable of type curl_off_t.
*/ */
#if defined(_MSC_VER) || defined(__LCC__) #if defined(_MSC_VER) || defined(__LCC__)
/* MSVC */ /* MSVC */
#ifdef _WIN32_WCE
typedef long curl_off_t;
#define CURL_FORMAT_OFF_T "%ld"
#else
typedef signed __int64 curl_off_t; typedef signed __int64 curl_off_t;
#define CURL_FORMAT_OFF_T "%I64d" #define CURL_FORMAT_OFF_T "%I64d"
#endif
#else /* _MSC_VER || __LCC__ */ #else /* _MSC_VER || __LCC__ */
#if (defined(__GNUC__) && defined(WIN32)) || defined(__WATCOMC__) #if (defined(__GNUC__) && defined(WIN32)) || defined(__WATCOMC__)
/* gcc on windows or Watcom */ /* gcc on windows or Watcom */
@@ -143,19 +163,39 @@ typedef size_t (*curl_write_callback)(char *buffer,
size_t nitems, size_t nitems,
void *outstream); void *outstream);
/* This is a brand new return code for the read callback that will signal /* This is a return code for the read callback that, when returned, will
the caller to immediately abort the current transfer. */ signal libcurl to immediately abort the current transfer. */
#define CURL_READFUNC_ABORT 0x10000000 #define CURL_READFUNC_ABORT 0x10000000
typedef size_t (*curl_read_callback)(char *buffer, typedef size_t (*curl_read_callback)(char *buffer,
size_t size, size_t size,
size_t nitems, size_t nitems,
void *instream); void *instream);
#ifndef CURL_NO_OLDIES
/* not used since 7.10.8, will be removed in a future release */ /* not used since 7.10.8, will be removed in a future release */
typedef int (*curl_passwd_callback)(void *clientp, typedef int (*curl_passwd_callback)(void *clientp,
const char *prompt, const char *prompt,
char *buffer, char *buffer,
int buflen); int buflen);
#endif
typedef enum {
CURLIOE_OK, /* I/O operation successful */
CURLIOE_UNKNOWNCMD, /* command was unknown to callback */
CURLIOE_FAILRESTART, /* failed to restart the read */
CURLIOE_LAST /* never use */
} curlioerr;
typedef enum {
CURLIOCMD_NOP, /* no operation */
CURLIOCMD_RESTARTREAD, /* restart the read stream from start */
CURLIOCMD_LAST /* never use */
} curliocmd;
typedef curlioerr (*curl_ioctl_callback)(CURL *handle,
int cmd,
void *clientp);
/* /*
* The following typedef's are signatures of malloc, free, realloc, strdup and * The following typedef's are signatures of malloc, free, realloc, strdup and
@@ -262,7 +302,9 @@ typedef enum {
CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */ CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */
CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */ CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */
CURLE_FTP_SSL_FAILED, /* 64 - Requested FTP SSL level failed */ CURLE_FTP_SSL_FAILED, /* 64 - Requested FTP SSL level failed */
CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind
that failed */
CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */
CURL_LAST /* never use! */ CURL_LAST /* never use! */
} CURLcode; } CURLcode;
@@ -274,9 +316,12 @@ typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */
/* Make a spelling correction for the operation timed-out define */ /* Make a spelling correction for the operation timed-out define */
#define CURLE_OPERATION_TIMEDOUT CURLE_OPERATION_TIMEOUTED #define CURLE_OPERATION_TIMEDOUT CURLE_OPERATION_TIMEOUTED
#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
the obsolete stuff removed! */
/* backwards compatibility with older names */ /* backwards compatibility with older names */
#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR #define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR
#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED #define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED
#endif
typedef enum { typedef enum {
CURLPROXY_HTTP = 0, CURLPROXY_HTTP = 0,
@@ -292,14 +337,17 @@ typedef enum {
#define CURLAUTH_ANY ~0 /* all types set */ #define CURLAUTH_ANY ~0 /* all types set */
#define CURLAUTH_ANYSAFE (~CURLAUTH_BASIC) #define CURLAUTH_ANYSAFE (~CURLAUTH_BASIC)
#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
the obsolete stuff removed! */
/* this was the error code 50 in 7.7.3 and a few earlier versions, this /* this was the error code 50 in 7.7.3 and a few earlier versions, this
is no longer used by libcurl but is instead #defined here only to not is no longer used by libcurl but is instead #defined here only to not
make programs break */ make programs break */
#define CURLE_ALREADY_COMPLETE 99999 #define CURLE_ALREADY_COMPLETE 99999
/* This is just to make older programs not break: */ /* These are just to make older programs not break: */
#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE #define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE
#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME #define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME
#endif
#define CURL_ERROR_SIZE 256 #define CURL_ERROR_SIZE 256
@@ -794,25 +842,15 @@ typedef enum {
/* Enable/disable the TCP Nagle algorithm */ /* Enable/disable the TCP Nagle algorithm */
CINIT(TCP_NODELAY, LONG, 121), CINIT(TCP_NODELAY, LONG, 121),
/* When doing 3rd party transfer, set the source host name with this */ /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
CINIT(SOURCE_HOST, OBJECTPOINT, 122),
/* When doing 3rd party transfer, set the source user and password with /* When doing 3rd party transfer, set the source user and password with
this */ this */
CINIT(SOURCE_USERPWD, OBJECTPOINT, 123), CINIT(SOURCE_USERPWD, OBJECTPOINT, 123),
/* When doing 3rd party transfer, set the source file path with this */ /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
CINIT(SOURCE_PATH, OBJECTPOINT, 124), /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
/* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */
/* When doing 3rd party transfer, set the source server's port number
with this */
CINIT(SOURCE_PORT, LONG, 125),
/* When doing 3rd party transfer, decide which server that should get the
PASV command (and the other gets the PORT).
0 (default) - The target host issues PASV.
1 - The source host issues PASV */
CINIT(PASV_HOST, LONG, 126),
/* When doing 3rd party transfer, set the source pre-quote linked list /* When doing 3rd party transfer, set the source pre-quote linked list
of commands with this */ of commands with this */
@@ -834,6 +872,20 @@ typedef enum {
*/ */
CINIT(FTPSSLAUTH, LONG, 129), CINIT(FTPSSLAUTH, LONG, 129),
CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
CINIT(IOCTLDATA, OBJECTPOINT, 131),
/* To make a 3rd party transfer, set the source URL with this */
CINIT(SOURCE_URL, OBJECTPOINT, 132),
/* When doing 3rd party transfer, set the source quote linked list of
commands with this */
CINIT(SOURCE_QUOTE, OBJECTPOINT, 133),
/* zero terminated string for pass on to the FTP server when asked for
"account" info */
CINIT(FTP_ACCOUNT, OBJECTPOINT, 134),
CURLOPT_LASTENTRY /* the last unused */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;
@@ -859,6 +911,11 @@ typedef enum {
#define CURLOPT_PASSWDDATA -4 #define CURLOPT_PASSWDDATA -4
#define CURLOPT_CLOSEFUNCTION -5 #define CURLOPT_CLOSEFUNCTION -5
#define CURLOPT_SOURCE_HOST -6
#define CURLOPT_SOURCE_PATH -7
#define CURLOPT_SOURCE_PORT -8
#define CURLOPT_PASV_HOST -9
#else #else
/* This is set if CURL_NO_OLDIES is defined at compile-time */ /* This is set if CURL_NO_OLDIES is defined at compile-time */
#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */ #undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */
@@ -915,8 +972,8 @@ typedef enum {
/* curl_strequal() and curl_strnequal() are subject for removal in a future /* curl_strequal() and curl_strnequal() are subject for removal in a future
libcurl, see lib/README.curlx for details */ libcurl, see lib/README.curlx for details */
extern int (curl_strequal)(const char *s1, const char *s2); CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2);
extern int (curl_strnequal)(const char *s1, const char *s2, size_t n); CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n);
/* name is uppercase CURLFORM_<name> */ /* name is uppercase CURLFORM_<name> */
#ifdef CFINIT #ifdef CFINIT
@@ -1005,7 +1062,7 @@ typedef enum {
* adds one part that together construct a full post. Then use * adds one part that together construct a full post. Then use
* CURLOPT_HTTPPOST to send it off to libcurl. * CURLOPT_HTTPPOST to send it off to libcurl.
*/ */
CURLFORMcode curl_formadd(struct curl_httppost **httppost, CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost,
struct curl_httppost **last_post, struct curl_httppost **last_post,
...); ...);
@@ -1016,7 +1073,7 @@ CURLFORMcode curl_formadd(struct curl_httppost **httppost,
* *
* Free a multipart formpost previously built with curl_formadd(). * Free a multipart formpost previously built with curl_formadd().
*/ */
void curl_formfree(struct curl_httppost *form); CURL_EXTERN void curl_formfree(struct curl_httppost *form);
/* /*
* NAME curl_getenv() * NAME curl_getenv()
@@ -1026,7 +1083,7 @@ void curl_formfree(struct curl_httppost *form);
* Returns a malloc()'ed string that MUST be curl_free()ed after usage is * Returns a malloc()'ed string that MUST be curl_free()ed after usage is
* complete. DEPRECATED - see lib/README.curlx * complete. DEPRECATED - see lib/README.curlx
*/ */
char *curl_getenv(const char *variable); CURL_EXTERN char *curl_getenv(const char *variable);
/* /*
* NAME curl_version() * NAME curl_version()
@@ -1035,7 +1092,7 @@ char *curl_getenv(const char *variable);
* *
* Returns a static ascii string of the libcurl version. * Returns a static ascii string of the libcurl version.
*/ */
char *curl_version(void); CURL_EXTERN char *curl_version(void);
/* /*
* NAME curl_escape() * NAME curl_escape()
@@ -1046,7 +1103,7 @@ char *curl_version(void);
* %XX versions). This function returns a new allocated string or NULL if an * %XX versions). This function returns a new allocated string or NULL if an
* error occurred. * error occurred.
*/ */
char *curl_escape(const char *string, int length); CURL_EXTERN char *curl_escape(const char *string, int length);
/* /*
* NAME curl_unescape() * NAME curl_unescape()
@@ -1057,7 +1114,7 @@ char *curl_escape(const char *string, int length);
* versions). This function returns a new allocated string or NULL if an error * versions). This function returns a new allocated string or NULL if an error
* occurred. * occurred.
*/ */
char *curl_unescape(const char *string, int length); CURL_EXTERN char *curl_unescape(const char *string, int length);
/* /*
* NAME curl_free() * NAME curl_free()
@@ -1067,7 +1124,7 @@ char *curl_unescape(const char *string, int length);
* Provided for de-allocation in the same translation unit that did the * Provided for de-allocation in the same translation unit that did the
* allocation. Added in libcurl 7.10 * allocation. Added in libcurl 7.10
*/ */
void curl_free(void *p); CURL_EXTERN void curl_free(void *p);
/* /*
* NAME curl_global_init() * NAME curl_global_init()
@@ -1077,7 +1134,7 @@ void curl_free(void *p);
* curl_global_init() should be invoked exactly once for each application that * curl_global_init() should be invoked exactly once for each application that
* uses libcurl * uses libcurl
*/ */
CURLcode curl_global_init(long flags); CURL_EXTERN CURLcode curl_global_init(long flags);
/* /*
* NAME curl_global_init_mem() * NAME curl_global_init_mem()
@@ -1092,7 +1149,7 @@ CURLcode curl_global_init(long flags);
* callback routines with be invoked by this library instead of the system * callback routines with be invoked by this library instead of the system
* memory management routines like malloc, free etc. * memory management routines like malloc, free etc.
*/ */
CURLcode curl_global_init_mem(long flags, CURL_EXTERN CURLcode curl_global_init_mem(long flags,
curl_malloc_callback m, curl_malloc_callback m,
curl_free_callback f, curl_free_callback f,
curl_realloc_callback r, curl_realloc_callback r,
@@ -1107,7 +1164,7 @@ CURLcode curl_global_init_mem(long flags,
* curl_global_cleanup() should be invoked exactly once for each application * curl_global_cleanup() should be invoked exactly once for each application
* that uses libcurl * that uses libcurl
*/ */
void curl_global_cleanup(void); CURL_EXTERN void curl_global_cleanup(void);
/* linked-list structure for the CURLOPT_QUOTE option (and other) */ /* linked-list structure for the CURLOPT_QUOTE option (and other) */
struct curl_slist { struct curl_slist {
@@ -1123,7 +1180,8 @@ struct curl_slist {
* Appends a string to a linked list. If no list exists, it will be created * Appends a string to a linked list. If no list exists, it will be created
* first. Returns the new list, after appending. * first. Returns the new list, after appending.
*/ */
struct curl_slist *curl_slist_append(struct curl_slist *, const char *); CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,
const char *);
/* /*
* NAME curl_slist_free_all() * NAME curl_slist_free_all()
@@ -1132,7 +1190,7 @@ struct curl_slist *curl_slist_append(struct curl_slist *, const char *);
* *
* free a previously built curl_slist. * free a previously built curl_slist.
*/ */
void curl_slist_free_all(struct curl_slist *); CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
/* /*
* NAME curl_getdate() * NAME curl_getdate()
@@ -1144,11 +1202,12 @@ void curl_slist_free_all(struct curl_slist *);
* where the specified time is relative now, like 'two weeks' or 'tomorrow' * where the specified time is relative now, like 'two weeks' or 'tomorrow'
* etc. * etc.
*/ */
time_t curl_getdate(const char *p, const time_t *now); CURL_EXTERN time_t curl_getdate(const char *p, const time_t *now);
#define CURLINFO_STRING 0x100000 #define CURLINFO_STRING 0x100000
#define CURLINFO_LONG 0x200000 #define CURLINFO_LONG 0x200000
#define CURLINFO_DOUBLE 0x300000 #define CURLINFO_DOUBLE 0x300000
#define CURLINFO_SLIST 0x400000
#define CURLINFO_MASK 0x0fffff #define CURLINFO_MASK 0x0fffff
#define CURLINFO_TYPEMASK 0xf00000 #define CURLINFO_TYPEMASK 0xf00000
@@ -1179,9 +1238,11 @@ typedef enum {
CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23, CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23,
CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24, CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24,
CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, CURLINFO_OS_ERRNO = CURLINFO_LONG + 25,
CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26,
CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27,
/* Fill in new entries below here! */ /* Fill in new entries below here! */
CURLINFO_LASTONE = 26 CURLINFO_LASTONE = 28
} CURLINFO; } CURLINFO;
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as /* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
@@ -1264,9 +1325,9 @@ typedef enum {
CURLSHOPT_LAST /* never use */ CURLSHOPT_LAST /* never use */
} CURLSHoption; } CURLSHoption;
CURLSH *curl_share_init(void); CURL_EXTERN CURLSH *curl_share_init(void);
CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...); CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);
CURLSHcode curl_share_cleanup(CURLSH *); CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *);
/**************************************************************************** /****************************************************************************
* Structures for querying information about the curl library at runtime. * Structures for querying information about the curl library at runtime.
@@ -1282,7 +1343,7 @@ typedef enum {
/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by /* The 'CURLVERSION_NOW' is the symbolic name meant to be used by
basicly all programs ever, that want to get version information. It is basicly all programs ever, that want to get version information. It is
meant to be a built-in version number for what kind of struct the caller meant to be a built-in version number for what kind of struct the caller
expects. If the struct ever changes, we redfine the NOW to another enum expects. If the struct ever changes, we redefine the NOW to another enum
from above. */ from above. */
#define CURLVERSION_NOW CURLVERSION_THIRD #define CURLVERSION_NOW CURLVERSION_THIRD
@@ -1292,11 +1353,11 @@ typedef struct {
unsigned int version_num; /* LIBCURL_VERSION_NUM */ unsigned int version_num; /* LIBCURL_VERSION_NUM */
const char *host; /* OS/host/cpu/machine when configured */ const char *host; /* OS/host/cpu/machine when configured */
int features; /* bitmask, see defines below */ int features; /* bitmask, see defines below */
char *ssl_version; /* human readable string */ const char *ssl_version; /* human readable string */
long ssl_version_num; /* number */ long ssl_version_num; /* number */
const char *libz_version; /* human readable string */ const char *libz_version; /* human readable string */
/* protocols is terminated by an entry with a NULL protoname */ /* protocols is terminated by an entry with a NULL protoname */
const char **protocols; const char * const *protocols;
/* The fields below this were added in CURLVERSION_SECOND */ /* The fields below this were added in CURLVERSION_SECOND */
const char *ares; const char *ares;
@@ -1326,7 +1387,7 @@ typedef struct {
* This function returns a pointer to a static copy of the version info * This function returns a pointer to a static copy of the version info
* struct. See above. * struct. See above.
*/ */
curl_version_info_data *curl_version_info(CURLversion); CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion);
/* /*
* NAME curl_easy_strerror() * NAME curl_easy_strerror()
@@ -1337,7 +1398,7 @@ curl_version_info_data *curl_version_info(CURLversion);
* into the equivalent human readable error string. This is useful * into the equivalent human readable error string. This is useful
* for printing meaningful error messages. * for printing meaningful error messages.
*/ */
const char *curl_easy_strerror(CURLcode); CURL_EXTERN const char *curl_easy_strerror(CURLcode);
/* /*
* NAME curl_share_strerror() * NAME curl_share_strerror()
@@ -1348,7 +1409,7 @@ const char *curl_easy_strerror(CURLcode);
* into the equivalent human readable error string. This is useful * into the equivalent human readable error string. This is useful
* for printing meaningful error messages. * for printing meaningful error messages.
*/ */
const char *curl_share_strerror(CURLSHcode); CURL_EXTERN const char *curl_share_strerror(CURLSHcode);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -28,7 +28,7 @@
/* This is the version number of the libcurl package from which this header /* This is the version number of the libcurl package from which this header
file origins: */ file origins: */
#define LIBCURL_VERSION "7.12.2-CVS" #define LIBCURL_VERSION "7.13.0-CVS"
/* This is the numeric version of the libcurl version number, meant for easier /* This is the numeric version of the libcurl version number, meant for easier
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
@@ -44,12 +44,12 @@
always a greater number in a more recent release. It makes comparisons with always a greater number in a more recent release. It makes comparisons with
greater than and less than work. greater than and less than work.
*/ */
#define LIBCURL_VERSION_NUM 0x070c02 #define LIBCURL_VERSION_NUM 0x070d00
/* The numeric version number is also available "in parts" by using these /* The numeric version number is also available "in parts" by using these
defines: */ defines: */
#define LIBCURL_VERSION_MAJOR 7 #define LIBCURL_VERSION_MAJOR 7
#define LIBCURL_VERSION_MINOR 12 #define LIBCURL_VERSION_MINOR 13
#define LIBCURL_VERSION_PATCH 2 #define LIBCURL_VERSION_PATCH 0
#endif /* __CURL_CURLVER_H */ #endif /* __CURL_CURLVER_H */

View File

@@ -26,10 +26,10 @@
extern "C" { extern "C" {
#endif #endif
CURL *curl_easy_init(void); CURL_EXTERN CURL *curl_easy_init(void);
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
CURLcode curl_easy_perform(CURL *curl); CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);
void curl_easy_cleanup(CURL *curl); CURL_EXTERN void curl_easy_cleanup(CURL *curl);
/* /*
* NAME curl_easy_getinfo() * NAME curl_easy_getinfo()
@@ -44,7 +44,7 @@ void curl_easy_cleanup(CURL *curl);
* performed transfer, all results from this function are undefined until the * performed transfer, all results from this function are undefined until the
* transfer is completed. * transfer is completed.
*/ */
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
/* /*
@@ -59,7 +59,7 @@ CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
* curl_easy_duphandle() for each new thread to avoid a series of identical * curl_easy_duphandle() for each new thread to avoid a series of identical
* curl_easy_setopt() invokes in every thread. * curl_easy_setopt() invokes in every thread.
*/ */
CURL* curl_easy_duphandle(CURL *curl); CURL_EXTERN CURL* curl_easy_duphandle(CURL *curl);
/* /*
* NAME curl_easy_reset() * NAME curl_easy_reset()
@@ -72,7 +72,7 @@ CURL* curl_easy_duphandle(CURL *curl);
* It does keep: live connections, the Session ID cache, the DNS cache and the * It does keep: live connections, the Session ID cache, the DNS cache and the
* cookies. * cookies.
*/ */
void curl_easy_reset(CURL *curl); CURL_EXTERN void curl_easy_reset(CURL *curl);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -27,16 +27,18 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> /* needed for FILE */ #include <stdio.h> /* needed for FILE */
int curl_mprintf(const char *format, ...); #include "curl.h"
int curl_mfprintf(FILE *fd, const char *format, ...);
int curl_msprintf(char *buffer, const char *format, ...); CURL_EXTERN int curl_mprintf(const char *format, ...);
int curl_msnprintf(char *buffer, size_t maxlength, const char *format, ...); CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...);
int curl_mvprintf(const char *format, va_list args); CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...);
int curl_mvfprintf(FILE *fd, const char *format, va_list args); CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, const char *format, ...);
int curl_mvsprintf(char *buffer, const char *format, va_list args); CURL_EXTERN int curl_mvprintf(const char *format, va_list args);
int curl_mvsnprintf(char *buffer, size_t maxlength, const char *format, va_list args); CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args);
char *curl_maprintf(const char *format, ...); CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args);
char *curl_mvaprintf(const char *format, va_list args); CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, const char *format, va_list args);
CURL_EXTERN char *curl_maprintf(const char *format, ...);
CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
#ifdef _MPRINTF_REPLACE #ifdef _MPRINTF_REPLACE
# define printf curl_mprintf # define printf curl_mprintf

View File

@@ -51,7 +51,8 @@
#define WIN32 1 #define WIN32 1
#endif #endif
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) #if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) || \
defined(__MINGW32__)
#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H)) #if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H))
/* The check above prevents the winsock2 inclusion if winsock.h already was /* The check above prevents the winsock2 inclusion if winsock.h already was
included, since they can't co-exist without problems */ included, since they can't co-exist without problems */
@@ -66,7 +67,9 @@
#include <sys/select.h> #include <sys/select.h>
#endif #endif
#ifndef _WIN32_WCE
#include <sys/socket.h> #include <sys/socket.h>
#endif
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#endif #endif
@@ -112,7 +115,7 @@ typedef struct CURLMsg CURLMsg;
* Desc: inititalize multi-style curl usage * Desc: inititalize multi-style curl usage
* Returns: a new CURLM handle to use in all 'curl_multi' functions. * Returns: a new CURLM handle to use in all 'curl_multi' functions.
*/ */
CURLM *curl_multi_init(void); CURL_EXTERN CURLM *curl_multi_init(void);
/* /*
* Name: curl_multi_add_handle() * Name: curl_multi_add_handle()
@@ -120,7 +123,7 @@ CURLM *curl_multi_init(void);
* Desc: add a standard curl handle to the multi stack * Desc: add a standard curl handle to the multi stack
* Returns: CURLMcode type, general multi error code. * Returns: CURLMcode type, general multi error code.
*/ */
CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
CURL *curl_handle); CURL *curl_handle);
/* /*
@@ -129,7 +132,7 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle,
* Desc: removes a curl handle from the multi stack again * Desc: removes a curl handle from the multi stack again
* Returns: CURLMcode type, general multi error code. * Returns: CURLMcode type, general multi error code.
*/ */
CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
CURL *curl_handle); CURL *curl_handle);
/* /*
@@ -140,7 +143,7 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
* them are ready. * them are ready.
* Returns: CURLMcode type, general multi error code. * Returns: CURLMcode type, general multi error code.
*/ */
CURLMcode curl_multi_fdset(CURLM *multi_handle, CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
fd_set *read_fd_set, fd_set *read_fd_set,
fd_set *write_fd_set, fd_set *write_fd_set,
fd_set *exc_fd_set, fd_set *exc_fd_set,
@@ -162,7 +165,7 @@ CURLMcode curl_multi_fdset(CURLM *multi_handle,
* still have occurred problems on invidual transfers even when this * still have occurred problems on invidual transfers even when this
* returns OK. * returns OK.
*/ */
CURLMcode curl_multi_perform(CURLM *multi_handle, CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
int *running_handles); int *running_handles);
/* /*
@@ -174,7 +177,7 @@ CURLMcode curl_multi_perform(CURLM *multi_handle,
* in the middle of a transfer. * in the middle of a transfer.
* Returns: CURLMcode type, general multi error code. * Returns: CURLMcode type, general multi error code.
*/ */
CURLMcode curl_multi_cleanup(CURLM *multi_handle); CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
/* /*
* Name: curl_multi_info_read() * Name: curl_multi_info_read()
@@ -204,7 +207,7 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle);
* queue (after this read) in the integer the second argument points * queue (after this read) in the integer the second argument points
* to. * to.
*/ */
CURLMsg *curl_multi_info_read(CURLM *multi_handle, CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
int *msgs_in_queue); int *msgs_in_queue);
/* /*
@@ -216,7 +219,7 @@ CURLMsg *curl_multi_info_read(CURLM *multi_handle,
* into the equivalent human readable error string. This is useful * into the equivalent human readable error string. This is useful
* for printing meaningful error messages. * for printing meaningful error messages.
*/ */
const char *curl_multi_strerror(CURLMcode); CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
#ifdef __cplusplus #ifdef __cplusplus
} /* end of extern "C" */ } /* end of extern "C" */

357
lib/Makefile.Watcom Normal file
View File

@@ -0,0 +1,357 @@
#
# Watcom / OpenWatcom / Win32 makefile for libcurl.
# G. Vanem <giva@bgnett.no>
#
# $Id$
TARGETS = libcurl_wc.lib libcurl_wc.dll libcurl_wc_imp.lib
CC = wcc386
CFLAGS = -3r -mf -d3 -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm -bt=nt -bd &
-d+ -dWIN32 -dHAVE_LONGLONG -dCURL_CA_BUNDLE=getenv("CURL_CA_BUNDLE") &
-dBUILDING_LIBCURL -dWITHOUT_MM_LIB -dHAVE_SPNEGO=1 -dENABLE_IPV6 &
-dDEBUG_THREADING_GETADDRINFO -dDEBUG=1 -dCURLDEBUG -I. -I..\include
OBJ_DIR = Watcom_obj
LIB_ARG = $(OBJ_DIR)\wlib.arg
LINK_ARG = $(OBJ_DIR)\wlink.arg
OBJS = $(OBJ_DIR)\transfer.obj $(OBJ_DIR)\file.obj &
$(OBJ_DIR)\strequal.obj $(OBJ_DIR)\timeval.obj &
$(OBJ_DIR)\easy.obj $(OBJ_DIR)\base64.obj &
$(OBJ_DIR)\security.obj $(OBJ_DIR)\hostip.obj &
$(OBJ_DIR)\krb4.obj $(OBJ_DIR)\progress.obj &
$(OBJ_DIR)\memdebug.obj $(OBJ_DIR)\formdata.obj &
$(OBJ_DIR)\http_chunks.obj $(OBJ_DIR)\cookie.obj &
$(OBJ_DIR)\strtok.obj $(OBJ_DIR)\http.obj &
$(OBJ_DIR)\connect.obj $(OBJ_DIR)\sendf.obj &
$(OBJ_DIR)\llist.obj $(OBJ_DIR)\ftp.obj &
$(OBJ_DIR)\hash.obj $(OBJ_DIR)\url.obj &
$(OBJ_DIR)\multi.obj $(OBJ_DIR)\dict.obj &
$(OBJ_DIR)\content_encoding.obj $(OBJ_DIR)\if2ip.obj &
$(OBJ_DIR)\share.obj $(OBJ_DIR)\speedcheck.obj &
$(OBJ_DIR)\http_digest.obj $(OBJ_DIR)\ldap.obj &
$(OBJ_DIR)\md5.obj $(OBJ_DIR)\ssluse.obj &
$(OBJ_DIR)\http_negotiate.obj $(OBJ_DIR)\version.obj &
$(OBJ_DIR)\http_ntlm.obj $(OBJ_DIR)\getenv.obj &
$(OBJ_DIR)\inet_pton.obj $(OBJ_DIR)\escape.obj &
$(OBJ_DIR)\strtoofft.obj $(OBJ_DIR)\mprintf.obj &
$(OBJ_DIR)\strerror.obj $(OBJ_DIR)\telnet.obj &
$(OBJ_DIR)\hostares.obj $(OBJ_DIR)\netrc.obj &
$(OBJ_DIR)\hostasyn.obj $(OBJ_DIR)\getinfo.obj &
$(OBJ_DIR)\hostip4.obj $(OBJ_DIR)\hostthre.obj &
$(OBJ_DIR)\hostip6.obj $(OBJ_DIR)\inet_ntop.obj &
$(OBJ_DIR)\hostsyn.obj $(OBJ_DIR)\parsedate.obj &
$(OBJ_DIR)\select.obj
RESOURCE = $(OBJ_DIR)\libcurl.res
all: $(OBJ_DIR) $(TARGETS) .SYMBOLIC
@echo Welcome to libcurl
$(OBJ_DIR):
mkdir $(OBJ_DIR)
libcurl_wc.lib: $(OBJS) $(LIB_ARG)
wlib -q -b -c $@ @$(LIB_ARG)
libcurl_wc.dll: $(OBJS) $(RESOURCE) $(LINK_ARG)
wlink name libcurl_wc.dll @$(LINK_ARG)
clean: .SYMBOLIC
- rm -f $(OBJS) $(RESOURCE)
vclean realclean: clean .SYMBOLIC
- rm -f $(TARGETS) $(LIB_ARG) $(LINK_ARG) libcurl_wc.map
- rmdir $(OBJ_DIR)
.ERASE
$(RESOURCE): libcurl.rc
wrc -dCURLDEBUG=1 -q -r -zm -I..\include -fo=$@ libcurl.rc
.ERASE
.c{$(OBJ_DIR)}.obj:
$(CC) $[@ $(CFLAGS) -fo=$@
@echo .
$(LIB_ARG): $(__MAKEFILES__)
%create $^@
for %f in ($(OBJS)) do @%append $^@ +- %f
$(LINK_ARG): $(__MAKEFILES__)
%create $^@
@%append $^@ system nt dll
@%append $^@ file { $(OBJS) }
@%append $^@ option quiet, map, caseexact, eliminate, implib=libcurl_wc_imp.lib,
@%append $^@ res=$(RESOURCE) libpath $(%watcom)\lib386;$(%watcom)\lib386\nt
@%append $^@ library clib3r.lib, ws2_32.lib
#
# Dependencies based on "gcc -MM .."
#
$(OBJ_DIR)\file.obj: file.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h progress.h sendf.h escape.h file.h &
speedcheck.h getinfo.h transfer.h url.h memory.h ..\include\curl\mprintf.h &
memdebug.h
$(OBJ_DIR)\timeval.obj: timeval.c timeval.h setup.h config-win32.h
$(OBJ_DIR)\base64.obj: base64.c setup.h config-win32.h ..\include\curl\mprintf.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h base64.h memory.h ..\include\curl\curl.h &
memdebug.h
$(OBJ_DIR)\hostip.obj: hostip.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h &
inet_ntop.h ..\include\curl\mprintf.h memory.h memdebug.h
$(OBJ_DIR)\progress.obj: progress.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h ..\include\curl\multi.h &
..\include\curl\curl.h urldata.h cookie.h formdata.h timeval.h http_chunks.h &
hostip.h hash.h llist.h sendf.h progress.h ..\include\curl\mprintf.h
$(OBJ_DIR)\formdata.obj: formdata.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h strequal.h &
memory.h ..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\cookie.obj: cookie.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h strequal.h strtok.h sendf.h &
memory.h memdebug.h
$(OBJ_DIR)\http.obj: http.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h progress.h &
base64.h strequal.h ssluse.h http_digest.h http_ntlm.h http_negotiate.h &
url.h share.h http.h memory.h select.h ..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\sendf.obj: sendf.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h ..\include\curl\multi.h &
..\include\curl\curl.h urldata.h cookie.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h connect.h &
..\include\curl\mprintf.h memory.h strerror.h memdebug.h
$(OBJ_DIR)\ftp.obj: ftp.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h urldata.h cookie.h &
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h sendf.h &
if2ip.h progress.h transfer.h escape.h http.h ftp.h strtoofft.h &
strequal.h ssluse.h connect.h strerror.h memory.h inet_ntop.h select.h &
..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\url.obj: url.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h netrc.h base64.h ssluse.h if2ip.h &
transfer.h sendf.h progress.h strequal.h strerror.h escape.h strtok.h &
share.h content_encoding.h http_digest.h http_negotiate.h select.h multiif.h &
ftp.h dict.h telnet.h http.h file.h ldap.h url.h connect.h inet_ntop.h &
./ca-bundle.h ..\include\curl\mprintf.h memory.h memdebug.h
$(OBJ_DIR)\dict.obj: dict.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h progress.h &
strequal.h dict.h ..\include\curl\mprintf.h
$(OBJ_DIR)\if2ip.obj: if2ip.c setup.h config-win32.h
$(OBJ_DIR)\speedcheck.obj: speedcheck.c setup.h config-win32.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h urldata.h cookie.h &
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h sendf.h &
speedcheck.h
$(OBJ_DIR)\ldap.obj: ldap.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h escape.h transfer.h &
strequal.h strtok.h ldap.h memory.h ..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\ssluse.obj: ssluse.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h url.h inet_pton.h &
ssluse.h connect.h strequal.h select.h ..\include\curl\mprintf.h
$(OBJ_DIR)\version.obj: version.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h ..\include\curl\multi.h &
..\include\curl\curl.h urldata.h cookie.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h ..\include\curl\mprintf.h
$(OBJ_DIR)\getenv.obj: getenv.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h memory.h memdebug.h
$(OBJ_DIR)\escape.obj: escape.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h memory.h &
..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\mprintf.obj: mprintf.c setup.h config-win32.h ..\include\curl\mprintf.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h memory.h ..\include\curl\curl.h memdebug.h
$(OBJ_DIR)\telnet.obj: telnet.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h telnet.h &
..\include\curl\mprintf.h arpa_telnet.h memory.h select.h memdebug.h
$(OBJ_DIR)\netrc.obj: netrc.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h netrc.h strequal.h &
strtok.h memory.h ..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\getinfo.obj: getinfo.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h urldata.h cookie.h &
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h &
getinfo.h memory.h ssluse.h memdebug.h
$(OBJ_DIR)\transfer.obj: transfer.c setup.h config-win32.h strtoofft.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h strequal.h urldata.h &
cookie.h formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h &
netrc.h content_encoding.h transfer.h sendf.h speedcheck.h progress.h &
http.h url.h getinfo.h ssluse.h http_digest.h http_ntlm.h &
http_negotiate.h share.h memory.h select.h ..\include\curl\mprintf.h &
memdebug.h
$(OBJ_DIR)\strequal.obj: strequal.c setup.h config-win32.h strequal.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h
$(OBJ_DIR)\easy.obj: easy.c setup.h config-win32.h strequal.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h urldata.h cookie.h &
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h &
transfer.h ssluse.h url.h getinfo.h share.h memory.h progress.h &
easyif.h ..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\security.obj: security.c setup.h config-win32.h
$(OBJ_DIR)\krb4.obj: krb4.c setup.h config-win32.h
$(OBJ_DIR)\memdebug.obj: memdebug.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h ..\include\curl\multi.h &
..\include\curl\curl.h ..\include\curl\mprintf.h urldata.h cookie.h &
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h memory.h memdebug.h
$(OBJ_DIR)\http_chunks.obj: http_chunks.c setup.h config-win32.h urldata.h &
cookie.h ..\include\curl\curl.h ..\include\curl\curlver.h &
..\include\curl\easy.h ..\include\curl\multi.h ..\include\curl\curl.h &
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h sendf.h &
content_encoding.h http.h memory.h ..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\strtok.obj: strtok.c setup.h config-win32.h strtok.h
$(OBJ_DIR)\connect.obj: connect.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h if2ip.h strerror.h connect.h &
memory.h select.h memdebug.h
$(OBJ_DIR)\llist.obj: llist.c setup.h config-win32.h llist.h memory.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h memdebug.h
$(OBJ_DIR)\hash.obj: hash.c setup.h config-win32.h hash.h llist.h memory.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h memdebug.h
$(OBJ_DIR)\multi.obj: multi.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h urldata.h cookie.h &
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h &
transfer.h url.h connect.h progress.h memory.h easyif.h multiif.h &
memdebug.h
$(OBJ_DIR)\content_encoding.obj: content_encoding.c setup.h config-win32.h urldata.h &
cookie.h ..\include\curl\curl.h ..\include\curl\curlver.h &
..\include\curl\easy.h ..\include\curl\multi.h ..\include\curl\curl.h &
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h sendf.h &
content_encoding.h memory.h memdebug.h
$(OBJ_DIR)\share.obj: share.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h ..\include\curl\multi.h &
..\include\curl\curl.h urldata.h cookie.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h share.h memory.h memdebug.h
$(OBJ_DIR)\http_digest.obj: http_digest.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h strequal.h base64.h md5.h &
http_digest.h strtok.h url.h memory.h ..\include\curl\mprintf.h memdebug.h
$(OBJ_DIR)\md5.obj: md5.c setup.h config-win32.h md5.h
$(OBJ_DIR)\http_negotiate.obj: http_negotiate.c setup.h config-win32.h
$(OBJ_DIR)\http_ntlm.obj: http_ntlm.c setup.h config-win32.h
$(OBJ_DIR)\inet_pton.obj: inet_pton.c setup.h config-win32.h inet_pton.h
$(OBJ_DIR)\strtoofft.obj: strtoofft.c setup.h config-win32.h strtoofft.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h
$(OBJ_DIR)\strerror.obj: strerror.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h strerror.h urldata.h &
cookie.h formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h &
..\include\curl\mprintf.h
$(OBJ_DIR)\hostares.obj: hostares.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h &
..\include\curl\mprintf.h memory.h memdebug.h
$(OBJ_DIR)\hostasyn.obj: hostasyn.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h &
..\include\curl\mprintf.h memory.h memdebug.h
$(OBJ_DIR)\hostip4.obj: hostip4.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h &
..\include\curl\mprintf.h memory.h memdebug.h
$(OBJ_DIR)\hostip6.obj: hostip6.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h &
..\include\curl\mprintf.h memory.h memdebug.h
$(OBJ_DIR)\hostsyn.obj: hostsyn.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h &
..\include\curl\mprintf.h memory.h memdebug.h
$(OBJ_DIR)\hostthre.obj: hostthre.c setup.h config-win32.h urldata.h cookie.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h formdata.h timeval.h &
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h &
..\include\curl\mprintf.h inet_ntop.h memory.h memdebug.h
$(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h config-win32.h ..\include\curl\mprintf.h &
..\include\curl\curl.h ..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h inet_ntop.h
$(OBJ_DIR)\parsedate.obj: parsedate.c setup.h config-win32.h ..\include\curl\curl.h &
..\include\curl\curlver.h ..\include\curl\easy.h &
..\include\curl\multi.h ..\include\curl\curl.h
$(OBJ_DIR)\select.obj: select.c setup.h config-win32.h select.h

View File

@@ -24,14 +24,13 @@ AUTOMAKE_OPTIONS = foreign nostdinc
DSP = curllib.dsp DSP = curllib.dsp
EXTRA_DIST = Makefile.b32 Makefile.m32 \ EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 Makefile.riscos $(DSP) \
Makefile.vc6 Makefile.riscos libcurl.def $(DSP) curllib.dsw \ curllib.dsw config-vms.h config-win32.h config-win32ce.h config-riscos.h \
config-vms.h config-win32.h config-riscos.h config-mac.h config.h.in \ config-mac.h config.h.in ca-bundle.crt README.encoding README.memoryleak \
ca-bundle.crt README.encoding README.memoryleak README.ares \ README.ares README.curlx makefile.dj config.dj libcurl.framework.make \
README.curlx makefile.dj config.dj libcurl.framework.make \ libcurl.plist libcurl.rc config-amigaos.h amigaos.c amigaos.h makefile.amiga \
libcurl.plist libcurl.rc config-amigaos.h amigaos.c amigaos.h \ Makefile.netware nwlib.c libcurl.imp msvcproj.head msvcproj.foot \
makefile.amiga Makefile.netware nwlib.c libcurl.imp \ config-win32ce.h README.httpauth Makefile.Watcom README.hostip
msvcproj.head msvcproj.foot
CLEANFILES = $(DSP) CLEANFILES = $(DSP)
@@ -90,7 +89,7 @@ include Makefile.inc
libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS) libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
WIN32SOURCES = $(CSOURCES) libcurl.def WIN32SOURCES = $(CSOURCES)
WIN32HEADERS = $(HHEADERS) config-win32.h WIN32HEADERS = $(HHEADERS) config-win32.h
BUILT_SOURCES = $(top_builddir)/lib/ca-bundle.h BUILT_SOURCES = $(top_builddir)/lib/ca-bundle.h

View File

@@ -22,9 +22,10 @@ ZLIB_PATH = ../../zlib-1.2.1
OPENSSL_PATH = ../../openssl-0.9.7d OPENSSL_PATH = ../../openssl-0.9.7d
!endif !endif
# Set libcurl's name # Set libcurl static lib, dll and import lib
LIBCURLLIB = libcurl.lib LIBCURL_LIB = libcurl.lib
LIBCURLDLL = libcurl.dll LIBCURL_DLL = libcurl.dll
LIBCURL_IMPLIB = libcurl_imp.lib
# Setup environment # Setup environment
CXX = bcc32 CXX = bcc32
@@ -32,27 +33,28 @@ LD = bcc32
CP = copy CP = copy
RM = del RM = del
LIB = tlib LIB = tlib
TOPDIR = .. IMPLIB = implib
CURNTDIR = .
CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM
LIBFLAGS = /C /P32 LIBFLAGS = /C /P32
LDFLAGS = -q -lq -laa -tWD LDFLAGS = -q -lq -laa -tWD
INCDIRS = -I$(CURNTDIR);$(TOPDIR)/include INCDIRS = -I.;../include
LINKLIB = $(BCCDIR)/lib/cw32mt.lib LINKLIB = $(BCCDIR)/lib/cw32mt.lib
# If you build with SSL support, set WITH_SSL=1 # If you build with SSL support, set WITH_SSL=1
DEFINES = -DLIBCURL_BIGENDIAN=0 -DNDEBUG -DWIN32 -D_CONSOLE -D_MBCS DEFINES = -DNDEBUG -DWIN32 -D_CONSOLE -D_MBCS -DBUILDING_LIBCURL
!ifdef WITH_ZLIB !ifdef WITH_ZLIB
DEFINES = $(DEFINES) -DHAVE_LIBZ -DHAVE_ZLIB_H DEFINES = $(DEFINES) -DHAVE_LIBZ -DHAVE_ZLIB_H
INCDIRS = $(INCDIRS);$(ZLIB_PATH) INCDIRS = $(INCDIRS);$(ZLIB_PATH)
# LINKLIB = $(LINKLIB) $(ZLIB_PATH)/zlib.lib LINKLIB = $(LINKLIB) $(ZLIB_PATH)/zlib.lib
!endif !endif
!ifdef WITH_SSL !ifdef WITH_SSL
DEFINES = $(DEFINES) -DUSE_SSLEAY DEFINES = $(DEFINES) -DUSE_SSLEAY
INCDIRS = $(INCDIRS);$(OPENSSL_PATH)/inc32;$(OPENSSL_PATH)/inc32/openssl INCDIRS = $(INCDIRS);$(OPENSSL_PATH)/inc32;$(OPENSSL_PATH)/inc32/openssl
# LINKLIB = $(LINKLIB) $(OPENSSL_PATH)/out32/ssleay32.lib $(OPENSSL_PATH)/out32/libeay32.lib LINKLIB = $(LINKLIB) $(OPENSSL_PATH)/out32/ssleay32.lib $(OPENSSL_PATH)/out32/libeay32.lib
!endif !endif
.autodepend .autodepend
@@ -65,21 +67,24 @@ OBJECTS = $(CSOURCES:.c=.obj)
.c.obj: .c.obj:
$(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $< $(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $<
all: $(LIBCURLLIB) all: $(LIBCURL_LIB) $(LIBCURL_DLL)
clean: clean:
-$(RM) $(LIBCURLLIB) -$(RM) $(LIBCURL_LIB)
-$(RM) $(LIBCURL_IMPLIB)
-$(RM) libcurl.tds
-$(RM) *.obj -$(RM) *.obj
$(LIBCURLLIB): $(OBJECTS) $(LIBCURL_LIB): $(OBJECTS)
@-$(RM) $@ @-$(RM) $@
$(LIB) $(LIBFLAGS) $@ @&&! $(LIB) $(LIBFLAGS) $@ @&&!
+$(**: = &^ +$(**: = &^
+) +)
! !
$(LIBCURLDLL): $(OBJECTS) $(LINKLIB) $(LIBCURL_DLL) $(LIBCURL_IMPLIB): $(OBJECTS) $(LINKLIB)
@-$(RM) $@ @-$(RM) $(LIBCURL_DLL)
$(LD) $(LDFLAGS) -e$@ $** @-$(RM) $(LIBCURL_IMPLIB)
$(LD) $(LDFLAGS) -e$(LIBCURL_DLL) $**
$(IMPLIB) $(LIBCURL_IMPLIB) $(LIBCURL_DLL)

View File

@@ -7,7 +7,8 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \ memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \
content_encoding.c share.c http_digest.c md5.c http_negotiate.c \ content_encoding.c share.c http_digest.c md5.c http_negotiate.c \
http_ntlm.c inet_pton.c strtoofft.c strerror.c hostares.c hostasyn.c \ http_ntlm.c inet_pton.c strtoofft.c strerror.c hostares.c hostasyn.c \
hostip4.c hostip6.c hostsyn.c hostthre.c inet_ntop.c parsedate.c hostip4.c hostip6.c hostsyn.c hostthre.c inet_ntop.c parsedate.c \
select.c
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h \ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h \
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \ progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
@@ -16,4 +17,4 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h \
http_chunks.h strtok.h connect.h llist.h hash.h content_encoding.h \ http_chunks.h strtok.h connect.h llist.h hash.h content_encoding.h \
share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h \ share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h \
inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h \ inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h \
setup.h transfer.h setup.h transfer.h select.h easyif.h multiif.h

View File

@@ -25,11 +25,13 @@ STRIP = strip -g
######################################################## ########################################################
## Nothing more to do below this line! ## Nothing more to do below this line!
INCLUDES = -I. -I.. -I../include -I../src INCLUDES = -I. -I../include
CFLAGS = -g -O2 -DMINGW32 CFLAGS = -g -O2 -DMINGW32 -DBUILDING_LIBCURL -DHAVE_LONGLONG
ifdef SSL ifdef SSL
INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl" INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H CFLAGS += -DUSE_SSLEAY -DUSE_OPENSSL -DHAVE_OPENSSL_ENGINE_H -DHAVE_OPENSSL_PKCS12_H \
-DHAVE_ENGINE_LOAD_BUILTIN_ENGINES -DOPENSSL_NO_KRB5 \
-DCURL_CA_BUNDLE='getenv("CURL_CA_BUNDLE")'
DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32 DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32
endif endif
ifdef ZLIB ifdef ZLIB
@@ -59,22 +61,16 @@ RESOURCE = libcurl.res
# remove the last line above to keep debug info # remove the last line above to keep debug info
libcurl.dll libcurldll.a: libcurl.a libcurl.def $(RESOURCE) libcurl.dll libcurldll.a: $(libcurl_a_OBJECTS) $(RESOURCE)
$(RM) $@ $(RM) $@
dllwrap --dllname $@ --output-lib libcurldll.a --export-all --def libcurl.def $(libcurl_a_LIBRARIES) $(RESOURCE) $(DLL_LIBS) -lwsock32 -lws2_32 -lwinmm $(CC) -s -shared -Wl,--out-implib,libcurldll.a -o libcurl.dll \
$(STRIP) $@ $(libcurl_a_OBJECTS) $(RESOURCE) $(DLL_LIBS) -lws2_32 -lwinmm
# remove the last line above to keep debug info # remove the above '-s' to keep debug info
.c.o: .c.o:
$(COMPILE) -c $< $(COMPILE) -c $<
.s.o:
$(COMPILE) -c $<
.S.o:
$(COMPILE) -c $<
libcurl.res: libcurl.rc libcurl.res: libcurl.rc
windres -DCURLDEBUG=0 -O COFF -o $@ -i $^ windres -DCURLDEBUG=0 -O COFF -o $@ -i $^

View File

@@ -353,6 +353,7 @@ ifdef ZLIB_PATH
endif endif
ifdef SSL ifdef SSL
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@ @echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@ @echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@ @echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_RSA_H 1$(DL) >> $@ @echo $(DL)#define HAVE_OPENSSL_RSA_H 1$(DL) >> $@

View File

@@ -5,11 +5,12 @@
# Project objects: # Project objects:
objs = o.base64 o.connect o.cookie o.dict \ objs = o.base64 o.connect o.cookie o.dict \
o.dllinit o.easy o.escape o.file \ o.dllinit o.easy o.escape o.file \
o.formdata o.ftp o.getdate o.getenv \ o.formdata o.ftp o.getenv \
o.getinfo o.getpass o.hostip o.http \ o.getinfo o.getpass o.hostip \
o.http_chunks o.if2ip o.krb4 o.ldap \ o.hostip4 o.hostsyn o.http \
o.memdebug o.mprintf o.netrc o.progress \ o.http_chunks o.inet_ntop o.inet_pton o.if2ip o.krb4 o.ldap \
o.security o.sendf o.speedcheck o.ssluse \ o.memdebug o.mprintf o.netrc o.parsedate o.progress \
o.security o.select o.sendf o.speedcheck o.ssluse \
o.strequal o.strtok o.telnet o.timeval \ o.strequal o.strtok o.telnet o.timeval \
o.transfer o.url o.version o.strtoofft o.transfer o.url o.version o.strtoofft
@@ -52,9 +53,6 @@ o.formdata: c.formdata
o.ftp: c.ftp o.ftp: c.ftp
gcc $(compileropts) -c -o ftp.o c.ftp gcc $(compileropts) -c -o ftp.o c.ftp
o.getdate: c.getdate
gcc $(compileropts) -c -o getdate.o c.getdate
o.getenv: c.getenv o.getenv: c.getenv
gcc $(compileropts) -c -o getenv.o c.getenv gcc $(compileropts) -c -o getenv.o c.getenv
@@ -67,6 +65,12 @@ o.getpass: c.getpass
o.hostip: c.hostip o.hostip: c.hostip
gcc $(compileropts) -c -o hostip.o c.hostip gcc $(compileropts) -c -o hostip.o c.hostip
o.hostip4: c.hostip4
gcc $(compileropts) -c -o hostip4.o c.hostip4
o.hostsyn: c.hostsyn
gcc $(compileropts) -c -o hostsyn.o c.hostsyn
o.http: c.http o.http: c.http
gcc $(compileropts) -c -o http.o c.http gcc $(compileropts) -c -o http.o c.http
@@ -76,6 +80,12 @@ o.http_chunks: c.http_chunks
o.if2ip: c.if2ip o.if2ip: c.if2ip
gcc $(compileropts) -c -o if2ip.o c.if2ip gcc $(compileropts) -c -o if2ip.o c.if2ip
o.inet_ntop: c.inet_ntop
gcc $(compileropts) -c -o inet_ntop.o c.inet_ntop
o.inet_pton: c.inet_pton
gcc $(compileropts) -c -o inet_pton.o c.inet_pton
o.krb4: c.krb4 o.krb4: c.krb4
gcc $(compileropts) -c -o krb4.o c.krb4 gcc $(compileropts) -c -o krb4.o c.krb4
@@ -91,12 +101,18 @@ o.mprintf: c.mprintf
o.netrc: c.netrc o.netrc: c.netrc
gcc $(compileropts) -c -o netrc.o c.netrc gcc $(compileropts) -c -o netrc.o c.netrc
o.parsedate: c.parsedate
gcc $(compileropts) -c -o parsedate.o c.parsedate
o.progress: c.progress o.progress: c.progress
gcc $(compileropts) -c -o progress.o c.progress gcc $(compileropts) -c -o progress.o c.progress
o.security: c.security o.security: c.security
gcc $(compileropts) -c -o security.o c.security gcc $(compileropts) -c -o security.o c.security
o.select: c.select
gcc $(compileropts) -c -o select.o c.select
o.sendf: c.sendf o.sendf: c.sendf
gcc $(compileropts) -c -o sendf.o c.sendf gcc $(compileropts) -c -o sendf.o c.sendf

View File

@@ -22,10 +22,20 @@
# $Id: Makefile.vc6,v 1.17 2004/01/13 08:57:01 bagder Exp $ # $Id: Makefile.vc6,v 1.17 2004/01/13 08:57:01 bagder Exp $
############################################################## ##############################################################
#
# Stem for static libs and DLLs
#
LIB_NAME = libcurl LIB_NAME = libcurl
LIB_NAME_DEBUG = libcurld LIB_NAME_DEBUG = libcurld
#
# Stem for DLL import libs
#
IMPLIB_NAME = libcurl_imp
IMPLIB_NAME_DEBUG = libcurld_imp
!IFNDEF OPENSSL_PATH !IFNDEF OPENSSL_PATH
OPENSSL_PATH = ../../openssl-0.9.7d OPENSSL_PATH = ../../openssl-0.9.7e
!ENDIF !ENDIF
!IFNDEF ZLIB_PATH !IFNDEF ZLIB_PATH
@@ -39,20 +49,22 @@ USEMM_LIBS = YES
############################################################# #############################################################
## Nothing more to do below this line! ## Nothing more to do below this line!
CCNODBG = cl.exe /MD /O2 /D "NDEBUG" CCNODBG = cl.exe /MD /O2 /DNDEBUG
CCDEBUG = cl.exe /MDd /Od /Gm /Zi /D "_DEBUG" /GZ CCDEBUG = cl.exe /MDd /Od /Gm /Zi /D_DEBUG /GZ
CFLAGSSSL = /D "USE_SSLEAY" /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl" CFLAGSSSL = /DUSE_SSLEAY /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
CFLAGSZLIB = /D "HAVE_ZLIB_H" /D "HAVE_ZLIB" /D "HAVE_LIBZ" /I "$(ZLIB_PATH)" CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
CFLAGS = /I "." /I "../include" /nologo /W3 /GX /D "WIN32" /D "VC6" /D "_MBCS" /D "_LIB" /YX /FD /c /D "MSDOS" CFLAGS = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
LNKDLL = link.exe /DLL /def:libcurl.def LNKDLL = link.exe /DLL
LNKLIB = link.exe /lib LNKLIB = link.exe /lib
LFLAGS = /nologo LFLAGS = /nologo
SSLLIBS = libeay32.lib ssleay32.lib SSLLIBS = libeay32.lib ssleay32.lib
ZLIBLIBSDLL= zdll.lib
ZLIBLIBS = zlib.lib
!IFDEF USEMM_LIBS !IFDEF USEMM_LIBS
WINLIBS = wsock32.lib winmm.lib WINLIBS = wsock32.lib winmm.lib
!ELSE !ELSE
WINLIBS = wsock32.lib WINLIBS = wsock32.lib
CFLAGS = $(CFLAGS) /D "WITHOUT_MM_LIB" CFLAGS = $(CFLAGS) /DWITHOUT_MM_LIB
!ENDIF !ENDIF
# RSAglue.lib was formerly needed in the SSLLIBS # RSAglue.lib was formerly needed in the SSLLIBS
CFGSET = FALSE CFGSET = FALSE
@@ -62,8 +74,8 @@ CFGSET = FALSE
!IF "$(CFG)" == "release" !IF "$(CFG)" == "release"
TARGET = $(LIB_NAME).lib TARGET = $(LIB_NAME).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LNK = $(LNKLIB) /out:$(TARGET) LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) CC = $(CCNODBG)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
@@ -73,9 +85,9 @@ CFGSET = TRUE
!IF "$(CFG)" == "release-zlib" !IF "$(CFG)" == "release-zlib"
TARGET = $(LIB_NAME).lib TARGET = $(LIB_NAME).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(LFLAGSZLIB) /out:$(TARGET) LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(CFLAGSZLIB) CC = $(CCNODBG) $(CFLAGSZLIB)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
@@ -85,8 +97,8 @@ CFGSET = TRUE
!IF "$(CFG)" == "release-dll" !IF "$(CFG)" == "release-dll"
TARGET = $(LIB_NAME).dll TARGET = $(LIB_NAME).dll
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LNK = $(LNKDLL) $(WINLIBS) /out:$(TARGET) /IMPLIB:"$(LIB_NAME).lib" LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib
CC = $(CCNODBG) CC = $(CCNODBG)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
@@ -97,9 +109,9 @@ RESOURCE = $(DIROBJ)\libcurl.res
!IF "$(CFG)" == "release-ssl" !IF "$(CFG)" == "release-ssl"
TARGET = $(LIB_NAME).lib TARGET = $(LIB_NAME).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(TARGET) LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(CFLAGSSSL) CC = $(CCNODBG) $(CFLAGSSSL)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
@@ -108,81 +120,123 @@ CFGSET = TRUE
# release-ssl-dll # release-ssl-dll
!IF "$(CFG)" == "release-ssl-dll" !IF "$(CFG)" == "release-ssl-dll"
TARGET =$(LIB_NAME).dll TARGET = $(LIB_NAME).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32dll" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(WINLIBS) $(LFLAGSSSL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME).lib" LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(CFLAGSSSL) CC = $(CCNODBG) $(CFLAGSSSL)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF !ENDIF
###################### ######################
# release-ssl-zlib # release-ssl-zlib
!IF "$(CFG)" == "release-ssl-zlib" !IF "$(CFG)" == "release-ssl-zlib"
TARGET = $(LIB_NAME).lib TARGET = $(LIB_NAME).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(TARGET) LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB) CC = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
###################### ######################
# release-libcurl-ssl-dll # release-dll-ssl-dll
!IF "$(CFG)" == "release-libcurl-ssl-dll"
TARGET =$(LIB_NAME).lib !IF "$(CFG)" == "release-dll-ssl-dll"
DIROBJ =.\$(CFG) TARGET = $(LIB_NAME).dll
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32dll" DIROBJ = $(CFG)
LNK = $(LNKLIB) $(SSLLIBS) $(LFLAGSSSL) /out:$(TARGET) LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib
CC = $(CCNODBG) $(CFLAGSSSL) CC = $(CCNODBG) $(CFLAGSSSL)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF !ENDIF
######################
# release-zlib-dll
!IF "$(CFG)" == "release-zlib-dll"
TARGET = $(LIB_NAME).lib
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(CFLAGSZLIB)
CFGSET = TRUE
!ENDIF
######################
# release-ssl-dll-zlib-dll
!IF "$(CFG)" == "release-ssl-dll-zlib-dll"
TARGET = $(LIB_NAME).lib
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB)
CFGSET = TRUE
!ENDIF
######################
# release-dll-zlib-dll
!IF "$(CFG)" == "release-dll-zlib-dll"
TARGET = $(LIB_NAME).dll
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib
CC = $(CCNODBG) $(CFLAGSZLIB)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
######################
# release-dll-ssl-dll-zlib-dll
!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
TARGET = $(LIB_NAME).dll
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib
CC = $(CCNODBG) $(CFLAGSSSL) $(CFLAGSZLIB)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
###################### ######################
# debug # debug
!IF "$(CFG)" == "debug" !IF "$(CFG)" == "debug"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIB_NAME_DEBUG).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LNK = $(LNKLIB) /out:$(TARGET) LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) CC = $(CCDEBUG)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
######################
# debug-dll
!IF "$(CFG)" == "debug-dll"
TARGET =$(LIB_NAME_DEBUG).dll
DIROBJ =.\$(CFG)
LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" /PDB:"$(LIB_NAME_DEBUG).pdb"
CC = $(CCDEBUG)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
###################### ######################
# debug-ssl # debug-ssl
#todo
!IF "$(CFG)" == "debug-ssl" !IF "$(CFG)" == "debug-ssl"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIB_NAME_DEBUG).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(TARGET) LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
LNK = $(LNKLIB) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(CFLAGSSSL) CC = $(CCDEBUG) $(CFLAGSSSL)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
###################### ######################
# debug-zlib # debug-zlib
!IF "$(CFG)" == "debug-zlib" !IF "$(CFG)" == "debug-zlib"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIB_NAME_DEBUG).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(LFLAGSZLIB) /out:$(TARGET) LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(CFLAGSZLIB) CC = $(CCDEBUG) $(CFLAGSZLIB)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
@@ -191,38 +245,151 @@ CFGSET = TRUE
# debug-ssl-dll # debug-ssl-dll
!IF "$(CFG)" == "debug-ssl-dll" !IF "$(CFG)" == "debug-ssl-dll"
TARGET =$(LIB_NAME_DEBUG).dll TARGET = $(LIB_NAME_DEBUG).lib
DIROBJ =.\$(CFG) DIROBJ = $(CFG)
LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)/out32dll LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
LNK = $(LNKDLL) $(WINLIBS) $(LFLAGSSSL) /DEBUG /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" /PDB:"$(LIB_NAME_DEBUG).pdb" LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(CFLAGSSSL) CC = $(CCDEBUG) $(CFLAGSSSL)
CFGSET = TRUE CFGSET = TRUE
!ENDIF
######################
# debug-ssl-zlib
!IF "$(CFG)" == "debug-ssl-zlib"
TARGET = $(LIB_NAME_DEBUG).lib
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
LNK = $(LNKLIB) $(SSLLIBS) $(ZLIBLIBS) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB)
CFGSET = TRUE
!ENDIF
######################
# debug-zlib-dll
!IF "$(CFG)" == "debug-zlib-dll"
TARGET = $(LIB_NAME_DEBUG).lib
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(CFLAGSZLIB)
CFGSET = TRUE
!ENDIF
######################
# debug-ssl-dll-zlib-dll
!IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
TARGET = $(LIB_NAME_DEBUG).lib
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB)
CFGSET = TRUE
!ENDIF
######################
# debug-dll
!IF "$(CFG)" == "debug-dll"
TARGET = $(LIB_NAME_DEBUG).dll
DIROBJ = $(CFG)
LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb
CC = $(CCDEBUG)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
######################
# debug-dll-ssl-dll
!IF "$(CFG)" == "debug-dll-ssl-dll"
TARGET = $(LIB_NAME_DEBUG).dll
DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb
CC = $(CCDEBUG) $(CFLAGSSSL)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
######################
# debug-dll-zlib-dll
!IF "$(CFG)" == "debug-dll-zlib-dll"
TARGET = $(LIB_NAME_DEBUG).dll
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb
CC = $(CCDEBUG) $(CFLAGSZLIB)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
######################
# debug-dll-ssl-dll-zlib-dll
!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
TARGET = $(LIB_NAME_DEBUG).dll
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb
CC = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF !ENDIF
####################### #######################
# Usage # Usage
# #
!IF "$(CFGSET)" == "FALSE" !IF "$(CFGSET)" == "FALSE" && "$(CFG)" != ""
!MESSAGE Usage: nmake /f makefile.vc6 CFG=<config> <target> !MESSAGE Usage: nmake /f makefile.vc6 CFG=<config> <target>
!MESSAGE where <config> is one of: !MESSAGE where <config> is one of:
!MESSAGE release - release static library !MESSAGE release - release static library
!MESSAGE release-dll - release dll
!MESSAGE release-zlib - release static library with zlib
!MESSAGE release-ssl - release static library with ssl !MESSAGE release-ssl - release static library with ssl
!MESSAGE release-zlib - release static library with zlib
!MESSAGE release-ssl-zlib - release static library with ssl and zlib !MESSAGE release-ssl-zlib - release static library with ssl and zlib
!MESSAGE release-ssl-dll - release dll library with ssl !MESSAGE release-ssl-dll - release static library with dynamic ssl
!MESSAGE release-libcurl-ssl-dll - static libcurl with shared ssl !MESSAGE release-zlib-dll - release static library with dynamic zlib
!MESSAGE release-ssl-dll-zlib-dll - release static library with dynamic ssl and dynamic zlib
!MESSAGE release-dll - release dynamic library
!MESSAGE release-dll-ssl-dll - release dynamic library with dynamic ssl
!MESSAGE release-dll-zlib-dll - release dynamic library with dynamic zlib
!MESSAGE release-dll-ssl-dll-zlib-dll - release dynamic library with dynamic ssl and dynamic zlib
!MESSAGE debug - debug static library !MESSAGE debug - debug static library
!MESSAGE debug-dll - debug dll
!MESSAGE debug-zlib - debug static library with zlib
!MESSAGE debug-ssl - debug static library with ssl !MESSAGE debug-ssl - debug static library with ssl
!MESSAGE debug-ssl-dll - debug dll library with ssl !MESSAGE debug-zlib - debug static library with zlib
!MESSAGE debug-ssl-zlib - debug static library with ssl and zlib
!MESSAGE debug-ssl-dll - debug static library with dynamic ssl
!MESSAGE debug-zlib-dll - debug static library with dynamic zlib
!MESSAGE debug-ssl-dll-zlib-dll - debug static library with dynamic ssl and dynamic zlib
!MESSAGE debug-dll - debug dynamic library
!MESSAGE debug-dll-ssl-dll - debug dynamic library with dynamic ssl
!MESSAGE debug-dll-zlib-dll - debug dynamic library with dynamic zlib1
!MESSAGE debug-dll-ssl-dll-zlib-dll - debug dynamic library with dynamic ssl and dynamic zlib
!MESSAGE <target> can be left blank in which case all is assumed !MESSAGE <target> can be left blank in which case all is assumed
!ERROR please choose a valid configuration "$(CFG)" !ERROR please choose a valid configuration "$(CFG)"
!ENDIF !ENDIF
####################### #######################
# Only the clean target can be used if a config was not provided.
#
!IF "$(CFGSET)" == "FALSE"
clean:
@-erase /s *.dll 2> NUL
@-erase /s *.exp 2> NUL
@-erase /s *.idb 2> NUL
@-erase /s *.lib 2> NUL
@-erase /s *.obj 2> NUL
@-erase /s *.pch 2> NUL
@-erase /s *.pdb 2> NUL
@-erase /s *.res 2> NUL
!ELSE
# A config was provided, so the library can be built.
# #
X_OBJS= \ X_OBJS= \
$(DIROBJ)\base64.obj \ $(DIROBJ)\base64.obj \
@@ -272,15 +439,24 @@ X_OBJS= \
$(DIROBJ)\http_negotiate.obj \ $(DIROBJ)\http_negotiate.obj \
$(DIROBJ)\http_ntlm.obj \ $(DIROBJ)\http_ntlm.obj \
$(DIROBJ)\md5.obj \ $(DIROBJ)\md5.obj \
$(DIROBJ)\memdebug.obj \
$(DIROBJ)\strerror.obj \ $(DIROBJ)\strerror.obj \
$(DIROBJ)\select.obj \
$(DIROBJ)\content_encoding.obj \ $(DIROBJ)\content_encoding.obj \
$(RESOURCE) $(RESOURCE)
all : $(TARGET) all : $(TARGET)
$(TARGET): $(X_OBJS) $(TARGET): $(X_OBJS)
$(LNK) $(LFLAGS) $(X_OBJS) $(LNK) $(LFLAGS) $(X_OBJS)
-xcopy $(DIROBJ)\$(LIB_NAME).dll . /y
-xcopy $(DIROBJ)\$(LIB_NAME).lib . /y
-xcopy $(DIROBJ)\$(LIB_NAME_DEBUG).dll . /y
-xcopy $(DIROBJ)\$(LIB_NAME_DEBUG).lib . /y
-xcopy $(DIROBJ)\$(IMPLIB_NAME).lib . /y
-xcopy $(DIROBJ)\$(IMPLIB_NAME).lib . /y
-xcopy $(DIROBJ)\*.exp . /y
-xcopy $(DIROBJ)\*.pdb . /y
$(X_OBJS): $(DIROBJ) $(X_OBJS): $(DIROBJ)
@@ -293,17 +469,14 @@ $(DIROBJ):
$(CC) $(CFLAGS) /Fo"$@" $< $(CC) $(CFLAGS) /Fo"$@" $<
debug-dll\libcurl.res \ debug-dll\libcurl.res \
debug-ssl-dll\libcurl.res \ debug-dll-ssl-dll\libcurl.res \
release-libcurl-ssl-dll\libcurl.res: libcurl.rc debug-dll-zlib-dll\libcurl.res \
debug-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
rc /dCURLDEBUG=1 /Fo $@ libcurl.rc rc /dCURLDEBUG=1 /Fo $@ libcurl.rc
release-dll\libcurl.res \ release-dll\libcurl.res \
release-ssl-dll\libcurl.res \ release-dll-ssl-dll\libcurl.res \
release-libcurl-ssl-dll\libcurl.res: libcurl.rc release-dll-zlib-dll\libcurl.res \
release-dll-ssl-dll-zlib-dll\libcurl.res: libcurl.rc
rc /dCURLDEBUG=0 /Fo $@ libcurl.rc rc /dCURLDEBUG=0 /Fo $@ libcurl.rc
!ENDIF # End of case where a config was provided.
clean:
-@erase $(DIROBJ)\*.obj
-@erase $(DIROBJ)\*.res
-@erase vc60.idb
-@erase vc60.pch

35
lib/README.hostip Normal file
View File

@@ -0,0 +1,35 @@
hostip.c explained
==================
The main COMPILE-TIME DEFINES to keep in mind when reading the host*.c
source file are these:
CURLRES_IPV6 - this host has getaddrinfo() and family, and thus we use
that. The host may not be able to resolve IPv6, but we don't really have to
take that into account. Hosts that aren't IPv6-enabled have CURLRES_IPV4
defined.
CURLRES_ARES - is defined if libcurl is built to use c-ares for asynchronous
name resolves. It cannot have ENABLE_IPV6 defined at the same time, as c-ares
has no ipv6 support. 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.
If any of the two previous are defined, CURLRES_ASYNCH is defined too. If
libcurl is not built to use an asynchronous resolver, CURLRES_SYNCH is
defined.
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
The hostip.h is the single united header file for all this. It defines the
CURLRES_* defines based on the config*.h and setup.h defines.

74
lib/README.httpauth Normal file
View File

@@ -0,0 +1,74 @@
1. PUT/POST without a known auth to use (possibly no auth required):
(When explicitly set to use a multi-pass auth when doing a POST/PUT,
libcurl should immediately go the Content-Length: 0 bytes route to avoid
the first send all data phase, step 2. If told to use a single-pass auth,
goto step 3.)
Issue the proper PUT/POST request immediately, with the correct
Content-Length and Expect: headers.
If a 100 response is received or the wait for one times out, start sending
the request-body.
If a 401 (or 407 when talking through a proxy) is received, then:
If we have "more than just a little" data left to send, close the
connection. Exactly what "more than just a little" means will have to be
determined. Possibly the current transfer speed should be taken into
account as well.
NOTE: if the size of the POST data is less than MAX_INITIAL_POST_SIZE (when
CURLOPT_POSTFIELDS is used), libcurl will send everything in one single
write() (all request-headers and request-body) and thus it will
unconditionally send the full post data here.
2. PUT/POST with multi-pass auth but not yet completely negotiated:
Send a PUT/POST request, we know that it will be rejected and thus we claim
Content-Length zero to avoid having to send the request-body. (This seems
to be what IE does.)
3. PUT/POST as the last step in the auth negotiation, that is when we have
what we believe is a completed negotiation:
Send a full and proper PUT/POST request (again) with the proper
Content-Length and a following request-body.
NOTE: this may very well be the second (or even third) time the whole or at
least parts of the request body is sent to the server. Since the data may
be provided to libcurl with a callback, we need a way to tell the app that
the upload is to be restarted so that the callback will provide data from
the start again. This requires an API method/mechanism that libcurl
doesn't have today. See below.
Data Rewind
It will be troublesome for some apps to deal with a rewind like this in all
circumstances. I'm thinking for example when using 'curl' to upload data
from stdin. If libcurl ends up having to rewind the reading for a request
to succeed, of course a lack of this callback or if it returns failure, will
cause the request to fail completely.
The new callback is set with CURLOPT_IOCTLFUNCTION (in an attempt to add a
more generic function that might be used for other IO-related controls in
the future):
curlioerr curl_ioctl(CURL *handle, curliocmd cmd, void *clientp);
And in the case where the read is to be rewinded, it would be called with a
cmd named CURLIOCMD_RESTARTREAD. The callback would then return CURLIOE_OK,
if things are fine, or CURLIOE_FAILRESTART if not.
Backwards Compatibility
The approach used until now, that issues a HEAD on the given URL to trigger
the auth negotiation could still be supported and encouraged, but it would
be up to the app to first fetch a URL with GET/HEAD to negotiate on, since
then a following PUT/POST wouldn't need to negotiate authentication and
thus avoid double-sending data.
Optionally, we keep the current approach if some option is set
(CURLOPT_HEADBEFOREAUTH or similar), since it seems to work fairly well for
POST on most servers.

View File

@@ -39,7 +39,7 @@
/* /*
* The telnet options represented as strings * The telnet options represented as strings
*/ */
static const char *telnetoptions[]= static const char * const telnetoptions[]=
{ {
"BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD",
"NAME", "STATUS", "TIMING MARK", "RCTE", "NAME", "STATUS", "TIMING MARK", "RCTE",
@@ -78,7 +78,7 @@ static const char *telnetoptions[]=
/* /*
* Then those numbers represented as strings: * Then those numbers represented as strings:
*/ */
static const char *telnetcmds[]= static const char * const telnetcmds[]=
{ {
"EOF", "SUSP", "ABORT", "EOR", "SE", "EOF", "SUSP", "ABORT", "EOR", "SE",
"NOP", "DMARK", "BRK", "IP", "AO", "NOP", "DMARK", "BRK", "IP", "AO",

View File

@@ -110,7 +110,7 @@ size_t Curl_base64_decode(const char *src, char *dest)
} }
/* ---- Base64 Encoding --- */ /* ---- Base64 Encoding --- */
static char table64[]= static const char table64[]=
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/* /*

View File

@@ -55,6 +55,9 @@
#define HAVE_WRITABLE_ARGV 1 #define HAVE_WRITABLE_ARGV 1
#define HAVE_ZLIB_H 1 #define HAVE_ZLIB_H 1
#define USE_OPENSSL 1
#define USE_SSLEAY 1
#define OS "AmigaOS" #define OS "AmigaOS"
#define PACKAGE "curl" #define PACKAGE "curl"

View File

@@ -53,9 +53,6 @@
/* Define this to your Entropy Gathering Daemon socket pathname */ /* Define this to your Entropy Gathering Daemon socket pathname */
#undef EGD_SOCKET #undef EGD_SOCKET
/* Define if you have a working OpenSSL installation */
#undef OPENSSL_ENABLED
/* Set to explicitly specify we don't want to use thread-safe functions */ /* Set to explicitly specify we don't want to use thread-safe functions */
#define DISABLED_THREADSAFE #define DISABLED_THREADSAFE

View File

@@ -343,8 +343,11 @@
/* Define if you have the getpass function. */ /* Define if you have the getpass function. */
#undef HAVE_GETPASS #undef HAVE_GETPASS
/* Define if you have a working OpenSSL installation */ /* if OpenSSL is in use */
#define OPENSSL_ENABLED 1 #define USE_OPENSSL 1
/* if SSL is enabled */
#define USE_SSLEAY 1
/* Define if you have the `dlopen' function. */ /* Define if you have the `dlopen' function. */
#undef HAVE_DLOPEN #undef HAVE_DLOPEN

View File

@@ -107,7 +107,7 @@
#define HAVE_STRSTR 1 #define HAVE_STRSTR 1
/* Define if you have the strtoll function. */ /* Define if you have the strtoll function. */
#ifdef MINGW32 #if defined(__MINGW32__) || defined(__WATCOMC__)
#define HAVE_STRTOLL 1 #define HAVE_STRTOLL 1
#endif #endif
@@ -121,7 +121,9 @@
/*#define HAVE_UNAME 1*/ /*#define HAVE_UNAME 1*/
/* Define if you have utime() */ /* Define if you have utime() */
#ifndef __BORLANDC__
#define HAVE_UTIME 1 #define HAVE_UTIME 1
#endif
/* Define if you have the <alloca.h> header file. */ /* Define if you have the <alloca.h> header file. */
/*#define HAVE_ALLOCA_H 1*/ /*#define HAVE_ALLOCA_H 1*/
@@ -178,7 +180,9 @@
#define HAVE_SYS_STAT_H 1 #define HAVE_SYS_STAT_H 1
/* Define if you have the <sys/utime.h> header file */ /* Define if you have the <sys/utime.h> header file */
#ifndef __BORLANDC__
#define HAVE_SYS_UTIME_H 1 #define HAVE_SYS_UTIME_H 1
#endif
/* Define if you have the <sys/types.h> header file. */ /* Define if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1 #define HAVE_SYS_TYPES_H 1
@@ -232,7 +236,7 @@
* This section is for compiler specific defines.* * This section is for compiler specific defines.*
*************************************************/ *************************************************/
/* Borland and MS don't have this */ /* Borland and MS don't have this */
#if defined(MINGW32) || defined(__WATCOMC__) || defined(__LCC__) #if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__)
/* Define if you have the <unistd.h> header file. */ /* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1 #define HAVE_UNISTD_H 1

257
lib/config-win32ce.h Normal file
View File

@@ -0,0 +1,257 @@
/* config.h. Generated automatically by configure. */
/* config.h.in. Generated automatically from configure.in by autoheader. */
#ifndef __CONFIG_WIN32CE_H
#define __CONFIG_WIN32CE_H
/* Define if on AIX 3.
System headers sometimes define this.
We just want to avoid a redefinition error message. */
#ifndef _ALL_SOURCE
/* #undef _ALL_SOURCE */
#endif
/* Define to empty if the keyword does not work. */
/* #undef const */
/* Define if you don't have vprintf but do have _doprnt. */
/* #undef HAVE_DOPRNT */
/* Define if you have the vprintf function. */
#define HAVE_VPRINTF 1
/* Define as the return type of signal handlers (int or void). */
/*#define RETSIGTYPE void */
/* Define to `unsigned' if <sys/types.h> doesn't define. */
/* #undef size_t */
/* Define this to 'int' if ssize_t is not an available typedefed type */
#define ssize_t int
/* Define this to 'int' if socklen_t is not an available typedefed type */
#if !defined(ENABLE_IPV6) && ((_MSC_VER < 1300) || !defined(USE_SSLEAY))
#define socklen_t int
#endif
/* The size of a `curl_off_t', as computed by sizeof. */
#ifdef SIZEOF_CURL_OFF_T
#undef SIZEOF_CURL_OFF_T
#endif
/* Borland lacks _lseeki64(), so we don't support >2GB files */
#define SIZEOF_CURL_OFF_T 4
/* Define if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Define if you can safely include both <sys/time.h> and <time.h>. */
/* #define TIME_WITH_SYS_TIME 1 */
/* Define cpu-machine-OS */
#define OS "i386-pc-win32ce"
/* The number of bytes in a long double. */
#define SIZEOF_LONG_DOUBLE 16
/* The number of bytes in a long long. */
/* #define SIZEOF_LONG_LONG 8 */
/* Define if you have the gethostbyaddr function. */
#define HAVE_GETHOSTBYADDR 1
/* Define if you have the gethostname function. */
#define HAVE_GETHOSTNAME 1
/* Define if you have the getpass function. */
/*#define HAVE_GETPASS 1*/
/* Define if you have the getservbyname function. */
#define HAVE_GETSERVBYNAME 1
/* Define if you have the gettimeofday function. */
/* #define HAVE_GETTIMEOFDAY 1 */
/* Define if you have the inet_addr function. */
#define HAVE_INET_ADDR 1
/* Define if you have the inet_ntoa function. */
#define HAVE_INET_NTOA 1
/* Define if you have the perror function. */
#define HAVE_PERROR 1
/* Define if you have the select function. */
#define HAVE_SELECT 1
/* Define if you have the socket function. */
#define HAVE_SOCKET 1
/* Define if you have the strcasecmp function. */
/*#define HAVE_STRCASECMP 1*/
/* Define if you have the stricmp function. */
//#define HAVE_STRICMP 1
/* Define if you have the strdup function. */
//#define HAVE_STRDUP 1
/* Define if you have the strftime function. */
//#define HAVE_STRFTIME 1
/* Define if you have the strstr function. */
#define HAVE_STRSTR 1
/* Define if you have the strtoll function. */
#ifdef __MINGW32__
#define HAVE_STRTOLL 1
#endif
/* Define if you have the tcgetattr function. */
/*#define HAVE_TCGETATTR 1*/
/* Define if you have the tcsetattr function. */
/*#define HAVE_TCSETATTR 1*/
/* Define if you have the uname function. */
/*#define HAVE_UNAME 1*/
/* Define if you have utime() */
#define HAVE_UTIME 1
/* Define if you have the <alloca.h> header file. */
/*#define HAVE_ALLOCA_H 1*/
/* Define if you have the malloc.h file. */
#define HAVE_MALLOC_H 1
/* Define if you have the <arpa/inet.h> header file. */
/* #define HAVE_ARPA_INET_H 1 */
/* Define if you have the <assert.h> header file. */
//#define HAVE_ASSERT_H 1
/* Define if you have the <crypto.h> header file. */
/* #undef HAVE_CRYPTO_H */
/* Define if you have the <dlfcn.h> header file. */
/*#define HAVE_DLFCN_H 1*/
/* Define if you have the <err.h> header file. */
/* #undef HAVE_ERR_H */
/* Define if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define if you have the <getopt.h> header file. */
/* #undef HAVE_GETOPT_H */
/* Define if you have the <netdb.h> header file. */
/* #define HAVE_NETDB_H 1 */
/* Define if you have the <netinet/in.h> header file. */
/*#define HAVE_NETINET_IN_H 1*/
/* Define if you have the <sgtty.h> header file. */
/*#define HAVE_SGTTY_H 1*/
/* Define if you have the <ssl.h> header file. */
/* #undef HAVE_SSL_H */
/* Define if you have the <sys/param.h> header file. */
/*#define HAVE_SYS_PARAM_H 1*/
/* Define if you have the <sys/select.h> header file. */
/* #define HAVE_SYS_SELECT_H 1 */
/* Define if you have the <sys/socket.h> header file. */
/*#define HAVE_SYS_SOCKET_H 1*/
/* Define if you have the <sys/sockio.h> header file. */
/* #define HAVE_SYS_SOCKIO_H 1 */
/* Define if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define if you have the <sys/utime.h> header file */
#define HAVE_SYS_UTIME_H 1
/* Define if you have the <sys/types.h> header file. */
//#define HAVE_SYS_TYPES_H 1
/* Define if you have the <termio.h> header file. */
/* #define HAVE_TERMIO_H 1 */
/* Define if you have the <termios.h> header file. */
/* #define HAVE_TERMIOS_H 1 */
/* Name of package */
#define PACKAGE "curl"
/* Define if you have the <io.h> header file. */
#define HAVE_IO_H 1
/* Define if you have the <time.h> header file. */
#define HAVE_TIME_H 1
/* Define if you have the <winsock.h> header file. */
#define HAVE_WINSOCK_H 1
/* Define if you have the <winsock2.h> header file. */
//#define HAVE_WINSOCK2_H 1
/* Define if you have the <ws2tcpip.h> header file. */
//#define HAVE_WS2TCPIP_H 1
/* Define if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define if you have the closesocket function. */
#define HAVE_CLOSESOCKET 1
/* Define if you have the setvbuf function. */
#define HAVE_SETVBUF 1
/* Define if you have the RAND_screen function when using SSL */
#define HAVE_RAND_SCREEN 1
/* Define if you have the `RAND_status' function. */
#define HAVE_RAND_STATUS 1
/* Define this to if in_addr_t is not an available typedefed type */
#define in_addr_t unsigned long
/* use ioctlsocket() for non-blocking sockets */
#define HAVE_IOCTLSOCKET
/*************************************************
* This section is for compiler specific defines.*
*************************************************/
/* Borland and MS don't have this */
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__)
/* Define if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
#else
#endif
/* WinCE */
#define CURL_DISABLE_FILE
#define CURL_DISABLE_TELNET
#define CURL_DISABLE_LDAP
#define WITHOUT_MM_LIB
#include <winsock.h>
#include <process.h>
#define ENOSPC 1
#define ENOMEM 2
#define EAGAIN 3
extern int stat(const char *path,struct stat *buffer );
#endif

View File

@@ -10,7 +10,6 @@
/* #define HAVE_DLOPEN 1 maybe not (DXE3) */ /* #define HAVE_DLOPEN 1 maybe not (DXE3) */
#endif #endif
#define HAVE_ALARM 1
#define HAVE_ASSERT_T 1 #define HAVE_ASSERT_T 1
#define HAVE_ARPA_INET_H 1 #define HAVE_ARPA_INET_H 1
#define HAVE_BASENAME 1 #define HAVE_BASENAME 1
@@ -27,6 +26,7 @@
#define HAVE_IOCTLSOCKET 1 #define HAVE_IOCTLSOCKET 1
#define HAVE_INET_PTON 1 #define HAVE_INET_PTON 1
#define HAVE_INET_NTOP 1 #define HAVE_INET_NTOP 1
#define HAVE_LOCALE_H 1
#define HAVE_LONGLONG 1 #define HAVE_LONGLONG 1
#define HAVE_MALLOC_H 1 #define HAVE_MALLOC_H 1
#define HAVE_MEMORY_H 1 #define HAVE_MEMORY_H 1
@@ -37,6 +37,7 @@
#define HAVE_PERROR 1 #define HAVE_PERROR 1
#define HAVE_SELECT 1 #define HAVE_SELECT 1
#define HAVE_SETJMP_H 1 #define HAVE_SETJMP_H 1
#define HAVE_SETLOCALE 1
#define HAVE_SETVBUF 1 #define HAVE_SETVBUF 1
#define HAVE_SIGNAL 1 #define HAVE_SIGNAL 1
#define HAVE_SIGACTION 1 #define HAVE_SIGACTION 1
@@ -89,6 +90,7 @@
#define HAVE_LIBSSL 1 #define HAVE_LIBSSL 1
#define HAVE_LIBCRYPTO 1 #define HAVE_LIBCRYPTO 1
#define OPENSSL_NO_KRB5 1 #define OPENSSL_NO_KRB5 1
#define USE_OPENSSL 1
#endif #endif
/* Because djgpp <= 2.03 doesn't have snprintf() etc. /* Because djgpp <= 2.03 doesn't have snprintf() etc.

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -97,6 +97,8 @@
#include "strerror.h" #include "strerror.h"
#include "connect.h" #include "connect.h"
#include "memory.h" #include "memory.h"
#include "select.h"
#include "url.h" /* for Curl_safefree() */
/* The last #include file should be: */ /* The last #include file should be: */
#include "memdebug.h" #include "memdebug.h"
@@ -156,6 +158,7 @@ int Curl_nonblock(curl_socket_t sockfd, /* operate on this */
/* Windows? */ /* Windows? */
unsigned long flags; unsigned long flags;
flags = nonblock; flags = nonblock;
return ioctlsocket(sockfd, FIONBIO, &flags); return ioctlsocket(sockfd, FIONBIO, &flags);
#define SETBLOCK 3 #define SETBLOCK 3
#endif #endif
@@ -201,9 +204,6 @@ static
int waitconnect(curl_socket_t sockfd, /* socket */ int waitconnect(curl_socket_t sockfd, /* socket */
long timeout_msec) long timeout_msec)
{ {
fd_set fd;
fd_set errfd;
struct timeval interval;
int rc; int rc;
#ifdef mpeix #ifdef mpeix
/* Call this function once now, and ignore the results. We do this to /* Call this function once now, and ignore the results. We do this to
@@ -213,18 +213,7 @@ int waitconnect(curl_socket_t sockfd, /* socket */
#endif #endif
/* now select() until we get connect or timeout */ /* now select() until we get connect or timeout */
FD_ZERO(&fd); rc = Curl_select(CURL_SOCKET_BAD, sockfd, (int)timeout_msec);
FD_SET(sockfd, &fd);
FD_ZERO(&errfd);
FD_SET(sockfd, &errfd);
interval.tv_sec = (int)(timeout_msec/1000);
timeout_msec -= interval.tv_sec*1000;
interval.tv_usec = timeout_msec*1000;
rc = select(sockfd+1, NULL, &fd, &errfd, &interval);
if(-1 == rc) if(-1 == rc)
/* error, no connect here, try next */ /* error, no connect here, try next */
return WAITCONN_SELECT_ERROR; return WAITCONN_SELECT_ERROR;
@@ -233,7 +222,7 @@ int waitconnect(curl_socket_t sockfd, /* socket */
/* timeout, no connect today */ /* timeout, no connect today */
return WAITCONN_TIMEOUT; return WAITCONN_TIMEOUT;
if(FD_ISSET(sockfd, &errfd)) if(rc & CSELECT_ERR)
/* error condition caught */ /* error condition caught */
return WAITCONN_FDSET_ERROR; return WAITCONN_FDSET_ERROR;
@@ -406,13 +395,25 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
* *
* Someone got to verify this on Win-NT 4.0, 2000." * Someone got to verify this on Win-NT 4.0, 2000."
*/ */
#ifdef _WIN32_WCE
Sleep(0);
#else
SleepEx(0, FALSE); SleepEx(0, FALSE);
#endif
#endif #endif
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR, if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
(void *)&err, &errSize)) (void *)&err, &errSize))
err = Curl_ourerrno(); err = Curl_ourerrno();
#ifdef _WIN32_WCE
/* Always returns this error, bug in CE? */
if(WSAENOPROTOOPT==err)
err=0;
#endif
if ((0 == err) || (EISCONN == err)) if ((0 == err) || (EISCONN == err))
/* we are connected, awesome! */ /* we are connected, awesome! */
rc = TRUE; rc = TRUE;
@@ -429,6 +430,25 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
return rc; return rc;
} }
CURLcode Curl_store_ip_addr(struct connectdata *conn)
{
char addrbuf[256];
Curl_printable_address(conn->ip_addr, addrbuf, sizeof(addrbuf));
/* save the string */
Curl_safefree(conn->ip_addr_str);
conn->ip_addr_str = strdup(addrbuf);
if(!conn->ip_addr_str)
return CURLE_OUT_OF_MEMORY; /* FAIL */
#ifdef PF_INET6
if(conn->ip_addr->ai_family == PF_INET6)
conn->bits.ipv6 = TRUE;
#endif
return CURLE_OK;
}
/* Used within the multi interface. Try next IP address, return TRUE if no /* Used within the multi interface. Try next IP address, return TRUE if no
more address exists */ more address exists */
static bool trynextip(struct connectdata *conn, static bool trynextip(struct connectdata *conn,
@@ -450,6 +470,8 @@ static bool trynextip(struct connectdata *conn,
/* store the new socket descriptor */ /* store the new socket descriptor */
conn->sock[sockindex] = sockfd; conn->sock[sockindex] = sockfd;
conn->ip_addr = ai; conn->ip_addr = ai;
Curl_store_ip_addr(conn);
return FALSE; return FALSE;
} }
ai = ai->ai_next; ai = ai->ai_next;
@@ -478,7 +500,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
*connected = FALSE; /* a very negative world view is best */ *connected = FALSE; /* a very negative world view is best */
/* Evaluate in milliseconds how much time that has passed */ /* Evaluate in milliseconds how much time that has passed */
has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.start); has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle);
/* subtract the most strict timeout of the ones */ /* subtract the most strict timeout of the ones */
if(data->set.timeout && data->set.connecttimeout) { if(data->set.timeout && data->set.connecttimeout) {
@@ -523,10 +545,20 @@ CURLcode Curl_is_connected(struct connectdata *conn,
} }
} }
else if(WAITCONN_TIMEOUT != rc) { else if(WAITCONN_TIMEOUT != rc) {
int error = 0;
/* nope, not connected */ /* nope, not connected */
if (WAITCONN_FDSET_ERROR == rc) {
verifyconnect(sockfd, &error);
data->state.os_errno = error;
infof(data, "%s\n",Curl_strerror(conn,error));
}
else
infof(data, "Connection failed\n"); infof(data, "Connection failed\n");
if(trynextip(conn, sockindex, connected)) { if(trynextip(conn, sockindex, connected)) {
int error = Curl_ourerrno(); error = Curl_ourerrno();
data->state.os_errno = error;
failf(data, "Failed connect to %s:%d; %s", failf(data, "Failed connect to %s:%d; %s",
conn->host.name, conn->port, Curl_strerror(conn,error)); conn->host.name, conn->port, Curl_strerror(conn,error));
code = CURLE_COULDNT_CONNECT; code = CURLE_COULDNT_CONNECT;
@@ -636,6 +668,7 @@ singleipconnect(struct connectdata *conn,
/* unknown error, fallthrough and try another address! */ /* unknown error, fallthrough and try another address! */
failf(data, "Failed to connect to %s: %s", failf(data, "Failed to connect to %s: %s",
addr_buf, Curl_strerror(conn,error)); addr_buf, Curl_strerror(conn,error));
data->state.os_errno = error;
break; break;
} }
} }
@@ -703,7 +736,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
long has_passed; long has_passed;
/* Evaluate in milliseconds how much time that has passed */ /* Evaluate in milliseconds how much time that has passed */
has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.start); has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle);
#ifndef min #ifndef min
#define min(a, b) ((a) < (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b))
@@ -743,7 +776,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
if(data->state.used_interface == Curl_if_multi) if(data->state.used_interface == Curl_if_multi)
/* don't hang when doing multi */ /* don't hang when doing multi */
timeout_per_addr = timeout_ms = 0; timeout_per_addr = 0;
/* /*
* Connecting with a Curl_addrinfo chain * Connecting with a Curl_addrinfo chain
@@ -784,5 +817,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
if(sockconn) if(sockconn)
*sockconn = sockfd; /* the socket descriptor we've connected */ *sockconn = sockfd; /* the socket descriptor we've connected */
data->info.numconnects++; /* to track the number of connections made */
return CURLE_OK; return CURLE_OK;
} }

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -39,6 +39,8 @@ CURLcode Curl_connecthost(struct connectdata *conn,
int Curl_ourerrno(void); int Curl_ourerrno(void);
CURLcode Curl_store_ip_addr(struct connectdata *conn);
#define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */ #define DEFAULT_CONNECT_TIMEOUT 300000 /* milliseconds == five minutes */
#endif #endif

View File

@@ -36,6 +36,10 @@
#include "memdebug.h" #include "memdebug.h"
/* Comment this out if zlib is always going to be at least ver. 1.2.0.4
(doing so will reduce code size slightly). */
#define OLD_ZLIB_SUPPORT 1
#define DSIZ 0x10000 /* buffer size for decompressed data */ #define DSIZ 0x10000 /* buffer size for decompressed data */
#define GZIP_MAGIC_0 0x1f #define GZIP_MAGIC_0 0x1f
@@ -49,14 +53,23 @@
#define COMMENT 0x10 /* bit 4 set: file comment present */ #define COMMENT 0x10 /* bit 4 set: file comment present */
#define RESERVED 0xE0 /* bits 5..7: reserved */ #define RESERVED 0xE0 /* bits 5..7: reserved */
enum zlibState {
ZLIB_UNINIT, /* uninitialized */
ZLIB_INIT, /* initialized */
ZLIB_GZIP_HEADER, /* reading gzip header */
ZLIB_GZIP_INFLATING, /* inflating gzip stream */
ZLIB_INIT_GZIP /* initialized in transparent gzip mode */
};
static CURLcode static CURLcode
process_zlib_error(struct SessionHandle *data, z_stream *z) process_zlib_error(struct SessionHandle *data,
z_stream *z)
{ {
if (z->msg) if (z->msg)
failf (data, "Error while processing content unencoding.\n%s", failf (data, "Error while processing content unencoding: %s",
z->msg); z->msg);
else else
failf (data, "Error while processing content unencoding.\n" failf (data, "Error while processing content unencoding: "
"Unknown failure within decompression software."); "Unknown failure within decompression software.");
return CURLE_BAD_CONTENT_ENCODING; return CURLE_BAD_CONTENT_ENCODING;
@@ -66,41 +79,31 @@ static CURLcode
exit_zlib(z_stream *z, bool *zlib_init, CURLcode result) exit_zlib(z_stream *z, bool *zlib_init, CURLcode result)
{ {
inflateEnd(z); inflateEnd(z);
*zlib_init = 0; *zlib_init = ZLIB_UNINIT;
return result; return result;
} }
CURLcode static CURLcode
Curl_unencode_deflate_write(struct SessionHandle *data, inflate_stream(struct SessionHandle *data,
struct Curl_transfer_keeper *k, struct Curl_transfer_keeper *k)
ssize_t nread)
{ {
z_stream *z = &k->z; /* zlib state structure */
int status; /* zlib status */ int status; /* zlib status */
CURLcode result = CURLE_OK; /* Curl_client_write status */ CURLcode result = CURLE_OK; /* Curl_client_write status */
char decomp[DSIZ]; /* Put the decompressed data here. */ char *decomp; /* Put the decompressed data here. */
z_stream *z = &k->z; /* zlib state structure */
/* Initialize zlib? */ /* Dynamically allocate a buffer for decompression because it's uncommonly
if (!k->zlib_init) { large to hold on the stack */
z->zalloc = (alloc_func)Z_NULL; decomp = (char*)malloc(DSIZ);
z->zfree = (free_func)Z_NULL; if (decomp == NULL) {
z->opaque = 0; return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
z->next_in = NULL;
z->avail_in = 0;
if (inflateInit(z) != Z_OK)
return process_zlib_error(data, z);
k->zlib_init = 1;
} }
/* Set the compressed input when this function is called */ /* because the buffer size is fixed, iteratively decompress and transfer to
z->next_in = (Bytef *)k->str; the client via client_write. */
z->avail_in = (uInt)nread;
/* because the buffer size is fixed, iteratively decompress
and transfer to the client via client_write. */
for (;;) { for (;;) {
/* (re)set buffer for decompressed output for every iteration */ /* (re)set buffer for decompressed output for every iteration */
z->next_out = (Bytef *)&decomp[0]; z->next_out = (Bytef *)decomp;
z->avail_out = DSIZ; z->avail_out = DSIZ;
status = inflate(z, Z_SYNC_FLUSH); status = inflate(z, Z_SYNC_FLUSH);
@@ -109,12 +112,15 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp, result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
DSIZ - z->avail_out); DSIZ - z->avail_out);
/* if !CURLE_OK, clean up, return */ /* if !CURLE_OK, clean up, return */
if (result) if (result) {
free(decomp);
return exit_zlib(z, &k->zlib_init, result); return exit_zlib(z, &k->zlib_init, result);
} }
}
/* Done?; clean up, return */ /* Done? clean up, return */
if (status == Z_STREAM_END) { if (status == Z_STREAM_END) {
free(decomp);
if (inflateEnd(z) == Z_OK) if (inflateEnd(z) == Z_OK)
return exit_zlib(z, &k->zlib_init, result); return exit_zlib(z, &k->zlib_init, result);
else else
@@ -122,15 +128,47 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
} }
/* Done with these bytes, exit */ /* Done with these bytes, exit */
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0) if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0) {
free(decomp);
return result; return result;
} }
}
else { /* Error; exit loop, handle below */ else { /* Error; exit loop, handle below */
free(decomp);
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z)); return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
} }
} }
/* Will never get here */
} }
CURLcode
Curl_unencode_deflate_write(struct SessionHandle *data,
struct Curl_transfer_keeper *k,
ssize_t nread)
{
z_stream *z = &k->z; /* zlib state structure */
/* Initialize zlib? */
if (k->zlib_init == ZLIB_UNINIT) {
z->zalloc = (alloc_func)Z_NULL;
z->zfree = (free_func)Z_NULL;
z->opaque = 0;
z->next_in = NULL;
z->avail_in = 0;
if (inflateInit(z) != Z_OK)
return process_zlib_error(data, z);
k->zlib_init = ZLIB_INIT;
}
/* Set the compressed input when this function is called */
z->next_in = (Bytef *)k->str;
z->avail_in = (uInt)nread;
/* Now uncompress the data */
return inflate_stream(data, k);
}
#ifdef OLD_ZLIB_SUPPORT
/* Skip over the gzip header */ /* Skip over the gzip header */
static enum { static enum {
GZIP_OK, GZIP_OK,
@@ -172,6 +210,7 @@ static enum {
return GZIP_UNDERFLOW; return GZIP_UNDERFLOW;
len -= (extra_len + 2); len -= (extra_len + 2);
data += (extra_len + 2);
} }
if (flags & ORIG_NAME) { if (flags & ORIG_NAME) {
@@ -213,38 +252,67 @@ static enum {
*headerlen = totallen - len; *headerlen = totallen - len;
return GZIP_OK; return GZIP_OK;
} }
#endif
CURLcode CURLcode
Curl_unencode_gzip_write(struct SessionHandle *data, Curl_unencode_gzip_write(struct SessionHandle *data,
struct Curl_transfer_keeper *k, struct Curl_transfer_keeper *k,
ssize_t nread) ssize_t nread)
{ {
int status; /* zlib status */
CURLcode result = CURLE_OK; /* Curl_client_write status */
char decomp[DSIZ]; /* Put the decompressed data here. */
z_stream *z = &k->z; /* zlib state structure */ z_stream *z = &k->z; /* zlib state structure */
/* Initialize zlib? */ /* Initialize zlib? */
if (!k->zlib_init) { if (k->zlib_init == ZLIB_UNINIT) {
z->zalloc = (alloc_func)Z_NULL; z->zalloc = (alloc_func)Z_NULL;
z->zfree = (free_func)Z_NULL; z->zfree = (free_func)Z_NULL;
z->opaque = 0; z->opaque = 0;
z->next_in = NULL; z->next_in = NULL;
z->avail_in = 0; z->avail_in = 0;
if (inflateInit2(z, -MAX_WBITS) != Z_OK)
if (strcmp(zlibVersion(), "1.2.0.4") >= 0) {
/* zlib ver. >= 1.2.0.4 supports transparent gzip decompressing */
if (inflateInit2(z, MAX_WBITS+32) != Z_OK) {
return process_zlib_error(data, z); return process_zlib_error(data, z);
k->zlib_init = 1; /* Initial call state */ }
k->zlib_init = ZLIB_INIT_GZIP; /* Transparent gzip decompress state */
} else {
/* we must parse the gzip header ourselves */
if (inflateInit2(z, -MAX_WBITS) != Z_OK) {
return process_zlib_error(data, z);
}
k->zlib_init = ZLIB_INIT; /* Initial call state */
}
} }
if (k->zlib_init == ZLIB_INIT_GZIP) {
/* Let zlib handle the gzip decompression entirely */
z->next_in = (Bytef *)k->str;
z->avail_in = (uInt)nread;
/* Now uncompress the data */
return inflate_stream(data, k);
}
#ifndef OLD_ZLIB_SUPPORT
/* Support for old zlib versions is compiled away and we are running with
an old version, so return an error. */
return exit_zlib(z, &k->zlib_init, CURLE_FUNCTION_NOT_FOUND);
#else
/* This next mess is to get around the potential case where there isn't /* This next mess is to get around the potential case where there isn't
* enough data passed in to skip over the gzip header. If that happens, we * enough data passed in to skip over the gzip header. If that happens, we
* malloc a block and copy what we have then wait for the next call. If * malloc a block and copy what we have then wait for the next call. If
* there still isn't enough (this is definitely a worst-case scenario), we * there still isn't enough (this is definitely a worst-case scenario), we
* make the block bigger, copy the next part in and keep waiting. * make the block bigger, copy the next part in and keep waiting.
*
* This is only required with zlib versions < 1.2.0.4 as newer versions
* can handle the gzip header themselves.
*/ */
switch (k->zlib_init) {
/* Skip over gzip header? */ /* Skip over gzip header? */
if (k->zlib_init == 1) { case ZLIB_INIT:
{
/* Initial call state */ /* Initial call state */
ssize_t hlen; ssize_t hlen;
@@ -252,7 +320,7 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
case GZIP_OK: case GZIP_OK:
z->next_in = (Bytef *)k->str + hlen; z->next_in = (Bytef *)k->str + hlen;
z->avail_in = (uInt)(nread - hlen); z->avail_in = (uInt)(nread - hlen);
k->zlib_init = 3; /* Inflating stream state */ k->zlib_init = ZLIB_GZIP_INFLATING; /* Inflating stream state */
break; break;
case GZIP_UNDERFLOW: case GZIP_UNDERFLOW:
@@ -269,7 +337,7 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY); return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
} }
memcpy(z->next_in, k->str, z->avail_in); memcpy(z->next_in, k->str, z->avail_in);
k->zlib_init = 2; /* Need more gzip header data state */ k->zlib_init = ZLIB_GZIP_HEADER; /* Need more gzip header data state */
/* We don't have any data to inflate yet */ /* We don't have any data to inflate yet */
return CURLE_OK; return CURLE_OK;
@@ -279,7 +347,10 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
} }
} }
else if (k->zlib_init == 2) { break;
case ZLIB_GZIP_HEADER:
{
/* Need more gzip header data state */ /* Need more gzip header data state */
ssize_t hlen; ssize_t hlen;
unsigned char *oldblock = z->next_in; unsigned char *oldblock = z->next_in;
@@ -300,7 +371,7 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
/* Don't point into the malloced block since we just freed it */ /* Don't point into the malloced block since we just freed it */
z->next_in = (Bytef *)k->str + hlen + nread - z->avail_in; z->next_in = (Bytef *)k->str + hlen + nread - z->avail_in;
z->avail_in = (uInt)(z->avail_in - hlen); z->avail_in = (uInt)(z->avail_in - hlen);
k->zlib_init = 3; /* Inflating stream state */ k->zlib_init = ZLIB_GZIP_INFLATING; /* Inflating stream state */
break; break;
case GZIP_UNDERFLOW: case GZIP_UNDERFLOW:
@@ -314,10 +385,14 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
} }
} }
else { break;
case ZLIB_GZIP_INFLATING:
default:
/* Inflating stream state */ /* Inflating stream state */
z->next_in = (Bytef *)k->str; z->next_in = (Bytef *)k->str;
z->avail_in = (uInt)nread; z->avail_in = (uInt)nread;
break;
} }
if (z->avail_in == 0) { if (z->avail_in == 0) {
@@ -325,39 +400,8 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
return CURLE_OK; return CURLE_OK;
} }
/* because the buffer size is fixed, iteratively decompress and transfer to /* We've parsed the header, now uncompress the data */
the client via client_write. */ return inflate_stream(data, k);
for (;;) { #endif
/* (re)set buffer for decompressed output for every iteration */
z->next_out = (Bytef *)&decomp[0];
z->avail_out = DSIZ;
status = inflate(z, Z_SYNC_FLUSH);
if (status == Z_OK || status == Z_STREAM_END) {
if(DSIZ - z->avail_out) {
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
DSIZ - z->avail_out);
/* if !CURLE_OK, clean up, return */
if (result)
return exit_zlib(z, &k->zlib_init, result);
}
/* Done?; clean up, return */
/* We should really check the gzip CRC here */
if (status == Z_STREAM_END) {
if (inflateEnd(z) == Z_OK)
return exit_zlib(z, &k->zlib_init, result);
else
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
}
/* Done with these bytes, exit */
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0)
return result;
}
else { /* Error; exit loop, handle below */
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
}
}
} }
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */

View File

@@ -80,7 +80,7 @@ Example set of cookies:
#include "setup.h" #include "setup.h"
#ifndef CURL_DISABLE_HTTP #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@@ -113,6 +113,8 @@ static void freecookie(struct Cookie *co)
free(co->value); free(co->value);
if(co->maxage) if(co->maxage)
free(co->maxage); free(co->maxage);
if(co->version)
free(co->version);
free(co); free(co);
} }
@@ -878,4 +880,4 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
return 0; return 0;
} }
#endif /* CURL_DISABLE_HTTP */ #endif /* CURL_DISABLE_HTTP || CURL_DISABLE_COOKIES */

View File

@@ -23,14 +23,20 @@
#include "setup.h" #include "setup.h"
#ifndef CURL_DISABLE_DICT
/* -- WIN32 approved -- */ /* -- WIN32 approved -- */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h> #include <sys/stat.h>
#endif
#include <errno.h> #include <errno.h>
@@ -218,3 +224,4 @@ CURLcode Curl_dict(struct connectdata *conn)
return CURLE_OK; return CURLE_OK;
} }
#endif /*CURL_DISABLE_DICT*/

View File

@@ -29,8 +29,12 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h> #include <sys/stat.h>
#endif
#include <errno.h> #include <errno.h>
@@ -78,6 +82,7 @@
#include "share.h" #include "share.h"
#include "memory.h" #include "memory.h"
#include "progress.h" #include "progress.h"
#include "easyif.h"
#define _MPRINTF_REPLACE /* use our functions only */ #define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h> #include <curl/mprintf.h>
@@ -161,13 +166,18 @@ static void idna_init (void)
#endif /* USE_LIBIDN */ #endif /* USE_LIBIDN */
/* true globals -- for curl_global_init() and curl_global_cleanup() */ /* true globals -- for curl_global_init() and curl_global_cleanup() */
static unsigned int initialized = 0; static unsigned int initialized;
static long init_flags = 0; static long init_flags;
/* /*
* If a memory-using function (like curl_getenv) is used before * If a memory-using function (like curl_getenv) is used before
* curl_global_init() is called, we need to have these pointers set already. * curl_global_init() is called, we need to have these pointers set already.
*/ */
#ifdef _WIN32_WCE
#define strdup _strdup
#endif
curl_malloc_callback Curl_cmalloc = (curl_malloc_callback)malloc; curl_malloc_callback Curl_cmalloc = (curl_malloc_callback)malloc;
curl_free_callback Curl_cfree = (curl_free_callback)free; curl_free_callback Curl_cfree = (curl_free_callback)free;
curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc; curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc;
@@ -345,6 +355,89 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
return ret; return ret;
} }
#ifdef CURL_MULTIEASY
/***************************************************************************
* This function is still only for testing purposes. It makes a great way
* to run the full test suite on the multi interface instead of the easy one.
***************************************************************************
*
* The *new* curl_easy_perform() is the external interface that performs a
* transfer previously setup.
*
* Wrapper-function that: 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. This will make everything internally use and assume multi interface.
*/
CURLcode curl_easy_perform(CURL *easy)
{
CURLM *multi;
CURLMcode mcode;
CURLcode code = CURLE_OK;
int still_running;
struct timeval timeout;
int rc;
CURLMsg *msg;
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd;
if(!easy)
return CURLE_BAD_FUNCTION_ARGUMENT;
multi = curl_multi_init();
if(!multi)
return CURLE_OUT_OF_MEMORY;
mcode = curl_multi_add_handle(multi, easy);
if(mcode) {
curl_multi_cleanup(multi);
return CURLE_FAILED_INIT;
}
/* we start some action by calling perform right away */
do {
while(CURLM_CALL_MULTI_PERFORM ==
curl_multi_perform(multi, &still_running));
if(!still_running)
break;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* timeout once per second */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
/* get file descriptors from the transfers */
curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd);
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
if(rc == -1)
/* select error */
break;
/* timeout or data to send/receive => loop! */
} while(still_running);
msg = curl_multi_info_read(multi, &rc);
if(msg)
code = msg->data.result;
mcode = curl_multi_remove_handle(multi, easy);
/* what to do if it fails? */
mcode = curl_multi_cleanup(multi);
/* what to do if it fails? */
return code;
}
#else
/* /*
* curl_easy_perform() is the external interface that performs a transfer * curl_easy_perform() is the external interface that performs a transfer
* previously setup. * previously setup.
@@ -379,6 +472,7 @@ CURLcode curl_easy_perform(CURL *curl)
return Curl_perform(data); return Curl_perform(data);
} }
#endif
/* /*
* curl_easy_cleanup() is the external interface to cleaning/freeing the given * curl_easy_cleanup() is the external interface to cleaning/freeing the given
@@ -394,6 +488,15 @@ void curl_easy_cleanup(CURL *curl)
Curl_close(data); Curl_close(data);
} }
/*
* 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;
}
/* /*
* curl_easy_getinfo() is an external interface that allows an app to retrieve * curl_easy_getinfo() is an external interface that allows an app to retrieve
* information from a performed transfer and similar. * information from a performed transfer and similar.
@@ -455,7 +558,7 @@ CURL *curl_easy_duphandle(CURL *incurl)
outcurl->progress.flags = data->progress.flags; outcurl->progress.flags = data->progress.flags;
outcurl->progress.callback = data->progress.callback; outcurl->progress.callback = data->progress.callback;
#ifndef CURL_DISABLE_HTTP #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
if(data->cookies) { if(data->cookies) {
/* If cookies are enabled in the parent handle, we enable them /* If cookies are enabled in the parent handle, we enable them
in the clone as well! */ in the clone as well! */
@@ -546,6 +649,7 @@ void curl_easy_reset(CURL *curl)
data->set.fread = (curl_read_callback)fread; data->set.fread = (curl_read_callback)fread;
data->set.infilesize = -1; /* we don't know any size */ data->set.infilesize = -1; /* we don't know any size */
data->set.postfieldsize = -1;
data->state.current_speed = -1; /* init to negative == impossible */ data->state.current_speed = -1; /* init to negative == impossible */

31
lib/easyif.h Normal file
View File

@@ -0,0 +1,31 @@
#ifndef __EASYIF_H
#define __EASYIF_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://curl.haxx.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
* $Id$
***************************************************************************/
/*
* Prototypes for library-wide functions provided by easy.c
*/
void Curl_easy_addmulti(struct SessionHandle *data, void *multi);
#endif /* __EASYIF_H */

View File

@@ -30,8 +30,12 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h> #include <sys/stat.h>
#endif
#include <errno.h> #include <errno.h>
@@ -66,9 +70,6 @@
#include <sys/param.h> #include <sys/param.h>
#endif #endif
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#ifdef HAVE_FCNTL_H #ifdef HAVE_FCNTL_H
#include <fcntl.h> #include <fcntl.h>
#endif #endif
@@ -103,7 +104,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
char *real_path = curl_unescape(conn->path, 0); char *real_path = curl_unescape(conn->path, 0);
struct FILEPROTO *file; struct FILEPROTO *file;
int fd; int fd;
#if defined(WIN32) || defined(__EMX__) #if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
int i; int i;
char *actual_path; char *actual_path;
#endif #endif
@@ -119,7 +120,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
conn->proto.file = file; conn->proto.file = file;
#if defined(WIN32) || defined(__EMX__) #if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
/* If the first character is a slash, and there's /* If the first character is a slash, and there's
something that looks like a drive at the beginning of something that looks like a drive at the beginning of
the path, skip the slash. If we remove the initial the path, skip the slash. If we remove the initial
@@ -143,7 +144,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
actual_path++; actual_path++;
} }
/* change path separators from '/' to '\\' for Windows and OS/2 */ /* change path separators from '/' to '\\' for DOS, Windows and OS/2 */
for (i=0; actual_path[i] != '\0'; ++i) for (i=0; actual_path[i] != '\0'; ++i)
if (actual_path[i] == '/') if (actual_path[i] == '/')
actual_path[i] = '\\'; actual_path[i] = '\\';
@@ -166,10 +167,6 @@ CURLcode Curl_file_connect(struct connectdata *conn)
return CURLE_OK; return CURLE_OK;
} }
#if defined(WIN32) && (SIZEOF_CURL_OFF_T > 4)
#define lseek(x,y,z) _lseeki64(x, y, z)
#endif
CURLcode Curl_file_done(struct connectdata *conn, CURLcode Curl_file_done(struct connectdata *conn,
CURLcode status) CURLcode status)
{ {
@@ -183,7 +180,7 @@ CURLcode Curl_file_done(struct connectdata *conn,
return CURLE_OK; return CURLE_OK;
} }
#if defined(WIN32) || defined(__EMX__) #if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
#define DIRSEP '\\' #define DIRSEP '\\'
#else #else
#define DIRSEP '/' #define DIRSEP '/'
@@ -277,7 +274,9 @@ CURLcode Curl_file(struct connectdata *conn)
(via NFS, Samba, NT sharing) can be accessed through a file:// URL (via NFS, Samba, NT sharing) can be accessed through a file:// URL
*/ */
CURLcode res = CURLE_OK; CURLcode res = CURLE_OK;
struct stat statbuf; 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' */
curl_off_t expected_size=0; curl_off_t expected_size=0;
bool fstated=FALSE; bool fstated=FALSE;
ssize_t nread; ssize_t nread;
@@ -339,12 +338,12 @@ CURLcode Curl_file(struct connectdata *conn)
return result; return result;
} }
/* Added by Dolbneff A.V & Spiridonoff A.V */
if (conn->resume_from <= expected_size) if (conn->resume_from <= expected_size)
expected_size -= conn->resume_from; expected_size -= conn->resume_from;
else else {
/* Is this error code suitable in such situation? */ failf(data, "failed to resume file:// transfer");
return CURLE_FTP_BAD_DOWNLOAD_RESUME; return CURLE_BAD_DOWNLOAD_RESUME;
}
if (fstated && (expected_size == 0)) if (fstated && (expected_size == 0))
return CURLE_OK; return CURLE_OK;

View File

@@ -112,7 +112,9 @@ Content-Disposition: form-data; name="FILECONTENT"
#include <string.h> #include <string.h>
#include <stdarg.h> #include <stdarg.h>
#include <time.h> #include <time.h>
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h> #include <sys/stat.h>
#endif
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME) #if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
#include <libgen.h> #include <libgen.h>
#endif #endif
@@ -259,7 +261,7 @@ static const char * ContentTypeForFilename (const char *filename,
const char *extension; const char *extension;
const char *type; const char *type;
}; };
static struct ContentType ctts[]={ static const struct ContentType ctts[]={
{".gif", "image/gif"}, {".gif", "image/gif"},
{".jpg", "image/jpeg"}, {".jpg", "image/jpeg"},
{".jpeg", "image/jpeg"}, {".jpeg", "image/jpeg"},
@@ -833,7 +835,7 @@ static CURLcode AddFormData(struct FormData **formp,
/* Since this is a file to be uploaded here, add the size of the actual /* Since this is a file to be uploaded here, add the size of the actual
file */ file */
if(!strequal("-", newform->line)) { if(!strequal("-", newform->line)) {
struct stat file; struct_stat file;
if(!stat(newform->line, &file)) { if(!stat(newform->line, &file)) {
*size += file.st_size; *size += file.st_size;
} }
@@ -1307,9 +1309,13 @@ size_t Curl_FormReader(char *buffer,
if(!form->data) if(!form->data)
return 0; /* nothing, error, empty */ return 0; /* nothing, error, empty */
if(form->data->type == FORM_FILE) if(form->data->type == FORM_FILE) {
return readfromfile(form, buffer, wantedsize); gotsize = readfromfile(form, buffer, wantedsize);
if(gotsize)
/* If positive or -1, return. If zero, continue! */
return gotsize;
}
do { do {
if( (form->data->length - form->sent ) > wantedsize - gotsize) { if( (form->data->length - form->sent ) > wantedsize - gotsize) {
@@ -1533,11 +1539,11 @@ void curl_formfree(struct curl_httppost *form)
char *Curl_FormBoundary(void) char *Curl_FormBoundary(void)
{ {
char *retstring; char *retstring;
static int randomizer=0; /* this is just so that two boundaries within static int randomizer; /* this is just so that two boundaries within
the same form won't be identical */ the same form won't be identical */
size_t i; size_t i;
static char table16[]="abcdef0123456789"; static const char table16[]="abcdef0123456789";
retstring = (char *)malloc(BOUNDARY_LENGTH+1); retstring = (char *)malloc(BOUNDARY_LENGTH+1);

356
lib/ftp.c
View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -34,13 +34,10 @@
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
#include <unistd.h> #include <unistd.h>
#endif #endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
#else /* some kind of unix */ #else /* probably some kind of unix */
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
@@ -51,7 +48,9 @@
#ifdef HAVE_ARPA_INET_H #ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h> #include <arpa/inet.h>
#endif #endif
#ifdef HAVE_UTSNAME_H
#include <sys/utsname.h> #include <sys/utsname.h>
#endif
#ifdef HAVE_NETDB_H #ifdef HAVE_NETDB_H
#include <netdb.h> #include <netdb.h>
#endif #endif
@@ -94,6 +93,7 @@
#include "strerror.h" #include "strerror.h"
#include "memory.h" #include "memory.h"
#include "inet_ntop.h" #include "inet_ntop.h"
#include "select.h"
#if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL) #if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL)
#include "inet_ntoa_r.h" #include "inet_ntoa_r.h"
@@ -149,6 +149,14 @@ static void freedirs(struct FTP *ftp)
} }
} }
/* Returns non-zero iff the given string contains CR (0x0D) or LF (0x0A), which
are not allowed within RFC 959 <string>.
*/
static bool isBadFtpString(const char *string)
{
return strchr(string, 0x0D) != NULL || strchr(string, 0x0A) != NULL;
}
/*********************************************************************** /***********************************************************************
* *
* AllowServerConnect() * AllowServerConnect()
@@ -160,8 +168,7 @@ static void freedirs(struct FTP *ftp)
*/ */
static CURLcode AllowServerConnect(struct connectdata *conn) static CURLcode AllowServerConnect(struct connectdata *conn)
{ {
fd_set rdset; int timeout_ms;
struct timeval dt;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
curl_socket_t sock = conn->sock[SECONDARYSOCKET]; curl_socket_t sock = conn->sock[SECONDARYSOCKET];
struct timeval now = Curl_tvnow(); struct timeval now = Curl_tvnow();
@@ -169,10 +176,6 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
long timeout = data->set.connecttimeout?data->set.connecttimeout: long timeout = data->set.connecttimeout?data->set.connecttimeout:
(data->set.timeout?data->set.timeout: 0); (data->set.timeout?data->set.timeout: 0);
FD_ZERO(&rdset);
FD_SET(sock, &rdset);
if(timeout) { if(timeout) {
timeout -= timespent; timeout -= timespent;
if(timeout<=0) { if(timeout<=0) {
@@ -181,11 +184,11 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
} }
} }
/* we give the server 60 seconds to connect to us, or a custom timeout */ /* We allow the server 60 seconds to connect to us, or a custom timeout.
dt.tv_sec = (int)(timeout?timeout:60); Note the typecast here. */
dt.tv_usec = 0; timeout_ms = (timeout?(int)timeout:60) * 1000;
switch (select(sock+1, &rdset, NULL, NULL, &dt)) { switch (Curl_select(sock, CURL_SOCKET_BAD, timeout_ms)) {
case -1: /* error */ case -1: /* error */
/* let's die here */ /* let's die here */
failf(data, "Error while waiting for server connect"); failf(data, "Error while waiting for server connect");
@@ -248,9 +251,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
ssize_t gotbytes; ssize_t gotbytes;
char *ptr; char *ptr;
long timeout; /* timeout in seconds */ long timeout; /* timeout in seconds */
struct timeval interval; int interval_ms;
fd_set rkeepfd;
fd_set readfd;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
char *line_start; char *line_start;
int code=0; /* default ftp "error code" to return */ int code=0; /* default ftp "error code" to return */
@@ -262,13 +263,6 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
if (ftpcode) if (ftpcode)
*ftpcode = 0; /* 0 for errors */ *ftpcode = 0; /* 0 for errors */
FD_ZERO (&readfd); /* clear it */
FD_SET (sockfd, &readfd); /* read socket */
/* get this in a backup variable to be able to restore it on each lap in the
select() loop */
rkeepfd = readfd;
ptr=buf; ptr=buf;
line_start = buf; line_start = buf;
@@ -302,11 +296,9 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
} }
if(!ftp->cache) { if(!ftp->cache) {
readfd = rkeepfd; /* set every lap */ interval_ms = 1 * 1000; /* use 1 second timeout intervals */
interval.tv_sec = 1; /* use 1 second timeout intervals */
interval.tv_usec = 0;
switch (select (sockfd+1, &readfd, NULL, NULL, &interval)) { switch (Curl_select(sockfd, CURL_SOCKET_BAD, interval_ms)) {
case -1: /* select() error, stop reading */ case -1: /* select() error, stop reading */
result = CURLE_RECV_ERROR; result = CURLE_RECV_ERROR;
failf(data, "FTP response aborted due to select() error: %d", errno); failf(data, "FTP response aborted due to select() error: %d", errno);
@@ -376,7 +368,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
/* output debug output if that is requested */ /* output debug output if that is requested */
if(data->set.verbose) if(data->set.verbose)
Curl_debug(data, CURLINFO_HEADER_IN, line_start, perline, conn->host.dispname); Curl_debug(data, CURLINFO_HEADER_IN, line_start, perline, conn);
/* /*
* We pass all response-lines to the callback function registered * We pass all response-lines to the callback function registered
@@ -458,10 +450,6 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
return result; return result;
} }
static const char *ftpauth[]= {
"SSL", "TLS", NULL
};
/* /*
* Curl_ftp_connect() should do everything that is to be considered a part of * Curl_ftp_connect() should do everything that is to be considered a part of
* the connection phase. * the connection phase.
@@ -474,13 +462,15 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
char *buf = data->state.buffer; /* this is our buffer */ char *buf = data->state.buffer; /* this is our buffer */
struct FTP *ftp; struct FTP *ftp;
CURLcode result; CURLcode result;
int ftpcode, try; int ftpcode, trynum;
static const char * const ftpauth[] = {
"SSL", "TLS", NULL
};
ftp = (struct FTP *)malloc(sizeof(struct FTP)); ftp = (struct FTP *)calloc(sizeof(struct FTP), 1);
if(!ftp) if(!ftp)
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
memset(ftp, 0, sizeof(struct FTP));
conn->proto.ftp = ftp; conn->proto.ftp = ftp;
/* We always support persistant connections on ftp */ /* We always support persistant connections on ftp */
@@ -492,6 +482,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
/* no need to duplicate them, this connectdata struct won't change */ /* no need to duplicate them, this connectdata struct won't change */
ftp->user = conn->user; ftp->user = conn->user;
ftp->passwd = conn->passwd; ftp->passwd = conn->passwd;
if (isBadFtpString(ftp->user) || isBadFtpString(ftp->passwd)) {
return CURLE_URL_MALFORMAT;
}
ftp->response_time = 3600; /* set default response time-out */ ftp->response_time = 3600; /* set default response time-out */
#ifndef CURL_DISABLE_HTTP #ifndef CURL_DISABLE_HTTP
@@ -562,9 +555,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
return CURLE_FAILED_INIT; /* we don't know what to do */ return CURLE_FAILED_INIT; /* we don't know what to do */
} }
for (try = start; ftpauth[count]; try=trynext, count++) { for (trynum = start; ftpauth[count]; trynum=trynext, count++) {
FTPSENDF(conn, "AUTH %s", ftpauth[try]); FTPSENDF(conn, "AUTH %s", ftpauth[trynum]);
result = Curl_GetFTPResponse(&nread, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
@@ -600,7 +593,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
if(ftpcode == 530) { if(ftpcode == 530) {
/* 530 User ... access denied /* 530 User ... access denied
(the server denies to log the specified user) */ (the server denies to log the specified user) */
failf(data, "Access denied: %s", &buf[4]); failf(data, "Access denied: %03d", ftpcode);
return CURLE_FTP_ACCESS_DENIED; return CURLE_FTP_ACCESS_DENIED;
} }
else if(ftpcode == 331) { else if(ftpcode == 331) {
@@ -617,7 +610,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
or or
530 Sorry, the maximum number of allowed users are already connected 530 Sorry, the maximum number of allowed users are already connected
*/ */
failf(data, "not logged in: %s", &buf[4]); failf(data, "not logged in: %03d", ftpcode);
return CURLE_FTP_USER_PASSWORD_INCORRECT; return CURLE_FTP_USER_PASSWORD_INCORRECT;
} }
else if(ftpcode/100 == 2) { else if(ftpcode/100 == 2) {
@@ -628,6 +621,23 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
infof(data, "We have successfully logged in\n"); infof(data, "We have successfully logged in\n");
} }
else if(ftpcode == 332) {
/* 332 Please provide account info */
if(data->set.ftp_account) {
FTPSENDF(conn, "ACCT %s", data->set.ftp_account);
result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(!result && (ftpcode != 230)) {
failf(data, "ACCT rejected by server: %03d", ftpcode);
result = CURLE_FTP_WEIRD_PASS_REPLY; /* FIX */
}
}
else {
failf(data, "ACCT requested by none available");
result = CURLE_FTP_WEIRD_PASS_REPLY;
}
if(result)
return result;
}
else { else {
failf(data, "Odd return code after PASS"); failf(data, "Odd return code after PASS");
return CURLE_FTP_WEIRD_PASS_REPLY; return CURLE_FTP_WEIRD_PASS_REPLY;
@@ -693,12 +703,14 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
if(result) if(result)
return result; return result;
if(ftpcode == 200) if(ftpcode/100 == 2)
/* We have enabled SSL for the data connection! */ /* We have enabled SSL for the data connection! */
conn->ssl[SECONDARYSOCKET].use = TRUE; conn->ssl[SECONDARYSOCKET].use = TRUE;
/* FTP servers typically responds with 500 if they decide to reject /* FTP servers typically responds with 500 if they decide to reject
our 'P' request */ our 'P' request */
else if(data->set.ftp_ssl> CURLFTPSSL_CONTROL)
/* we failed and bails out */
return CURLE_FTP_SSL_FAILED;
} }
} }
@@ -778,9 +790,32 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status)
ssize_t nread; ssize_t nread;
int ftpcode; int ftpcode;
CURLcode result=CURLE_OK; CURLcode result=CURLE_OK;
bool was_ctl_valid = ftp->ctl_valid; bool was_ctl_valid = ftp->ctl_valid;
size_t flen;
size_t dlen;
char *path;
/* now store a copy of the directory we are in */
if(ftp->prevpath)
free(ftp->prevpath);
path = curl_unescape(conn->path, 0); /* get the "raw" path */
if(!path)
return CURLE_OUT_OF_MEMORY;
flen = ftp->file?strlen(ftp->file):0; /* file is "raw" already */
dlen = strlen(path)-flen;
if(dlen) {
ftp->prevpath = path;
if(flen)
/* if 'path' is not the whole string */
ftp->prevpath[dlen]=0; /* terminate */
infof(data, "Remembering we are in dir %s\n", ftp->prevpath);
}
else {
ftp->prevpath = NULL; /* no path */
free(path);
}
/* free the dir tree and file parts */ /* free the dir tree and file parts */
freedirs(ftp); freedirs(ftp);
@@ -840,8 +875,15 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status)
#ifdef HAVE_KRB4 #ifdef HAVE_KRB4
Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]); Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]);
#endif #endif
/* shut down the socket to inform the server we're done */ /* shut down the socket to inform the server we're done */
#ifdef _WIN32_WCE
shutdown(conn->sock[SECONDARYSOCKET],2); /* SD_BOTH */
#endif
sclose(conn->sock[SECONDARYSOCKET]); sclose(conn->sock[SECONDARYSOCKET]);
conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD; conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD;
if(!ftp->no_transfer && !status) { if(!ftp->no_transfer && !status) {
@@ -1088,22 +1130,31 @@ CURLcode ftp_use_port(struct connectdata *conn)
struct addrinfo hints, *res, *ai; struct addrinfo hints, *res, *ai;
struct sockaddr_storage ss; struct sockaddr_storage ss;
socklen_t sslen; socklen_t sslen;
char hbuf[NI_MAXHOST]; char hbuf[NI_MAXHOST]="";
struct sockaddr *sa=(struct sockaddr *)&ss; struct sockaddr *sa=(struct sockaddr *)&ss;
unsigned char *ap; unsigned char *ap;
unsigned char *pp; unsigned char *pp;
char portmsgbuf[1024], tmp[1024]; char portmsgbuf[1024], tmp[1024];
enum ftpcommand { EPRT, LPRT, PORT, DONE } fcmd;
const char *mode[] = { "EPRT", "LPRT", "PORT", NULL }; const char *mode[] = { "EPRT", "LPRT", "PORT", NULL };
char **modep;
int rc; int rc;
int error; int error;
char *host=NULL;
struct Curl_dns_entry *h=NULL;
if(data->set.ftpport && (strlen(data->set.ftpport) > 1)) {
/* attempt to get the address of the given interface name */
if(!Curl_if2ip(data->set.ftpport, hbuf, sizeof(hbuf)))
/* not an interface, use the given string as host name instead */
host = data->set.ftpport;
else
host = hbuf; /* use the hbuf for host name */
} /* data->set.ftpport */
if(!host) {
/* not an interface and not a host name, get default by extracting
the IP from the control connection */
/*
* we should use Curl_if2ip? given pickiness of recent ftpd,
* I believe we should use the same address as the control connection.
*/
sslen = sizeof(ss); sslen = sizeof(ss);
rc = getsockname(conn->sock[FIRSTSOCKET], (struct sockaddr *)&ss, &sslen); rc = getsockname(conn->sock[FIRSTSOCKET], (struct sockaddr *)&ss, &sslen);
if(rc < 0) { if(rc < 0) {
@@ -1111,27 +1162,27 @@ CURLcode ftp_use_port(struct connectdata *conn)
return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED;
} }
rc = getnameinfo((struct sockaddr *)&ss, sslen, hbuf, sizeof(hbuf), NULL, 0, rc = getnameinfo((struct sockaddr *)&ss, sslen, hbuf, sizeof(hbuf), NULL,
NIFLAGS); 0, NIFLAGS);
if(rc) { if(rc) {
failf(data, "getnameinfo() returned %d\n", rc); failf(data, "getnameinfo() returned %d\n", rc);
return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED;
} }
host = hbuf; /* use this host name */
memset(&hints, 0, sizeof(hints));
hints.ai_family = sa->sa_family;
/*hints.ai_family = ss.ss_family;
this way can be used if sockaddr_storage is properly defined, as glibc
2.1.X doesn't do*/
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
rc = getaddrinfo(hbuf, NULL, &hints, &res);
if(rc) {
failf(data, "getaddrinfo() returned %d\n", rc);
return CURLE_FTP_PORT_FAILED;
} }
rc = Curl_resolv(conn, host, 0, &h);
if(rc == CURLRESOLV_PENDING)
rc = Curl_wait_for_resolv(conn, &h);
if(h) {
res = h->addr;
/* when we return from this function, we can forget about this entry
to we can unlock it now already */
Curl_resolv_unlock(data, h);
} /* (h) */
else
res = NULL; /* failure! */
portsock = CURL_SOCKET_BAD; portsock = CURL_SOCKET_BAD;
error = 0; error = 0;
for (ai = res; ai; ai = ai->ai_next) { for (ai = res; ai; ai = ai->ai_next) {
@@ -1146,7 +1197,6 @@ CURLcode ftp_use_port(struct connectdata *conn)
error = Curl_ourerrno(); error = Curl_ourerrno();
continue; continue;
} }
if (bind(portsock, ai->ai_addr, ai->ai_addrlen) < 0) { if (bind(portsock, ai->ai_addr, ai->ai_addrlen) < 0) {
error = Curl_ourerrno(); error = Curl_ourerrno();
sclose(portsock); sclose(portsock);
@@ -1163,7 +1213,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
break; break;
} }
freeaddrinfo(res);
if (portsock == CURL_SOCKET_BAD) { if (portsock == CURL_SOCKET_BAD) {
failf(data, "%s", Curl_strerror(conn,error)); failf(data, "%s", Curl_strerror(conn,error));
return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED;
@@ -1175,11 +1225,25 @@ CURLcode ftp_use_port(struct connectdata *conn)
return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED;
} }
for (modep = (char **)(data->set.ftp_use_eprt?&mode[0]:&mode[2]); #ifdef PF_INET6
modep && *modep; modep++) { if(!conn->bits.ftp_use_eprt && conn->bits.ipv6)
/* EPRT is disabled but we are connected to a IPv6 host, so we ignore the
request and enable EPRT again! */
conn->bits.ftp_use_eprt = TRUE;
#endif
for (fcmd = EPRT; fcmd != DONE; fcmd++) {
int lprtaf, eprtaf; int lprtaf, eprtaf;
int alen=0, plen=0; int alen=0, plen=0;
if(!conn->bits.ftp_use_eprt && (EPRT == fcmd))
/* if disabled, goto next */
continue;
if(!conn->bits.ftp_use_lprt && (LPRT == fcmd))
/* if disabled, goto next */
continue;
switch (sa->sa_family) { switch (sa->sa_family) {
case AF_INET: case AF_INET:
ap = (unsigned char *)&((struct sockaddr_in *)&ss)->sin_addr; ap = (unsigned char *)&((struct sockaddr_in *)&ss)->sin_addr;
@@ -1203,7 +1267,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
break; break;
} }
if (strcmp(*modep, "EPRT") == 0) { if (EPRT == fcmd) {
if (eprtaf < 0) if (eprtaf < 0)
continue; continue;
if (getnameinfo((struct sockaddr *)&ss, sslen, if (getnameinfo((struct sockaddr *)&ss, sslen,
@@ -1218,22 +1282,21 @@ CURLcode ftp_use_port(struct connectdata *conn)
*q = '\0'; *q = '\0';
} }
result = Curl_ftpsendf(conn, "%s |%d|%s|%s|", *modep, eprtaf, result = Curl_ftpsendf(conn, "%s |%d|%s|%s|", mode[fcmd], eprtaf,
portmsgbuf, tmp); portmsgbuf, tmp);
if(result) if(result)
return result; return result;
} }
else if (strcmp(*modep, "LPRT") == 0 || else if ((LPRT == fcmd) || (PORT == fcmd)) {
strcmp(*modep, "PORT") == 0) {
int i; int i;
if (strcmp(*modep, "LPRT") == 0 && lprtaf < 0) if ((LPRT == fcmd) && lprtaf < 0)
continue; continue;
if (strcmp(*modep, "PORT") == 0 && sa->sa_family != AF_INET) if ((PORT == fcmd) && sa->sa_family != AF_INET)
continue; continue;
portmsgbuf[0] = '\0'; portmsgbuf[0] = '\0';
if (strcmp(*modep, "LPRT") == 0) { if (LPRT == fcmd) {
snprintf(tmp, sizeof(tmp), "%d,%d", lprtaf, alen); snprintf(tmp, sizeof(tmp), "%d,%d", lprtaf, alen);
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >=
sizeof(portmsgbuf)) { sizeof(portmsgbuf)) {
@@ -1253,7 +1316,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
} }
} }
if (strcmp(*modep, "LPRT") == 0) { if (LPRT == fcmd) {
snprintf(tmp, sizeof(tmp), ",%d", plen); snprintf(tmp, sizeof(tmp), ",%d", plen);
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf))
@@ -1269,7 +1332,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
} }
} }
result = Curl_ftpsendf(conn, "%s %s", *modep, portmsgbuf); result = Curl_ftpsendf(conn, "%s %s", mode[fcmd], portmsgbuf);
if(result) if(result)
return result; return result;
} }
@@ -1279,13 +1342,21 @@ CURLcode ftp_use_port(struct connectdata *conn)
return result; return result;
if (ftpcode != 200) { if (ftpcode != 200) {
if (EPRT == fcmd) {
infof(data, "disabling EPRT usage\n");
conn->bits.ftp_use_eprt = FALSE;
}
else if (LPRT == fcmd) {
infof(data, "disabling LPRT usage\n");
conn->bits.ftp_use_lprt = FALSE;
}
continue; continue;
} }
else else
break; break;
} }
if (!*modep) { if (fcmd == DONE) {
sclose(portsock); sclose(portsock);
failf(data, "PORT command attempts failed"); failf(data, "PORT command attempts failed");
return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED;
@@ -1486,10 +1557,17 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
/* newhost must be able to hold a full IP-style address in ASCII, which /* newhost must be able to hold a full IP-style address in ASCII, which
in the IPv6 case means 5*8-1 = 39 letters */ in the IPv6 case means 5*8-1 = 39 letters */
char newhost[48]; #define NEWHOST_BUFSIZE 48
char *newhostp=NULL; char newhost[NEWHOST_BUFSIZE];
for (modeoff = (data->set.ftp_use_epsv?0:1); #ifdef PF_INET6
if(!conn->bits.ftp_use_epsv && conn->bits.ipv6)
/* EPSV is disabled but we are connected to a IPv6 host, so we ignore the
request and enable EPSV again! */
conn->bits.ftp_use_epsv = TRUE;
#endif
for (modeoff = (conn->bits.ftp_use_epsv?0:1);
mode[modeoff]; modeoff++) { mode[modeoff]; modeoff++) {
result = Curl_ftpsendf(conn, "%s", mode[modeoff]); result = Curl_ftpsendf(conn, "%s", mode[modeoff]);
if(result) if(result)
@@ -1499,6 +1577,12 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
return result; return result;
if (ftpcode == results[modeoff]) if (ftpcode == results[modeoff])
break; break;
if(modeoff == 0) {
/* EPSV is not supported, disable it for next transfer */
conn->bits.ftp_use_epsv = FALSE;
infof(data, "disabling EPSV usage\n");
}
} }
if (!mode[modeoff]) { if (!mode[modeoff]) {
@@ -1530,13 +1614,12 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
} }
if(!*str) { if(!*str) {
failf(data, "Couldn't interpret this 227-reply: %s", buf); failf(data, "Couldn't interpret the 227-reply");
return CURLE_FTP_WEIRD_227_FORMAT; return CURLE_FTP_WEIRD_227_FORMAT;
} }
snprintf(newhost, sizeof(newhost), snprintf(newhost, sizeof(newhost),
"%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
newhostp = newhost;
newport = (port[0]<<8) + port[1]; newport = (port[0]<<8) + port[1];
} }
else if (229 == results[modeoff]) { else if (229 == results[modeoff]) {
@@ -1565,8 +1648,8 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
if(ptr) { if(ptr) {
newport = num; newport = num;
/* we should use the same host we already are connected to */ /* We must use the same IP we are already connected to */
newhostp = conn->host.name; snprintf(newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str);
} }
} }
else else
@@ -1598,12 +1681,12 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
} }
else { else {
/* normal, direct, ftp connection */ /* normal, direct, ftp connection */
rc = Curl_resolv(conn, newhostp, newport, &addr); rc = Curl_resolv(conn, newhost, newport, &addr);
if(rc == CURLRESOLV_PENDING) if(rc == CURLRESOLV_PENDING)
rc = Curl_wait_for_resolv(conn, &addr); rc = Curl_wait_for_resolv(conn, &addr);
if(!addr) { if(!addr) {
failf(data, "Can't resolve new host %s:%d", newhostp, newport); failf(data, "Can't resolve new host %s:%d", newhost, newport);
return CURLE_FTP_CANT_GET_HOST; return CURLE_FTP_CANT_GET_HOST;
} }
connectport = newport; /* we connect to the remote port */ connectport = newport; /* we connect to the remote port */
@@ -1628,13 +1711,13 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
if(data->set.verbose) if(data->set.verbose)
/* this just dumps information about this second connection */ /* this just dumps information about this second connection */
ftp_pasv_verbose(conn, conninfo, newhostp, connectport); ftp_pasv_verbose(conn, conninfo, newhost, connectport);
#ifndef CURL_DISABLE_HTTP #ifndef CURL_DISABLE_HTTP
if(conn->bits.tunnel_proxy) { if(conn->bits.tunnel_proxy) {
/* We want "seamless" FTP operations through HTTP proxy tunnel */ /* We want "seamless" FTP operations through HTTP proxy tunnel */
result = Curl_ConnectHTTPProxyTunnel(conn, SECONDARYSOCKET, result = Curl_ConnectHTTPProxyTunnel(conn, SECONDARYSOCKET,
newhostp, newport); newhost, newport);
if(CURLE_OK != result) if(CURLE_OK != result)
return result; return result;
} }
@@ -1765,7 +1848,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
return result; return result;
if(ftpcode>=400) { if(ftpcode>=400) {
failf(data, "Failed FTP upload:%s", buf+3); failf(data, "Failed FTP upload: %03d", ftpcode);
/* oops, we never close the sockets! */ /* oops, we never close the sockets! */
return CURLE_FTP_COULDNT_STOR_FILE; return CURLE_FTP_COULDNT_STOR_FILE;
} }
@@ -1917,7 +2000,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
failf(data, "Offset (%" FORMAT_OFF_T failf(data, "Offset (%" FORMAT_OFF_T
") was beyond file size (%" FORMAT_OFF_T ")", ") was beyond file size (%" FORMAT_OFF_T ")",
conn->resume_from, foundsize); conn->resume_from, foundsize);
return CURLE_FTP_BAD_DOWNLOAD_RESUME; return CURLE_BAD_DOWNLOAD_RESUME;
} }
/* convert to size to download */ /* convert to size to download */
downloadsize = -conn->resume_from; downloadsize = -conn->resume_from;
@@ -1929,7 +2012,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
failf(data, "Offset (%" FORMAT_OFF_T failf(data, "Offset (%" FORMAT_OFF_T
") was beyond file size (%" FORMAT_OFF_T ")", ") was beyond file size (%" FORMAT_OFF_T ")",
conn->resume_from, foundsize); conn->resume_from, foundsize);
return CURLE_FTP_BAD_DOWNLOAD_RESUME; return CURLE_BAD_DOWNLOAD_RESUME;
} }
/* Now store the number of bytes we are expected to download */ /* Now store the number of bytes we are expected to download */
downloadsize = foundsize-conn->resume_from; downloadsize = foundsize-conn->resume_from;
@@ -1959,7 +2042,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
return result; return result;
if(ftpcode != 350) { if(ftpcode != 350) {
failf(data, "Couldn't use REST: %s", buf+4); failf(data, "Couldn't use REST: %03d", ftpcode);
return CURLE_FTP_COULDNT_USE_REST; return CURLE_FTP_COULDNT_USE_REST;
} }
} }
@@ -2073,7 +2156,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
ftp->no_transfer = TRUE; /* don't think we should download anything */ ftp->no_transfer = TRUE; /* don't think we should download anything */
} }
else { else {
failf(data, "%s", buf+4); failf(data, "RETR failed: %03d", ftpcode);
return CURLE_FTP_COULDNT_RETR_FILE; return CURLE_FTP_COULDNT_RETR_FILE;
} }
} }
@@ -2304,7 +2387,7 @@ CURLcode Curl_ftpsendf(struct connectdata *conn,
break; break;
if(conn->data->set.verbose) if(conn->data->set.verbose)
Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, bytes_written, conn->host.dispname); Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, bytes_written, conn);
if(bytes_written != (ssize_t)write_len) { if(bytes_written != (ssize_t)write_len) {
write_len -= bytes_written; write_len -= bytes_written;
@@ -2372,6 +2455,10 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
ftp->cache = NULL; ftp->cache = NULL;
} }
freedirs(ftp); freedirs(ftp);
if(ftp->prevpath) {
free(ftp->prevpath);
ftp->prevpath = NULL;
}
} }
return CURLE_OK; return CURLE_OK;
} }
@@ -2486,6 +2573,9 @@ static CURLcode ftp_3rdparty_pretransfer(struct connectdata *conn)
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
struct connectdata *sec_conn = conn->sec_conn; struct connectdata *sec_conn = conn->sec_conn;
conn->xfertype = TARGET3RD;
sec_conn->xfertype = SOURCE3RD;
/* sets transfer type */ /* sets transfer type */
result = ftp_transfertype(conn, data->set.ftp_ascii); result = ftp_transfertype(conn, data->set.ftp_ascii);
if (result) if (result)
@@ -2529,7 +2619,7 @@ static CURLcode ftp_3rdparty_transfer(struct connectdata *conn)
struct connectdata *pasv_conn; struct connectdata *pasv_conn;
struct connectdata *port_conn; struct connectdata *port_conn;
if (data->set.pasvHost == CURL_TARGET_PASV) { if (data->set.ftpport == NULL) {
pasv_conn = conn; pasv_conn = conn;
port_conn = sec_conn; port_conn = sec_conn;
} }
@@ -2545,9 +2635,11 @@ static CURLcode ftp_3rdparty_transfer(struct connectdata *conn)
/* sets the passive mode */ /* sets the passive mode */
FTPSENDF(pasv_conn, "%s", "PASV"); FTPSENDF(pasv_conn, "%s", "PASV");
result = Curl_GetFTPResponse(&nread, pasv_conn, &ftpcode); result = Curl_GetFTPResponse(&nread, pasv_conn, &ftpcode);
if (result) return result; if (result)
return result;
if (ftpcode != 227) { if (ftpcode != 227) {
failf(data, "Odd return code after PASV:%s", buf + 3); failf(data, "Odd return code after PASV: %03d", ftpcode);
return CURLE_FTP_WEIRD_PASV_REPLY; return CURLE_FTP_WEIRD_PASV_REPLY;
} }
@@ -2559,7 +2651,7 @@ static CURLcode ftp_3rdparty_transfer(struct connectdata *conn)
} }
if (!*str) { if (!*str) {
failf(pasv_conn->data, "Couldn't interpret this 227-reply: %s", buf); failf(pasv_conn->data, "Couldn't interpret the 227-reply");
return CURLE_FTP_WEIRD_227_FORMAT; return CURLE_FTP_WEIRD_227_FORMAT;
} }
@@ -2573,7 +2665,7 @@ static CURLcode ftp_3rdparty_transfer(struct connectdata *conn)
return result; return result;
if (ftpcode != 200) { if (ftpcode != 200) {
failf(data, "PORT command attempts failed:%s", buf + 3); failf(data, "PORT command attempts failed: %03d", ftpcode);
return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED;
} }
@@ -2581,41 +2673,44 @@ static CURLcode ftp_3rdparty_transfer(struct connectdata *conn)
stor_cmd = data->set.ftp_append?"APPE":"STOR"; stor_cmd = data->set.ftp_append?"APPE":"STOR";
/* transfers file between remote hosts */ /* transfers file between remote hosts */
FTPSENDF(sec_conn, "RETR %s", data->set.source_path); /* FIX: this should send a series of CWD commands and then RETR only the
ftp->file file. The conn->path "full path" is not unescaped. Test case
230 tests this. */
FTPSENDF(sec_conn, "RETR %s", sec_conn->path);
if(data->set.pasvHost == CURL_TARGET_PASV) { if(!data->set.ftpport) {
result = Curl_GetFTPResponse(&nread, sec_conn, &ftpcode); result = Curl_GetFTPResponse(&nread, sec_conn, &ftpcode);
if (result) if (result)
return result; return result;
if (ftpcode != 150) { if((ftpcode != 150) && (ftpcode != 125)) {
failf(data, "Failed RETR: %s", buf + 4); failf(data, "Failed RETR: %03d", ftpcode);
return CURLE_FTP_COULDNT_RETR_FILE; return CURLE_FTP_COULDNT_RETR_FILE;
} }
result = Curl_ftpsendf(conn, "%s %s", stor_cmd, conn->path); result = Curl_ftpsendf(conn, "%s %s", stor_cmd, conn->proto.ftp->file);
if(CURLE_OK == result) if(CURLE_OK == result)
result = Curl_GetFTPResponse(&nread, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if (result) if (result)
return result; return result;
if (ftpcode != 150) { if (ftpcode >= 400) {
failf(data, "Failed FTP upload: %s", buf + 4); failf(data, "Failed FTP upload: %03d", ftpcode);
return CURLE_FTP_COULDNT_STOR_FILE; return CURLE_FTP_COULDNT_STOR_FILE;
} }
} }
else { else {
result = Curl_ftpsendf(conn, "%s %s", stor_cmd, conn->path); result = Curl_ftpsendf(conn, "%s %s", stor_cmd, conn->proto.ftp->file);
if(CURLE_OK == result) if(CURLE_OK == result)
result = Curl_GetFTPResponse(&nread, sec_conn, &ftpcode); result = Curl_GetFTPResponse(&nread, sec_conn, &ftpcode);
if (result) if (result)
return result; return result;
if (ftpcode != 150) { if (ftpcode >= 400) {
failf(data, "Failed FTP upload: %s", buf + 4); failf(data, "Failed FTP upload: %03d", ftpcode);
return CURLE_FTP_COULDNT_STOR_FILE; return CURLE_FTP_COULDNT_STOR_FILE;
} }
@@ -2623,8 +2718,8 @@ static CURLcode ftp_3rdparty_transfer(struct connectdata *conn)
if (result) if (result)
return result; return result;
if (ftpcode != 150) { if((ftpcode != 150) && (ftpcode != 125)) {
failf(data, "Failed FTP upload: %s", buf + 4); failf(data, "Failed FTP upload: %03d", ftpcode);
return CURLE_FTP_COULDNT_STOR_FILE; return CURLE_FTP_COULDNT_STOR_FILE;
} }
} }
@@ -2647,6 +2742,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
CURLcode retcode = CURLE_OK; CURLcode retcode = CURLE_OK;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
struct FTP *ftp; struct FTP *ftp;
size_t dlen;
char *slash_pos; /* position of the first '/' char in curpos */ char *slash_pos; /* position of the first '/' char in curpos */
char *cur_pos = conn->path; /* current position in path. point at the begin char *cur_pos = conn->path; /* current position in path. point at the begin
@@ -2681,6 +2777,10 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
freedirs(ftp); freedirs(ftp);
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
} }
if (isBadFtpString(ftp->dirs[ftp->dirdepth])) {
freedirs(ftp);
return CURLE_URL_MALFORMAT;
}
} }
else { else {
cur_pos = slash_pos + 1; /* jump to the rest of the string */ cur_pos = slash_pos + 1; /* jump to the rest of the string */
@@ -2712,11 +2812,33 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
failf(data, "no memory"); failf(data, "no memory");
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
} }
if (isBadFtpString(ftp->file)) {
freedirs(ftp);
return CURLE_URL_MALFORMAT;
}
} }
else else
ftp->file=NULL; /* instead of point to a zero byte, we make it a NULL ftp->file=NULL; /* instead of point to a zero byte, we make it a NULL
pointer */ pointer */
ftp->cwddone = FALSE; /* default to not done */
if(ftp->prevpath) {
/* prevpath is "raw" so we convert the input path before we compare the
strings */
char *path = curl_unescape(conn->path, 0);
if(!path)
return CURLE_OUT_OF_MEMORY;
dlen = strlen(path) - (ftp->file?strlen(ftp->file):0);
if((dlen == strlen(ftp->prevpath)) &&
curl_strnequal(path, ftp->prevpath, dlen)) {
infof(data, "Request has same path as previous transfer\n");
ftp->cwddone = TRUE;
}
free(path);
}
return retcode; return retcode;
} }
@@ -2737,6 +2859,10 @@ CURLcode ftp_cwd_and_create_path(struct connectdata *conn)
struct FTP *ftp = conn->proto.ftp; struct FTP *ftp = conn->proto.ftp;
int i; int i;
if(ftp->cwddone)
/* already done and fine */
return CURLE_OK;
/* This is a re-used connection. Since we change directory to where the /* This is a re-used connection. Since we change directory to where the
transfer is taking place, we must now get back to the original dir transfer is taking place, we must now get back to the original dir
where we ended up after login: */ where we ended up after login: */

View File

@@ -43,6 +43,9 @@
static static
char *GetEnv(const char *variable) char *GetEnv(const char *variable)
{ {
#ifdef _WIN32_WCE
return NULL;
#else
#ifdef WIN32 #ifdef WIN32
/* This shit requires windows.h (HUGE) to be included */ /* This shit requires windows.h (HUGE) to be included */
char env[MAX_PATH]; /* MAX_PATH is from windef.h */ char env[MAX_PATH]; /* MAX_PATH is from windef.h */
@@ -62,6 +65,7 @@ char *GetEnv(const char *variable)
#endif #endif
#endif #endif
return (env && env[0])?strdup(env):NULL; return (env && env[0])?strdup(env):NULL;
#endif
} }
char *curl_getenv(const char *v) char *curl_getenv(const char *v)

View File

@@ -33,12 +33,13 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include "memory.h" #include "memory.h"
#include "ssluse.h"
/* Make this the last #include */ /* Make this the last #include */
#include "memdebug.h" #include "memdebug.h"
/* /*
* This is supposed to be called in the beginning of a permform() session * This is supposed to be called in the beginning of a perform() session
* and should reset all session-info variables * and should reset all session-info variables
*/ */
CURLcode Curl_initinfo(struct SessionHandle *data) CURLcode Curl_initinfo(struct SessionHandle *data)
@@ -63,6 +64,7 @@ CURLcode Curl_initinfo(struct SessionHandle *data)
info->header_size = 0; info->header_size = 0;
info->request_size = 0; info->request_size = 0;
info->numconnects = 0;
return CURLE_OK; return CURLE_OK;
} }
@@ -72,6 +74,7 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
long *param_longp=NULL; long *param_longp=NULL;
double *param_doublep=NULL; double *param_doublep=NULL;
char **param_charp=NULL; char **param_charp=NULL;
struct curl_slist **param_slistp=NULL;
va_start(arg, info); va_start(arg, info);
switch(info&CURLINFO_TYPEMASK) { switch(info&CURLINFO_TYPEMASK) {
@@ -92,6 +95,11 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
if(NULL == param_doublep) if(NULL == param_doublep)
return CURLE_BAD_FUNCTION_ARGUMENT; return CURLE_BAD_FUNCTION_ARGUMENT;
break; break;
case CURLINFO_SLIST:
param_slistp = va_arg(arg, struct curl_slist **);
if(NULL == param_slistp)
return CURLE_BAD_FUNCTION_ARGUMENT;
break;
} }
switch(info) { switch(info) {
@@ -159,7 +167,7 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
*param_charp = data->info.contenttype; *param_charp = data->info.contenttype;
break; break;
case CURLINFO_PRIVATE: case CURLINFO_PRIVATE:
*param_charp = data->set.private; *param_charp = data->set.private_data;
break; break;
case CURLINFO_HTTPAUTH_AVAIL: case CURLINFO_HTTPAUTH_AVAIL:
*param_longp = data->info.httpauthavail; *param_longp = data->info.httpauthavail;
@@ -170,6 +178,12 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
case CURLINFO_OS_ERRNO: case CURLINFO_OS_ERRNO:
*param_longp = data->state.os_errno; *param_longp = data->state.os_errno;
break; break;
case CURLINFO_NUM_CONNECTS:
*param_longp = data->info.numconnects;
break;
case CURLINFO_SSL_ENGINES:
*param_slistp = Curl_SSL_engines_list(data);
break;
default: default:
return CURLE_BAD_FUNCTION_ARGUMENT; return CURLE_BAD_FUNCTION_ARGUMENT;
} }

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -50,12 +50,11 @@ hash_str(const char *key, size_t key_length)
static void static void
hash_element_dtor(void *user, void *element) hash_element_dtor(void *user, void *element)
{ {
curl_hash *h = (curl_hash *) user; struct curl_hash *h = (struct curl_hash *) user;
curl_hash_element *e = (curl_hash_element *) element; struct curl_hash_element *e = (struct curl_hash_element *) element;
if (e->key) { if (e->key)
free(e->key); free(e->key);
}
h->dtor(e->ptr); h->dtor(e->ptr);
@@ -64,7 +63,7 @@ hash_element_dtor(void *user, void *element)
/* return 1 on error, 0 is fine */ /* return 1 on error, 0 is fine */
int int
Curl_hash_init(curl_hash *h, int slots, curl_hash_dtor dtor) Curl_hash_init(struct curl_hash *h, int slots, curl_hash_dtor dtor)
{ {
int i; int i;
@@ -72,7 +71,7 @@ Curl_hash_init(curl_hash *h, int slots, curl_hash_dtor dtor)
h->size = 0; h->size = 0;
h->slots = slots; h->slots = slots;
h->table = (curl_llist **) malloc(slots * sizeof(curl_llist *)); h->table = (struct curl_llist **) malloc(slots * sizeof(struct curl_llist *));
if(h->table) { if(h->table) {
for (i = 0; i < slots; ++i) { for (i = 0; i < slots; ++i) {
h->table[i] = Curl_llist_alloc((curl_llist_dtor) hash_element_dtor); h->table[i] = Curl_llist_alloc((curl_llist_dtor) hash_element_dtor);
@@ -89,12 +88,12 @@ Curl_hash_init(curl_hash *h, int slots, curl_hash_dtor dtor)
return 1; /* failure */ return 1; /* failure */
} }
curl_hash * struct curl_hash *
Curl_hash_alloc(int slots, curl_hash_dtor dtor) Curl_hash_alloc(int slots, curl_hash_dtor dtor)
{ {
curl_hash *h; struct curl_hash *h;
h = (curl_hash *) malloc(sizeof(curl_hash)); h = (struct curl_hash *) malloc(sizeof(struct curl_hash));
if (h) { if (h) {
if(Curl_hash_init(h, slots, dtor)) { if(Curl_hash_init(h, slots, dtor)) {
/* failure */ /* failure */
@@ -118,11 +117,11 @@ hash_key_compare(char *key1, size_t key1_len, char *key2, size_t key2_len)
return 0; return 0;
} }
static curl_hash_element * static struct curl_hash_element *
mk_hash_element(char *key, size_t key_len, const void *p) mk_hash_element(char *key, size_t key_len, const void *p)
{ {
curl_hash_element *he = struct curl_hash_element *he =
(curl_hash_element *) malloc(sizeof(curl_hash_element)); (struct curl_hash_element *) malloc(sizeof(struct curl_hash_element));
if(he) { if(he) {
char *dup = strdup(key); char *dup = strdup(key);
@@ -147,14 +146,14 @@ mk_hash_element(char *key, size_t key_len, const void *p)
/* Return the data in the hash. If there already was a match in the hash, /* Return the data in the hash. If there already was a match in the hash,
that data is returned. */ that data is returned. */
void * void *
Curl_hash_add(curl_hash *h, char *key, size_t key_len, void *p) Curl_hash_add(struct curl_hash *h, char *key, size_t key_len, void *p)
{ {
curl_hash_element *he; struct curl_hash_element *he;
curl_llist_element *le; struct curl_llist_element *le;
curl_llist *l = FETCH_LIST(h, key, key_len); struct curl_llist *l = FETCH_LIST(h, key, key_len);
for (le = l->head; le; le = le->next) { for (le = l->head; le; le = le->next) {
he = (curl_hash_element *) le->ptr; he = (struct curl_hash_element *) le->ptr;
if (hash_key_compare(he->key, he->key_len, key, key_len)) { if (hash_key_compare(he->key, he->key_len, key, key_len)) {
h->dtor(p); /* remove the NEW entry */ h->dtor(p); /* remove the NEW entry */
return he->ptr; /* return the EXISTING entry */ return he->ptr; /* return the EXISTING entry */
@@ -181,11 +180,11 @@ Curl_hash_add(curl_hash *h, char *key, size_t key_len, void *p)
} }
void * void *
Curl_hash_pick(curl_hash *h, char *key, size_t key_len) Curl_hash_pick(struct curl_hash *h, char *key, size_t key_len)
{ {
curl_llist_element *le; struct curl_llist_element *le;
curl_hash_element *he; struct curl_hash_element *he;
curl_llist *l = FETCH_LIST(h, key, key_len); struct curl_llist *l = FETCH_LIST(h, key, key_len);
for (le = l->head; for (le = l->head;
le; le;
@@ -204,7 +203,7 @@ void
Curl_hash_apply(curl_hash *h, void *user, Curl_hash_apply(curl_hash *h, void *user,
void (*cb)(void *user, void *ptr)) void (*cb)(void *user, void *ptr))
{ {
curl_llist_element *le; struct curl_llist_element *le;
int i; int i;
for (i = 0; i < h->slots; ++i) { for (i = 0; i < h->slots; ++i) {
@@ -219,7 +218,7 @@ Curl_hash_apply(curl_hash *h, void *user,
#endif #endif
void void
Curl_hash_clean(curl_hash *h) Curl_hash_clean(struct curl_hash *h)
{ {
int i; int i;
@@ -231,19 +230,19 @@ Curl_hash_clean(curl_hash *h)
} }
void void
Curl_hash_clean_with_criterium(curl_hash *h, void *user, Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
int (*comp)(void *, void *)) int (*comp)(void *, void *))
{ {
curl_llist_element *le; struct curl_llist_element *le;
curl_llist_element *lnext; struct curl_llist_element *lnext;
curl_llist *list; struct curl_llist *list;
int i; int i;
for (i = 0; i < h->slots; ++i) { for (i = 0; i < h->slots; ++i) {
list = h->table[i]; list = h->table[i];
le = list->head; /* get first list entry */ le = list->head; /* get first list entry */
while(le) { while(le) {
curl_hash_element *he = le->ptr; struct curl_hash_element *he = le->ptr;
lnext = le->next; lnext = le->next;
/* ask the callback function if we shall remove this entry or not */ /* ask the callback function if we shall remove this entry or not */
if (comp(user, he->ptr)) { if (comp(user, he->ptr)) {
@@ -256,7 +255,7 @@ Curl_hash_clean_with_criterium(curl_hash *h, void *user,
} }
void void
Curl_hash_destroy(curl_hash *h) Curl_hash_destroy(struct curl_hash *h)
{ {
if (!h) if (!h)
return; return;

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -31,30 +31,31 @@
typedef void (*curl_hash_dtor)(void *); typedef void (*curl_hash_dtor)(void *);
typedef struct _curl_hash { struct curl_hash {
curl_llist **table; struct curl_llist **table;
curl_hash_dtor dtor; curl_hash_dtor dtor;
int slots; int slots;
size_t size; size_t size;
} curl_hash; };
typedef struct _curl_hash_element { struct curl_hash_element {
void *ptr; void *ptr;
char *key; char *key;
size_t key_len; size_t key_len;
} curl_hash_element; };
int Curl_hash_init(curl_hash *, int, curl_hash_dtor); int Curl_hash_init(struct curl_hash *, int, curl_hash_dtor);
curl_hash *Curl_hash_alloc(int, curl_hash_dtor); struct curl_hash *Curl_hash_alloc(int, curl_hash_dtor);
void *Curl_hash_add(curl_hash *, char *, size_t, void *); void *Curl_hash_add(struct curl_hash *, char *, size_t, void *);
int Curl_hash_delete(curl_hash *h, char *key, size_t key_len); int Curl_hash_delete(struct curl_hash *h, char *key, size_t key_len);
void *Curl_hash_pick(curl_hash *, char *, size_t); void *Curl_hash_pick(struct curl_hash *, char *, size_t);
void Curl_hash_apply(curl_hash *h, void *user, void Curl_hash_apply(struct curl_hash *h, void *user,
void (*cb)(void *user, void *ptr)); void (*cb)(void *user, void *ptr));
int Curl_hash_count(curl_hash *h); int Curl_hash_count(struct curl_hash *h);
void Curl_hash_clean(curl_hash *h); void Curl_hash_clean(struct curl_hash *h);
void Curl_hash_clean_with_criterium(curl_hash *h, void *user, int (*comp)(void *, void *)); void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
void Curl_hash_destroy(curl_hash *h); int (*comp)(void *, void *));
void Curl_hash_destroy(struct curl_hash *h);
#endif #endif

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -131,7 +131,7 @@
*/ */
/* These two symbols are for the global DNS cache */ /* These two symbols are for the global DNS cache */
static curl_hash hostname_cache; static struct curl_hash hostname_cache;
static int host_cache_initialized; static int host_cache_initialized;
static void freednsentry(void *freethis); static void freednsentry(void *freethis);
@@ -152,7 +152,7 @@ void Curl_global_host_cache_init(void)
/* /*
* Return a pointer to the global cache * Return a pointer to the global cache
*/ */
curl_hash *Curl_global_host_cache_get(void) struct curl_hash *Curl_global_host_cache_get(void)
{ {
return &hostname_cache; return &hostname_cache;
} }
@@ -174,7 +174,8 @@ void Curl_global_host_cache_dtor(void)
int Curl_num_addresses(const Curl_addrinfo *addr) int Curl_num_addresses(const Curl_addrinfo *addr)
{ {
int i; int i;
for (i = 0; addr; addr = addr->ai_next, i++); for (i = 0; addr; addr = addr->ai_next, i++)
; /* empty loop */
return i; return i;
} }
@@ -243,7 +244,7 @@ hostcache_timestamp_remove(void *datap, void *hc)
* Prune the DNS cache. This assumes that a lock has already been taken. * Prune the DNS cache. This assumes that a lock has already been taken.
*/ */
static void static void
hostcache_prune(curl_hash *hostcache, int cache_timeout, time_t now) hostcache_prune(struct curl_hash *hostcache, int cache_timeout, time_t now)
{ {
struct hostcache_prune_data user; struct hostcache_prune_data user;
@@ -506,7 +507,7 @@ static void freednsentry(void *freethis)
/* /*
* Curl_mk_dnscache() creates a new DNS cache and returns the handle for it. * Curl_mk_dnscache() creates a new DNS cache and returns the handle for it.
*/ */
curl_hash *Curl_mk_dnscache(void) struct curl_hash *Curl_mk_dnscache(void)
{ {
return Curl_hash_alloc(7, freednsentry); return Curl_hash_alloc(7, freednsentry);
} }

Some files were not shown because too many files have changed in this diff Show More