Compare commits

...

533 Commits

Author SHA1 Message Date
Daniel Stenberg
30c85c327b 7.17.1! 2007-10-29 14:49:11 +00:00
Daniel Stenberg
ed3cc86390 correct mirror count 2007-10-29 14:48:37 +00:00
Daniel Stenberg
e5f1499f62 let 7.17.1 be version-info 4:1:0 2007-10-29 10:19:07 +00:00
Gisle Vanem
848f40fd65 OpenWatcom cannot use wldap32.lib (wrong calling convention?).
Added generation of dummy ca-bundle.h. Sorted objects.
2007-10-28 12:02:20 +00:00
Daniel Stenberg
5adf53dc01 http://curl.wetzlmayr.at/ is a new web mirror in Nuremberg, Germany 2007-10-28 09:33:03 +00:00
Dan Fandrich
15feb8217f Fixed the 2000-series tests so that the downloaded data is actually checked 2007-10-27 01:04:36 +00:00
Dan Fandrich
59dccb34b0 Made the magic testnumber > 10000 support actually work 2007-10-27 01:02:57 +00:00
Dan Fandrich
e8057241c6 Fixed the test case to create only a single test file, which is all the
test harness supports.
2007-10-26 20:19:49 +00:00
Dan Fandrich
d3ee83747c Fixed a valgrind uninitialized variable error. 2007-10-26 19:26:41 +00:00
Dan Fandrich
3f55ed0ef7 Check that all servers in the <server> section are supported, not just
the first.
2007-10-26 19:26:04 +00:00
Daniel Stenberg
f9cfef3599 mention --static-libs as added in 7.17.1 2007-10-26 07:46:02 +00:00
Yang Tse
07dbfa25a0 typecast to prevent compiler warning 2007-10-26 01:12:33 +00:00
Yang Tse
1d49c04545 Detect, log and avoid storing a request with a negative size. 2007-10-26 00:36:36 +00:00
Dan Fandrich
faaaf62655 Added the --static-libs option to curl-config 2007-10-25 22:30:35 +00:00
Dan Fandrich
43885493ea Disable valgrind for this test to avoid the rlimit = soft rlimit problem
found by Michal Marek.
2007-10-25 21:49:45 +00:00
Daniel Stenberg
1230422181 oops 2007-10-25 21:14:15 +00:00
Daniel Stenberg
6a17cae4f6 Made libcurl built with NSS possible to ignore the peer verification.
Previously it would fail if the ca bundle wasn't present, even if the code
ignored the verification results.
2007-10-25 21:08:55 +00:00
Dan Fandrich
1eac702c1a Added test case 2004.
Disable valgrind in test case 1004 due to a libtool bug.
2007-10-25 21:04:51 +00:00
Daniel Stenberg
4b96ac504c prevent compiler warnings about shadowing and one case of unused variable 2007-10-25 20:54:46 +00:00
Patrick Monnerat
0678a51d3b Allow test server to handle binary POSTs.
Tests 35, 544 545 added: binary data POSTs.
2007-10-25 19:40:05 +00:00
Dan Fandrich
b7dd186d36 When valgrind is disabled in the test file, don't run it at all (as opposed
to running it and ignoring its output).
2007-10-25 19:39:52 +00:00
Yang Tse
26c1c8b2ad Don't show valgrind log files of other tests 2007-10-25 18:07:13 +00:00
Daniel Stenberg
824aa5f918 Michal Marek fixed the test script to be able to use valgrind even when the
lib is built shared with libtool.
2007-10-25 14:30:51 +00:00
Daniel Stenberg
ca67dcbc05 Don't assume there's a sessionhandle around when a connection is disconnected,
so do the data->reqdata.current_conn assignment when we know there is an easy
handle existing! Fixes the valgrind report on test 509.
2007-10-25 09:41:35 +00:00
Daniel Stenberg
9dbc2c827d fix the check 2007-10-25 09:34:16 +00:00
Daniel Stenberg
91e27ce755 Fixed a TFTP memory leak. Enabled test 2003 to verify this. 2007-10-25 07:47:38 +00:00
Dan Fandrich
65ed696625 Fixed the test TFTP server to support the >10000 test number notation
Added test cases 2002 and 2003 (the latter disabled for now)
2007-10-24 22:48:23 +00:00
Daniel Stenberg
3e3eaaada7 enable 2000 and 2001 2007-10-24 21:27:25 +00:00
Daniel Stenberg
8997d258f7 Curl_ftp_disconnect() no longer relies on anything in the reqdata struct. That
was even mentioned to be bad in a comment! Should make test 2000 and 2001 work
fine.

Also, freedirs() now take a ftp_conn struct pointer which saves some extra
unnecessary variable assignments.
2007-10-24 21:14:11 +00:00
Daniel Stenberg
a3f958aaaa added clarifying comment 2007-10-24 21:09:59 +00:00
Dan Fandrich
38649d1362 Added test cases 2000 and 2001 which test multiple protocols using the
same easy handle
Fixed the filecheck: make target to work outside the source tree
2007-10-24 19:40:07 +00:00
Dan Fandrich
4f00a02ba3 Fixed the test FTP server to support the >10000 test number notation 2007-10-24 19:39:29 +00:00
Yang Tse
edef367e9c Missing double quotes 2007-10-24 16:40:59 +00:00
Yang Tse
08c5e2a194 Windows build targets have socklen_t definition in ws2tcpip.h but some
versions of ws2tcpip.h do not have the definition. It seems that when
the socklen_t definition is missing from ws2tcpip.h the definition for
INET_ADDRSTRLEN is also missing, and that when one definition is present
the other one also is available.
2007-10-24 14:39:07 +00:00
Patrick Monnerat
c67c54d4b3 Close log/server.input ASAP to avoid lengthy file lock on cygwin 2007-10-24 13:03:08 +00:00
Daniel Stenberg
23b05e8473 Vladimir Lazarenko pointed out that we should do some 'mt' magic when
building with VC8 to get the "manifest" embedded to make fine stand-alone
binaries. The maketgz and the src/Makefile.vc6 files were adjusted
accordingly.
2007-10-24 09:28:36 +00:00
Daniel Stenberg
949ff9715a Bug report #1812190 (http://curl.haxx.se/bug/view.cgi?id=1812190) points out
that libcurl tried to re-use connections a bit too much when using non-SSL
protocols tunneled over a HTTP proxy.
2007-10-23 21:00:51 +00:00
Yang Tse
b9a305983f File is not a protocol that can deal with "persistancy" 2007-10-23 15:16:46 +00:00
Yang Tse
8e7da9464a Read callback should return 0 when no more data left 2007-10-23 15:10:48 +00:00
Yang Tse
e550df675a Fix compiler warning: subscript has type `char' 2007-10-23 10:14:24 +00:00
Gunter Knauf
f614fe4946 removed dependency on gettimeofday() since we use only 1 sec resolution here. 2007-10-22 23:31:40 +00:00
Daniel Stenberg
e6ad066ed1 removed 105, it is now assumed to be fixed!
105 - "invalid free after an http redirect to ftp"
2007-10-22 15:07:29 +00:00
Daniel Stenberg
5b358603bd Michal Marek forwarded the bug report
https://bugzilla.novell.com/show_bug.cgi?id=332917 about a HTTP redirect to
FTP that caused memory havoc. His work together with my efforts created two
fixes:

#1 - FTP::file was moved to struct ftp_conn, because is has to be dealt with
     at connection cleanup, at which time the struct HandleData could be
     used by another connection.
     Also, the unused char *urlpath member is removed from struct FTP.

#2 - provide a Curl_reset_reqproto() function that frees
     data->reqdata.proto.* on connection setup if needed (that is if the
     SessionHandle was used by a different connection).
2007-10-22 15:05:35 +00:00
Daniel Stenberg
3910a61b61 Removed 93 and 100, there's no work on these and they're not critical in any
way:

93 - Digest for IIS fix (subject for removal)
100 - icc segmentation faults (subject for removal)
2007-10-22 14:48:25 +00:00
Daniel Stenberg
45d9772667 #103 is fixed 2007-10-22 10:23:25 +00:00
Daniel Stenberg
268eebca01 mention Patrick Monnerat's recent work on the postfields problems 2007-10-22 09:28:42 +00:00
Daniel Stenberg
1056dc9a26 Bug report #1815530 (http://curl.haxx.se/bug/view.cgi?id=1815530) points out
that specifying a proxy with a trailing slash didn't work (unless it also
contained a port number).
2007-10-22 09:25:45 +00:00
Gunter Knauf
053654dc4d Mohun Biswas sent a patch to fix generated MSVC8 makefiles. 2007-10-20 21:06:24 +00:00
Yang Tse
7fe89c5d29 We use this ZERO_NULL to avoid picky compiler warnings,
when assigning a NULL pointer to a function pointer var.
2007-10-20 15:47:16 +00:00
Yang Tse
5c8fc7dce9 Fix compiler warning: conversion from "int" to "unsigned short" may lose significant bits 2007-10-20 15:11:51 +00:00
Yang Tse
e8d3710aff Add custom check for WINLDAP libraries.
In CURL_CHECK_LIBS_WINLDAP and CURL_CHECK_LIBS_LDAP, check first with no
additional library even when the optional list of libraries has been given.
2007-10-19 16:15:42 +00:00
Yang Tse
d0fe681a28 Fix message shown when detecting icc version 2007-10-19 12:15:00 +00:00
Yang Tse
9a70a6d0c0 Avoid shadowing a global declaration 2007-10-19 10:52:28 +00:00
Yang Tse
ee19b44fe0 Renamed a variable to avoid shadowing a global declaration 2007-10-18 17:31:19 +00:00
Yang Tse
8f0bef2fa0 Renamed internal function to avoid a variable shadowing it 2007-10-18 17:17:18 +00:00
Yang Tse
33ddeb6dcc Fix compiler warning: feupdateenv is not implemented and will always fail.
Specifically for linux x86-64 with Intel's icc.
2007-10-18 16:24:14 +00:00
Yang Tse
e0dc7d6fc8 Sync PLATFORM_AIX_V3 detection and CURL_CC_DEBUG_OPTS()
icc warning level with libcurl's
2007-10-18 15:11:51 +00:00
Patrick Monnerat
8f5909b664 Allow CURLOPT_COPYPOSTFIELDS with explicit data size = 0 2007-10-18 10:54:49 +00:00
Dan Fandrich
bef2e7f2ff Avoid a NULL pointer dereference in an OOM condition. 2007-10-18 01:04:57 +00:00
Yang Tse
8cfb0e26bb Fix compiler warning: conversion from "int" to "unsigned char"
may lose significant bits
2007-10-18 01:01:20 +00:00
Yang Tse
0164f0cf81 Fix overflow detection, take four. Avoiding zero size malloc. 2007-10-17 19:29:06 +00:00
Yang Tse
420ea83ef3 Fix CURL_CHECK_LIBS_LDAP failure when no parameter is given 2007-10-17 18:47:01 +00:00
Yang Tse
223e470e93 actually sync with lib/setup_once.h 2007-10-17 18:18:27 +00:00
Yang Tse
e7387f7557 Fix overflow detection, thanks to Patrick Monnerat detecting test
failure condition: http://curl.haxx.se/mail/lib-2007-10/0152.html
2007-10-17 18:06:32 +00:00
Yang Tse
582bad89ef sync with lib/setup_once.h 2007-10-17 16:59:24 +00:00
Yang Tse
92433e596b We use this ZERO_NULL to avoid picky compiler warnings,
when assigning a NULL pointer to a function pointer var.
2007-10-17 16:58:32 +00:00
Yang Tse
5360f88393 Default check for more libraries in CURL_CHECK_LIBS_LDAP,
and allow parameter specification of libraries to check.
2007-10-17 13:08:10 +00:00
Yang Tse
949073d448 Fix compiler warning: signed and unsigned type in conditional expression 2007-10-17 00:44:48 +00:00
Yang Tse
85877dae9a Fix compiler warning: comparison between signed and unsigned 2007-10-17 00:10:00 +00:00
Yang Tse
c6ef31955a ANSI C compliant overflow check 2007-10-16 23:32:02 +00:00
Steinar H. Gunderson
92aaff009d Fix a bug where fallback from AF_INET6 to AF_INET would not work properly together with relative search; if you had a search path of .a.com and .b.com, and foo.a.com would return ARES_ENODATA and foo.b.com would return ARES_ENOTFOUND, the lookup would not properly retry with AF_INET as it forgot the first ARES_ENODATA. 2007-10-16 21:27:51 +00:00
Dan Fandrich
65ba6e3337 Fixed compiler warning re: unused variable `bigsize' 2007-10-16 18:09:57 +00:00
Yang Tse
fbb5518ab6 Avoid depending on a header file for the definition of NULL 2007-10-15 23:58:11 +00:00
Dan Fandrich
a83b5d1b67 Mention first version with CURLOPT_COPYPOSTFIELDS.
Don't confuse NUL with NULL.
2007-10-15 21:19:40 +00:00
Dan Fandrich
add90abfa4 Updated minimum libcurl size 2007-10-15 21:03:40 +00:00
Patrick Monnerat
a005243908 Fix dynamic CURLOPT_POSTFIELDS bug: back to static.
CURLOPT_COPYPOSTFIELDS option added for dynamic.
Fix some OS400 features.
2007-10-15 18:32:01 +00:00
Dan Fandrich
001a2d9b67 Fix LDAP compile error when LDAP is not available.
Fixed a typo in the LDAP configure code and made sure NULL is defined
in a test programs that need it.
2007-10-15 16:24:46 +00:00
Yang Tse
95446f694b Fix custom check for LDAP libraries 2007-10-14 23:47:15 +00:00
Yang Tse
4db954f802 Add custom check for LDAP libraries 2007-10-14 21:25:10 +00:00
Yang Tse
a171f60bf7 Add custom checks for lber, ldap, ldapssl and ldap_ssl header files 2007-10-14 02:37:04 +00:00
Daniel Stenberg
887e8f9265 Chris Leighton:
My understanding is that we use "number" for discrete variables and
"amount" for continuous variables.

So you can say "The amount of flour required depends on..." or, "Last
night I consumed a large amount of beer!".

And, "That tank contains a large number of fish" or, "Over the week I
consumed a number of cases of beer."

I think that features are discrete, so the man page would read "...the
number of features will make your head spin!".
2007-10-13 20:49:51 +00:00
Yang Tse
07625fe243 Add check for winldap and winber header files 2007-10-13 14:23:15 +00:00
Dan Fandrich
61ffcd7815 Made a few more functions static with the protocol handler table in place. 2007-10-13 00:47:53 +00:00
Daniel Stenberg
a9f47b9364 another Curl_handler fix, the #ifdefs got a bit mixed up... 2007-10-12 20:53:43 +00:00
Dan Fandrich
7831c1ae44 Fixed a few compile errors and warnings. 2007-10-12 18:49:14 +00:00
Daniel Stenberg
5ce3eb066e added three serious bugs to fix before release, and marked the previous two
as subject for removal from this list (without any fix)
2007-10-12 15:26:33 +00:00
Patrick Monnerat
07b6e7363d Added per-protocol callback static tables, replacing callback ptr storage
in the connectdata structure by a single handler table ptr.
2007-10-12 13:36:37 +00:00
Dan Fandrich
2741f97a69 Fixed a couple of typos that messed up the tests. 2007-10-12 02:09:45 +00:00
Dan Fandrich
d7fbe07ee2 Added some <keywords> sections and use some key words more consistently. 2007-10-12 01:44:22 +00:00
Dan Fandrich
2fce1f3e97 Fixed the -l option of runtests.pl
Added support for skipping tests based on key words.
2007-10-11 21:15:09 +00:00
Yang Tse
d09bac137a improve checking for ldap.h and ldap_ssl.h header files 2007-10-10 13:00:11 +00:00
Yang Tse
43e8f00861 lber.h needs to be included since ldap.h might not include it 2007-10-09 23:51:55 +00:00
Yang Tse
3337be81c8 Add check for lber.h and ldap.h header files 2007-10-09 23:44:14 +00:00
Gunter Knauf
0cc9122093 added check for MSVC6 standard PSDK and bail out since insufficient for LDAP support with current code. 2007-10-09 23:25:58 +00:00
Yang Tse
54bcde0a14 also log error message string 2007-10-09 23:24:28 +00:00
Yang Tse
660c86ce95 logmsg already appends '\n' 2007-10-09 23:21:29 +00:00
Gunter Knauf
50b3545ada fix socklen_t for MSVC6 & 7. 2007-10-09 22:10:17 +00:00
Gunter Knauf
baac8065cf added two more module dependencies for LDAPS. 2007-10-09 20:15:27 +00:00
Dan Fandrich
257e38d5c5 Documented error codes 77-80, and fixed the one for 60. 2007-10-09 16:49:41 +00:00
Daniel Stenberg
fc70b2f916 Add a paragraph about CURLOPT_CUSTOMREQUEST not actually changing libcurl's
behavior, it only changes the actual request method keyword and this is not
always what the user/app wants.
2007-10-09 14:53:50 +00:00
Daniel Stenberg
33a8e6c30c Michal Marek removed the no longer existing return codes from the curl.1
man page.
2007-10-09 08:42:50 +00:00
Gisle Vanem
3c875e0112 Added needed 'HAVE_*' defines. 2007-10-08 14:39:52 +00:00
Gisle Vanem
59136ece19 'FD_CLOXEC' is meaningless on MSDOS/Watt-32. 2007-10-08 14:38:51 +00:00
Daniel Stenberg
08fd1829e0 Known bug #47, which confused libcurl if doing NTLM auth over a proxy with
a response that was larger than 16KB is now improved slightly so that now
the restriction at 16KB is for the headers only and it should be a rare
situation where the response-headers exceed 16KB. Thus, I consider #47 fixed
and the header limitation is now known as known bug #48.
2007-10-07 08:28:03 +00:00
Gisle Vanem
43a4604639 <ws2tcpip.h> needed for 'socklen_t' typedef. 2007-10-06 17:20:06 +00:00
Daniel Stenberg
83f385acf3 add url to the wikipedia article for a longer description 2007-10-05 15:18:34 +00:00
Daniel Stenberg
606af3024b Alexey Pesternikov documented CURLOPT_OPENSOCKETDATA and
CURLOPT_OPENSOCKETFUNCTION
2007-10-05 15:16:18 +00:00
Daniel Stenberg
4449bd9b4d Michael Wallner made the CULROPT_COOKIELIST option support a new magic
string: "FLUSH". Using that will cause libcurl to flush its cookies to the
CURLOPT_COOKIEJAR file.
2007-10-05 14:37:33 +00:00
Daniel Stenberg
bffa835573 The new file docs/libcurl/ABI describes how we view ABI breakages, soname
bumps and what the version number's significance to all that is.
2007-10-04 22:05:25 +00:00
Daniel Stenberg
6dd6b4d1fa I enabled test 1009 and made the --local-port use a wide range to reduce the
risk of failures.
2007-10-04 21:26:26 +00:00
Daniel Stenberg
67d94514b0 Kim Rinnewitz reported that --local-port didn't work with TFTP transfers.
This happened because the tftp code always uncondionally did a bind()
without caring if one already had been done and then it failed. I wrote a
test case (1009) to verify this, but it is a bit error-prone since it will
have to pick a fixed local port number and since the tests are run on so
many different hosts in different situations I add it in disabled state.
2007-10-04 10:01:41 +00:00
Steinar H. Gunderson
91b38857ef Removed a piece of redundant code (process_answer already takes care of it). 2007-10-04 08:12:12 +00:00
Steinar H. Gunderson
6d5f899761 Another timeout fix in ares_getnameinfo(). 2007-10-04 08:09:52 +00:00
Steinar H. Gunderson
77a3e3c7f7 Send the timeout count in ares_getnameinfo(). 2007-10-04 08:09:04 +00:00
Steinar H. Gunderson
81249965f7 Moved the NULL check for channel upwards in ares_destroy(). 2007-10-04 08:07:47 +00:00
Steinar H. Gunderson
45c6db9ac4 Clarified the comment over ares_cancel. 2007-10-04 08:06:25 +00:00
Yang Tse
06be8bc389 On error, close "log/server.response" 2007-10-04 02:09:33 +00:00
Yang Tse
0ac5fd354b If TCP_NODELAY is not defined we can't disable the Nagle algorithm 2007-10-03 23:38:07 +00:00
Yang Tse
a11c8a6ea0 Cleanup no longer used macros 2007-10-03 16:58:10 +00:00
Yang Tse
2858935187 Fix compiler warning: local variable may be used without having been initialized 2007-10-03 16:26:56 +00:00
Patrick Monnerat
43b10339ab Upgrade OS400 wrappers and RPG copy file according to latest code updates 2007-10-03 15:09:21 +00:00
Yang Tse
3f3a38f9c6 Fix issue related with the use of ares_timeout() result. 2007-10-03 13:19:34 +00:00
Daniel Stenberg
4bf28cb904 exported symbols must use lowercase "curl_", and I also fixed two compiler
warnings, one C99 thing and the bad pointer sent to the callback
2007-10-03 08:58:40 +00:00
Daniel Stenberg
1abde9009a recount contributors after the 7.17.0 release 2007-10-03 08:54:35 +00:00
Daniel Stenberg
db85a941d0 people from the 7.17.0 announcement 2007-10-03 08:51:36 +00:00
Daniel Stenberg
1bfb0fc5da "97 - check ip callback", check 2007-10-03 08:46:45 +00:00
Daniel Stenberg
ce1cfcb7a6 Alexey Pesternikov introduced CURLOPT_OPENSOCKETFUNCTION and
CURLOPT_OPENSOCKETDATA to set a callback that allows an application to replace
the socket() call used by libcurl. It basically allows the app to change
address, protocol or whatever of the socket. (I also did some whitespace
indent/cleanups in lib/url.c which kind of hides some of these changes, sorry
for mixing those in.)
2007-10-03 08:45:00 +00:00
Daniel Stenberg
ce81cd21d3 I renamed the CURLE_SSL_PEER_CERTIFICATE error code to
CURLE_PEER_FAILED_VERIFICATION (standard CURL_NO_OLDIES style), and made this
return code get used by the previous SSH MD5 fingerprint check in case it
fails.
2007-10-03 08:07:50 +00:00
Daniel Stenberg
51c6a5d43b Based on a patch brought by Johnny Luong, libcurl now offers
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 and the curl tool --hostpubmd5. They both make
the SCP or SFTP connection verify the remote host's md5 checksum of the public
key before doing a connect, to reduce the risk of a man-in-the-middle attack.
2007-10-03 08:00:42 +00:00
Daniel Stenberg
15b8da1980 "99 - curl_easy_close()" seems to have gone uninteresting 2007-10-02 22:00:03 +00:00
Daniel Stenberg
c1c257d19a 102, check 2007-10-02 21:59:06 +00:00
Yang Tse
08b9f73219 Fix memory leak under low memory conditions. 2007-10-02 19:19:47 +00:00
Yang Tse
94162d62ac Avoid a segfault when generating a DNS "Transaction ID" in internal
function init_id_key() under low memory conditions.
2007-10-02 18:26:48 +00:00
Yang Tse
059707be32 Renamed a couple of global variables to avoid shadowing warnings 2007-10-02 16:05:28 +00:00
Yang Tse
048bfeaaef Fix compiler warning 2007-10-02 15:26:30 +00:00
Yang Tse
a137109a0c <winber.h> needed for Windows LDAP client 32 API support 2007-10-02 14:48:38 +00:00
Yang Tse
17c01d21a9 Linking with wldap32.lib needed for Windows LDAP client 32 API support 2007-10-02 14:26:04 +00:00
Yang Tse
f5cad68d22 Add ares_llist.c and ares_llist.h to MSCV project file. 2007-10-02 11:13:58 +00:00
Daniel Stenberg
119364741e known bug #46: chunked-encoded CONNECT responses from a http proxy now works.
Added test case 1008 to verify. Note that #47 is still there.
2007-10-02 10:21:36 +00:00
Daniel Stenberg
8d1239c091 Disable the Nagle algorithm and send back responses in small chunks in an
attempt to force smaller bits to get read by clients.
2007-10-02 10:13:37 +00:00
Daniel Stenberg
30a39fe877 document --post301, based on the phrasing in curl_easy_setopt.3 for
CURLOPT_POST301 written by Philip Langdale
2007-10-02 09:57:48 +00:00
Daniel Stenberg
0489081d3f CURLOPT_POST301 section, added by Philip Langdale 2007-10-02 09:56:52 +00:00
Daniel Stenberg
19c8da85d8 Fixed the problem where next_lookup would use 'status' uninitialized. Now
it gets passed the initial value as an argument.
2007-10-02 08:12:30 +00:00
Yang Tse
b03abddb28 Avoid inline C99ism, and move c-ares routines for managing doubly-linked lists. 2007-10-02 02:18:01 +00:00
Daniel Stenberg
ccf083e26d ares_strerror() segfaulted if the input error number was out of the currently
supported range.
2007-10-01 22:52:31 +00:00
Daniel Stenberg
dbd4abf0ff Prevent ares_strerror() from segfaulting if an invalid error code is passed
in as argument!
2007-10-01 22:51:38 +00:00
Daniel Stenberg
9ca2644429 Added test536 that was accidentally missing. I also wrote up a new makefile
target called 'filecheck' so that if you run 'make filecheck' in this directory
it'll check if the local files are also mentioned in the Makefile.am so that
they are properly included in release archives!
2007-09-30 22:58:24 +00:00
Daniel Stenberg
ec08e2f9f2 Alex Fishman reported a curl_easy_escape() problem that was made the
function do wrong on all input bytes that are >= 0x80 (decimal 128) due to a
signed / unsigned mistake in the code. I fixed it and added test case 543 to
verify.
2007-09-30 22:40:24 +00:00
Yang Tse
38dd0ede9d Fix compiler warning 2007-09-30 19:43:23 +00:00
Yang Tse
62c264bcdb check availability of <netinet/tcp.h> 2007-09-30 02:12:11 +00:00
Yang Tse
b108c664ac Fix missing right parenthesis 2007-09-30 01:27:39 +00:00
Yang Tse
64db60397b Fix comparison between signed and unsigned 2007-09-30 01:01:43 +00:00
Yang Tse
d243908a01 improve portability, defining MAXDNAME and MAXCDNAME 2007-09-30 00:37:47 +00:00
Steinar H. Gunderson
c145fbea49 Fix a memory leak that I recently inadvertedly introduced. 2007-09-30 00:08:01 +00:00
Steinar H. Gunderson
84fcff79f4 Use ISDIGIT instead of isdigit; fixes a gcc warning. 2007-09-29 21:57:05 +00:00
Daniel Stenberg
f58ba5ab1c Immanuel Gregoire fixed a problem with persistent transfers over SFTP - the
previous proto struct was kept.
2007-09-29 21:34:34 +00:00
Steinar H. Gunderson
2694b970e8 Port the TCP socket fix made in ares_fds() to ares_getsock() as well. 2007-09-29 19:26:59 +00:00
Steinar H. Gunderson
23f5d145ec Previously, processing a large batch of timeouts was O(n^2) in the number of
outstanding queries, and processing a DNS response packet was O(n) in the
number of outstanding queries. To speed things up in Google, we added a few circular,
doubly-linked lists of queries that are hash-bucketed based on
the attributes we care about, so most important operations are now O(1).

It might be that the number of buckets are higher than most people would need,
but on a quick calculation it should only be 100kB or so even on a 64-bit
system, so I've let it stay as-is.
2007-09-29 18:18:47 +00:00
Gisle Vanem
b01ab65225 We should standarise on C comments. 2007-09-29 14:37:47 +00:00
Gisle Vanem
7a7f490efa Fix compiler warning in setsockopt(). 2007-09-29 14:34:59 +00:00
Steinar H. Gunderson
95c15fce0c TCP queries can time out too, not just UDP queries. (Patch from the Google tree.) 2007-09-29 14:25:14 +00:00
Steinar H. Gunderson
c788efffd4 Read and process as many packets as possible in read_udp_packets, to avoid having to run the entire event loop once per packet. (Patch from the Google tree.) 2007-09-29 14:21:47 +00:00
Steinar H. Gunderson
c1a475e708 There are two different places in write_tcp_data() that advance the send_queue; however, they are slightly different and only the first one properly uses a while loop. Consolidate both into a single function that DTTR. (Patch from the Google tree.) 2007-09-29 14:09:14 +00:00
Steinar H. Gunderson
d0de9663e2 Reject names that are longer than 255 characters, to avoid problems with strict or buggy DNS server implementations. (Patch from the Google tree) 2007-09-29 13:58:23 +00:00
Steinar H. Gunderson
d6dd848523 In ares_mkquery, make sure we set buflen and buf to reasonable values if there's an error. (Patch from the Google tree) 2007-09-29 13:56:36 +00:00
Steinar H. Gunderson
9fc66e4dd9 Be stricter about what's a valid IP address in fake_hostent. (Patch from the Google tree.) 2007-09-29 13:52:14 +00:00
Steinar H. Gunderson
6ecea9453b Handle the root of the DNS tree correctly in ares_expand_name. 2007-09-29 13:38:17 +00:00
Daniel Stenberg
2c105af910 Adapted the c-ares code to the API change c-ares 1.5.0 brings in the
notifier callback(s).
2007-09-28 21:48:28 +00:00
Daniel Stenberg
bb667c8ac6 rename variable to prevent shadow warning 2007-09-28 21:45:05 +00:00
Daniel Stenberg
8179743cee today's modifications by Steinar and me 2007-09-28 20:28:20 +00:00
Daniel Stenberg
3d59a3855a Bumped version to 1.5.0 for next release and soname bumped to 2 due to ABI
and API changes in the progress callback (and possibly more coming up from
Steinar)
2007-09-28 20:28:06 +00:00
Dan Fandrich
8388366849 Renamed a variable to avoid shadowing a global declarations. 2007-09-28 18:47:59 +00:00
Steinar H. Gunderson
ef3b425b11 Unrevert previous 'missing' hunks. They were missing since the patch is still in for review :-) 2007-09-28 15:56:28 +00:00
Steinar H. Gunderson
026d93b4f6 Yet more missing hunks... Nggh. 2007-09-28 15:55:11 +00:00
Steinar H. Gunderson
36710c4586 Always register for TCP events even if there are no outstanding queries, as the other side could always close the connection, which is a valid event which should be responded to. 2007-09-28 15:53:10 +00:00
Steinar H. Gunderson
63ac6156aa Forgot to include a few hunks from ares_process.c earlier. Fixing now. 2007-09-28 15:51:00 +00:00
Steinar H. Gunderson
08a70d117c Support a few more socket options, and refactor the option setting a bit. (Patch from the Google tree.) 2007-09-28 15:15:39 +00:00
Steinar H. Gunderson
6ce589c3ee Make the query callbacks return the number of timeouts that happened during the execution of a query, and update documentation accordingly. (Patch from the Google tree.) 2007-09-28 14:46:51 +00:00
Steinar H. Gunderson
d426c20c0a Three fixes in one commit (sorry): a) Take care of the tcpbuf if it ends while queued for transmission, note broken servers and close them in the main loop, and store TCP socket generation number in order not to send the same query twice over the same socket. 2007-09-28 14:28:14 +00:00
Steinar H. Gunderson
54ca7d8cb2 Don't skip a server if it's the only one. (Bugfix from the Google tree.) 2007-09-28 14:26:11 +00:00
Dan Fandrich
0819c3a8cf Don't strdup an empty string 2007-09-27 18:39:10 +00:00
Dan Fandrich
ad05b22de3 Renamed a few variables to avoid shadowing global declarations. 2007-09-27 18:12:03 +00:00
Dan Fandrich
9fc8800b6d Removed cut-and-paste cruft leading to fclose() of an unopened file 2007-09-27 17:22:10 +00:00
Daniel Stenberg
a4d6611d26 a name resolve that times out is still a failed name resolve 2007-09-27 12:05:39 +00:00
Daniel Stenberg
015fc6aa17 wrong, revert the previous "fix" and instead check that the fd_set pointer
is non-NULL before we FD_CLR
2007-09-27 12:04:56 +00:00
Daniel Stenberg
a739b9bc45 eek, fix the conditions to return on either problem instead of requiring
both to occur
2007-09-27 12:02:15 +00:00
Dan Fandrich
0bd2d54814 Renamed a few variables to avoid shadowing global declarations. 2007-09-27 02:45:58 +00:00
Dan Fandrich
16b95fc773 Enabled a few more gcc warnings with --enable-debug. Renamed a few
variables to avoid shadowing global declarations.
2007-09-27 01:45:22 +00:00
Yang Tse
9c5cd6c413 Fix compiler warning: the address of 'env' will always evaluate as 'true' 2007-09-27 00:58:41 +00:00
Daniel Stenberg
9b55056423 we added a curl_easy_setopt() option too 2007-09-26 12:46:03 +00:00
Daniel Stenberg
fd4cf78f36 Philip Langdale provided the new CURLOPT_POST301 option for
curl_easy_setopt() that alters how libcurl functions when following
redirects. It makes libcurl obey the RFC2616 when a 301 response is received
after a non-GET request is made. Default libcurl behaviour is to change
method to GET in the subsequent request (like it does for response code 302
- because that's what many/most browsers do), but with this CURLOPT_POST301
option enabled it will do what the spec says and do the next request using
the same method again. I.e keep POST after 301.

The curl tool got this option as --post301

Test case 1011 and 1012 were added to verify.
2007-09-26 12:44:59 +00:00
Daniel Stenberg
a6315359d7 Max Katsev reported that when doing a libcurl FTP request with
CURLOPT_NOBODY enabled but not CURLOPT_HEADER, libcurl wouldn't do TYPE
before it does SIZE which makes it less useful. I walked over the code and
made it do this properly, and added test case 542 to verify it.
2007-09-26 12:00:01 +00:00
Dan Fandrich
966130132f Make glibc define the prototype for strcasestr 2007-09-25 17:33:56 +00:00
Daniel Stenberg
a19de6e9ac a new Lua binding and I shortened the wording on several bindings by cutting
out "written"
2007-09-25 08:46:49 +00:00
Dan Fandrich
bdfeaa0f95 #ifdef out a few more functions when SSL is disabled. 2007-09-25 06:45:05 +00:00
Dan Fandrich
c478200766 Use a native strcasestr() if found. 2007-09-25 06:43:58 +00:00
Daniel Stenberg
775f86cb5a Immanuel Gregoire fixed KNOWN_BUGS #44: --ftp-method nocwd did not handle
URLs ending with a slash properly (it should list the contents of that
directory). Test case 351 brought back and also test 1010 was added.
2007-09-24 21:47:35 +00:00
Daniel Stenberg
db1c92ceac Bad use of "its" replaceed with a rephrase. I noticed this flaw thanks to the
Debian bug report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=443734
2007-09-24 10:56:26 +00:00
Daniel Stenberg
0f4664d27f Steinar H. Gunderson fixed: Correctly clear sockets from the fd_set on in
several functions (write_tcp_data, read_tcp_data, read_udp_packets) so that
if it fails and the socket is closed the following code doesn't try to use
the file descriptor.
2007-09-22 21:23:10 +00:00
Daniel Stenberg
0f89a2e639 Steinar H. Gunderson modified c-ares to now also do to DNS retries even when
TCP is used since there are several edge cases where it still makes sense.
2007-09-22 21:04:16 +00:00
Daniel Stenberg
05b26e7566 Brad House provided a fix for ares_save_options(): Apparently I overlooked
something with the ares_save_options() where it would try to do a malloc(0)
when no options of that type needed to be saved.  On most platforms, this was
fine because malloc(0) doesn't actually return NULL, but on AIX it does, so
ares_save_options would return ARES_ENOMEM.
2007-09-22 20:45:50 +00:00
Daniel Stenberg
6c511abf43 --proxy-negotiate is added in 7.17.1 2007-09-21 11:53:56 +00:00
Daniel Stenberg
bb6d0771c2 the NSS patch has been committed 2007-09-21 11:19:13 +00:00
Daniel Stenberg
75f6c36e51 Available command line options: 119 2007-09-21 11:08:03 +00:00
Daniel Stenberg
015d5869d7 Mark Davies fixed Negotiate authentication over proxy, and also introduced
the --proxy-negotiate command line option to allow a user to explicitly
select it.
2007-09-21 11:05:31 +00:00
Dan Fandrich
4686adb433 Added variable substitution to the <verify><file> section.
Made a few more tests work remotely.
2007-09-20 20:39:17 +00:00
Daniel Stenberg
785a4899f5 reformatted to be similar to the FAQ to make it look nicer on the site:
http://curl.haxx.se/docs/contribute.html
2007-09-20 14:43:31 +00:00
Daniel Stenberg
da62aff6bb Achint Mehta pointed out this dead link 2007-09-20 14:19:57 +00:00
Daniel Stenberg
322308e298 the winsock stuff is made by curl_global_init 2007-09-20 14:05:53 +00:00
Daniel Stenberg
b53e326828 fix bad link 2007-09-20 14:05:11 +00:00
Daniel Stenberg
0885d787ab Immanuel Gregoire is the man 2007-09-20 14:02:34 +00:00
Dan Fandrich
2620d78e94 Fixed typo in error message. 2007-09-20 00:37:08 +00:00
Daniel Stenberg
8c3f40ee32 Rob Crittenden provided an NSS update with the following highlights:
o It looks for the NSS database first in the environment variable SSL_DIR,
  then in /etc/pki/nssdb, then it initializes with no database if neither of
  those exist.

o If the NSS PKCS#11 libnspsem.so driver is available then PEM files may be
  loaded, including the ca-bundle. If it is not available then only
  certificates already in the NSS database are used.

o Tries to detect whether a file or nickname is being passed in so the right
  thing is done

o Added a bit of code to make the output more like the OpenSSL module,
  including displaying the certificate information when connecting in
  verbose mode

o Improved handling of certificate errors (expired, untrusted, etc)

The libnsspem.so PKCS#11 module is currently only available in Fedora
8/rawhide. Work will be done soon to upstream it. The NSS module will work
with or without it, all that changes is the source of the certificates and
keys.
2007-09-18 22:21:54 +00:00
Daniel Stenberg
b1aafbd957 mention the prefered source code line length to be less than 80 columns 2007-09-18 21:33:05 +00:00
Daniel Stenberg
45fd6685bd Immanuel pointed out that public key SSH auth failed if no public/private
key was specified and there was no HOME environment variable, and then it
didn't continue to try the other auth methods. Now it will instead try to
get the files id_dsa.pub and id_dsa from the current directory if none of
the two conditions were met.
2007-09-18 21:14:28 +00:00
Dan Fandrich
0159636373 Use double quotes in command lines for consistency. 2007-09-18 20:41:20 +00:00
Gunter Knauf
7ac7c119be added a define for Win32 to detect already defined ssize_t. 2007-09-18 18:18:34 +00:00
Dan Fandrich
4f067b1d1c IPv6 is a required feature for these two tests, even if it's not obvious. 2007-09-18 17:41:04 +00:00
Dan Fandrich
ae60745e3e Fixed the required server entry 2007-09-17 23:23:13 +00:00
Dan Fandrich
7f496d8c3f Changed some FTP tests to validate the format of the PORT and EPRT commands
sent by curl, if not the addresses themselves.
2007-09-17 21:44:57 +00:00
Dan Fandrich
048c74f2fa Added %CLIENTIP and %CLIENT6IP data file substitution variables.
Added hooks to the test suite to make it possible to test a curl running
on a remote host.
2007-09-17 21:42:01 +00:00
Dan Fandrich
0ed57d370d Allow setting the IP address on which to listen for connections. 2007-09-17 21:39:34 +00:00
Daniel Stenberg
551abba277 Gnter's ldap fixes 2007-09-17 20:43:05 +00:00
Dan Fandrich
9b11a84e74 Make the ftp server connect to the address given by curl in the PORT/EPRT
instead of hard-coding it to 127.0.0.1
2007-09-17 18:12:11 +00:00
Dan Fandrich
26f8de459a Made the directory postprocessor more forgiving of input directory format 2007-09-17 17:22:46 +00:00
Daniel Stenberg
ceff98fd49 three done, seven to go 2007-09-15 22:05:20 +00:00
Daniel Stenberg
e04151ed76 Michal Marek made libcurl automatically append ";type=<a|i>" when using HTTP
proxies for FTP urls.
2007-09-15 21:14:12 +00:00
Daniel Stenberg
cdb2552424 offer a friendlier single-line command 2007-09-15 21:06:11 +00:00
Gunter Knauf
b41e65a8e3 fixed ldap support for winldap. 2007-09-15 20:03:03 +00:00
Gunter Knauf
be8c219ec2 fixed VC6 makefiles for new ldap linkage. 2007-09-15 20:02:22 +00:00
Daniel Stenberg
099c011059 I want these CONNECT problems fixed too 2007-09-15 08:51:42 +00:00
Daniel Stenberg
245a780711 7.17.1 planned release in November 2007, and a bunch of things to deal with 2007-09-15 08:50:04 +00:00
Dan Fandrich
05e4a3026d Replaced 127.0.0.1 with %HOSTIP where possible 2007-09-14 19:32:31 +00:00
Dan Fandrich
39a416f12a Added LDAPS, SCP and SFTP to curl-config --protocols. Removed and
fixed some AC_SUBST configure entries.
2007-09-14 01:56:08 +00:00
Dan Fandrich
9b23b31071 Added LDAPS, SCP and SFTP to curl-config --protocols.
Removed and fixed some AC_SUBST configure entries.
2007-09-14 01:24:59 +00:00
Dan Fandrich
8412d1e493 Compile samples with -DCURL_NO_OLDIES 2007-09-13 22:20:35 +00:00
Daniel Stenberg
2ee41a5ffc 7.17.1-CVS is now the dev version 2007-09-13 21:06:19 +00:00
Daniel Stenberg
a18f599482 start over on 7.17.1 2007-09-13 21:05:56 +00:00
Dan Fandrich
6d27647b61 Remove remaining traces of ftp3rdparty.c and mention htmltidy.c 2007-09-13 20:36:52 +00:00
Daniel Stenberg
3bc11344de Version 7.17.0 (13 September 2007) 2007-09-13 20:22:14 +00:00
Daniel Stenberg
3dbe708308 added some further stuff from the feature-requests tracker, and a bunch of URLs
to the specific tracker entries
2007-09-13 09:02:15 +00:00
Dan Fandrich
621709c623 TFTP error 0 is no longer treated as success 2007-09-12 18:20:52 +00:00
Daniel Stenberg
9e241864e3 Extracting the CURLINFO_PRIVATE pointer makes no point since nothing set
it. This caused a segfault in some fprintf() implementations. Like on Solaris.
2007-09-12 10:46:14 +00:00
Daniel Stenberg
cf613fdba4 rephrased to mention ftp 2007-09-11 22:37:47 +00:00
Daniel Stenberg
e6addcf624 curl.digimirror.nl is a new mirror in Amsterdam, the Netherlands 2007-09-11 22:36:39 +00:00
Daniel Stenberg
9e88343a17 Daniel S (12 September 2007)
- Bug report #1792649 (http://curl.haxx.se/bug/view.cgi?id=1792649) pointed
  out a problem with doing an empty upload over FTP on a re-used connection.
  I added test case 541 to reproduce it and to verify the fix.

- I noticed while writing test 541 that the FTP code wrongly did a CWD on the
  second transfer as it didn't store and remember the "" path from the
  previous transfer so it would instead CWD to the entry path as stored. This
  worked, but did a superfluous command. Thus, test case 541 now also verifies
  this fix.
2007-09-11 22:23:57 +00:00
Daniel Stenberg
1ce732e9d6 - I noticed while writing test 541 that the FTP code wrongly did a CWD on the
second transfer as it didn't store and remember the "" path from the
  previous transfer so it would instead CWD to the entry path as stored. This
  worked, but did a superfluous command. Thus, test case 541 now also verifies
  this fix.
2007-09-11 22:21:39 +00:00
Daniel Stenberg
cc618e761c - Bug report #1792649 (http://curl.haxx.se/bug/view.cgi?id=1792649) pointed
out a problem with doing an empty upload over FTP on a re-used connection.
  I added test case 541 to reproduce it and to verify the fix.
2007-09-11 22:21:12 +00:00
Daniel Stenberg
24db40de7c A brand new binding for SP-Forth was written 2007-09-09 22:22:45 +00:00
Dan Fandrich
7350f9851a TFTP now reports the "not defined" TFTP error code 0 as an error,
not success.
2007-09-07 20:35:37 +00:00
Dan Fandrich
d030dfa6e2 Added test case 1007 to test permission problem when uploading with TFTP
(to validate bug #1790403).
2007-09-07 20:05:20 +00:00
Daniel Stenberg
14d6db0873 http://curl.cheap.co.il is a new mirror in Tel-Aviv, Israel 2007-09-06 21:38:50 +00:00
Daniel Stenberg
0ff311aa1a two new CONNECT response problems that have appeared 2007-09-06 13:38:05 +00:00
Dan Fandrich
8147c3659d Minix doesn't support getsockopt on UDP sockets or send/recv on TCP
sockets.
2007-09-05 22:01:57 +00:00
Daniel Stenberg
73e91ce20c Curl_GetFTPResponse() now checks and properly deals with the fact that the
underlying ftp_readresp() function has a separate "cache" where there might
in fact be leftover data...
2007-09-05 21:41:07 +00:00
Dan Fandrich
8780ff879c Minix doesn't support getsockopt on UDP sockets or send/recv on TCP
sockets.
2007-09-05 17:22:23 +00:00
Dan Fandrich
6fd1cfeab1 Minor updates 2007-09-05 17:17:59 +00:00
Daniel Stenberg
9d0533056c I can't spell 2007-09-03 14:10:32 +00:00
Daniel Stenberg
6c4f317f7f curlpp 0.7.1 was relased 2007-09-03 14:08:23 +00:00
Gunter Knauf
21ed69b51e added some comments for MingW32 builds. 2007-09-03 11:10:46 +00:00
Dan Fandrich
3b819b3064 bash is not required when compiling under Minix 2007-09-01 21:21:52 +00:00
Dan Fandrich
3fa60164af Renamed the CURLE_FTP_SSL_FAILED error code to CURLE_USE_SSL_FAILED.
Renamed the curl_ftpssl enum to curl_usessl and its enumerated constants,
creating macros for backward compatibility.
2007-08-31 19:36:32 +00:00
Dan Fandrich
ac6e0501c6 Made some of the error strings returned by the *strerror functions more
generic, and more consistent with each other.
2007-08-31 17:56:06 +00:00
Dan Fandrich
4f17c58315 Fixed an invalid returned error code added in my last submission. 2007-08-31 17:54:01 +00:00
Dan Fandrich
f6251734fc Added more accurate error code returns from SFTP operations. Added test
case 615 to test an SFTP upload failure.
2007-08-30 23:03:59 +00:00
Dan Fandrich
9f44a95522 Renamed several libcurl error codes and options to make them more general
and allow reuse by multiple protocols. Several unused error codes were
removed.  In all cases, macros were added to preserve source (and binary)
compatibility with the old names.  These macros are subject to removal at
a future date, but probably not before 2009.  An application can be
tested to see if it is using any obsolete code by compiling it with the
CURL_NO_OLDIES macro defined.

Documented some newer error codes in libcurl-error(3)
2007-08-30 20:34:57 +00:00
Gunter Knauf
4b60c3e9d3 added --enable-ldaps switch;
renamed LDAP(S) messages from 'yes' to 'enabled'.
2007-08-30 20:28:40 +00:00
Dan Fandrich
5d4c981e13 Fixed a few compiler warnings. Try to do a slightly better job of
cleaning up after an OOM condition in curl_multi_add_handle
2007-08-30 18:26:19 +00:00
Daniel Stenberg
da4a776758 Made Curl_GetFTPResponse() use lots less code and instead use the proper
low-level ftp_readresp() function. Hopefully adressing bug #1779054.
2007-08-30 14:06:00 +00:00
Dan Fandrich
1b66c1da6c Added lots of consts 2007-08-29 05:36:53 +00:00
Dan Fandrich
5cb2ee878c Mention that 'make test' does more than just run all the tests (suggested
by Kris/tinker105 in bug #1779054) and mention the torture tests.
2007-08-28 18:23:19 +00:00
Dan Fandrich
8cf0814a14 Fixed some minor type mismatches and missing consts mainly found by splint. 2007-08-27 06:31:28 +00:00
Dan Fandrich
523767660c Fixed some minor mismatched types found by splint. 2007-08-26 05:53:26 +00:00
Gunter Knauf
327c0d6b1c bail out with error if someone tries to use another cert than PEM with OpenLDAP. 2007-08-25 12:10:30 +00:00
Gunter Knauf
870842ccee only link with -lwldap32 if we dont use other LDAP SDKs. 2007-08-25 12:08:38 +00:00
Gunter Knauf
68b215157f added defines to build with OpenLDAP. 2007-08-24 17:08:49 +00:00
Patrick Monnerat
a892cf2c12 Adding DOCS file in OS400 installation library with license and various other documentation text files.
Setting character set of OS400 installed source components
2007-08-24 15:56:59 +00:00
Daniel Stenberg
7cba40b218 Bug report #1779054 (http://curl.haxx.se/bug/view.cgi?id=1779054) pointed
out that libcurl didn't deal with large responses from server commands, when
the single response was consisting of multiple lines but of a total size of
16KB or more. Dan Fandrich improved the ftp test script and provided test
case 1006 to repeat the problem, and I fixed the code to make sure this new
test case runs fine.
2007-08-24 14:00:42 +00:00
Patrick Monnerat
d994fcf2b1 Remove leading space in curl_version_info ss_version field. 2007-08-24 09:06:17 +00:00
Dan Fandrich
975fafdc49 Added test case 1005 to test excessively-long replies spread out over
multiple lines (similar to test case 1003).
2007-08-23 23:25:47 +00:00
Dan Fandrich
9537580ba2 Allow ftp server alternate replies to contain backslash-escaped control
characters.
2007-08-23 23:24:39 +00:00
Patrick Monnerat
bc0adcef1f Make ldap.h, gssapi.h and qsossl.h inclusions conditional. 2007-08-23 18:46:45 +00:00
Dan Fandrich
7ffae92daf Need even more time to wait for an accept. 2007-08-23 18:45:28 +00:00
Dan Fandrich
abca03cf36 Added test1004 to validate a previous fix for a memory leak when an
empty proxy server is selected.
2007-08-23 17:35:00 +00:00
Dan Fandrich
374f0214b6 Mention OS/400 and TPF 2007-08-23 17:26:42 +00:00
Daniel Stenberg
4945b2454d ported to OS/400 2007-08-23 15:00:55 +00:00
Daniel Stenberg
a5cb022407 added the two new os400 files 2007-08-23 14:58:10 +00:00
Daniel Stenberg
feb63efc31 Add the files in the OS400 dir to the dist. I didn't add it as a new subdir
just because if I do that automake does funny things automatically with the
makefile.sh file in that directory and thus doing it this way was a quick
work-around that annoyance!
2007-08-23 14:46:37 +00:00
Daniel Stenberg
4cf3ad07e5 --libcurl does not support -F 2007-08-23 14:33:08 +00:00
Patrick Monnerat
557cc55f6f Porting library to OS/400 2007-08-23 14:30:24 +00:00
Gunter Knauf
2d8dba388b added support for CA cert verification;
default now to verify cert unless data->set.ssl.verifypeer is 0.
2007-08-23 00:10:56 +00:00
Daniel Stenberg
91fd2c3bcd Bug report #1779751 (http://curl.haxx.se/bug/view.cgi?id=1779751) pointed
out that doing first a file:// upload and then an FTP upload crashed libcurl
or at best caused furious valgrind complaints. Fixed now by making sure we
free and clear the file-specific struct properly when done with it.
2007-08-22 22:48:41 +00:00
Gisle Vanem
d38891c950 Reversed the 'HAVE_LDAP_URL_PARSE' ifdef statement. 2007-08-22 18:05:46 +00:00
Daniel Stenberg
381e372939 Bug report #1779054 (http://curl.haxx.se/bug/view.cgi?id=1779054) pointed
out that libcurl didn't deal with very long (>16K) FTP server response lines
properly. Starting now, libcurl will chop them off (thus the client app will
not get the full line) but survive and deal with them fine otherwise. Test
case 1003 was added to verify this.
2007-08-22 14:18:06 +00:00
Daniel Stenberg
c347db2e0a added a size > buffer size check to make it easier to track this in the
future
2007-08-22 14:09:13 +00:00
Daniel Stenberg
232a4553b8 Upped the buffer size to 17000+ bytes to prepare for the upcoming test 1003
that verfies ridiculously long server response lines. Also changed sprintf
to snprintf in a few places.
2007-08-22 13:57:49 +00:00
Daniel Stenberg
014f1bea9a 1) the talk about strings used by libcurl doesn't apply to libcurl >= 7.17.0
2) added nroff header
2007-08-22 11:28:26 +00:00
Gunter Knauf
5b4f50857a for now comment the tls_start section... 2007-08-22 10:14:57 +00:00
Gunter Knauf
6f10a718e4 sync libssh2 paths with comments. 2007-08-21 03:04:46 +00:00
Gunter Knauf
658de40930 added targets to create the files missing in CVS which makes calling buildconf.bat obsolete;
removed obsolete wsock32 link lib.
2007-08-21 02:42:29 +00:00
Gunter Knauf
2c06e7f8ef fixed wrong CLAGS define. 2007-08-20 23:31:57 +00:00
Gunter Knauf
fa1c916943 fixed warning with unused var;
removed now obsolete defines since we include now ldap headers which define these.
2007-08-20 23:31:26 +00:00
Daniel Stenberg
b132e865b9 Based on a patch by Christian Vogt, the FTP code now sets the upcoming
download transfer size much earlier to be possible to get read with
CURLINFO_CONTENT_LENGTH_DOWNLOAD as soon as possible.
2007-08-20 21:54:00 +00:00
Gunter Knauf
77431568d2 converted tabs to spaces. 2007-08-20 19:33:46 +00:00
Gunter Knauf
e16c1b8e28 removed trailing spaces. 2007-08-20 19:30:25 +00:00
Dan Fandrich
1a8d8aa227 Increase timeout for accept for improved reliability on loaded servers. 2007-08-20 17:53:38 +00:00
Gunter Knauf
d4c4fd6272 compile with ldaps by default since it seems to work fine so far. 2007-08-20 16:34:04 +00:00
Gunter Knauf
acb905231d fixed ldaps section for OpenLDAP. Still not working, but at least it compiles now, and should serve as base to get it finally working. Also seems that the ifdefs can be arranged some better because the Solaris and Netscape/iPlanet/Mozilla LDAP SDKs seem to be closer to the Novell section than the OpenLDAP one. 2007-08-20 16:30:41 +00:00
Gunter Knauf
c915eac93c added some comments about the paths and build options;
added define to build with ldaps support;
enabled build with the Novell LDAP SDK.
2007-08-20 16:21:51 +00:00
Gunter Knauf
72e675caee dont set CURL_LDAP_HYBRID for MingW32 configure builds. 2007-08-20 15:51:45 +00:00
Gunter Knauf
e347cff0e4 added define for ldap_ssl.h. 2007-08-20 12:50:44 +00:00
Gunter Knauf
d79fdbc46e ignore errors of the RM command; seems that the del command fails on W2K when the file to delete isnt found while on XP it only prints the warning but make continues.... 2007-08-19 23:23:50 +00:00
Gunter Knauf
ab13c2f814 added some comments in the makefiles about build options. 2007-08-19 00:26:24 +00:00
Daniel Stenberg
138ca334f9 ignore all the binaries and the .deps and .libs 2007-08-17 22:33:25 +00:00
Daniel Stenberg
1aa82decea - Robson Braga Araujo filed bug report #1776232
(http://curl.haxx.se/bug/view.cgi?id=1776232) about libcurl calling
  Curl_client_write(), passing on a const string that the caller may not
  modify and yet it does (on some platforms).
2007-08-17 22:31:51 +00:00
Daniel Stenberg
014fe6971e remove stupid comment since there's no content in this test case 2007-08-17 22:24:51 +00:00
Daniel Stenberg
3217809294 Robson Braga Araujo filed bug report #1776235
(http://curl.haxx.se/bug/view.cgi?id=1776235) about ftp requests with NOBODY
on a directory would do a "SIZE (null)" request. This is now fixed and test
case 1000 was added to verify.
2007-08-17 22:22:43 +00:00
Daniel Stenberg
f3c7adcb54 NEXT soname bump
* #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
   from being output in NOBODY requests over ftp
2007-08-17 22:21:41 +00:00
Daniel Stenberg
dcf698dc74 some keywords for future stats/coverage checks 2007-08-17 22:17:23 +00:00
Daniel Stenberg
54117be639 Moved the 5320 and 5322 into the 1000-series instead which is a documented
range. They are about FTP but the 100-199 range is full.
2007-08-17 22:11:25 +00:00
Daniel Stenberg
5a79532aee Song Ma provided a patch that cures a problem libcurl has when doing resume
HTTP PUT using Digest authentication. Test case 5320 and 5322 were also
added to verify the functionality.
2007-08-17 20:21:32 +00:00
Gunter Knauf
29ac001aa6 fixed warning about uninitialized. 2007-08-16 15:23:39 +00:00
Gunter Knauf
ccba0d10b6 added basic ldaps support; for now its ifdef'd with HAVE_LDAP_SSL unless we know its fully working, and available with all LDAP SDKs.
Win32 requires to have the trusted CA in local keystore - I've not found yet a way to disable the cert check.
2007-08-16 14:08:47 +00:00
Gunter Knauf
7f7e42732d added define PORT_LDAPS. 2007-08-15 16:17:32 +00:00
Patrick Monnerat
ca410ec2ca Fix a potential buffer overflow bug in lib/version.c 2007-08-15 14:49:16 +00:00
Gunter Knauf
e5d8693865 added ldap_msgfree() to fix memory leak. 2007-08-15 08:18:37 +00:00
Gunter Knauf
46c92c0b80 added a dependency for libcares if build with ares support;
other minor makefile tweaks.
2007-08-14 18:39:26 +00:00
Dan Fandrich
7b5d148b1f LDAP is no longer excluded on Minix. 2007-08-14 17:23:32 +00:00
Gunter Knauf
f4bc326670 updated NetWare docu about recent LDAP changes. 2007-08-14 16:43:52 +00:00
Gunter Knauf
327598e7b4 only include LDAP headers if we build with LDAP support. 2007-08-14 16:31:20 +00:00
Gunter Knauf
11caaad5f9 added -lwldap32 to link libs. 2007-08-14 14:48:25 +00:00
Gunter Knauf
3e0845e182 changed autoload dependent LDAP NLM. 2007-08-14 13:01:40 +00:00
Gunter Knauf
a2c7abea6c trial to enable LDAP support again with patched Novell headers. 2007-08-14 12:02:10 +00:00
Daniel Stenberg
2f8f12e82e Andrew Wansink provided an NTLM bugfix: in the case the server sets the flag
NTLMFLAG_NEGOTIATE_UNICODE, we need to filter it off because libcurl doesn't
unicode encode the strings it packs into the NTLM authenticate packet.
2007-08-14 10:28:21 +00:00
Daniel Stenberg
5cdcc2b3aa the curl_multi_handle_control() idea 2007-08-14 10:11:34 +00:00
Dan Fandrich
652e2cf57c Removed redundant dependency lines 2007-08-13 18:11:37 +00:00
Dan Fandrich
8ee5e95ab1 Removed unused variable. 2007-08-13 16:37:51 +00:00
Patrick Monnerat
22c61d8da6 Simplify and rename internal structure to avoid potential name clash with LDAP header file. 2007-08-13 13:03:08 +00:00
Daniel Stenberg
1b88990cbb Fixed the LDAP_DEPRECATED #define as suggested by Daniel Johnson, and
indented some of the code to curl-style
2007-08-12 22:25:50 +00:00
Daniel Stenberg
df3e8e19c1 minor change in language for the --libcurl source header 2007-08-12 20:36:06 +00:00
Gunter Knauf
44dc36cc8f disable LDAP since we can no longer compile due to header incompatiblities. 2007-08-12 00:48:10 +00:00
Daniel Stenberg
6d3701318d Allen Pulsifer provided a patch that makes libcurl set the expected download
size earlier when doing HTTP downloads, so that applications and the
progress meter etc know get the info earlier in the flow than before.
2007-08-11 21:05:13 +00:00
Daniel Stenberg
d0edb47896 Patrick Monnerat modified the LDAP code and approach in curl. Starting now,
the configure script checks for openldap and friends and we link with those
libs just like we link all other third party libraries, and we no longer
dlopen() those libraries. Our private header file lib/ldap.h was renamed to
lib/curl_ldap.h due to this. I set a tag in CVS (curl-7_17_0-preldapfix)
just before this commit, just in case.
2007-08-11 20:57:54 +00:00
Gunter Knauf
b238e0b1b4 fixed warning with gcc 4.x (hopefully); dynamincally imported UseAccurateCaseForPaths() for CLIB port to be stonetime-compatible (NW 3.x). 2007-08-09 22:33:49 +00:00
Gunter Knauf
3f62bfb61d fixed a warning which MingW gcc 4.2.1. 2007-08-09 21:05:05 +00:00
Dan Fandrich
c7a66d5af4 There's no need to ignore the User-Agent for this test. 2007-08-09 03:28:16 +00:00
Gunter Knauf
1866b95b7f moved ugly CLIB define to nwos.c. 2007-08-08 20:09:08 +00:00
Dan Fandrich
668c204970 Song Ma noted a zlib memory leak in the illegal compressed header
countermeasures code path.
2007-08-08 17:51:40 +00:00
Gunter Knauf
af2d899d6b removed asm rules since we have no asm in the sources, and this produced 2 warnings. 2007-08-08 17:07:16 +00:00
Gunter Knauf
d5ed9f787f blocked ssize_t define for MingW32. 2007-08-08 16:59:43 +00:00
Patrick Monnerat
259f27b09f Fix getsockname argument type
Improve "universal" alignment type in struct memdebug
2007-08-08 10:37:07 +00:00
Daniel Stenberg
c1b9356081 Usage of the BCURLOPT_PROGRESSFUNCTION callback is not recommended when using
the multi interface, but having the comment in here caused more questions than
we fixed problems so I remove it now. It still works fine.
2007-08-07 21:14:31 +00:00
Dan Fandrich
c669e1ae45 Fixed torture test for test 509 2007-08-07 18:24:49 +00:00
Gunter Knauf
10203cada9 moved HAVE_LONGLONG from makefiles to config-win32.h. 2007-08-07 17:40:56 +00:00
Daniel Stenberg
58b0415d36 add URL to more "generated public config.h" details 2007-08-07 13:01:36 +00:00
Patrick Monnerat
ad9cb40b6f Some #if --> #ifdef
undef standard *printf before (re)defining them
2007-08-07 12:44:38 +00:00
Dan Fandrich
2e60ca382d Fixed some icc compiler warnings. 2007-08-07 00:10:27 +00:00
Gunter Knauf
25920f4a14 Peteris Krumins pointed out that MingW32 doesnt provide a batch file to set the path to the bin folder. 2007-08-06 22:21:38 +00:00
Daniel Stenberg
160c302933 ontributors from the 7.16.4 release notes and a removed duplicate 2007-08-06 15:58:05 +00:00
Daniel Stenberg
dddc8e3374 removed the rsaglue hint since it doesn't apply to modern OpenSSL, and added
some brief hints about gssapi and libssh2
2007-08-06 15:54:38 +00:00
Daniel Stenberg
bccb1ee7cd we now support GSS/Kerberos 5 for ftp file transfers! 2007-08-06 14:56:21 +00:00
Daniel Stenberg
26af759732 Patrick Monnerat updated the _FORM_DEBUG-enabled code, and I updated comments
based on his comments/suggestions.
2007-08-05 21:33:31 +00:00
Gunter Knauf
87fc4ad919 changed to use libssh2 0.16;
fixed link order in case libssh2 is build with zlib.
2007-08-04 23:35:23 +00:00
Daniel Stenberg
b214298960 another mirror 2007-08-04 20:58:53 +00:00
Daniel Stenberg
1926f4573d Patrick Monnerat fixed curl_easy_escape() and curlx_strtoll() to work on
non-ASCII systems.
2007-08-04 20:47:59 +00:00
Dan Fandrich
7fe65aaf5b Fixed a couple of compiler warnings. 2007-08-04 16:54:58 +00:00
Dan Fandrich
0d3d84e3ff Refactored CreateConnection() somewhat to reduce its length by splitting
it into a few new functions.
Fixed a few leaks in out of memory conditions, including for test case 231.
2007-08-03 22:46:59 +00:00
Gunter Knauf
e789a3802c fixed small fix issue I introduced with my previous commit. 2007-08-03 19:54:31 +00:00
Gunter Knauf
4aabbc5ac2 some more makefile fixes/changes. 2007-08-03 14:30:02 +00:00
James Housley
e7a50e37d6 Start adding some expanded error conversion of libssh2 errors. 2007-08-03 13:57:37 +00:00
James Housley
9fa05db83b The previous commit to force the use of libssh2-0.16 by removing
LIBSSH2_APINO
2007-08-03 13:46:59 +00:00
Gunter Knauf
7ed58c4636 changed 'rm -f' to 'del /f' so it works without GnuUtils as Peteris Krumins pointed out; changed to use latest external libs. 2007-08-03 12:53:00 +00:00
Gunter Knauf
f2f7c18245 Peteris Krumins pointed out some MingW32 related build issues. 2007-08-03 11:46:00 +00:00
Gunter Knauf
efaab37698 Peteris Krumins pointed out that the standard MingW32 build depends on zlib; removed that, and added another option for zlib build, and renamed all other targets to reflect zlib dependency. 2007-08-03 11:24:22 +00:00
Daniel Stenberg
869319ce4a SCP and SFTP support now requires libssh2 0.16 or later 2007-08-03 08:31:47 +00:00
Daniel Stenberg
252f16db02 remove left-over partly support for libssh2 0.14 2007-08-03 08:25:28 +00:00
Daniel Stenberg
72f5d6ba46 The SSH code now only works with libssh2 0.16 or later. Thus we must not
release the next curl until there is a libssh2 0.16 released.
2007-08-03 08:14:51 +00:00
Daniel Stenberg
5ec786b02e Scott Cantor filed bug report #1766320
(http://curl.haxx.se/bug/view.cgi?id=1766320) pointing out that the libcurl
code accessed two curl_easy_setopt() options (CURLOPT_DNS_CACHE_TIMEOUT and
CURLOPT_DNS_USE_GLOBAL_CACHE) as ints even though they're documented to be
passed in as longs, and that makes a difference on 64 bit architectures.
2007-08-02 20:10:28 +00:00
Dan Fandrich
035ee257c8 Fixed a compiler warning. 2007-08-02 19:23:35 +00:00
Daniel Stenberg
188b08ca55 Patrick Monnerat's cleanup fix after my alloc-strings commit 2007-08-02 14:42:16 +00:00
Daniel Stenberg
6f750f3b57 Dmitriy Sergeyev reported a regression: resumed file:// transfers broke
after 7.16.2. This is much due to the different treatment file:// gets
internally, but now I added test 231 to make it less likely to happen again
without us noticing!
2007-08-02 14:09:08 +00:00
Daniel Stenberg
5a6dcdc36c clarify that setting POSTFIELDS to NULL or "" is not enough to make a zero byte
POST
2007-08-02 13:26:06 +00:00
Daniel Stenberg
59c16a570f argh, Greg Morse pointed out that the NTLM POST fix only worked if VERBOSE
was set, this should make it work for all cases!
2007-08-02 11:34:50 +00:00
Daniel Stenberg
50c10aa5bf Patrick Monnerat and I modified libcurl so that now it *copies* all strings
passed to it with curl_easy_setopt()! Previously it has always just refered
to the data, forcing the user to keep the data around until libcurl is done
with it. That is now history and libcurl will instead clone the given
strings and keep private copies.
2007-08-01 21:20:01 +00:00
Daniel Stenberg
006878686c Greg Morse reported a problem with POSTing using ANYAUTH to a server requiring
NTLM, and he provided test code and a test server and we worked out a bug
fix. We failed to count sent body data at times, which then caused internal
confusions when libcurl tried to send the rest of the data in order to
maintain the same connection alive.

(and then I did some minor reformatting of code in lib/http.c)
2007-08-01 12:58:04 +00:00
Daniel Stenberg
bd100b2a51 AIX 4 and 5 get to use non-blocking sockets 2007-07-30 22:54:02 +00:00
Daniel Stenberg
5b1bbffdff Peter O'Gorman pointed out (and fixed) that the non-blocking check in
configure made libcurl use blocking sockets on AIX 4 and 5, while that
wasn't the intention.
2007-07-30 22:53:18 +00:00
Daniel Stenberg
16710a1c9b users should use the CURLMOPT_TIMERFUNCTION rather than curl_multi_timeout
when using the socket API
2007-07-30 22:01:04 +00:00
Daniel Stenberg
ba5c71b79b less blocking these days 2007-07-30 21:47:56 +00:00
Daniel Stenberg
f3799462c2 updated based on suggestion from Jeff Pohlmeyer 2007-07-30 21:47:44 +00:00
Daniel Stenberg
f01c6e51f4 Patrick Monnerat restored qssl successful compilation and loading 2007-07-30 21:41:12 +00:00
Daniel Stenberg
21d62118dc give credit to Greg Zavertnik 2007-07-30 20:07:43 +00:00
Dan Fandrich
de55038e33 Properly set USE_SSL on OS/400 2007-07-30 17:08:26 +00:00
Dan Fandrich
ea908c23ae Fixed compiler warning on non-SSL builds 2007-07-30 17:05:39 +00:00
Daniel Stenberg
844cbc701a Added "4.15 FTPS doesn't work" and updated a few other sections slightly 2007-07-29 22:17:39 +00:00
Daniel Stenberg
f1fa7b8ba4 Bug report #1759542 (http://curl.haxx.se/bug/view.cgi?id=1759542). A bad use
of a socket after it has been closed, when the FTP-SSL data connection is taken
down.
2007-07-29 12:54:05 +00:00
Daniel Stenberg
86ff3194fa added missing part for the qsossl support 2007-07-27 08:33:32 +00:00
Daniel Stenberg
d460b601f9 added initial pkg-config file (attempt) 2007-07-26 21:56:47 +00:00
Dan Fandrich
48a06d1a7b Removed unused variable. 2007-07-24 15:23:16 +00:00
Daniel Stenberg
813a1107f4 #if that should be #ifdef 2007-07-23 21:48:27 +00:00
Daniel Stenberg
b3461bab1d Implemented the parts of Patrick Monnerat's OS/400 patch that introduces
support for the OS/400 Secure Sockets Layer library
2007-07-23 21:46:26 +00:00
Dan Fandrich
5ecd56d964 Implemented only the parts of Patrick Monnerat's OS/400 patch that renamed
some few internal identifiers to avoid conflicts, which could be useful on
other platforms.
2007-07-23 18:51:22 +00:00
Dan Fandrich
cc44fb1dc8 Log the "<CMD> wasn't handled" error normally since it is now expected
to occur in a couple of tests.
2007-07-23 17:51:43 +00:00
Gunter Knauf
77b0efdbc2 added 2 system libs necessary for linking OpenSSL 0.9.8e statically. 2007-07-23 01:05:34 +00:00
Daniel Stenberg
68653bcbdd fix mess added in my previous commit 2007-07-22 10:19:53 +00:00
Daniel Stenberg
9af807a5ce HTTP Digest auth fix on a re-used connection 2007-07-22 10:17:52 +00:00
Daniel Stenberg
4bbcc47f3f Added test case 354 that makes a simple FTP retrieval without password, which
verifies the bug fix in #1757328.
2007-07-22 10:08:59 +00:00
Daniel Stenberg
8ab495a088 test and verify curl -I on a single FTP file somewhat more than before 2007-07-21 21:49:23 +00:00
Daniel Stenberg
84e7bb85b1 To allow more flexibility in FTP test cases, I've removed the enforced states
from the test server code as they served no real purpose. The test server is
here to serve for the test cases, not to attempt to function as a real server!
2007-07-21 21:48:58 +00:00
Daniel Stenberg
4fc7e13a98 news 2007-07-21 21:47:02 +00:00
Dan Fandrich
b465750041 Make the pointers of a few static const arrays const, too, for safety. 2007-07-21 02:08:17 +00:00
Gunter Knauf
37dc0fa519 added curl include for debug builds. 2007-07-20 21:50:53 +00:00
Dan Fandrich
000fdc6b99 Document pwd as an sftp quote command for curl(1), and show it as
lower case for consistency since sftp commands are case insensitive.
2007-07-20 17:29:43 +00:00
Gunter Knauf
594fc0411e added lf to Win32 getpass_r() so that next output appears in new line. 2007-07-20 16:01:05 +00:00
Daniel Stenberg
94fcb4b09d PWD for SFTP is fixed 2007-07-20 15:33:44 +00:00
Daniel Stenberg
1a0034ac34 the "libssh2 owns the memory don't free it" case 2007-07-20 09:38:41 +00:00
Daniel Stenberg
e3377e637a Ralf S. Engelschall filed bug report #1757328
(http://curl.haxx.se/bug/view.cgi?id=1757328) and submitted a patch. It turns
out we broke login to FTP servers that don't require (nor understand) PASS
after the USER command
2007-07-20 09:35:58 +00:00
James Housley
2ab854cafd Fix a loop with PWD 2007-07-20 01:03:49 +00:00
Dan Fandrich
4a2f0fb2be Made some const arrays static to avoid unnecessary stack usage. 2007-07-20 00:41:12 +00:00
Daniel Stenberg
dca3564cfb minor addition, re-count of the number of lines of code 2007-07-19 21:35:36 +00:00
Daniel Stenberg
9d183bb7b1 libssh2 fix 2007-07-19 15:08:47 +00:00
Dan Fandrich
c7db74fe73 Revert the 512 change since newer versions of OpenSSH don't support DSA
keys that small.
2007-07-19 01:42:22 +00:00
James Housley
5251c45187 SFTP also supports PWD 2007-07-18 23:21:32 +00:00
Dan Fandrich
d9b5f327bf Added the list of sftp quote commands. 2007-07-18 22:23:07 +00:00
James Housley
ca1356702a As has been pointed out, err_msg should not be freed here. The actual
issue is in libssh2 and not freeing a dynamic error message during cleanup.
2007-07-18 18:31:34 +00:00
Dan Fandrich
89d119646d Use 512 bit keys to reduce the time taken to generate them. This shouldn't
really reduce security since in the common case of a daily automated build
the keys are only used for a single test run lasting a few minutes before
being deleted.
2007-07-18 00:27:13 +00:00
Dan Fandrich
989dd9c34a Fixed test cases 613 and 614 by improving the log postprocessor to handle
a new directory listing format that newer libssh2's can provide.  This
is probably NOT sufficient to handle all directory listing formats that
server's can provide and should be revisited.
2007-07-17 21:53:38 +00:00
Daniel Stenberg
1d728aae2a Jofell Gallardo posted a libcurl log using FTP that exposed a bug which made
a control connection that was deemed "dead" to yet be re-used in a following
request. We must make sure the connection gets closed on this situation.
2007-07-17 20:59:53 +00:00
Daniel Stenberg
98b9349be7 make it do all three requests on the same connection 2007-07-16 21:44:46 +00:00
Dan Fandrich
4706a93341 Fixed some more simple compile warnings in the examples. 2007-07-16 21:22:12 +00:00
Daniel Stenberg
b85b56a73d 45. libcurl built to support ipv6 uses getaddrinfo() to resolve host names.
getaddrinfo() sorts the response list which effectively kills how libcurl
  deals with round-robin DNS entries. All details:
    http://curl.haxx.se/mail/lib-2007-07/0168.html
  initial suggested function to use for randomizing the response:
    http://curl.haxx.se/mail/lib-2007-07/0178.html
2007-07-16 21:08:08 +00:00
Daniel Stenberg
1da3d402f6 convert test case 540 to use a custom Host: header as well 2007-07-15 21:00:26 +00:00
Daniel Stenberg
1da3192d2d let's just export the whole argc + argv pair globally so that each test tool
can take advantage of it however they see fit!
2007-07-15 20:59:43 +00:00
Gunter Knauf
dab569d76c make users use the latest OpenSSL and Zlib libraries;
added hint to compile with SSPI with MSVC6 without PSDK.
2007-07-15 13:00:39 +00:00
Daniel Stenberg
598c589359 added another SEE ALSO 2007-07-14 23:01:49 +00:00
Daniel Stenberg
15c8219340 Added test case 540 and lib540.c, the 'proxyauth.c' test app posted by Shmulik
Regev on the libcurl mailing list on 10 Jul 2007, converted to a test case.
2007-07-14 22:39:22 +00:00
Daniel Stenberg
5ae21ebde9 add support for arg3 as the third argument... 2007-07-14 22:38:18 +00:00
Daniel Stenberg
c7e0d8c30b add some better logging when HTTP server start fails, and make the failure
really hard if the test server can't be resolved (like for ::1 ipv6)
2007-07-14 22:33:46 +00:00
Gunter Knauf
fee4f8c86d for now unless we do better fixed LIBSSH2_APINO compares to use long constants. 2007-07-14 15:59:01 +00:00
Daniel Stenberg
1261c3feba Brad House's fix to hish a win32 compiler warning 2007-07-14 13:14:58 +00:00
Daniel Stenberg
7fc300d5dc added Vlad's entire description of his valgrind fix 2007-07-14 13:11:36 +00:00
Daniel Stenberg
88ce03e945 Vlad Dinulescu fixed two outstanding valgrind reports 2007-07-14 13:08:50 +00:00
Dan Fandrich
5bed99c97d The examples don't need access to curl internal source files. 2007-07-13 21:31:44 +00:00
Daniel Stenberg
46c699c483 Colin Hogben filed bug report #1750274
(http://curl.haxx.se/bug/view.cgi?id=1750274) and submitted a patch for the
case where libcurl did a connect attempt to a non-listening port and didn't
provide a human readable error string back.
2007-07-13 20:17:35 +00:00
Daniel Stenberg
f7d6e147f1 Daniel Cater added the mentioning of CURL_DISABLE_TFTP 2007-07-13 20:09:38 +00:00
Daniel Stenberg
aad1d3ce14 Daniel Cater: libcurl-errors needs updating to reflect a couple of deprecated
error codes
2007-07-13 20:07:22 +00:00
Daniel Stenberg
cf5378b366 Daniel Cater made libcurl build with CURL_NO_OLDIES defined (which doesn't
define the symbols for backwards source compatibility)
2007-07-13 20:04:53 +00:00
Daniel Stenberg
fea938cbcb Daniel Cater made the vc8-generating line use double-quotes to run fine on
windows
2007-07-13 19:38:36 +00:00
Daniel Stenberg
a67c8b4698 Made the krb5 code build with Heimdal's GSSAPI lib 2007-07-12 21:34:42 +00:00
Dan Fandrich
49ce3e5160 Fixed some compile warnings and errors and improved portability in the
examples.
Removed ftp3rdparty.c since libcurl doesn't support 3rd party FTP transfers
any longer.
2007-07-12 21:11:10 +00:00
Daniel Stenberg
4a728747e6 make it compile fine 2007-07-12 20:55:17 +00:00
Daniel Stenberg
f5a6355172 fix include path 2007-07-12 20:54:54 +00:00
Dan Fandrich
ffff8ddbef Compile most of the example apps in docs/examples when doing a 'make check'. 2007-07-12 20:38:54 +00:00
Daniel Stenberg
cf86f8cb78 Shmulik Regev found an (albeit rare) case where the proxy CONNECT operation
could in fact get stuck in an endless loop.
2007-07-12 20:15:38 +00:00
Daniel Stenberg
a53ba060c8 start the retry delay at 10 ms, double it for every failed attempt which makes
it 10 seconds delay after 11 attempts
2007-07-12 17:03:45 +00:00
Gunter Knauf
72bb5854f7 the timeout was probably too short with max = 1 sec, so lets test with 5 sec. 2007-07-12 10:54:15 +00:00
Gunter Knauf
0de56e5535 added nwos.c so that it gets distributed with releases and tarballs. 2007-07-12 10:44:46 +00:00
Gunter Knauf
0878b14f79 added time loop to sockfilt.c in order to wait for SO_REUSEADDR;
added go_sleep() to util.c.
2007-07-12 01:07:49 +00:00
Marty Kuhrt
7d56f35388 Updated to match curl.h 2007-07-11 23:17:11 +00:00
Daniel Stenberg
d12759c73e Made CURLOPT_SSL_VERIFYHOST set to 1 acts as described in the documentation:
fail to connect if there is no Common Name field found in the remote cert.
We should deprecate the support for this set to 1 anyway soon, since the
feature is pointless and most likely never really used by anyone.
2007-07-11 22:20:46 +00:00
Gunter Knauf
c0095d6dd9 removed now obsolete NETDB_DEFINE_CONTEXT macro calls. 2007-07-11 21:47:31 +00:00
Gunter Knauf
6a88eab067 updated makefile to compile nwos.c. 2007-07-11 21:38:28 +00:00
Gunter Knauf
a4f36558fc added NetWare-own file to provide some init functions (for now only CLIB);
added call to netware_init() in curl_global_init() to make sure it gets called before any library functions get used.
2007-07-11 21:34:22 +00:00
Dan Fandrich
5e1cd407a3 Added the first libcurl version to which the SSH options were added. 2007-07-11 19:21:38 +00:00
Gunter Knauf
2a1345ae9f added netdb.h for NetWare CLIB since gethostname() is defined there. 2007-07-11 09:08:03 +00:00
Gunter Knauf
cf61c8d659 fixed endif comment. 2007-07-11 09:03:22 +00:00
Gunter Knauf
c39690486c fixed endif comment. 2007-07-11 08:55:28 +00:00
Dan Fandrich
814b471d55 Added a code coverage section using gcc and gcov. 2007-07-10 22:55:51 +00:00
Daniel Stenberg
5119fb16d6 Shmulik Regev:
The tiny patch below fixes a bug (that I introduced :) which happens
when negotiating authentication with a proxy (probably with web
servers as well) that uses chunked transfer encoding for the 407 error
pages. In this case the ''ignorebody'' flag was ignored (no pun
intended).
2007-07-10 22:45:01 +00:00
Daniel Stenberg
dc2c70be07 Giancarlo Formicuccia reported and fixed a problem with a closed connection
to a proxy during CONNECT auth negotiation.
2007-07-10 22:31:13 +00:00
Dan Fandrich
19631f5d5f Force the time zone to GMT in the cookie tests in case the user is
using one of the so-called 'right' time zones that take into account
leap seconds, which causes the tests to fail (as reported by
Daniel Black in bug report #1745964).
2007-07-10 22:27:16 +00:00
James Housley
a8d6b40736 The previous commits changed the error code 2007-07-10 22:26:59 +00:00
James Housley
8026d94c07 * Finish moving sftp:// into a state machine so it won't block in multi mode
* Move scp:// into a state machine so it won't block in multi mode
* When available use the full directory entry from the sftp:// server
2007-07-10 22:26:32 +00:00
Dan Fandrich
93bd512357 Fixed a curl memory leak reported by Song Ma with a modified version
of the patch he suggested.  Added his test case as test289 to verify.
2007-07-10 22:23:16 +00:00
Daniel Stenberg
04d3a8c714 start working on 7.16.5... 2007-07-10 22:07:33 +00:00
Daniel Stenberg
4b1782c371 7.16.4 preps 2007-07-10 21:36:30 +00:00
Gunter Knauf
f84642197f added better CodeWarrior detection (forgot to add with previos version). 2007-07-09 02:00:39 +00:00
Gunter Knauf
ec1b7a0eea added better CodeWarrior detection;
added defines for setlocale().
2007-07-08 23:19:24 +00:00
Gunter Knauf
4b0e48cb4e added better CodeWarrior detection;
moved autounload flag so that its used for both lib architectures.
2007-07-08 23:18:47 +00:00
Gunter Knauf
41df67fc2c added better CodeWarrior detection. 2007-07-08 23:17:56 +00:00
Gunter Knauf
932d38323f removed some obsolete include paths and defines. 2007-07-07 16:26:02 +00:00
Daniel Stenberg
74ad8516d7 Thomas J. Moore made it build with less warnings 2007-07-06 22:14:29 +00:00
Daniel Stenberg
ed4a16dbd1 Gavrie Philipson's change, updated numbers 2007-07-06 21:56:42 +00:00
Daniel Stenberg
e2bac4fe6f add note about windows and dlls with CURLOPT_WRITEDATA 2007-07-06 20:14:03 +00:00
Gunter Knauf
836ffbfc22 fixed NetWare CLIB implementation of getpass_r() 2007-07-06 14:58:59 +00:00
James Housley
7fd4f82a45 Gavrie Philipson provided a patch that will use a more specific error
message for an scp:// upload failure.  If libssh2 has his matching
patch, then the error message return by the server will be used instead
of a more generic error.
2007-07-05 12:48:34 +00:00
Dan Fandrich
598bc3968e Add -a when running torture tests now that it's supported. 2007-07-05 01:38:00 +00:00
James Housley
29357151af Fix spelling error in error message 2007-07-04 22:54:29 +00:00
Gunter Knauf
6606ae6fe0 add test for gettimeofday() so that HAVE_GETTIMEOFDAY gets defined. 2007-07-04 17:20:19 +00:00
Gunter Knauf
9f21f74fbd enabled ares build. 2007-07-04 13:45:46 +00:00
Gunter Knauf
3760180320 although the check for HAVE_STRUCT_TIMEVAL solved the redefine it is incorrect; lets see if a check for HAVE_GETTIMEOFDAY also works; if gettimeofday() is present then we can assume we have the timezone struct too. 2007-07-04 10:54:15 +00:00
Gunter Knauf
056af4c9ac added check for sys/param.h. 2007-07-04 09:01:40 +00:00
Gunter Knauf
07bf3c86b6 trial to catch problem with Daniels cross-mingw ares builds. 2007-07-03 18:18:40 +00:00
Gunter Knauf
4182803bc2 added NetWare CLIB-own header to solve gcc warnings. 2007-07-03 16:21:57 +00:00
Gunter Knauf
7509ef6b4e few minor changes to make ares compile for NetWare CLIB architecture. 2007-07-03 16:00:36 +00:00
Gunter Knauf
70f8068d4d fixed rule to build libcares when needed. 2007-07-03 00:50:40 +00:00
Gunter Knauf
a7513a8521 changed to build for CLIB / LIBC. 2007-07-03 00:42:11 +00:00
Gunter Knauf
3f7e541415 added libcares to static build if ares enabled. 2007-07-03 00:12:03 +00:00
Daniel Stenberg
f7e9a21c53 contributors from the 7.16.3 release notes 2007-07-02 22:04:36 +00:00
Gunter Knauf
f1537d45ca sync'd with lib makefile changes: use var for awk; fixed RECV* / SEND* defines; debug var can be overwritten; added better compiler path handling. 2007-07-02 18:50:18 +00:00
Gunter Knauf
5a051617f3 some more makefile tweaks and hacks to deal with both lib architectures. 2007-07-02 18:42:14 +00:00
James Housley
55cd28283c Fix problem with the indenting noticed by Pavel 2007-07-02 17:22:51 +00:00
Gunter Knauf
924665c84c ignore make error when trying to copy curl.pdf which isnt in CVS. 2007-07-01 22:17:07 +00:00
Daniel Stenberg
fcfffbe2f2 mention the old name 2007-07-01 22:03:47 +00:00
Daniel Stenberg
54967d2a3a Thomas J. Moore provided a patch that introduces Kerberos5 support in
libcurl. This also makes the options change name to --krb (from --krb4) and
CURLOPT_KRBLEVEL (from CURLOPT_KRB4LEVEL) but the old names are still
2007-07-01 22:01:18 +00:00
Daniel Stenberg
667fd9a60b Song Ma helped me verify and extend a fix for doing FTP over a SOCKS4/5 proxy 2007-07-01 21:28:14 +00:00
Gunter Knauf
892a24f4c4 changed RECV_* / SEND_* defines to correctly reflect NetWare APIs;
some more minor Makefile tidyups.
2007-07-01 21:06:41 +00:00
Gunter Knauf
f7676e9667 disabled 64bit type for CLIB build which removes compiler runtime dependency. 2007-07-01 16:55:37 +00:00
Gunter Knauf
8727803cf8 updated NetWare docu. 2007-07-01 12:09:25 +00:00
Gunter Knauf
73e13ef19d added lib architecture to NLM description. 2007-07-01 01:33:51 +00:00
Gunter Knauf
e983cd5cd3 added HAVE_SYS_IOCTL_H define; added gcc runtime. 2007-06-30 23:53:54 +00:00
Gunter Knauf
ca3e5a6322 moved includes to setup.h so that the project headers also pick them up (eleminate gcc warning). 2007-06-30 23:45:57 +00:00
Gunter Knauf
c4931601c6 fixed path to Metrowerks tools and runtime since they changed between compiler versions. 2007-06-30 21:20:24 +00:00
Gunter Knauf
857492ac9e minor patches to enable building for NetWare CLIB.
sent by Dmitry Mityugov.
2007-06-30 20:16:03 +00:00
Gunter Knauf
afdfa4bed2 minor patches to enable building for NetWare CLIB.
sent by Dmitry Mityugov.
2007-06-30 20:08:13 +00:00
Gunter Knauf
3fc6faf1ae enabled building for NetWare CLIB architecture. 2007-06-30 20:02:51 +00:00
Gunter Knauf
c8a47bf662 revert previous patch since it turned out that older cp dont know this switch, argh! 2007-06-28 22:31:18 +00:00
James Housley
aed0cc6f2a Using fdopen() is a more correct way to implement the CURLOPT_NEW_FILE_PREMS
file.c, but the debug interface was missing.  This adds the routines needed
to make the memory debuging work for fdopen().
2007-06-28 11:11:29 +00:00
Daniel Stenberg
d500c468fc reality sync 2007-06-28 10:47:05 +00:00
Gunter Knauf
5df5a2aa54 fixed nasty cp warnings about not beeing able to preserve ownership. 2007-06-28 01:20:30 +00:00
Daniel Stenberg
9ca688c8e7 James Bursa's improvement 2007-06-27 21:35:17 +00:00
Daniel Stenberg
8edbe262d9 fix little flaw that could make the transfer loop end prematurely 2007-06-27 21:29:29 +00:00
James Housley
4cd7f85410 Add two new options for the SFTP/SCP/FILE protocols: CURLOPT_NEW_FILE_PERMS
and CURLOPT_NEW_DIRECTORY_PERMS.  These control the premissions for files
and directories created on the remote server.  CURLOPT_NEW_FILE_PERMS
defaults to 0644 and CURLOPT_NEW_DIRECTORY_PERMS defaults to 0755
2007-06-27 20:15:48 +00:00
Gunter Knauf
edd35cab5c removed trailing spaces. 2007-06-27 10:14:00 +00:00
Gunter Knauf
a2060effed fixed wrong var name 2007-06-27 10:12:48 +00:00
Daniel Stenberg
33b9daaa4c add an FTP rename example to 3.7 2007-06-26 21:53:46 +00:00
Daniel Stenberg
62f0f5571d Robert Iakobashvili re-arranged the internal hash code to work with a custom
hash function for different hashes, and also expanded the default size for
the socket hash table used in multi handles to greatly enhance speed when
very many connections are added and the socket API is used.
2007-06-26 21:09:28 +00:00
James Housley
7a360de49d The results for a list only directory should be sent to the callback 2007-06-26 20:23:10 +00:00
James Housley
1be4557694 ftp_list_only mode should list all file types, not just directories. 2007-06-26 19:12:58 +00:00
Daniel Stenberg
6a21738704 gah, adding missing braces, removed silly debug output, added new debug output 2007-06-25 14:17:52 +00:00
Daniel Stenberg
974fa1242a Adjusted how libcurl treats HTTP 1.1 responses without content-lenth or
chunked encoding (that also lacks "Connection: close"). It now simply
assumes that the connection WILL be closed to signal the end, as that is how
RFC2616 section 4.4 point #5 says we should behave.
2007-06-25 13:58:14 +00:00
Daniel Stenberg
3dff58b3aa fix the version string as well 2007-06-25 13:52:16 +00:00
Daniel Stenberg
abf8589f0d start working towards 7.16.4 2007-06-25 09:34:44 +00:00
510 changed files with 19997 additions and 6215 deletions

613
CHANGES
View File

@@ -6,6 +6,619 @@
Changelog Changelog
Version 7.17.1 (29 October 2007)
Dan F (25 October 2007)
- Added the --static-libs option to curl-config
Daniel S (25 October 2007)
- Made libcurl built with NSS possible to ignore the peer verification.
Previously it would fail if the ca bundle wasn't present, even if the code
ignored the verification results.
Patrick M (25 October 2007)
- Fixed test server to allow null bytes in binary posts.
_ Added tests 35, 544 & 545 to check binary data posts, both static (in place)
and dynamic (copied).
Daniel S (25 October 2007)
- Michal Marek fixed the test script to be able to use valgrind even when the
lib is built shared with libtool.
- Fixed a few memory leaks when the same easy handle is re-used to request
URLs with different protocols. FTP and TFTP related leaks. Caught thanks to
Dan F's new test cases.
Dan F (24 October 2007)
- Fixed the test FTP and TFTP servers to support the >10000 test number
notation
- Added test cases 2000 through 2003 which test multiple protocols using the
same easy handle
- Fixed the filecheck: make target to work outside the source tree
Daniel S (24 October 2007)
- Vladimir Lazarenko pointed out that we should do some 'mt' magic when
building with VC8 to get the "manifest" embedded to make fine stand-alone
binaries. The maketgz and the src/Makefile.vc6 files were adjusted
accordingly.
Daniel S (23 October 2007)
- Bug report #1812190 (http://curl.haxx.se/bug/view.cgi?id=1812190) points out
that libcurl tried to re-use connections a bit too much when using non-SSL
protocols tunneled over a HTTP proxy.
Daniel S (22 October 2007)
- Michal Marek forwarded the bug report
https://bugzilla.novell.com/show_bug.cgi?id=332917 about a HTTP redirect to
FTP that caused memory havoc. His work together with my efforts created two
fixes:
#1 - FTP::file was moved to struct ftp_conn, because is has to be dealt with
at connection cleanup, at which time the struct HandleData could be
used by another connection.
Also, the unused char *urlpath member is removed from struct FTP.
#2 - provide a Curl_reset_reqproto() function that frees
data->reqdata.proto.* on connection setup if needed (that is if the
SessionHandle was used by a different connection).
A long-term goal is of course to somehow get rid of how the reqdata struct
is used, as it is too error-prone.
- Bug report #1815530 (http://curl.haxx.se/bug/view.cgi?id=1815530) points out
that specifying a proxy with a trailing slash didn't work (unless it also
contained a port number).
Patrick M (15 October 2007)
- Fixed the dynamic CURLOPT_POSTFIELDS problem: this option is now static again
and option CURLOPT_COPYPOSTFIELDS has been added to support dynamic mode.
Patrick M (12 October 2007)
- Added per-protocol callback static tables, replacing callback ptr storage
in the connectdata structure by a single handler table ptr.
Dan F (11 October 2007)
- Fixed the -l option of runtests.pl
- Added support for skipping tests based on key words.
Daniel S (9 October 2007)
- Michal Marek removed the no longer existing return codes from the curl.1
man page.
Daniel S (7 October 2007)
- Known bug #47, which confused libcurl if doing NTLM auth over a proxy with
a response that was larger than 16KB is now improved slightly so that now
the restriction at 16KB is for the headers only and it should be a rare
situation where the response-headers exceed 16KB. Thus, I consider #47 fixed
and the header limitation is now known as known bug #48.
Daniel S (5 October 2007)
- Michael Wallner made the CULROPT_COOKIELIST option support a new magic
string: "FLUSH". Using that will cause libcurl to flush its cookies to the
CURLOPT_COOKIEJAR file.
- The new file docs/libcurl/ABI describes how we view ABI breakages, soname
bumps and what the version number's significance to all that is.
Daniel S (4 October 2007)
- I enabled test 1009 and made the --local-port use a wide range to reduce the
risk of failures.
- Kim Rinnewitz reported that --local-port didn't work with TFTP transfers.
This happened because the tftp code always uncondionally did a bind()
without caring if one already had been done and then it failed. I wrote a
test case (1009) to verify this, but it is a bit error-prone since it will
have to pick a fixed local port number and since the tests are run on so
many different hosts in different situations I'll add it in disabled state.
Yang Tse (3 October 2007)
- Fixed issue related with the use of ares_timeout() result.
Daniel S (3 October 2007)
- Alexey Pesternikov introduced CURLOPT_OPENSOCKETFUNCTION and
CURLOPT_OPENSOCKETDATA to set a callback that allows an application to
replace the socket() call used by libcurl. It basically allows the app to
change address, protocol or whatever of the socket.
- I renamed the CURLE_SSL_PEER_CERTIFICATE error code to
CURLE_PEER_FAILED_VERIFICATION (standard CURL_NO_OLDIES style), and made
this return code get used by the previous SSH MD5 fingerprint check in case
it fails.
- Based on a patch brought by Johnny Luong, libcurl now offers
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 and the curl tool --hostpubmd5. They both
make the SCP or SFTP connection verify the remote host's md5 checksum of the
public key before doing a connect, to reduce the risk of a man-in-the-middle
attack.
Daniel S (2 October 2007)
- libcurl now handles chunked-encoded CONNECT responses
Daniel S (1 October 2007)
- Alex Fishman reported a curl_easy_escape() problem that was made the
function do wrong on all input bytes that are >= 0x80 (decimal 128) due to a
signed / unsigned mistake in the code. I fixed it and added test case 543 to
verify.
Daniel S (29 September 2007)
- Immanuel Gregoire fixed a problem with persistent transfers over SFTP.
Daniel S (28 September 2007)
- Adapted the c-ares code to the API change c-ares 1.5.0 brings in the
notifier callback(s).
Dan F (26 September 2007)
- Enabled a few more gcc warnings with --enable-debug. Renamed a few
variables to avoid shadowing global declarations.
Daniel S (26 September 2007)
- Philip Langdale provided the new CURLOPT_POST301 option for
curl_easy_setopt() that alters how libcurl functions when following
redirects. It makes libcurl obey the RFC2616 when a 301 response is received
after a non-GET request is made. Default libcurl behaviour is to change
method to GET in the subsequent request (like it does for response code 302
- because that's what many/most browsers do), but with this CURLOPT_POST301
option enabled it will do what the spec says and do the next request using
the same method again. I.e keep POST after 301.
The curl tool got this option as --post301
Test case 1011 and 1012 were added to verify.
- Max Katsev reported that when doing a libcurl FTP request with
CURLOPT_NOBODY enabled but not CURLOPT_HEADER, libcurl wouldn't do TYPE
before it does SIZE which makes it less useful. I walked over the code and
made it do this properly, and added test case 542 to verify it.
Daniel S (24 September 2007)
- Immanuel Gregoire fixed KNOWN_BUGS #44: --ftp-method nocwd did not handle
URLs ending with a slash properly (it should list the contents of that
directory). Test case 351 brought back and also test 1010 was added.
Daniel S (21 September 2007)
- Mark Davies fixed Negotiate authentication over proxy, and also introduced
the --proxy-negotiate command line option to allow a user to explicitly
select it.
Daniel S (19 September 2007)
- Rob Crittenden provided an NSS update with the following highlights:
o It looks for the NSS database first in the environment variable SSL_DIR,
then in /etc/pki/nssdb, then it initializes with no database if neither of
those exist.
o If the NSS PKCS#11 libnspsem.so driver is available then PEM files may be
loaded, including the ca-bundle. If it is not available then only
certificates already in the NSS database are used.
o Tries to detect whether a file or nickname is being passed in so the right
thing is done
o Added a bit of code to make the output more like the OpenSSL module,
including displaying the certificate information when connecting in
verbose mode
o Improved handling of certificate errors (expired, untrusted, etc)
The libnsspem.so PKCS#11 module is currently only available in Fedora
8/rawhide. Work will be done soon to upstream it. The NSS module will work
with or without it, all that changes is the source of the certificates and
keys.
Daniel S (18 September 2007)
- Immanuel Gregoire pointed out that public key SSH auth failed if no
public/private key was specified and there was no HOME environment variable,
and then it didn't continue to try the other auth methods. Now it will
instead try to get the files id_dsa.pub and id_dsa from the current
directory if none of the two conditions were met.
Dan F (17 September 2007)
- Added hooks to the test suite to make it possible to test a curl running
on a remote host.
- Changed some FTP tests to validate the format of the PORT and EPRT commands
sent by curl, if not the addresses themselves.
Daniel S (15 September 2007)
- Michal Marek made libcurl automatically append ";type=<a|i>" when using HTTP
proxies for FTP urls.
- G<>nter Knauf fixed LDAP builds in the Windows makefiles and fixed LDAPv3
support on Windows.
Dan F (13 September 2007)
- Added LDAPS, SCP and SFTP to curl-config --protocols. Removed and
fixed some AC_SUBST configure entries.
Version 7.17.0 (13 September 2007)
Daniel S (12 September 2007)
- Bug report #1792649 (http://curl.haxx.se/bug/view.cgi?id=1792649) pointed
out a problem with doing an empty upload over FTP on a re-used connection.
I added test case 541 to reproduce it and to verify the fix.
- I noticed while writing test 541 that the FTP code wrongly did a CWD on the
second transfer as it didn't store and remember the "" path from the
previous transfer so it would instead CWD to the entry path as stored. This
worked, but did a superfluous command. Thus, test case 541 now also verifies
this fix.
Dan F (5 September 2007)
- Added test case 1007 to test permission problem when uploading with TFTP
(to validate bug #1790403).
- TFTP now reports the "not defined" TFTP error code 0 as an error,
not success.
Daniel S (5 September 2007)
- Continued the work on a fix for #1779054
(http://curl.haxx.se/bug/view.cgi?id=1779054). My previous fix from August
24 was not complete (either) but could accidentally "forget" parts of a
server response which led to faulty server response time-out errors.
Dan F (5 September 2007)
- Minix doesn't support getsockopt on UDP sockets or send/recv on TCP
sockets.
Dan F (31 August 2007)
- Made some of the error strings returned by the *strerror functions more
generic, and more consistent with each other.
- Renamed the curl_ftpssl enum to curl_usessl and its enumerated constants,
creating macros for backward compatibility:
CURLFTPSSL_NONE => CURLUSESSL_NONE
CURLFTPSSL_TRY => CURLUSESSL_TRY
CURLFTPSSL_CONTROL => CURLUSESSL_CONTROL
CURLFTPSSL_ALL => CURLUSESSL_ALL
CURLFTPSSL_LAST => CURLUSESSL_LAST
Dan F (30 August 2007)
- Renamed several libcurl error codes and options to make them more general
and allow reuse by multiple protocols. Several unused error codes were
removed. In all cases, macros were added to preserve source (and binary)
compatibility with the old names. These macros are subject to removal at
a future date, but probably not before 2009. An application can be
tested to see if it is using any obsolete code by compiling it with the
CURL_NO_OLDIES macro defined.
The following unused error codes were removed:
CURLE_BAD_CALLING_ORDER
CURLE_BAD_PASSWORD_ENTERED
CURLE_FTP_CANT_RECONNECT
CURLE_FTP_COULDNT_GET_SIZE
CURLE_FTP_COULDNT_SET_ASCII
CURLE_FTP_USER_PASSWORD_INCORRECT
CURLE_FTP_WEIRD_USER_REPLY
CURLE_FTP_WRITE_ERROR
CURLE_LIBRARY_NOT_FOUND
CURLE_MALFORMAT_USER
CURLE_OBSOLETE
CURLE_SHARE_IN_USE
CURLE_URL_MALFORMAT_USER
The following error codes were renamed:
CURLE_FTP_ACCESS_DENIED => CURLE_REMOTE_ACCESS_DENIED
CURLE_FTP_COULDNT_SET_BINARY => CURLE_FTP_COULDNT_SET_TYPE
CURLE_FTP_SSL_FAILED => CURLE_USE_SSL_FAILED
CURLE_FTP_QUOTE_ERROR => CURLE_QUOTE_ERROR
CURLE_TFTP_DISKFULL => CURLE_REMOTE_DISK_FULL
CURLE_TFTP_EXISTS => CURLE_REMOTE_FILE_EXISTS
CURLE_HTTP_RANGE_ERROR => CURLE_RANGE_ERROR
The following options were renamed:
CURLOPT_SSLKEYPASSWD => CURLOPT_KEYPASSWD
CURLOPT_FTPAPPEND => CURLOPT_APPEND
CURLOPT_FTPLISTONLY => CURLOPT_DIRLISTONLY
CURLOPT_FTP_SSL => CURLOPT_USE_SSL
A few more changes will take place with the next SONAME bump of the
library. These are documented in docs/TODO
- Documented some newer error codes in libcurl-error(3)
- Added more accurate error code returns from SFTP operations. Added test
case 615 to test an SFTP upload failure.
Dan F (28 August 2007)
- Some minor internal type and const changes based on a splint scan.
Daniel S (24 August 2007)
- Bug report #1779054 (http://curl.haxx.se/bug/view.cgi?id=1779054) pointed
out that libcurl didn't deal with large responses from server commands, when
the single response was consisting of multiple lines but of a total size of
16KB or more. Dan Fandrich improved the ftp test script and provided test
case 1006 to repeat the problem, and I fixed the code to make sure this new
test case runs fine.
Patrick M (23 August 2007)
- OS/400 port: new files lib/config-os400.h lib/setup-os400.h packages/OS400/*.
See packages/OS400/README.OS400.
Daniel S (23 August 2007)
- Bug report #1779751 (http://curl.haxx.se/bug/view.cgi?id=1779751) pointed
out that doing first a file:// upload and then an FTP upload crashed libcurl
or at best caused furious valgrind complaints. Fixed now!
Daniel S (22 August 2007)
- Bug report #1779054 (http://curl.haxx.se/bug/view.cgi?id=1779054) pointed
out that libcurl didn't deal with very long (>16K) FTP server response lines
properly. Starting now, libcurl will chop them off (thus the client app will
not get the full line) but survive and deal with them fine otherwise. Test
case 1003 was added to verify this.
Daniel S (20 August 2007)
- Based on a patch by Christian Vogt, the FTP code now sets the upcoming
download transfer size much earlier to be possible to get read with
CURLINFO_CONTENT_LENGTH_DOWNLOAD as soon as possible. This is very much in a
similar spirit to the HTTP size change from August 11 2007.
Daniel S (18 August 2007)
- Robson Braga Araujo filed bug report #1776232
(http://curl.haxx.se/bug/view.cgi?id=1776232) about libcurl calling
Curl_client_write(), passing on a const string that the caller may not
modify and yet it does (on some platforms).
- Robson Braga Araujo filed bug report #1776235
(http://curl.haxx.se/bug/view.cgi?id=1776235) about ftp requests with NOBODY
on a directory would do a "SIZE (null)" request. This is now fixed and test
case 1000 was added to verify.
Daniel S (17 August 2007)
- Song Ma provided a patch that cures a problem libcurl has when doing resume
HTTP PUT using Digest authentication. Test case 5320 and 5322 were also
added to verify the functionality.
Daniel S (14 August 2007)
- Andrew Wansink provided an NTLM bugfix: in the case the server sets the flag
NTLMFLAG_NEGOTIATE_UNICODE, we need to filter it off because libcurl doesn't
UNICODE encode the strings it packs into the NTLM authenticate packet.
Daniel S (11 August 2007)
- Allen Pulsifer provided a patch that makes libcurl set the expected download
size earlier when doing HTTP downloads, so that applications and the
progress meter etc know get the info earlier in the flow than before.
- Patrick Monnerat modified the LDAP code and approach in curl. Starting now,
the configure script checks for openldap and friends and we link with those
libs just like we link all other third party libraries, and we no longer
dlopen() those libraries. Our private header file lib/ldap.h was renamed to
lib/curl_ldap.h due to this. I set a tag in CVS (curl-7_17_0-preldapfix)
just before this commit, just in case.
Dan F (8 August 2007)
- Song Ma noted a zlib memory leak in the illegal compressed header
countermeasures code path.
Daniel S (4 August 2007)
- Patrick Monnerat fixed curl_easy_escape() and curlx_strtoll() to work on
non-ASCII systems.
Daniel S (3 August 2007)
- I cut out support for libssh2 versions older than 0.16 to make our code a
lot simpler, and to avoid getting trouble with the LIBSSH2_APINO define
that 1) didn't work properly since it was >32 bits and 2) is removed in
libssh2 0.16...
Daniel S (2 August 2007)
- Scott Cantor filed bug report #1766320
(http://curl.haxx.se/bug/view.cgi?id=1766320) pointing out that the libcurl
code accessed two curl_easy_setopt() options (CURLOPT_DNS_CACHE_TIMEOUT and
CURLOPT_DNS_USE_GLOBAL_CACHE) as ints even though they're documented to be
passed in as longs, and that makes a difference on 64 bit architectures.
- Dmitriy Sergeyev reported a regression: resumed file:// transfers broke
after 7.16.2. This is much due to the different treatment file:// gets
internally, but now I added test 231 to make it less likely to happen again
without us noticing!
Daniel S (1 August 2007)
- Patrick Monnerat and I modified libcurl so that now it *copies* all strings
passed to it with curl_easy_setopt()! Previously it has always just refered
to the data, forcing the user to keep the data around until libcurl is done
with it. That is now history and libcurl will instead clone the given
strings and keep private copies. This is also part of Patrick Monnerat's
OS/400 port.
Due to this being a somewhat interesting change API wise, I've decided to
bump the version of the upcoming release to 7.17.0. Older applications will
of course not notice this change nor do they have to care, but new
applications can be written to take advantage of this.
- Greg Morse reported a problem with POSTing using ANYAUTH to a server
requiring NTLM, and he provided test code and a test server and we worked
out a bug fix. We failed to count sent body data at times, which then caused
internal confusions when libcurl tried to send the rest of the data in order
to maintain the same connection alive.
Daniel S (31 July 2007)
- Peter O'Gorman pointed out (and fixed) that the non-blocking check in
configure made libcurl use blocking sockets on AIX 4 and 5, while that
wasn't the intention.
Daniel S (29 July 2007)
- Jayesh A Shah filed bug report #1759542
(http://curl.haxx.se/bug/view.cgi?id=1759542) identifying a rather serious
problem with FTPS: libcurl closed the data connection socket and then later
in the flow it would call the SSL layer to do SSL shutdown which then would
use a socket that had already been closed - so if the application had opened
a new one in the mean time, libcurl could send gibberish that way! I worked
with Greg Zavertnik to properly diagnose and fix this. The fix affects code
for all SSL libraries we support, but it has only been truly verified to
work fine for the OpenSSL version. The others have only been code reviewed.
Daniel S (23 July 2007)
- Implemented the parts of Patrick Monnerat's OS/400 patch that introduces
support for the OS/400 Secure Sockets Layer library.
Dan F (23 July 2007)
- Implemented only the parts of Patrick Monnerat's OS/400 patch that renamed
some few internal identifiers to avoid conflicts, which could be useful on
other platforms.
Daniel S (22 July 2007)
- HTTP Digest bug fix by Chris Flerackers:
Scenario
- Perfoming a POST request with body
- With authentication (only Digest)
- Re-using a connection
libcurl would send a HTTP POST with an Authorization header but without
body. Our server would return 400 Bad Request in that case (because
authentication passed, but the body was empty).
Cause
1) http_digest.c -> Curl_output_digest
- Updates allocptr.userpwd/allocptr.proxyuserpwd *only* if d->nonce is
filled in (and no errors)
- authp->done = TRUE if d->nonce is filled in
2) http.c -> Curl_http
- *Always* uses allocptr.userpwd/allocptr.proxyuserpwd if not NULL
3) http.c -> Curl_http, Curl_http_output_auth
So what happens is that Curl_output_digest cannot yet update the
Authorization header (allocptr.userpwd) which results in authhost->done=0 ->
authhost->multi=1 -> conn->bits.authneg = TRUE. The body is not
added. *However*, allocptr.userpwd is still used when building the request
- Added test case 354 that makes a simple FTP retrieval without password, which
verifies the bug fix in #1757328.
Daniel S (21 July 2007)
- To allow more flexibility in FTP test cases, I've removed the enforced states
from the test server code as they served no real purpose. The test server
is here to serve for the test cases, not to attempt to function as a real
server! While at it, I modified test case 141 to better test and verify
curl -I on a single FTP file.
Daniel S (20 July 2007)
- James Housley fixed the SFTP PWD command to work.
- Ralf S. Engelschall filed bug report #1757328
(http://curl.haxx.se/bug/view.cgi?id=1757328) and submitted a patch. It
turns out we broke login to FTP servers that don't require (nor understand)
PASS after the USER command. The breakage was done as part of the krb5
commit so a krb-using person needs to verify that the current version now
works or if we need to fix it (in a different way of course).
Dan F (17 July 2007)
- Fixed test cases 613 and 614 by improving the log postprocessor to handle
a new directory listing format that newer libssh2's can provide. This
is probably NOT sufficient to handle all directory listing formats that
server's can provide, and should be revisited.
Daniel S (17 July 2007)
- Daniel Johnson fixed a bug in how libssh2_session_last_error() was used, in
two places.
- Jofell Gallardo posted a libcurl log using FTP that exposed a bug which made
a control connection that was deemed "dead" to yet be re-used in a following
request.
Daniel S (13 July 2007)
- Colin Hogben filed bug report #1750274
(http://curl.haxx.se/bug/view.cgi?id=1750274) and submitted a patch for the
case where libcurl did a connect attempt to a non-listening port and didn't
provide a human readable error string back.
- Daniel Cater fixes:
1 - made 'make vc8' work on windows.
2 - made libcurl itself built with CURL_NO_OLDIES defined (which doesn't
define the symbols for backwards source compatibility)
3 - updated libcurl-errors.3
4 - added CURL_DISABLE_TFTP to docs/INSTALL
Daniel S (12 July 2007)
- Made the krb5 code build with Heimdal's GSSAPI lib.
Dan F (12 July 2007)
- Compile most of the example apps in docs/examples when doing a 'make check'.
Fixed some compile warnings and errors in those examples.
- Removed the example program ftp3rdparty.c since libcurl doesn't support
3rd party FTP transfers any longer.
Daniel S (12 July 2007)
- Shmulik Regev found an (albeit rare) case where the proxy CONNECT operation
could in fact get stuck in an endless loop.
- Made CURLOPT_SSL_VERIFYHOST set to 1 acts as described in the documentation:
fail to connect if there is no Common Name field found in the remote cert.
We should deprecate the support for this set to 1 anyway soon, since the
feature is pointless and most likely never really used by anyone.
Daniel S (11 July 2007)
- Shmulik Regev fixed a bug with transfer-encoding skipping during the 407
error pages for proxy authentication.
- Giancarlo Formicuccia reported and fixed a problem with a closed connection
to a proxy during CONNECT auth negotiation.
Dan F (10 July 2007)
- Fixed a curl memory leak reported by Song Ma with a modified version
of the patch he suggested. Added his test case as test289 to verify.
- Force the time zone to GMT in the cookie tests in case the user is
using one of the so-called 'right' time zones that take into account
leap seconds, which causes the tests to fail (as reported by
Daniel Black in bug report #1745964).
Version 7.16.4 (10 July 2007)
Daniel S (10 July 2007)
- Kees Cook notified us about a security flaw
(http://curl.haxx.se/docs/adv_20070710.html) in which libcurl failed to
properly reject some outdated or not yet valid server certificates when
built with GnuTLS. Kees also provided the patch.
James H (5 July 2007)
- Gavrie Philipson provided a patch that will use a more specific error
message for an scp:// upload failure. If libssh2 has his matching
patch, then the error message return by the server will be used instead
of a more generic error.
Daniel S (1 July 2007)
- Thomas J. Moore provided a patch that introduces Kerberos5 support in
libcurl. This also makes the options change name to --krb (from --krb4) and
CURLOPT_KRBLEVEL (from CURLOPT_KRB4LEVEL) but the old names are still
- Song Ma helped me verify and extend a fix for doing FTP over a SOCKS4/5
proxy.
Daniel S (27 June 2007)
- James Housley: Add two new options for the SFTP/SCP/FILE protocols:
CURLOPT_NEW_FILE_PERMS and CURLOPT_NEW_DIRECTORY_PERMS. These control the
premissions for files and directories created on the remote
server. CURLOPT_NEW_FILE_PERMS defaults to 0644 and
CURLOPT_NEW_DIRECTORY_PERMS defaults to 0755
- I corrected the 10-at-a-time.c example and applied a patch for it by James
Bursa.
Daniel S (26 June 2007)
- Robert Iakobashvili re-arranged the internal hash code to work with a custom
hash function for different hashes, and also expanded the default size for
the socket hash table used in multi handles to greatly enhance speed when
very many connections are added and the socket API is used.
- James Housley made the CURLOPT_FTPLISTONLY mode work for SFTP directory
listings as well
Daniel S (25 June 2007)
- Adjusted how libcurl treats HTTP 1.1 responses without content-lenth or
chunked encoding (that also lacks "Connection: close"). It now simply
assumes that the connection WILL be closed to signal the end, as that is how
RFC2616 section 4.4 point #5 says we should behave.
Version 7.16.3 (25 June 2007) Version 7.16.3 (25 June 2007)
Daniel S (23 June 2007) Daniel S (23 June 2007)

View File

@@ -49,7 +49,7 @@ html:
pdf: pdf:
cd docs; make pdf cd docs; make pdf
check: test check: test examples
if CROSSCOMPILING if CROSSCOMPILING
test-full: test test-full: test
@@ -71,6 +71,9 @@ test-torture:
endif endif
examples:
@(cd docs/examples; $(MAKE) all)
# #
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros # Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
# must contain the following line: # must contain the following line:

View File

@@ -68,18 +68,22 @@ watcom-clean:
wmake -f Makefile.Watcom clean wmake -f Makefile.Watcom clean
mingw32: mingw32:
$(MAKE) -C lib -f Makefile.m32
$(MAKE) -C src -f Makefile.m32
mingw32-zlib:
$(MAKE) -C lib -f Makefile.m32 ZLIB=1 $(MAKE) -C lib -f Makefile.m32 ZLIB=1
$(MAKE) -C src -f Makefile.m32 ZLIB=1 $(MAKE) -C src -f Makefile.m32 ZLIB=1
mingw32-ssl: mingw32-ssl-zlib:
$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1 $(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1
$(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1 $(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1
mingw32-ssh2-ssl: mingw32-ssh2-ssl-zlib:
$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1 $(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1
$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1 $(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 ZLIB=1
mingw32-ssh2-ssl-sspi: mingw32-ssh2-ssl-sspi-zlib:
$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1 $(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1
$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1 $(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1
@@ -248,5 +252,5 @@ linux-ssl: ssl
vc8: vc8:
echo "generate VC8 makefiles" echo "generate VC8 makefiles"
sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e 's#/GZ#/RTC1#' -e 's/wsock32.lib/wsock32.lib bufferoverflowu.lib/g' -e 's/VC6/VC8/g' lib/Makefile.vc6 > lib/Makefile.vc8 sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/wsock32.lib/wsock32.lib bufferoverflowu.lib/g" -e "s/VC6/VC8/g" lib/Makefile.vc6 > lib/Makefile.vc8
sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e 's#/GZ#/RTC1#' -e 's/wsock32.lib/wsock32.lib bufferoverflowu.lib/g' -e 's/VC6/VC8/g' src/Makefile.vc6 > src/Makefile.vc8 sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/wsock32.lib/wsock32.lib bufferoverflowu.lib/g" -e "s/VC6/VC8/g" src/Makefile.vc6 > src/Makefile.vc8

View File

@@ -1,67 +1,53 @@
Curl and libcurl 7.16.3 Curl and libcurl 7.17.1
Public curl release number: 99 Public curl release number: 102
Releases counted from the very beginning: 126 Releases counted from the very beginning: 128
Available command line options: 118 Available command line options: 121
Available curl_easy_setopt() options: 141 Available curl_easy_setopt() options: 147
Number of public functions in libcurl: 54 Number of public functions in libcurl: 55
Amount of public web site mirrors: 38 Amount of public web site mirrors: 43
Number of known libcurl bindings: 35 Number of known libcurl bindings: 36
Number of contributors: 554 Number of contributors: 588
This release includes the following changes: This release includes the following changes:
o added curl_multi_socket_action() o automatically append ";type=<a|i>" when using HTTP proxies for FTP urls
o deprecated curl_multi_socket() o improved NSS support
o uses less memory in non-pipelined use cases o added --proxy-negotiate
o CURLOPT_HTTP200ALIASES matched transfers assume HTTP 1.0 compliance o added --post301 and CURLOPT_POST301
o more than one test harness can run at the same time without conflict o builds with c-ares 1.5.0
o SFTP now supports quote commands before a transfer o added CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 and --hostpubmd5
o CURLMOPT_MAXCONNECTS added to curl_multi_setopt() o renamed CURLE_SSL_PEER_CERTIFICATE to CURLE_PEER_FAILED_VERIFICATION
o upload resume works for file:// URLs o added CURLOPT_OPENSOCKETFUNCTION and CURLOPT_OPENSOCKETDATA
o asynchronous name resolves now require c-ares 1.4.0 or later o CULROPT_COOKIELIST supports "FLUSH"
o added SOCKS test cases o added CURLOPT_COPYPOSTFIELDS
o CURLOPT_FTP_CREATE_MISSING_DIRS and --ftp-create-dirs now work for SFTP o added --static-libs to curl-config
operations as well
This release includes the following bugfixes: This release includes the following bugfixes:
o if2up too long interface name memory leak o curl-config --protocols now properly reports LDAPS, SCP and SFTP
o test case 534 started to fail 2007-04-13 due to the existance of a o ldapv3 support on Windows
new host on the net with the same silly domain the test was using o ldap builds with the MSVC makefiles
for a host which was supposed not to exist. o no HOME and no key given caused SSH auth failure
o test suite SSL certificate works better with newer stunnel o Negotiate authentication over proxy
o internal progress meter update frequency back to once per second o --ftp-method nocwd on directory listings
o avoid some unnecessary calls to function gettimeofday o FTP, CURLOPT_NOBODY enabled and CURLOPT_HEADER disabled now does TYPE
o a double-free in the SSL-layer before SIZE
o GnuTLS free of NULL credentials o re-used handle transfers with SFTP
o NSS-fix for closing down SSL o curl_easy_escape() problem with byte values >= 128
o bad warning from configure when gnutls was selected o handles chunked-encoded CONNECT responses
o compilation on VMS 64-bit mode o misuse of ares_timeout() result
o SCP/SFTP downloads could hang on the last bytes of a transfer o --local-port on TFTP transfers
o curl_easy_duphandle() crash o CURLOPT_POSTFIELDS could fail to send binary data
o curl -V / curl_version*() works even when GnuTLS is used on a system without o specifying a proxy with a trailing slash didn't work (unless it also
a good random source contained a port number)
o curl_multi_socket() not "noticing" newly added handles o redirect from HTTP to FTP or TFTP memory problems and leaks
o lack of Content-Length and chunked encoding now requires HTTP 1.1 as well o re-used connections a bit too much when using non-SSL protocols tunneled
to be treated as without response body over a HTTP proxy
o connection cache growth in multi handles o embed the manifest in VC8 builds
o better handling of out of memory conditions o use valgrind in the tests even when the lib is built shared with libtool
o overwriting an uploaded file with sftp now truncates it first o libcurl built with NSS can now ignore the peer verification even when the
o SFTP quote commands chmod, chown, chgrp can now set a value of 0 ca cert bundle is absent
o TFTP connect timouts less than 5 seconds
o improved curl -w for TFTP transfers
o memory leak when failed OpenSSL certificate CN field checking
o memory leak when OpenSSL failed PKCS #12 parsing
o FPL-SSL when built with NSS
o out-of-boundary write in Curl_select()
o -s/--silent can now be used to toggle off the silence again
o builds fine on 64bit HP-UX
o multi interface HTTP CONNECT glitch
o list FTP root directories when login dir is not root
o no longer slows down when getting very many URLs on the same command line
o lock share before decreasing dirty counter
o no-body FTP requests on re-used connections
This release includes the following known bugs: This release includes the following known bugs:
@@ -69,26 +55,18 @@ This release includes the following known bugs:
Other curl-related news: Other curl-related news:
o PycURL 7.16.2.1 was released: http://pycurl.sf.net/ o
o TclCurl 7.16.2 was released:
http://personal1.iddeo.es/andresgarci/tclcurl/english/
New curl mirrors: New curl mirrors:
o http://curl.spegulo.be is a new mirror in Belgium o http://curl.wetzlmayr.at/ is a new web mirror in Nuremberg, Germany
o http://curl.piotrkosoft.net is a new mirror in Poland
o http://curl.smudge-it.net is a new mirror in St Louis, MO, USA
o http://curl.askapache.com is a new mirror in Indiana, USA
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:
Song Ma, Dan Fandrich, Yang Tse, Jay Austin, Robert Iakobashvil, Dan Fandrich, Michal Marek, G<>nter Knauf, Rob Crittenden, Immanuel Gregoire,
James Housley, Daniel Black, Steve Little, Sonia Subramanian, Peter O'Gorman, Mark Davies, Max Katsev, Philip Langdale, Alex Fishman, Johnny Luong,
Frank Hempel, Michael Wallner, Jeff Pohlmeyer, Tobias Rundstr<74>m, Alexey Pesternikov, Yang Tse, Kim Rinnewitz, Michael Wallner,
Anders Gustafsson, James Bursa, Kristian Gunstone, Feng Tu, Patrick Monnerat, Vladimir Lazarenko
Andre Guibert de Bruet, Rob Crittenden, Rich Rauenzahn, Tom Regner,
Dave Vasilevsky, Shmulik Regev, Robson Braga Araujo, Adam Piggott,
Gerrit Bruchh<68>user
Thanks! (and sorry if I forgot to mention someone) Thanks! (and sorry if I forgot to mention someone)

View File

@@ -1,5 +1,4 @@
To be addressed before 7.16.3 (planned release: June 2007) To be addressed before 7.17.1 (planned release: late October 2007)
============================= =============================
93 - 106 -

View File

@@ -171,6 +171,515 @@ AC_DEFUN([CURL_CHECK_HEADER_WS2TCPIP], [
]) ])
dnl CURL_CHECK_HEADER_WINLDAP
dnl -------------------------------------------------
dnl Check for compilable and valid winldap.h header
AC_DEFUN([CURL_CHECK_HEADER_WINLDAP], [
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
AC_CACHE_CHECK([for winldap.h], [ac_cv_header_winldap_h], [
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#endif
#include <winldap.h>
],[
#ifdef __CYGWIN__
HAVE_WINLDAP_H shall not be defined.
#else
LDAP *ldp = ldap_init("dummy", LDAP_PORT);
ULONG res = ldap_unbind(ldp);
#endif
])
],[
ac_cv_header_winldap_h="yes"
],[
ac_cv_header_winldap_h="no"
])
])
case "$ac_cv_header_winldap_h" in
yes)
AC_DEFINE_UNQUOTED(HAVE_WINLDAP_H, 1,
[Define to 1 if you have the winldap.h header file.])
;;
esac
])
dnl CURL_CHECK_HEADER_WINBER
dnl -------------------------------------------------
dnl Check for compilable and valid winber.h header
AC_DEFUN([CURL_CHECK_HEADER_WINBER], [
AC_REQUIRE([CURL_CHECK_HEADER_WINLDAP])dnl
AC_CACHE_CHECK([for winber.h], [ac_cv_header_winber_h], [
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#endif
#include <winldap.h>
#include <winber.h>
],[
#ifdef __CYGWIN__
HAVE_WINBER_H shall not be defined.
#else
BERVAL *bvp = NULL;
BerElement *bep = ber_init(bvp);
ber_free(bep, 1);
#endif
])
],[
ac_cv_header_winber_h="yes"
],[
ac_cv_header_winber_h="no"
])
])
case "$ac_cv_header_winber_h" in
yes)
AC_DEFINE_UNQUOTED(HAVE_WINBER_H, 1,
[Define to 1 if you have the winber.h header file.])
;;
esac
])
dnl CURL_CHECK_HEADER_LBER
dnl -------------------------------------------------
dnl Check for compilable and valid lber.h header,
dnl and check if it is needed even with ldap.h
AC_DEFUN([CURL_CHECK_HEADER_LBER], [
AC_REQUIRE([CURL_CHECK_HEADER_WINDOWS])dnl
AC_CACHE_CHECK([for lber.h], [ac_cv_header_lber_h], [
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#else
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#endif
#ifndef NULL
#define NULL (void *)0
#endif
#include <lber.h>
],[
BerValue *bvp = NULL;
BerElement *bep = ber_init(bvp);
ber_free(bep, 1);
])
],[
ac_cv_header_lber_h="yes"
],[
ac_cv_header_lber_h="no"
])
])
if test "$ac_cv_header_lber_h" = "yes"; then
AC_DEFINE_UNQUOTED(HAVE_LBER_H, 1,
[Define to 1 if you have the lber.h header file.])
#
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#else
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#endif
#ifndef NULL
#define NULL (void *)0
#endif
#ifndef LDAP_DEPRECATED
#define LDAP_DEPRECATED 1
#endif
#include <ldap.h>
],[
BerValue *bvp = NULL;
BerElement *bep = ber_init(bvp);
ber_free(bep, 1);
])
],[
curl_cv_need_header_lber_h="no"
],[
curl_cv_need_header_lber_h="yes"
])
#
case "$curl_cv_need_header_lber_h" in
yes)
AC_DEFINE_UNQUOTED(NEED_LBER_H, 1,
[Define to 1 if you need the lber.h header file even with ldap.h])
;;
esac
fi
])
dnl CURL_CHECK_HEADER_LDAP
dnl -------------------------------------------------
dnl Check for compilable and valid ldap.h header
AC_DEFUN([CURL_CHECK_HEADER_LDAP], [
AC_REQUIRE([CURL_CHECK_HEADER_LBER])dnl
AC_CACHE_CHECK([for ldap.h], [ac_cv_header_ldap_h], [
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#else
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#endif
#ifndef LDAP_DEPRECATED
#define LDAP_DEPRECATED 1
#endif
#ifdef NEED_LBER_H
#include <lber.h>
#endif
#include <ldap.h>
],[
LDAP *ldp = ldap_init("dummy", LDAP_PORT);
int res = ldap_unbind(ldp);
])
],[
ac_cv_header_ldap_h="yes"
],[
ac_cv_header_ldap_h="no"
])
])
case "$ac_cv_header_ldap_h" in
yes)
AC_DEFINE_UNQUOTED(HAVE_LDAP_H, 1,
[Define to 1 if you have the ldap.h header file.])
;;
esac
])
dnl CURL_CHECK_HEADER_LDAP_SSL
dnl -------------------------------------------------
dnl Check for compilable and valid ldap_ssl.h header
AC_DEFUN([CURL_CHECK_HEADER_LDAP_SSL], [
AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl
AC_CACHE_CHECK([for ldap_ssl.h], [ac_cv_header_ldap_ssl_h], [
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#else
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#endif
#ifndef LDAP_DEPRECATED
#define LDAP_DEPRECATED 1
#endif
#ifdef NEED_LBER_H
#include <lber.h>
#endif
#ifdef HAVE_LDAP_H
#include <ldap.h>
#endif
#include <ldap_ssl.h>
],[
LDAP *ldp = ldapssl_init("dummy", LDAPS_PORT, 1);
])
],[
ac_cv_header_ldap_ssl_h="yes"
],[
ac_cv_header_ldap_ssl_h="no"
])
])
case "$ac_cv_header_ldap_ssl_h" in
yes)
AC_DEFINE_UNQUOTED(HAVE_LDAP_SSL_H, 1,
[Define to 1 if you have the ldap_ssl.h header file.])
;;
esac
])
dnl CURL_CHECK_HEADER_LDAPSSL
dnl -------------------------------------------------
dnl Check for compilable and valid ldapssl.h header
AC_DEFUN([CURL_CHECK_HEADER_LDAPSSL], [
AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl
AC_CACHE_CHECK([for ldapssl.h], [ac_cv_header_ldapssl_h], [
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#else
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#endif
#ifndef NULL
#define NULL (void *)0
#endif
#ifndef LDAP_DEPRECATED
#define LDAP_DEPRECATED 1
#endif
#ifdef NEED_LBER_H
#include <lber.h>
#endif
#ifdef HAVE_LDAP_H
#include <ldap.h>
#endif
#include <ldapssl.h>
],[
char *cert_label = NULL;
LDAP *ldp = ldap_ssl_init("dummy", LDAPS_PORT, cert_label);
])
],[
ac_cv_header_ldapssl_h="yes"
],[
ac_cv_header_ldapssl_h="no"
])
])
case "$ac_cv_header_ldapssl_h" in
yes)
AC_DEFINE_UNQUOTED(HAVE_LDAPSSL_H, 1,
[Define to 1 if you have the ldapssl.h header file.])
;;
esac
])
dnl CURL_CHECK_LIBS_WINLDAP
dnl -------------------------------------------------
dnl Check for libraries needed for WINLDAP support,
dnl and prepended to LIBS any needed libraries.
dnl This macro can take an optional parameter with a
dnl white space separated list of libraries to check
dnl before the WINLDAP default ones.
AC_DEFUN([CURL_CHECK_LIBS_WINLDAP], [
AC_REQUIRE([CURL_CHECK_HEADER_WINBER])dnl
#
AC_MSG_CHECKING([for WINLDAP libraries])
#
u_libs=""
#
ifelse($1,,,[
for x_lib in $1; do
case "$x_lib" in
-l*)
l_lib="$x_lib"
;;
*)
l_lib="-l$x_lib"
;;
esac
if test -z "$u_libs"; then
u_libs="$l_lib"
else
u_libs="$u_libs $l_lib"
fi
done
])
#
curl_cv_save_LIBS="$LIBS"
curl_cv_ldap_LIBS="unknown"
#
for x_nlibs in '' "$u_libs" \
'-lwldap32' ; do
if test -z "$x_nlibs"; then
LIBS="$curl_cv_save_LIBS"
else
LIBS="$x_nlibs $curl_cv_save_LIBS"
fi
AC_LINK_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#ifdef HAVE_WINLDAP_H
#include <winldap.h>
#endif
#ifdef HAVE_WINBER_H
#include <winber.h>
#endif
#endif
],[
BERVAL *bvp = NULL;
BerElement *bep = ber_init(bvp);
LDAP *ldp = ldap_init("dummy", LDAP_PORT);
ULONG res = ldap_unbind(ldp);
ber_free(bep, 1);
])
],[
curl_cv_ldap_LIBS="$x_nlibs"
break
])
done
#
LIBS="$curl_cv_save_LIBS"
#
case X-"$curl_cv_ldap_LIBS" in
X-unknown)
AC_MSG_RESULT([cannot find WINLDAP libraries])
;;
X-)
AC_MSG_RESULT([no additional lib required])
;;
*)
if test -z "$curl_cv_save_LIBS"; then
LIBS="$curl_cv_ldap_LIBS"
else
LIBS="$curl_cv_ldap_LIBS $curl_cv_save_LIBS"
fi
AC_MSG_RESULT([$curl_cv_ldap_LIBS])
;;
esac
#
])
dnl CURL_CHECK_LIBS_LDAP
dnl -------------------------------------------------
dnl Check for libraries needed for LDAP support,
dnl and prepended to LIBS any needed libraries.
dnl This macro can take an optional parameter with a
dnl white space separated list of libraries to check
dnl before the default ones.
AC_DEFUN([CURL_CHECK_LIBS_LDAP], [
AC_REQUIRE([CURL_CHECK_HEADER_LDAP])dnl
#
AC_MSG_CHECKING([for LDAP libraries])
#
u_libs=""
#
ifelse($1,,,[
for x_lib in $1; do
case "$x_lib" in
-l*)
l_lib="$x_lib"
;;
*)
l_lib="-l$x_lib"
;;
esac
if test -z "$u_libs"; then
u_libs="$l_lib"
else
u_libs="$u_libs $l_lib"
fi
done
])
#
curl_cv_save_LIBS="$LIBS"
curl_cv_ldap_LIBS="unknown"
#
for x_nlibs in '' "$u_libs" \
'-lldap' \
'-llber -lldap' \
'-lldap -llber' \
'-lldapssl -lldapx -lldapsdk' \
'-lldapsdk -lldapx -lldapssl' ; do
if test -z "$x_nlibs"; then
LIBS="$curl_cv_save_LIBS"
else
LIBS="$x_nlibs $curl_cv_save_LIBS"
fi
AC_LINK_IFELSE([
AC_LANG_PROGRAM([
#undef inline
#ifdef HAVE_WINDOWS_H
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#else
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#endif
#ifndef NULL
#define NULL (void *)0
#endif
#ifndef LDAP_DEPRECATED
#define LDAP_DEPRECATED 1
#endif
#ifdef NEED_LBER_H
#include <lber.h>
#endif
#ifdef HAVE_LDAP_H
#include <ldap.h>
#endif
],[
BerValue *bvp = NULL;
BerElement *bep = ber_init(bvp);
LDAP *ldp = ldap_init("dummy", LDAP_PORT);
int res = ldap_unbind(ldp);
ber_free(bep, 1);
])
],[
curl_cv_ldap_LIBS="$x_nlibs"
break
])
done
#
LIBS="$curl_cv_save_LIBS"
#
case X-"$curl_cv_ldap_LIBS" in
X-unknown)
AC_MSG_RESULT([cannot find LDAP libraries])
;;
X-)
AC_MSG_RESULT([no additional lib required])
;;
*)
if test -z "$curl_cv_save_LIBS"; then
LIBS="$curl_cv_ldap_LIBS"
else
LIBS="$curl_cv_ldap_LIBS $curl_cv_save_LIBS"
fi
AC_MSG_RESULT([$curl_cv_ldap_LIBS])
;;
esac
#
])
dnl CURL_CHECK_HEADER_MALLOC dnl CURL_CHECK_HEADER_MALLOC
dnl ------------------------------------------------- dnl -------------------------------------------------
dnl Check for compilable and valid malloc.h header, dnl Check for compilable and valid malloc.h header,
@@ -1107,7 +1616,7 @@ AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
# define PLATFORM_SUNOS4 # define PLATFORM_SUNOS4
# endif # endif
#endif #endif
#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4) #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)
# define PLATFORM_AIX_V3 # define PLATFORM_AIX_V3
#endif #endif
@@ -1316,6 +1825,9 @@ AC_TRY_RUN([
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <netdb.h> #include <netdb.h>
#ifndef NULL
#define NULL (void *)0
#endif
int int
main () { main () {
@@ -1762,7 +2274,7 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
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 -Wno-long-long -Wsign-compare" WARN="$WARN -Wundef -Wno-long-long -Wsign-compare -Wshadow -Wno-multichar"
fi fi
if test "$gccnum" -ge "296"; then if test "$gccnum" -ge "296"; then
@@ -1830,81 +2342,6 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
]) dnl end of AC_DEFUN() ]) dnl end of AC_DEFUN()
dnl Determine the name of the library to pass to dlopen() based on the name
dnl that would normally be given to AC_CHECK_LIB. The preprocessor symbol
dnl given is set to the quoted library file name.
dnl The standard dynamic library file name is first generated, based on the
dnl current system type, then a search is performed for that file on the
dnl standard dynamic library path. If it is a symbolic link, the destination
dnl of the link is used as the file name, after stripping off any minor
dnl version numbers. If a library file can't be found, a guess is made.
dnl This macro assumes AC_PROG_LIBTOOL has been called and requires perl
dnl to be available in the PATH, or $PERL to be set to its location.
dnl
dnl CURL_DLLIB_NAME(VARIABLE, library_name)
dnl e.g. CURL_DLLIB_NAME(LDAP_NAME, ldap) on a Linux system might result
dnl in LDAP_NAME holding the string "libldap.so.2".
AC_DEFUN([CURL_DLLIB_NAME],
[
AC_MSG_CHECKING([name of dynamic library $2])
dnl The shared library extension variable name changes from version to
dnl version of libtool. Try a few names then just set one statically.
test -z "$shared_ext" && eval shared_ext=\"$shrext_cmds\"
test -z "$shared_ext" && shared_ext="$std_shrext"
test -z "$shared_ext" && shared_ext="$shrext"
test -z "$shared_ext" && shared_ext=".so"
dnl Create the library link name of the correct form for this platform
LIBNAME_LINK_SPEC=`echo "$library_names_spec" | $SED 's/^.* //'`
DLGUESSLIB=`name=$2 eval echo "$libname_spec"`
DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_SPEC"`
dnl Last resort in case libtool knows nothing about shared libs on this platform
test -z "$DLGUESSFILE" && DLGUESSFILE="$DLGUESSLIB$shared_ext"
dnl Synthesize a likely dynamic library name in case we can't find an actual one
SO_NAME_SPEC="$soname_spec"
dnl soname_spec undefined when identical to the 1st entry in library_names_spec
test -z "$SO_NAME_SPEC" && SO_NAME_SPEC=`echo "$library_names_spec" | $SED 's/ .*$//'`
DLGUESSSOFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$SO_NAME_SPEC"`
dnl Last resort in case libtool knows nothing about shared libs on this platform
test -z "$DLGUESSSOFILE" && DLGUESSSOFILE="$DLGUESSFILE"
if test "$cross_compiling" = yes; then
dnl Can't look at filesystem when cross-compiling
AC_DEFINE_UNQUOTED($1, "$DLGUESSSOFILE", [$2 dynamic library file])
AC_MSG_RESULT([$DLGUESSSOFILE (guess while cross-compiling)])
else
DLFOUNDFILE=""
if test "$sys_lib_dlsearch_path_spec" ; then
dnl Search for the link library name and see what it points to.
for direc in $sys_lib_dlsearch_path_spec ; do
DLTRYFILE="$direc/$DLGUESSFILE"
dnl Find where the symbolic link for this name points
changequote(<<, >>)dnl
<<
DLFOUNDFILE=`${PERL:-perl} -e 'use File::Basename; (basename(readlink($ARGV[0])) =~ /^(.*[^\d]\.\d+)[\d\.]*$/ && print ${1}) || exit 1;' "$DLTRYFILE" 2>&5`
>>
changequote([, ])dnl
if test "$?" -eq "0"; then
dnl Found the file link
break
fi
done
fi
if test -z "$DLFOUNDFILE" ; then
dnl Couldn't find a link library, so guess at a name.
DLFOUNDFILE="$DLGUESSSOFILE"
fi
AC_DEFINE_UNQUOTED($1, "$DLFOUNDFILE", [$2 dynamic library file])
AC_MSG_RESULT($DLFOUNDFILE)
fi
])
# This is only a temporary fix. This macro is here to replace the broken one # This is only a temporary fix. This macro is here to replace the broken one
# delivered by the automake project (including the 1.9.6 release). As soon as # delivered by the automake project (including the 1.9.6 release). As soon as
# they ship a working version we SHOULD remove this work-around. # they ship a working version we SHOULD remove this work-around.

View File

@@ -1,5 +1,83 @@
Changelog for the c-ares project Changelog for the c-ares project
* October 2 2007 (Daniel Stenberg)
- ares_strerror() segfaulted if the input error number was out of the currently
supported range.
- Yang Tse: Avoid a segfault when generating a DNS "Transaction ID" in
internal function init_id_key() under low memory conditions.
* September 28 2007 (Daniel Stenberg)
- Bumped version to 1.5.0 for next release and soname bumped to 2 due to ABI
and API changes in the progress callback (and possibly more coming up from
Steinar)
* September 28 2007 (Steinar H. Gunderson)
- Don't skip a server if it's the only one. (Bugfix from the Google tree.)
- Made the query callbacks receive the number of timeouts that happened during
the execution of a query, and updated documentation accordingly. (Patch from
the Google tree.)
- Support a few more socket options: ARES_OPT_SOCK_SNDBUF and
ARES_OPT_SOCK_RCVBUF
- Always register for TCP events even if there are no outstanding queries, as
the other side could always close the connection, which is a valid event
which should be responded to.
* September 22 2007 (Daniel Stenberg)
- Steinar H. Gunderson fixed: Correctly clear sockets from the fd_set on in
several functions (write_tcp_data, read_tcp_data, read_udp_packets) so that
if it fails and the socket is closed the following code doesn't try to use
the file descriptor.
- Steinar H. Gunderson modified c-ares to now also do to DNS retries even when
TCP is used since there are several edge cases where it still makes sense.
- Brad House provided a fix for ares_save_options():
Apparently I overlooked something with the ares_save_options() where it
would try to do a malloc(0) when no options of that type needed to be saved.
On most platforms, this was fine because malloc(0) doesn't actually return
NULL, but on AIX it does, so ares_save_options would return ARES_ENOMEM.
* July 14 2007 (Daniel Stenberg)
- Vlad Dinulescu fixed two outstanding valgrind reports:
1. In ares_query.c , in find_query_by_id we compare q->qid (which is a short
int variable) with qid, which is declared as an int variable. Moreover,
DNS_HEADER_SET_QID is used to set the value of qid, but DNS_HEADER_SET_QID
sets only the first two bytes of qid. I think that qid should be declared as
"unsigned short" in this function.
2. The same problem occurs in ares_process.c, process_answer() . query->qid
(an unsigned short integer variable) is compared with id, which is an
integer variable. Moreover, id is initialized from DNS_HEADER_QID which sets
only the first two bytes of id. I think that the id variable should be
declared as "unsigned short" in this function.
Even after declaring these variables as "unsigned short", the valgrind
errors are still there. Which brings us to the third problem.
3. The third problem is that Valgrind assumes that query->qid is not
initialised correctly. And it does that because query->qid is set from
DNS_HEADER_QID(qbuf); Valgrind says that qbuf has unitialised bytes. And
qbuf has uninitialised bytes because of channel->next_id . And next_id is
set by ares_init.c:ares__generate_new_id() . I found that putting short r=0
in this function (instead of short r) makes all Valgrind warnings go away.
I have studied ares__rc4() too, and this is the offending line:
buffer_ptr[counter] ^= state[xorIndex]; (ares_query.c:62)
This is what triggers Valgrind.. buffer_ptr is unitialised in this function,
and by applying ^= on it, it remains unitialised.
Version 1.4.0 (June 8, 2007) Version 1.4.0 (June 8, 2007)
* June 4 2007 (Daniel Stenberg) * June 4 2007 (Daniel Stenberg)

View File

@@ -11,10 +11,10 @@ MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/vc.dsw vc/ahost/ahost.dep \
# adig and ahost are just sample programs and thus not mentioned with the # adig and ahost are just sample programs and thus not mentioned with the
# regular sources and headers # regular sources and headers
EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \
$(MSVCFILES) AUTHORS config-win32.h RELEASE-NOTES $(MSVCFILES) AUTHORS config-win32.h RELEASE-NOTES libcares.pc.in
VER=-version-info 1:0:0 VER=-version-info 2:0:0
# This flag accepts an argument of the form current[:revision[:age]]. So, # This flag accepts an argument of the form current[:revision[:age]]. So,
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
# 1. # 1.

View File

@@ -14,7 +14,8 @@ CFLAGS += -DWATT32 -DHAVE_AF_INET6 -DHAVE_PF_INET6 -DHAVE_FIONBIO \
-DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \ -DHAVE_STRUCT_IN6_ADDR -DHAVE_SOCKADDR_IN6_SIN6_SCOPE_ID \
-DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \ -DHAVE_SYS_TIME_H -DHAVE_STRUCT_SOCKADDR_IN6 -DHAVE_STRUCT_ADDRINFO \
-DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' -DHAVE_PROCESS_H \ -DHAVE_SIGNAL_H -DHAVE_SIG_ATOMIC_T -DRETSIGTYPE='void' -DHAVE_PROCESS_H \
-DHAVE_ARPA_NAMESER_H -DNS_INADDRSZ=4 -DHAVE_RECV -DHAVE_SEND \ -DHAVE_ARPA_NAMESER_H -DHAVE_SYS_SOCKET_H -DHAVE_SYS_UIO_H -DHAVE_NETINET_IN_H \
-DHAVE_NETINET_TCP_H -DNS_INADDRSZ=4 -DHAVE_RECV -DHAVE_SEND \
-DSEND_TYPE_ARG1='int' -DSEND_QUAL_ARG2='const' \ -DSEND_TYPE_ARG1='int' -DSEND_QUAL_ARG2='const' \
-DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \ -DSEND_TYPE_ARG2='void*' -DSEND_TYPE_ARG3='int' \
-DSEND_TYPE_ARG4='int' -DSEND_TYPE_RETV='int' \ -DSEND_TYPE_ARG4='int' -DSEND_TYPE_RETV='int' \

View File

@@ -6,7 +6,7 @@ ares_timeout.c ares_destroy.c ares_mkquery.c ares_version.c \
ares_expand_name.c ares_parse_a_reply.c windows_port.c \ ares_expand_name.c ares_parse_a_reply.c windows_port.c \
ares_expand_string.c ares_parse_ptr_reply.c ares_parse_aaaa_reply.c \ ares_expand_string.c ares_parse_ptr_reply.c ares_parse_aaaa_reply.c \
ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c \ ares_getnameinfo.c inet_net_pton.c bitncmp.c inet_ntop.c \
ares_parse_ns_reply.c ares_parse_ns_reply.c ares_llist.c
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h \ HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h \
nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h \ nameser.h inet_net_pton.h inet_ntop.h ares_ipv6.h bitncmp.h \

View File

@@ -35,10 +35,10 @@ ifndef LIBARCH
LIBARCH = LIBC LIBARCH = LIBC
endif endif
# must be equal to DEBUG or NDEBUG # must be equal to NDEBUG or DEBUG, CURLDEBUG
ifndef DB
DB = NDEBUG DB = NDEBUG
# DB = DEBUG endif
# DB = CURLDEBUG
# Optimization: -O<n> or debugging: -g # Optimization: -O<n> or debugging: -g
ifeq ($(DB),NDEBUG) ifeq ($(DB),NDEBUG)
OPT = -O2 OPT = -O2
@@ -51,12 +51,20 @@ endif
# Include the version info retrieved from curlver.h # Include the version info retrieved from curlver.h
-include $(OBJDIR)/version.inc -include $(OBJDIR)/version.inc
# The following line defines your compiler. # The following lines defines your compiler.
ifdef CWFolder
METROWERKS = $(CWFolder)
endif
ifdef METROWERKS ifdef METROWERKS
# MWCW_PATH = $(subst \,/,$(METROWERKS))/Novell Support
MWCW_PATH = $(subst \,/,$(METROWERKS))/Novell Support/Metrowerks Support
CC = mwccnlm CC = mwccnlm
else else
CC = gcc CC = gcc
endif endif
# a native win32 awk can be downloaded from here:
# http://www.gknw.net/development/prgtools/awk-20050424.zip
AWK = awk
YACC = bison -y YACC = bison -y
CP = cp -afv CP = cp -afv
# RM = rm -f # RM = rm -f
@@ -82,8 +90,10 @@ ifeq ($(LIBARCH),LIBC)
PRELUDE = $(SDK_LIBC)/imports/libcpre.o PRELUDE = $(SDK_LIBC)/imports/libcpre.o
CFLAGS += -align 4 CFLAGS += -align 4
else else
PRELUDE = "$(METROWERKS)/Novell Support/libraries/runtime/prelude.obj" # PRELUDE = $(SDK_CLIB)/imports/clibpre.o
# CFLAGS += -include "$(METROWERKS)/Novell Support/headers/nlm_prefix.h" # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj"
# CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h"
CFLAGS += -align 1 CFLAGS += -align 1
endif endif
else else
@@ -98,7 +108,10 @@ CFLAGS += -Wall -Wno-format -Wno-uninitialized # -pedantic
ifeq ($(LIBARCH),LIBC) ifeq ($(LIBARCH),LIBC)
PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o
else else
PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o # PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o
# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
# http://www.gknw.net/development/mk_nlm/gcc_pre.zip
PRELUDE = $(NDK_ROOT)/pre/prelude.o
CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h CFLAGS += -include $(NDKBASE)/nlmconv/genlm.h
endif endif
endif endif
@@ -108,14 +121,17 @@ SDK_CLIB = $(NDK_ROOT)/nwsdk
SDK_LIBC = $(NDK_ROOT)/libc SDK_LIBC = $(NDK_ROOT)/libc
ifeq ($(LIBARCH),LIBC) ifeq ($(LIBARCH),LIBC)
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks INCLUDES += -I$(SDK_LIBC)/include
# INCLUDES += -I$(SDK_LIBC)/include/nks
# INCLUDES += -I$(SDK_LIBC)/include/winsock # INCLUDES += -I$(SDK_LIBC)/include/winsock
CFLAGS += -D_POSIX_SOURCE CFLAGS += -D_POSIX_SOURCE
# CFLAGS += -D__ANSIC__
else else
INCLUDES += -I$(SDK_CLIB)/include/nlm -I$(SDK_CLIB)/include INCLUDES += -I$(SDK_CLIB)/include/nlm
# INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete # INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete
CFLAGS += -DNETDB_USE_INTERNET # INCLUDES += -I$(SDK_CLIB)/include
endif
ifeq ($(DB),CURLDEBUG)
INCLUDES += -I../include
endif endif
CFLAGS += -I. $(INCLUDES) CFLAGS += -I. $(INCLUDES)
@@ -186,7 +202,7 @@ $(OBJDIR)/%.o: %.c
$(OBJDIR)/version.inc: ares_version.h $(OBJDIR) $(OBJDIR)/version.inc: ares_version.h $(OBJDIR)
@echo Creating $@ @echo Creating $@
@awk -f ../packages/NetWare/get_ver.awk $< > $@ @$(AWK) -f ../packages/NetWare/get_ver.awk $< > $@
$(OBJDIR)/%.xdc: Makefile.netware $(OBJDIR)/%.xdc: Makefile.netware
@echo Creating $@ @echo Creating $@
@@ -267,25 +283,77 @@ config.h: Makefile.netware
@echo $(DL)#ifndef NETWARE$(DL) >> $@ @echo $(DL)#ifndef NETWARE$(DL) >> $@
@echo $(DL)#error This $(notdir $@) is created for NetWare platform!$(DL) >> $@ @echo $(DL)#error This $(notdir $@) is created for NetWare platform!$(DL) >> $@
@echo $(DL)#endif$(DL) >> $@ @echo $(DL)#endif$(DL) >> $@
@echo $(DL)#define OS "i586-pc-NetWare"$(DL) >> $@
@echo $(DL)#define VERSION "$(LIBCARES_VERSION_STR)"$(DL) >> $@ @echo $(DL)#define VERSION "$(LIBCARES_VERSION_STR)"$(DL) >> $@
@echo $(DL)#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/"$(DL) >> $@ @echo $(DL)#define PACKAGE_BUGREPORT "a suitable curl mailing list => http://curl.haxx.se/mail/"$(DL) >> $@
@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@ ifeq ($(LIBARCH),CLIB)
@echo $(DL)#define HAVE_ARPA_NAMESER_H 1$(DL) >> $@ @echo $(DL)#define OS "i586-pc-clib-NetWare"$(DL) >> $@
@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@ @echo $(DL)#define MAXHOSTNAMELEN 256$(DL) >> $@
@echo $(DL)#define NETDB_USE_INTERNET 1$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG2 char *$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG3 int$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG4 int$(DL) >> $@
@echo $(DL)#define RECV_TYPE_RETV int$(DL) >> $@
@echo $(DL)#define SEND_QUAL_ARG2$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG1 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG2 char *$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG3 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@
@echo $(DL)#define DL_LDAP_FILE "ldapsdk.nlm"$(DL) >> $@
@echo $(DL)#define socklen_t int$(DL) >> $@
@echo $(DL)#define strncasecmp strnicmp$(DL) >> $@
@echo $(DL)#define strcasecmp stricmp$(DL) >> $@
else
@echo $(DL)#define OS "i586-pc-libc-NetWare"$(DL) >> $@
@echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@ @echo $(DL)#define HAVE_DLFCN_H 1$(DL) >> $@
@echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@ @echo $(DL)#define HAVE_DLOPEN 1$(DL) >> $@
@echo $(DL)#define HAVE_ERR_H 1$(DL) >> $@ @echo $(DL)#define HAVE_FTRUNCATE 1$(DL) >> $@
@echo $(DL)#define HAVE_FCNTL_H 1$(DL) >> $@
@echo $(DL)#define HAVE_FIONBIO 1$(DL) >> $@
@echo $(DL)#define HAVE_GETHOSTBYADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@ @echo $(DL)#define HAVE_GETTIMEOFDAY 1$(DL) >> $@
@echo $(DL)#define HAVE_INET_ADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_INET_NTOA 1$(DL) >> $@
@echo $(DL)#define HAVE_INET_PTON 1$(DL) >> $@ @echo $(DL)#define HAVE_INET_PTON 1$(DL) >> $@
@echo $(DL)#define HAVE_INTTYPES_H 1$(DL) >> $@ @echo $(DL)#define HAVE_INTTYPES_H 1$(DL) >> $@
@echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@ @echo $(DL)#define HAVE_LIMITS_H 1$(DL) >> $@
@echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@ @echo $(DL)#define HAVE_LONGLONG 1$(DL) >> $@
@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@
@echo $(DL)#define HAVE_STRCASECMP 1$(DL) >> $@
@echo $(DL)#define HAVE_STRLCAT 1$(DL) >> $@
@echo $(DL)#define HAVE_STRLCPY 1$(DL) >> $@
@echo $(DL)#define HAVE_STRTOLL 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@
@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG2 void *$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG3 size_t$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG4 int$(DL) >> $@
@echo $(DL)#define RECV_TYPE_RETV ssize_t$(DL) >> $@
@echo $(DL)#define SEND_QUAL_ARG2$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG1 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG2 void *$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG3 size_t$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_RETV ssize_t$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
@echo $(DL)#define DL_LDAP_FILE "lldapsdk.nlm"$(DL) >> $@
endif
@echo $(DL)#define HAVE_ARPA_INET_H 1$(DL) >> $@
@echo $(DL)#define HAVE_ARPA_NAMESER_H 1$(DL) >> $@
@echo $(DL)#define HAVE_ASSERT_H 1$(DL) >> $@
@echo $(DL)#define HAVE_ERR_H 1$(DL) >> $@
@echo $(DL)#define HAVE_FCNTL_H 1$(DL) >> $@
@echo $(DL)#define HAVE_FIONBIO 1$(DL) >> $@
@echo $(DL)#define HAVE_GETHOSTBYADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_GETHOSTBYNAME 1$(DL) >> $@
@echo $(DL)#define HAVE_GETPROTOBYNAME 1$(DL) >> $@
@echo $(DL)#define HAVE_GMTIME_R 1$(DL) >> $@
@echo $(DL)#define HAVE_INET_ADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_INET_NTOA 1$(DL) >> $@
@echo $(DL)#define HAVE_LL 1$(DL) >> $@
@echo $(DL)#define HAVE_LOCALTIME_R 1$(DL) >> $@
@echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@ @echo $(DL)#define HAVE_MALLOC_H 1$(DL) >> $@
@echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@ @echo $(DL)#define HAVE_NETINET_IN_H 1$(DL) >> $@
@echo $(DL)#define HAVE_RECV 1$(DL) >> $@ @echo $(DL)#define HAVE_RECV 1$(DL) >> $@
@@ -296,46 +364,26 @@ config.h: Makefile.netware
@echo $(DL)#define HAVE_SIGNAL_H 1$(DL) >> $@ @echo $(DL)#define HAVE_SIGNAL_H 1$(DL) >> $@
@echo $(DL)#define HAVE_SIG_ATOMIC_T 1$(DL) >> $@ @echo $(DL)#define HAVE_SIG_ATOMIC_T 1$(DL) >> $@
@echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@ @echo $(DL)#define HAVE_SOCKET 1$(DL) >> $@
@echo $(DL)#define HAVE_STDINT_H 1$(DL) >> $@
@echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@ @echo $(DL)#define HAVE_STDLIB_H 1$(DL) >> $@
@echo $(DL)#define HAVE_STRCASECMP 1$(DL) >> $@
@echo $(DL)#define HAVE_STRDUP 1$(DL) >> $@ @echo $(DL)#define HAVE_STRDUP 1$(DL) >> $@
@echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@ @echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@
@echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@ @echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@
@echo $(DL)#define HAVE_STRLCAT 1$(DL) >> $@
@echo $(DL)#define HAVE_STRLCPY 1$(DL) >> $@
@echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@ @echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@ @echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@ @echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_IOCTL_H 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@ @echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_TIME_H 1$(DL) >> $@ @echo $(DL)#define HAVE_SYS_TIME_H 1$(DL) >> $@
@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@
@echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@ @echo $(DL)#define HAVE_TIME_H 1$(DL) >> $@
@echo $(DL)#define HAVE_UNAME 1$(DL) >> $@ @echo $(DL)#define HAVE_UNAME 1$(DL) >> $@
@echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@ @echo $(DL)#define HAVE_UNISTD_H 1$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@ @echo $(DL)#define HAVE_UTIME 1$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG2 char *$(DL) >> $@ @echo $(DL)#define HAVE_UTIME_H 1$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG3 int$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG4 int$(DL) >> $@
@echo $(DL)#define RECV_TYPE_RETV int$(DL) >> $@
@echo $(DL)#define RETSIGTYPE void$(DL) >> $@ @echo $(DL)#define RETSIGTYPE void$(DL) >> $@
@echo $(DL)#define SEND_QUAL_ARG2$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG1 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG2 char *$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG3 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@
@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ @echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ @echo $(DL)#define STDC_HEADERS 1$(DL) >> $@
@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ @echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
ifdef NW_WINSOCK ifdef NW_WINSOCK
@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ @echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@
else else

View File

@@ -60,6 +60,7 @@ OBJECTS = $(OBJ_DIR)\ares_fds.obj \
$(OBJ_DIR)\ares_strerror.obj \ $(OBJ_DIR)\ares_strerror.obj \
$(OBJ_DIR)\ares_cancel.obj \ $(OBJ_DIR)\ares_cancel.obj \
$(OBJ_DIR)\ares_init.obj \ $(OBJ_DIR)\ares_init.obj \
$(OBJ_DIR)\ares_llist.obj \
$(OBJ_DIR)\ares_timeout.obj \ $(OBJ_DIR)\ares_timeout.obj \
$(OBJ_DIR)\ares_destroy.obj \ $(OBJ_DIR)\ares_destroy.obj \
$(OBJ_DIR)\ares_mkquery.obj \ $(OBJ_DIR)\ares_mkquery.obj \
@@ -231,3 +232,6 @@ $(OBJ_DIR)\inet_ntop.obj: inet_ntop.c setup.h setup_once.h nameser.h \
ares_ipv6.h inet_ntop.h ares_ipv6.h inet_ntop.h
$(OBJ_DIR)\ares_getopt.obj: ares_getopt.c ares_getopt.h $(OBJ_DIR)\ares_getopt.obj: ares_getopt.c ares_getopt.h
$(OBJ_DIR)\ares_llist.obj: ares_llist.c setup.h setup_once.h ares.h \
ares_private.h ares_llist.h

View File

@@ -1085,7 +1085,7 @@ AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
# define PLATFORM_SUNOS4 # define PLATFORM_SUNOS4
# endif # endif
#endif #endif
#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4) #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)
# define PLATFORM_AIX_V3 # define PLATFORM_AIX_V3
#endif #endif
@@ -1369,7 +1369,7 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
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 -Wno-long-long -Wsign-compare" WARN="$WARN -Wundef -Wno-long-long -Wsign-compare -Wshadow -Wno-multichar"
fi fi
if test "$gccnum" -ge "296"; then if test "$gccnum" -ge "296"; then

View File

@@ -127,7 +127,8 @@ static const char *rcodes[] = {
"(unknown)", "(unknown)", "(unknown)", "(unknown)", "NOCHANGE" "(unknown)", "(unknown)", "(unknown)", "(unknown)", "NOCHANGE"
}; };
static void callback(void *arg, int status, unsigned char *abuf, int alen); static void callback(void *arg, int status, int timeouts,
unsigned char *abuf, int alen);
static const unsigned char *display_question(const unsigned char *aptr, static const unsigned char *display_question(const unsigned char *aptr,
const unsigned char *abuf, const unsigned char *abuf,
int alen); int alen);
@@ -294,7 +295,8 @@ int main(int argc, char **argv)
return 0; return 0;
} }
static void callback(void *arg, int status, unsigned char *abuf, int alen) static void callback(void *arg, int status, int timeouts,
unsigned char *abuf, int alen)
{ {
char *name = (char *) arg; char *name = (char *) arg;
int id, qr, opcode, aa, tc, rd, ra, rcode; int id, qr, opcode, aa, tc, rd, ra, rcode;

View File

@@ -47,7 +47,7 @@ struct in6_addr
}; };
#endif #endif
static void callback(void *arg, int status, struct hostent *host); static void callback(void *arg, int status, int timeouts, struct hostent *host);
static void usage(void); static void usage(void);
int main(int argc, char **argv) int main(int argc, char **argv)
@@ -142,7 +142,7 @@ int main(int argc, char **argv)
return 0; return 0;
} }
static void callback(void *arg, int status, struct hostent *host) static void callback(void *arg, int status, int timeouts, struct hostent *host)
{ {
char **p; char **p;

View File

@@ -20,12 +20,15 @@
#include <sys/types.h> #include <sys/types.h>
#if defined(_AIX) || defined(NETWARE) #if defined(_AIX) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish /* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
libc5-based Linux systems. Only include it on system that are known to libc5-based Linux systems. Only include it on system that are known to
require it! */ require it! */
#include <sys/select.h> #include <sys/select.h>
#endif #endif
#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
#include <sys/bsdskt.h>
#endif
#if defined(WATT32) #if defined(WATT32)
#include <netinet/in.h> #include <netinet/in.h>
@@ -95,6 +98,8 @@ extern "C" {
#define ARES_OPT_LOOKUPS (1 << 8) #define ARES_OPT_LOOKUPS (1 << 8)
#define ARES_OPT_SOCK_STATE_CB (1 << 9) #define ARES_OPT_SOCK_STATE_CB (1 << 9)
#define ARES_OPT_SORTLIST (1 << 10) #define ARES_OPT_SORTLIST (1 << 10)
#define ARES_OPT_SOCK_SNDBUF (1 << 11)
#define ARES_OPT_SOCK_RCVBUF (1 << 12)
/* Nameinfo flag values */ /* Nameinfo flag values */
#define ARES_NI_NOFQDN (1 << 0) #define ARES_NI_NOFQDN (1 << 0)
@@ -153,17 +158,10 @@ typedef int ares_socket_t;
#define ares_socket_typedef #define ares_socket_typedef
#endif /* ares_socket_typedef */ #endif /* ares_socket_typedef */
#ifdef WIN32
typedef void (*ares_sock_state_cb)(void *data, typedef void (*ares_sock_state_cb)(void *data,
SOCKET socket, ares_socket_t socket_fd,
int readable, int readable,
int writable); int writable);
#else
typedef void (*ares_sock_state_cb)(void *data,
int socket,
int readable,
int writable);
#endif
struct apattern; struct apattern;
@@ -174,6 +172,8 @@ struct ares_options {
int ndots; int ndots;
unsigned short udp_port; unsigned short udp_port;
unsigned short tcp_port; unsigned short tcp_port;
int socket_send_buffer_size;
int socket_receive_buffer_size;
struct in_addr *servers; struct in_addr *servers;
int nservers; int nservers;
char **domains; char **domains;
@@ -190,11 +190,11 @@ struct timeval;
struct sockaddr; struct sockaddr;
struct ares_channeldata; struct ares_channeldata;
typedef struct ares_channeldata *ares_channel; typedef struct ares_channeldata *ares_channel;
typedef void (*ares_callback)(void *arg, int status, unsigned char *abuf, typedef void (*ares_callback)(void *arg, int status, int timeouts,
int alen); unsigned char *abuf, int alen);
typedef void (*ares_host_callback)(void *arg, int status, typedef void (*ares_host_callback)(void *arg, int status, int timeouts,
struct hostent *hostent); struct hostent *hostent);
typedef void (*ares_nameinfo_callback)(void *arg, int status, typedef void (*ares_nameinfo_callback)(void *arg, int status, int timeouts,
char *node, char *service); char *node, char *service);
int ares_init(ares_channel *channelptr); int ares_init(ares_channel *channelptr);

View File

@@ -35,6 +35,8 @@ void ares__close_sockets(ares_channel channel, struct server_state *server)
/* Advance server->qhead; pull out query as we go. */ /* Advance server->qhead; pull out query as we go. */
sendreq = server->qhead; sendreq = server->qhead;
server->qhead = sendreq->next; server->qhead = sendreq->next;
if (sendreq->data_storage != NULL)
free(sendreq->data_storage);
free(sendreq); free(sendreq);
} }
server->qtail = NULL; server->qtail = NULL;
@@ -45,12 +47,16 @@ void ares__close_sockets(ares_channel channel, struct server_state *server)
server->tcp_buffer = NULL; server->tcp_buffer = NULL;
server->tcp_lenbuf_pos = 0; server->tcp_lenbuf_pos = 0;
/* Reset brokenness */
server->is_broken = 0;
/* Close the TCP and UDP sockets. */ /* Close the TCP and UDP sockets. */
if (server->tcp_socket != ARES_SOCKET_BAD) if (server->tcp_socket != ARES_SOCKET_BAD)
{ {
SOCK_STATE_CALLBACK(channel, server->tcp_socket, 0, 0); SOCK_STATE_CALLBACK(channel, server->tcp_socket, 0, 0);
closesocket(server->tcp_socket); closesocket(server->tcp_socket);
server->tcp_socket = ARES_SOCKET_BAD; server->tcp_socket = ARES_SOCKET_BAD;
server->tcp_connection_generation = ++channel->tcp_connection_generation;
} }
if (server->udp_socket != ARES_SOCKET_BAD) if (server->udp_socket != ARES_SOCKET_BAD)
{ {

View File

@@ -14,29 +14,45 @@
*/ */
#include "setup.h" #include "setup.h"
#include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include "ares.h" #include "ares.h"
#include "ares_private.h" #include "ares_private.h"
/* /*
* ares_cancel() cancels a ongoing request/resolve that might be going on on * ares_cancel() cancels all ongoing requests/resolves that might be going on
* the given channel. It does NOT kill the channel, use ares_destroy() for * on the given channel. It does NOT kill the channel, use ares_destroy() for
* that. * that.
*/ */
void ares_cancel(ares_channel channel) void ares_cancel(ares_channel channel)
{ {
struct query *query, *next; struct query *query;
struct list_node* list_head;
struct list_node* list_node;
int i; int i;
for (query = channel->queries; query; query = next) list_head = &(channel->all_queries);
for (list_node = list_head->next; list_node != list_head; )
{ {
next = query->next; query = list_node->data;
query->callback(query->arg, ARES_ETIMEOUT, NULL, 0); list_node = list_node->next; /* since we're deleting the query */
free(query->tcpbuf); query->callback(query->arg, ARES_ETIMEOUT, 0, NULL, 0);
free(query->skip_server); ares__free_query(query);
free(query);
} }
channel->queries = NULL; #ifndef NDEBUG
/* Freeing the query should remove it from all the lists in which it sits,
* so all query lists should be empty now.
*/
assert(ares__is_list_empty(&(channel->all_queries)));
for (i = 0; i < ARES_QID_TABLE_SIZE; i++)
{
assert(ares__is_list_empty(&(channel->queries_by_qid[i])));
}
for (i = 0; i < ARES_TIMEOUT_TABLE_SIZE; i++)
{
assert(ares__is_list_empty(&(channel->queries_by_timeout[i])));
}
#endif
if (!(channel->flags & ARES_FLAG_STAYOPEN)) if (!(channel->flags & ARES_FLAG_STAYOPEN))
{ {
if (channel->servers) if (channel->servers)

View File

@@ -16,6 +16,7 @@
*/ */
#include "setup.h" #include "setup.h"
#include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include "ares.h" #include "ares.h"
#include "ares_private.h" #include "ares_private.h"
@@ -37,13 +38,42 @@ void ares_destroy(ares_channel channel)
{ {
int i; int i;
struct query *query; struct query *query;
struct list_node* list_head;
struct list_node* list_node;
if (!channel) if (!channel)
return; return;
list_head = &(channel->all_queries);
for (list_node = list_head->next; list_node != list_head; )
{
query = list_node->data;
list_node = list_node->next; /* since we're deleting the query */
query->callback(query->arg, ARES_EDESTRUCTION, 0, NULL, 0);
ares__free_query(query);
}
#ifndef NDEBUG
/* Freeing the query should remove it from all the lists in which it sits,
* so all query lists should be empty now.
*/
assert(ares__is_list_empty(&(channel->all_queries)));
for (i = 0; i < ARES_QID_TABLE_SIZE; i++)
{
assert(ares__is_list_empty(&(channel->queries_by_qid[i])));
}
for (i = 0; i < ARES_TIMEOUT_TABLE_SIZE; i++)
{
assert(ares__is_list_empty(&(channel->queries_by_timeout[i])));
}
#endif
if (channel->servers) { if (channel->servers) {
for (i = 0; i < channel->nservers; i++) for (i = 0; i < channel->nservers; i++)
ares__close_sockets(channel, &channel->servers[i]); {
struct server_state *server = &channel->servers[i];
ares__close_sockets(channel, server);
assert(ares__is_list_empty(&(server->queries_to_server)));
}
free(channel->servers); free(channel->servers);
} }
@@ -59,16 +89,5 @@ void ares_destroy(ares_channel channel)
if (channel->lookups) if (channel->lookups)
free(channel->lookups); free(channel->lookups);
while (channel->queries) {
query = channel->queries;
channel->queries = query->next;
query->callback(query->arg, ARES_EDESTRUCTION, NULL, 0);
if (query->tcpbuf)
free(query->tcpbuf);
if (query->skip_server)
free(query->skip_server);
free(query);
}
free(channel); free(channel);
} }

View File

@@ -74,6 +74,15 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
return ARES_ENOMEM; return ARES_ENOMEM;
q = *s; q = *s;
if (len == 0) {
/* RFC2181 says this should be ".": the root of the DNS tree.
* Since this function strips trailing dots though, it becomes ""
*/
q[0] = '\0';
*enclen = 1; /* the caller should move one byte to get past this */
return ARES_SUCCESS;
}
/* No error-checking necessary; it was all done by name_length(). */ /* No error-checking necessary; it was all done by name_length(). */
p = encoded; p = encoded;
while (*p) while (*p)

View File

@@ -28,7 +28,7 @@ ares_expand_string \- Expand a length encoded string
.SH DESCRIPTION .SH DESCRIPTION
The The
.B ares_expand_string .B ares_expand_string
function converts a length encoded string to a NULL terminated C function converts a length encoded string to a NUL-terminated C
string. The argument string. The argument
.I encoded .I encoded
gives the beginning of the encoded string, and the arguments gives the beginning of the encoded string, and the arguments

View File

@@ -30,20 +30,26 @@ int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
ares_socket_t nfds; ares_socket_t nfds;
int i; int i;
/* No queries, no file descriptors. */ /* Are there any active queries? */
if (!channel->queries) int active_queries = !ares__is_list_empty(&(channel->all_queries));
return 0;
nfds = 0; nfds = 0;
for (i = 0; i < channel->nservers; i++) for (i = 0; i < channel->nservers; i++)
{ {
server = &channel->servers[i]; server = &channel->servers[i];
if (server->udp_socket != ARES_SOCKET_BAD) /* We only need to register interest in UDP sockets if we have
* outstanding queries.
*/
if (active_queries && server->udp_socket != ARES_SOCKET_BAD)
{ {
FD_SET(server->udp_socket, read_fds); FD_SET(server->udp_socket, read_fds);
if (server->udp_socket >= nfds) if (server->udp_socket >= nfds)
nfds = server->udp_socket + 1; nfds = server->udp_socket + 1;
} }
/* We always register for TCP events, because we want to know
* when the other side closes the connection, so we don't waste
* time trying to use a broken connection.
*/
if (server->tcp_socket != ARES_SOCKET_BAD) if (server->tcp_socket != ARES_SOCKET_BAD)
{ {
FD_SET(server->tcp_socket, read_fds); FD_SET(server->tcp_socket, read_fds);

View File

@@ -33,12 +33,13 @@ allocated by one of the functions \fIares_parse_a_reply(3)\fP,
.SH NOTES .SH NOTES
It is not necessary (and is not correct) to free the host structure passed to It is not necessary (and is not correct) to free the host structure passed to
the callback functions for \fIares_gethostbyname(3)\fP or the callback functions for \fIares_gethostbyname(3)\fP or
\fIares_gethostbyaddr(3)\fP. The ares library will automatically free such \fIares_gethostbyaddr(3)\fP. c-ares will automatically free such host
host structures when the callback returns. structures when the callback returns.
.SH SEE ALSO .SH SEE ALSO
.BR ares_parse_a_reply (3), .BR ares_parse_a_reply (3),
.BR ares_parse_aaaa_reply (3), .BR ares_parse_aaaa_reply (3),
.BR ares_parse_ptr_reply (3) .BR ares_parse_ptr_reply (3),
.BR ares_parse_ns_reply (3)
.SH AUTHOR .SH AUTHOR
Greg Hudson, MIT Information Systems Greg Hudson, MIT Information Systems
.br .br

View File

@@ -22,7 +22,7 @@ ares_gethostbyaddr \- Initiate a host query by address
.B #include <ares.h> .B #include <ares.h>
.PP .PP
.B typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP, .B typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP,
.B struct hostent *\fIhostent\fP) .B int \fItimeouts\fP, struct hostent *\fIhostent\fP)
.PP .PP
.B void ares_gethostbyaddr(ares_channel \fIchannel\fP, const void *\fIaddr\fP, .B void ares_gethostbyaddr(ares_channel \fIchannel\fP, const void *\fIaddr\fP,
.B int \fIaddrlen\fP, int \fIfamily\fP, ares_host_callback \fIcallback\fP, .B int \fIaddrlen\fP, int \fIfamily\fP, ares_host_callback \fIcallback\fP,
@@ -76,6 +76,11 @@ The name service channel
.I channel .I channel
is being destroyed; the query will not be completed. is being destroyed; the query will not be completed.
.PP .PP
The callback argument
.I timeouts
reports how many times a query timed out during the execution of the
given request.
.PP
On successful completion of the query, the callback argument On successful completion of the query, the callback argument
.I hostent .I hostent
points to a points to a

View File

@@ -49,11 +49,12 @@ struct addr_query {
void *arg; void *arg;
const char *remaining_lookups; const char *remaining_lookups;
int timeouts;
}; };
static void next_lookup(struct addr_query *aquery); static void next_lookup(struct addr_query *aquery);
static void addr_callback(void *arg, int status, unsigned char *abuf, static void addr_callback(void *arg, int status, int timeouts,
int alen); unsigned char *abuf, int alen);
static void end_aquery(struct addr_query *aquery, int status, static void end_aquery(struct addr_query *aquery, int status,
struct hostent *host); struct hostent *host);
static int file_lookup(union ares_addr *addr, int family, struct hostent **host); static int file_lookup(union ares_addr *addr, int family, struct hostent **host);
@@ -65,21 +66,21 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
if (family != AF_INET && family != AF_INET6) if (family != AF_INET && family != AF_INET6)
{ {
callback(arg, ARES_ENOTIMP, NULL); callback(arg, ARES_ENOTIMP, 0, NULL);
return; return;
} }
if ((family == AF_INET && addrlen != sizeof(struct in_addr)) || if ((family == AF_INET && addrlen != sizeof(struct in_addr)) ||
(family == AF_INET6 && addrlen != sizeof(struct in6_addr))) (family == AF_INET6 && addrlen != sizeof(struct in6_addr)))
{ {
callback(arg, ARES_ENOTIMP, NULL); callback(arg, ARES_ENOTIMP, 0, NULL);
return; return;
} }
aquery = malloc(sizeof(struct addr_query)); aquery = malloc(sizeof(struct addr_query));
if (!aquery) if (!aquery)
{ {
callback(arg, ARES_ENOMEM, NULL); callback(arg, ARES_ENOMEM, 0, NULL);
return; return;
} }
aquery->channel = channel; aquery->channel = channel;
@@ -91,6 +92,7 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
aquery->callback = callback; aquery->callback = callback;
aquery->arg = arg; aquery->arg = arg;
aquery->remaining_lookups = channel->lookups; aquery->remaining_lookups = channel->lookups;
aquery->timeouts = 0;
next_lookup(aquery); next_lookup(aquery);
} }
@@ -151,11 +153,13 @@ static void next_lookup(struct addr_query *aquery)
end_aquery(aquery, ARES_ENOTFOUND, NULL); end_aquery(aquery, ARES_ENOTFOUND, NULL);
} }
static void addr_callback(void *arg, int status, unsigned char *abuf, int alen) static void addr_callback(void *arg, int status, int timeouts,
unsigned char *abuf, int alen)
{ {
struct addr_query *aquery = (struct addr_query *) arg; struct addr_query *aquery = (struct addr_query *) arg;
struct hostent *host; struct hostent *host;
aquery->timeouts += timeouts;
if (status == ARES_SUCCESS) if (status == ARES_SUCCESS)
{ {
if (aquery->family == AF_INET) if (aquery->family == AF_INET)
@@ -175,7 +179,7 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, int alen)
static void end_aquery(struct addr_query *aquery, int status, static void end_aquery(struct addr_query *aquery, int status,
struct hostent *host) struct hostent *host)
{ {
aquery->callback(aquery->arg, status, host); aquery->callback(aquery->arg, status, aquery->timeouts, host);
if (host) if (host)
ares_free_hostent(host); ares_free_hostent(host);
free(aquery); free(aquery);

View File

@@ -22,7 +22,7 @@ ares_gethostbyname \- Initiate a host query by name
.B #include <ares.h> .B #include <ares.h>
.PP .PP
.B typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP, .B typedef void (*ares_host_callback)(void *\fIarg\fP, int \fIstatus\fP,
.B struct hostent *\fIhostent\fP) .B int \fItimeouts\fP, struct hostent *\fIhostent\fP)
.PP .PP
.B void ares_gethostbyname(ares_channel \fIchannel\fP, const char *\fIname\fP, .B void ares_gethostbyname(ares_channel \fIchannel\fP, const char *\fIname\fP,
.B int \fIfamily\fP, ares_host_callback \fIcallback\fP, void *\fIarg\fP) .B int \fIfamily\fP, ares_host_callback \fIcallback\fP, void *\fIarg\fP)
@@ -80,6 +80,11 @@ The name service channel
.I channel .I channel
is being destroyed; the query will not be completed. is being destroyed; the query will not be completed.
.PP .PP
The callback argument
.I timeouts
reports how many times a query timed out during the execution of the
given request.
.PP
On successful completion of the query, the callback argument On successful completion of the query, the callback argument
.I hostent .I hostent
points to a points to a

View File

@@ -54,11 +54,12 @@ struct host_query {
void *arg; void *arg;
int family; int family;
const char *remaining_lookups; const char *remaining_lookups;
int timeouts;
}; };
static void next_lookup(struct host_query *hquery); static void next_lookup(struct host_query *hquery, int status);
static void host_callback(void *arg, int status, unsigned char *abuf, static void host_callback(void *arg, int status, int timeouts,
int alen); unsigned char *abuf, int alen);
static void end_hquery(struct host_query *hquery, int status, static void end_hquery(struct host_query *hquery, int status,
struct hostent *host); struct hostent *host);
static int fake_hostent(const char *name, int family, ares_host_callback callback, static int fake_hostent(const char *name, int family, ares_host_callback callback,
@@ -81,7 +82,7 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
/* Right now we only know how to look up Internet addresses. */ /* Right now we only know how to look up Internet addresses. */
if (family != AF_INET && family != AF_INET6) if (family != AF_INET && family != AF_INET6)
{ {
callback(arg, ARES_ENOTIMP, NULL); callback(arg, ARES_ENOTIMP, 0, NULL);
return; return;
} }
@@ -92,7 +93,7 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
hquery = malloc(sizeof(struct host_query)); hquery = malloc(sizeof(struct host_query));
if (!hquery) if (!hquery)
{ {
callback(arg, ARES_ENOMEM, NULL); callback(arg, ARES_ENOMEM, 0, NULL);
return; return;
} }
hquery->channel = channel; hquery->channel = channel;
@@ -101,20 +102,20 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
if (!hquery->name) if (!hquery->name)
{ {
free(hquery); free(hquery);
callback(arg, ARES_ENOMEM, NULL); callback(arg, ARES_ENOMEM, 0, NULL);
return; return;
} }
hquery->callback = callback; hquery->callback = callback;
hquery->arg = arg; hquery->arg = arg;
hquery->remaining_lookups = channel->lookups; hquery->remaining_lookups = channel->lookups;
hquery->timeouts = 0;
/* Start performing lookups according to channel->lookups. */ /* Start performing lookups according to channel->lookups. */
next_lookup(hquery); next_lookup(hquery, ARES_SUCCESS);
} }
static void next_lookup(struct host_query *hquery) static void next_lookup(struct host_query *hquery, int status)
{ {
int status;
const char *p; const char *p;
struct hostent *host; struct hostent *host;
@@ -126,8 +127,8 @@ static void next_lookup(struct host_query *hquery)
/* DNS lookup */ /* DNS lookup */
hquery->remaining_lookups = p + 1; hquery->remaining_lookups = p + 1;
if (hquery->family == AF_INET6) if (hquery->family == AF_INET6)
ares_search(hquery->channel, hquery->name, C_IN, T_AAAA, host_callback, ares_search(hquery->channel, hquery->name, C_IN, T_AAAA,
hquery); host_callback, hquery);
else else
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
hquery); hquery);
@@ -144,15 +145,17 @@ static void next_lookup(struct host_query *hquery)
break; break;
} }
} }
end_hquery(hquery, ARES_ENOTFOUND, NULL); end_hquery(hquery, status, NULL);
} }
static void host_callback(void *arg, int status, unsigned char *abuf, int alen) static void host_callback(void *arg, int status, int timeouts,
unsigned char *abuf, int alen)
{ {
struct host_query *hquery = (struct host_query *) arg; struct host_query *hquery = (struct host_query *) arg;
ares_channel channel = hquery->channel; ares_channel channel = hquery->channel;
struct hostent *host; struct hostent *host;
hquery->timeouts += timeouts;
if (status == ARES_SUCCESS) if (status == ARES_SUCCESS)
{ {
if (hquery->family == AF_INET) if (hquery->family == AF_INET)
@@ -179,13 +182,13 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen)
else if (status == ARES_EDESTRUCTION) else if (status == ARES_EDESTRUCTION)
end_hquery(hquery, status, NULL); end_hquery(hquery, status, NULL);
else else
next_lookup(hquery); next_lookup(hquery, status);
} }
static void end_hquery(struct host_query *hquery, int status, static void end_hquery(struct host_query *hquery, int status,
struct hostent *host) struct hostent *host)
{ {
hquery->callback(hquery->arg, status, host); hquery->callback(hquery->arg, status, hquery->timeouts, host);
if (host) if (host)
ares_free_hostent(host); ares_free_hostent(host);
free(hquery->name); free(hquery->name);
@@ -206,7 +209,27 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac
struct in6_addr in6; struct in6_addr in6;
if (family == AF_INET) if (family == AF_INET)
{
/* It only looks like an IP address if it's all numbers and dots. */
int numdots = 0;
const char *p;
for (p = name; *p; p++)
{
if (!ISDIGIT(*p) && *p != '.') {
return 0;
} else if (*p == '.') {
numdots++;
}
}
/* if we don't have 3 dots, it is illegal
* (although inet_addr doesn't think so).
*/
if (numdots != 3)
result = 0;
else
result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1); result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1);
}
else if (family == AF_INET6) else if (family == AF_INET6)
result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1); result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1);
@@ -227,7 +250,7 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac
hostent.h_name = strdup(name); hostent.h_name = strdup(name);
if (!hostent.h_name) if (!hostent.h_name)
{ {
callback(arg, ARES_ENOMEM, NULL); callback(arg, ARES_ENOMEM, 0, NULL);
return 1; return 1;
} }
@@ -236,7 +259,7 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac
hostent.h_aliases = aliases; hostent.h_aliases = aliases;
hostent.h_addrtype = family; hostent.h_addrtype = family;
hostent.h_addr_list = addrs; hostent.h_addr_list = addrs;
callback(arg, ARES_SUCCESS, &hostent); callback(arg, ARES_SUCCESS, 0, &hostent);
free((char *)(hostent.h_name)); free((char *)(hostent.h_name));
return 1; return 1;
@@ -416,4 +439,3 @@ static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist,
} }
return i; return i;
} }

View File

@@ -22,7 +22,7 @@ ares_getnameinfo \- Address-to-nodename translation in protocol-independent mann
.B #include <ares.h> .B #include <ares.h>
.PP .PP
.B typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP, .B typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP,
.B char *\fInode\fP, char *\fIservice\fP) .B int \fItimeouts\fP, char *\fInode\fP, char *\fIservice\fP)
.PP .PP
.B void ares_getnameinfo(ares_channel \fIchannel\fP, const struct sockaddr *\fIsa\fP, .B void ares_getnameinfo(ares_channel \fIchannel\fP, const struct sockaddr *\fIsa\fP,
.B socklen_t \fIsalen\fP, int \fIflags\fP, ares_nameinfo_callback \fIcallback\fP, .B socklen_t \fIsalen\fP, int \fIflags\fP, ares_nameinfo_callback \fIcallback\fP,
@@ -120,6 +120,11 @@ The
.I flags .I flags
parameter contains an illegal value. parameter contains an illegal value.
.PP .PP
The callback argument
.I timeouts
reports how many times a query timed out during the execution of the
given request.
.PP
On successful completion of the query, the callback argument On successful completion of the query, the callback argument
.I node .I node
contains a string representing the hostname (assuming contains a string representing the hostname (assuming

View File

@@ -59,6 +59,7 @@ struct nameinfo_query {
} addr; } addr;
int family; int family;
int flags; int flags;
int timeouts;
}; };
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
@@ -67,7 +68,7 @@ struct nameinfo_query {
#define IPBUFSIZ 40 #define IPBUFSIZ 40
#endif #endif
static void nameinfo_callback(void *arg, int status, struct hostent *host); static void nameinfo_callback(void *arg, int status, int timeouts, struct hostent *host);
static char *lookup_service(unsigned short port, int flags, static char *lookup_service(unsigned short port, int flags,
char *buf, size_t buflen); char *buf, size_t buflen);
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID #ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
@@ -90,7 +91,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
addr6 = (struct sockaddr_in6 *)sa; addr6 = (struct sockaddr_in6 *)sa;
else else
{ {
callback(arg, ARES_ENOTIMP, NULL, NULL); callback(arg, ARES_ENOTIMP, 0, NULL, NULL);
return; return;
} }
@@ -110,7 +111,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
port = addr6->sin6_port; port = addr6->sin6_port;
service = lookup_service((unsigned short)(port & 0xffff), service = lookup_service((unsigned short)(port & 0xffff),
flags, buf, sizeof(buf)); flags, buf, sizeof(buf));
callback(arg, ARES_SUCCESS, NULL, service); callback(arg, ARES_SUCCESS, 0, NULL, service);
return; return;
} }
@@ -131,7 +132,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
*/ */
if (flags & ARES_NI_NAMEREQD) if (flags & ARES_NI_NAMEREQD)
{ {
callback(arg, ARES_EBADFLAGS, NULL, NULL); callback(arg, ARES_EBADFLAGS, 0, NULL, NULL);
return; return;
} }
if (salen == sizeof(struct sockaddr_in6)) if (salen == sizeof(struct sockaddr_in6))
@@ -152,7 +153,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
if (flags & ARES_NI_LOOKUPSERVICE) if (flags & ARES_NI_LOOKUPSERVICE)
service = lookup_service((unsigned short)(port & 0xffff), service = lookup_service((unsigned short)(port & 0xffff),
flags, srvbuf, sizeof(srvbuf)); flags, srvbuf, sizeof(srvbuf));
callback(arg, ARES_SUCCESS, ipbuf, service); callback(arg, ARES_SUCCESS, 0, ipbuf, service);
return; return;
} }
/* This is where a DNS lookup becomes necessary */ /* This is where a DNS lookup becomes necessary */
@@ -161,12 +162,13 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
niquery = malloc(sizeof(struct nameinfo_query)); niquery = malloc(sizeof(struct nameinfo_query));
if (!niquery) if (!niquery)
{ {
callback(arg, ARES_ENOMEM, NULL, NULL); callback(arg, ARES_ENOMEM, 0, NULL, NULL);
return; return;
} }
niquery->callback = callback; niquery->callback = callback;
niquery->arg = arg; niquery->arg = arg;
niquery->flags = flags; niquery->flags = flags;
niquery->timeouts = 0;
if (sa->sa_family == AF_INET) if (sa->sa_family == AF_INET)
{ {
niquery->family = AF_INET; niquery->family = AF_INET;
@@ -185,13 +187,13 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t
} }
} }
static void nameinfo_callback(void *arg, int status, struct hostent *host) static void nameinfo_callback(void *arg, int status, int timeouts, struct hostent *host)
{ {
struct nameinfo_query *niquery = (struct nameinfo_query *) arg; struct nameinfo_query *niquery = (struct nameinfo_query *) arg;
char srvbuf[33]; char srvbuf[33];
char *service = NULL; char *service = NULL;
niquery->timeouts += timeouts;
if (status == ARES_SUCCESS) if (status == ARES_SUCCESS)
{ {
/* They want a service too */ /* They want a service too */
@@ -220,7 +222,7 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
*end = 0; *end = 0;
} }
} }
niquery->callback(niquery->arg, ARES_SUCCESS, (char *)(host->h_name), niquery->callback(niquery->arg, ARES_SUCCESS, niquery->timeouts, (char *)(host->h_name),
service); service);
return; return;
} }
@@ -247,10 +249,10 @@ static void nameinfo_callback(void *arg, int status, struct hostent *host)
service = lookup_service(niquery->addr.addr6.sin6_port, service = lookup_service(niquery->addr.addr6.sin6_port,
niquery->flags, srvbuf, sizeof(srvbuf)); niquery->flags, srvbuf, sizeof(srvbuf));
} }
niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service); niquery->callback(niquery->arg, ARES_SUCCESS, niquery->timeouts, ipbuf, service);
return; return;
} }
niquery->callback(niquery->arg, status, NULL, NULL); niquery->callback(niquery->arg, status, niquery->timeouts, NULL, NULL);
free(niquery); free(niquery);
} }
@@ -295,7 +297,11 @@ static char *lookup_service(unsigned short port, int flags,
#endif #endif
#else #else
/* Lets just hope the OS uses TLS! */ /* Lets just hope the OS uses TLS! */
#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))
sep = getservbyport(port, (char*)proto);
#else
sep = getservbyport(port, proto); sep = getservbyport(port, proto);
#endif
#endif #endif
} }
if (sep && sep->s_name) if (sep && sep->s_name)

View File

@@ -34,16 +34,18 @@ int ares_getsock(ares_channel channel,
ares_socket_t *socks = (ares_socket_t *)s; ares_socket_t *socks = (ares_socket_t *)s;
/* No queries, no file descriptors. */ /* Are there any active queries? */
if (!channel->queries) int active_queries = !ares__is_list_empty(&(channel->all_queries));
return 0;
for (i = 0; for (i = 0;
(i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM); (i < channel->nservers) && (sockindex < ARES_GETSOCK_MAXNUM);
i++) i++)
{ {
server = &channel->servers[i]; server = &channel->servers[i];
if (server->udp_socket != ARES_SOCKET_BAD) /* We only need to register interest in UDP sockets if we have
* outstanding queries.
*/
if (active_queries && server->udp_socket != ARES_SOCKET_BAD)
{ {
if(sockindex >= numsocks) if(sockindex >= numsocks)
break; break;
@@ -51,6 +53,10 @@ int ares_getsock(ares_channel channel,
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
sockindex++; sockindex++;
} }
/* We always register for TCP events, because we want to know
* when the other side closes the connection, so we don't waste
* time trying to use a broken connection.
*/
if (server->tcp_socket != ARES_SOCKET_BAD) if (server->tcp_socket != ARES_SOCKET_BAD)
{ {
if(sockindex >= numsocks) if(sockindex >= numsocks)
@@ -58,7 +64,7 @@ int ares_getsock(ares_channel channel,
socks[sockindex] = server->tcp_socket; socks[sockindex] = server->tcp_socket;
bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex); bitmap |= ARES_GETSOCK_READABLE(setbits, sockindex);
if (server->qhead) if (server->qhead && active_queries)
/* then the tcp socket is also writable! */ /* then the tcp socket is also writable! */
bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex); bitmap |= ARES_GETSOCK_WRITABLE(setbits, sockindex);

View File

@@ -23,7 +23,10 @@
#include <malloc.h> #include <malloc.h>
#else #else
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h> #include <sys/param.h>
#endif
#ifdef HAVE_SYS_TIME_H #ifdef HAVE_SYS_TIME_H
#include <sys/time.h> #include <sys/time.h>
#endif #endif
@@ -72,7 +75,7 @@ static int config_nameserver(struct server_state **servers, int *nservers,
static int set_search(ares_channel channel, const char *str); static int set_search(ares_channel channel, const char *str);
static int set_options(ares_channel channel, const char *str); static int set_options(ares_channel channel, const char *str);
static const char *try_option(const char *p, const char *q, const char *opt); static const char *try_option(const char *p, const char *q, const char *opt);
static void init_id_key(rc4_key* key,int key_data_len); static int init_id_key(rc4_key* key,int key_data_len);
#ifndef WIN32 #ifndef WIN32
static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat); static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat);
@@ -130,17 +133,32 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
channel->ndots = -1; channel->ndots = -1;
channel->udp_port = -1; channel->udp_port = -1;
channel->tcp_port = -1; channel->tcp_port = -1;
channel->socket_send_buffer_size = -1;
channel->socket_receive_buffer_size = -1;
channel->nservers = -1; channel->nservers = -1;
channel->ndomains = -1; channel->ndomains = -1;
channel->nsort = -1; channel->nsort = -1;
channel->tcp_connection_generation = 0;
channel->lookups = NULL; channel->lookups = NULL;
channel->queries = NULL;
channel->domains = NULL; channel->domains = NULL;
channel->sortlist = NULL; channel->sortlist = NULL;
channel->servers = NULL; channel->servers = NULL;
channel->sock_state_cb = NULL; channel->sock_state_cb = NULL;
channel->sock_state_cb_data = NULL; channel->sock_state_cb_data = NULL;
channel->last_timeout_processed = (long)time(NULL);
/* Initialize our lists of queries */
ares__init_list_head(&(channel->all_queries));
for (i = 0; i < ARES_QID_TABLE_SIZE; i++)
{
ares__init_list_head(&(channel->queries_by_qid[i]));
}
for (i = 0; i < ARES_TIMEOUT_TABLE_SIZE; i++)
{
ares__init_list_head(&(channel->queries_by_timeout[i]));
}
/* Initialize configuration by each of the four sources, from highest /* Initialize configuration by each of the four sources, from highest
* precedence to lowest. * precedence to lowest.
*/ */
@@ -169,6 +187,18 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n", DEBUGF(fprintf(stderr, "Error: init_by_defaults failed: %s\n",
ares_strerror(status))); ares_strerror(status)));
} }
/* Generate random key */
if (status == ARES_SUCCESS) {
status = init_id_key(&channel->id_key, ARES_ID_KEY_LEN);
if (status == ARES_SUCCESS)
channel->next_id = ares__generate_new_id(&channel->id_key);
else
DEBUGF(fprintf(stderr, "Error: init_id_key failed: %s\n",
ares_strerror(status)));
}
if (status != ARES_SUCCESS) if (status != ARES_SUCCESS)
{ {
/* Something failed; clean up memory we may have allocated. */ /* Something failed; clean up memory we may have allocated. */
@@ -198,17 +228,16 @@ int ares_init_options(ares_channel *channelptr, struct ares_options *options,
server = &channel->servers[i]; server = &channel->servers[i];
server->udp_socket = ARES_SOCKET_BAD; server->udp_socket = ARES_SOCKET_BAD;
server->tcp_socket = ARES_SOCKET_BAD; server->tcp_socket = ARES_SOCKET_BAD;
server->tcp_connection_generation = ++channel->tcp_connection_generation;
server->tcp_lenbuf_pos = 0; server->tcp_lenbuf_pos = 0;
server->tcp_buffer = NULL; server->tcp_buffer = NULL;
server->qhead = NULL; server->qhead = NULL;
server->qtail = NULL; server->qtail = NULL;
ares__init_list_head(&(server->queries_to_server));
server->channel = channel;
server->is_broken = 0;
} }
init_id_key(&channel->id_key, ARES_ID_KEY_LEN);
channel->next_id = ares__generate_new_id(&channel->id_key);
channel->queries = NULL;
*channelptr = channel; *channelptr = channel;
return ARES_SUCCESS; return ARES_SUCCESS;
} }
@@ -235,24 +264,28 @@ int ares_save_options(ares_channel channel, struct ares_options *options,
options->timeout = channel->timeout; options->timeout = channel->timeout;
options->tries = channel->tries; options->tries = channel->tries;
options->ndots = channel->ndots; options->ndots = channel->ndots;
options->udp_port = channel->udp_port; options->udp_port = (unsigned short)channel->udp_port;
options->tcp_port = channel->tcp_port; options->tcp_port = (unsigned short)channel->tcp_port;
options->sock_state_cb = channel->sock_state_cb; options->sock_state_cb = channel->sock_state_cb;
options->sock_state_cb_data = channel->sock_state_cb_data; options->sock_state_cb_data = channel->sock_state_cb_data;
/* Copy servers */ /* Copy servers */
if (channel->nservers) {
options->servers = options->servers =
malloc(channel->nservers * sizeof(struct server_state)); malloc(channel->nservers * sizeof(struct server_state));
if (!options->servers && channel->nservers != 0) if (!options->servers && channel->nservers != 0)
return ARES_ENOMEM; return ARES_ENOMEM;
for (i = 0; i < channel->nservers; i++) for (i = 0; i < channel->nservers; i++)
options->servers[i] = channel->servers[i].addr; options->servers[i] = channel->servers[i].addr;
}
options->nservers = channel->nservers; options->nservers = channel->nservers;
/* copy domains */ /* copy domains */
if (channel->ndomains) {
options->domains = malloc(channel->ndomains * sizeof(char *)); options->domains = malloc(channel->ndomains * sizeof(char *));
if (!options->domains) if (!options->domains)
return ARES_ENOMEM; return ARES_ENOMEM;
for (i = 0; i < channel->ndomains; i++) for (i = 0; i < channel->ndomains; i++)
{ {
options->ndomains = i; options->ndomains = i;
@@ -260,14 +293,18 @@ int ares_save_options(ares_channel channel, struct ares_options *options,
if (!options->domains[i]) if (!options->domains[i])
return ARES_ENOMEM; return ARES_ENOMEM;
} }
}
options->ndomains = channel->ndomains; options->ndomains = channel->ndomains;
/* copy lookups */ /* copy lookups */
if (channel->lookups) {
options->lookups = strdup(channel->lookups); options->lookups = strdup(channel->lookups);
if (!options->lookups) if (!options->lookups && channel->lookups)
return ARES_ENOMEM; return ARES_ENOMEM;
}
/* copy sortlist */ /* copy sortlist */
if (channel->nsort) {
options->sortlist = malloc(channel->nsort * sizeof(struct apattern)); options->sortlist = malloc(channel->nsort * sizeof(struct apattern));
if (!options->sortlist) if (!options->sortlist)
return ARES_ENOMEM; return ARES_ENOMEM;
@@ -276,6 +313,7 @@ int ares_save_options(ares_channel channel, struct ares_options *options,
memcpy(&(options->sortlist[i]), &(channel->sortlist[i]), memcpy(&(options->sortlist[i]), &(channel->sortlist[i]),
sizeof(struct apattern)); sizeof(struct apattern));
} }
}
options->nsort = channel->nsort; options->nsort = channel->nsort;
return ARES_SUCCESS; return ARES_SUCCESS;
@@ -305,6 +343,12 @@ static int init_by_options(ares_channel channel,
channel->sock_state_cb = options->sock_state_cb; channel->sock_state_cb = options->sock_state_cb;
channel->sock_state_cb_data = options->sock_state_cb_data; channel->sock_state_cb_data = options->sock_state_cb_data;
} }
if ((optmask & ARES_OPT_SOCK_SNDBUF)
&& channel->socket_send_buffer_size == -1)
channel->socket_send_buffer_size = options->socket_send_buffer_size;
if ((optmask & ARES_OPT_SOCK_RCVBUF)
&& channel->socket_receive_buffer_size == -1)
channel->socket_receive_buffer_size = options->socket_receive_buffer_size;
/* Copy the servers, if given. */ /* Copy the servers, if given. */
if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1) if ((optmask & ARES_OPT_SERVERS) && channel->nservers == -1)
@@ -453,7 +497,7 @@ 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);
typedef DWORD (WINAPI* get_net_param_func) (FIXED_INFO*, DWORD*); typedef DWORD (WINAPI* get_net_param_func) (FIXED_INFO*, DWORD*);
get_net_param_func GetNetworkParams; /* available only on Win-98/2000+ */ get_net_param_func fpGetNetworkParams; /* 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;
@@ -470,16 +514,16 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
if (!handle) if (!handle)
return (0); return (0);
GetNetworkParams = (get_net_param_func) GetProcAddress (handle, "GetNetworkParams"); fpGetNetworkParams = (get_net_param_func) GetProcAddress (handle, "GetNetworkParams");
if (!GetNetworkParams) if (!fpGetNetworkParams)
goto quit; goto quit;
res = (*GetNetworkParams) (fi, &size); res = (*fpGetNetworkParams) (fi, &size);
if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS)) if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
goto quit; goto quit;
fi = alloca (size); fi = alloca (size);
if (!fi || (*GetNetworkParams) (fi, &size) != ERROR_SUCCESS) if (!fi || (*fpGetNetworkParams) (fi, &size) != ERROR_SUCCESS)
goto quit; goto quit;
if (debug) if (debug)
@@ -1303,11 +1347,11 @@ static void randomize_key(unsigned char* key,int key_data_len)
if ( !randomized ) { if ( !randomized ) {
for (;counter<key_data_len;counter++) for (;counter<key_data_len;counter++)
key[counter]=rand() % 256; key[counter]=(unsigned char)(rand() % 256);
} }
} }
static void init_id_key(rc4_key* key,int key_data_len) static int init_id_key(rc4_key* key,int key_data_len)
{ {
unsigned char index1; unsigned char index1;
unsigned char index2; unsigned char index2;
@@ -1316,29 +1360,33 @@ static void init_id_key(rc4_key* key,int key_data_len)
unsigned char *key_data_ptr = 0; unsigned char *key_data_ptr = 0;
key_data_ptr = calloc(1,key_data_len); key_data_ptr = calloc(1,key_data_len);
if (!key_data_ptr)
return ARES_ENOMEM;
randomize_key(key->state,key_data_len); randomize_key(key->state,key_data_len);
state = &key->state[0]; state = &key->state[0];
for(counter = 0; counter < 256; counter++) for(counter = 0; counter < 256; counter++)
state[counter] = counter; /* unnecessary AND but it keeps some compilers happier */
state[counter] = (unsigned char)(counter & 0xff);
key->x = 0; key->x = 0;
key->y = 0; key->y = 0;
index1 = 0; index1 = 0;
index2 = 0; index2 = 0;
for(counter = 0; counter < 256; counter++) for(counter = 0; counter < 256; counter++)
{ {
index2 = (key_data_ptr[index1] + state[counter] + index2 = (unsigned char)((key_data_ptr[index1] + state[counter] +
index2) % 256; index2) % 256);
ARES_SWAP_BYTE(&state[counter], &state[index2]); ARES_SWAP_BYTE(&state[counter], &state[index2]);
index1 = (index1 + 1) % key_data_len; index1 = (unsigned char)((index1 + 1) % key_data_len);
} }
free(key_data_ptr); free(key_data_ptr);
return ARES_SUCCESS;
} }
short ares__generate_new_id(rc4_key* key) short ares__generate_new_id(rc4_key* key)
{ {
short r; short r=0;
ares__rc4(key, (unsigned char *)&r, sizeof(r)); ares__rc4(key, (unsigned char *)&r, sizeof(r));
return r; return r;
} }

87
ares/ares_llist.c Normal file
View File

@@ -0,0 +1,87 @@
/* $Id$ */
/* Copyright 1998 by the Massachusetts Institute of Technology.
*
* Permission to use, copy, modify, and distribute this
* software and its documentation for any purpose and without
* fee is hereby granted, provided that the above copyright
* notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting
* documentation, and that the name of M.I.T. not be used in
* advertising or publicity pertaining to distribution of the
* software without specific, written prior permission.
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is"
* without express or implied warranty.
*/
#include "setup.h"
#include "ares.h"
#include "ares_private.h"
/* Routines for managing doubly-linked circular linked lists with a
* dummy head.
*/
/* Initialize a new head node */
void ares__init_list_head(struct list_node* head) {
head->prev = head;
head->next = head;
head->data = NULL;
}
/* Initialize a list node */
void ares__init_list_node(struct list_node* node, void* d) {
node->prev = NULL;
node->next = NULL;
node->data = d;
}
/* Returns true iff the given list is empty */
int ares__is_list_empty(struct list_node* head) {
return ((head->next == head) && (head->prev == head));
}
/* Inserts new_node before old_node */
void ares__insert_in_list(struct list_node* new_node,
struct list_node* old_node) {
new_node->next = old_node;
new_node->prev = old_node->prev;
old_node->prev->next = new_node;
old_node->prev = new_node;
}
/* Removes the node from the list it's in, if any */
void ares__remove_from_list(struct list_node* node) {
if (node->next != NULL) {
node->prev->next = node->next;
node->next->prev = node->prev;
node->prev = NULL;
node->next = NULL;
}
}
/* Swap the contents of two lists */
void ares__swap_lists(struct list_node* head_a,
struct list_node* head_b) {
int is_a_empty = ares__is_list_empty(head_a);
int is_b_empty = ares__is_list_empty(head_b);
struct list_node old_a = *head_a;
struct list_node old_b = *head_b;
if (is_a_empty) {
ares__init_list_head(head_b);
} else {
*head_b = old_a;
old_a.next->prev = head_b;
old_a.prev->next = head_b;
}
if (is_b_empty) {
ares__init_list_head(head_a);
} else {
*head_a = old_b;
old_b.next->prev = head_a;
old_b.prev->next = head_a;
}
}

43
ares/ares_llist.h Normal file
View File

@@ -0,0 +1,43 @@
#ifndef __ARES_LLIST_H
#define __ARES_LLIST_H
/* $Id$ */
/* Copyright 1998 by the Massachusetts Institute of Technology.
*
* Permission to use, copy, modify, and distribute this
* software and its documentation for any purpose and without
* fee is hereby granted, provided that the above copyright
* notice appear in all copies and that both that copyright
* notice and this permission notice appear in supporting
* documentation, and that the name of M.I.T. not be used in
* advertising or publicity pertaining to distribution of the
* software without specific, written prior permission.
* M.I.T. makes no representations about the suitability of
* this software for any purpose. It is provided "as is"
* without express or implied warranty.
*/
/* Node definition for circular, doubly-linked list */
struct list_node {
struct list_node *prev;
struct list_node *next;
void* data;
};
void ares__init_list_head(struct list_node* head);
void ares__init_list_node(struct list_node* node, void* d);
int ares__is_list_empty(struct list_node* head);
void ares__insert_in_list(struct list_node* new_node,
struct list_node* old_node);
void ares__remove_from_list(struct list_node* node);
void ares__swap_lists(struct list_node* head_a,
struct list_node* head_b);
#endif /* __ARES_LLIST_H */

View File

@@ -88,6 +88,10 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
unsigned char *q; unsigned char *q;
const char *p; const char *p;
/* Set our results early, in case we bail out early with an error. */
*buflen = 0;
*buf = NULL;
/* Compute the length of the encoded name so we can check buflen. /* Compute the length of the encoded name so we can check buflen.
* Start counting at 1 for the zero-length label at the end. */ * Start counting at 1 for the zero-length label at the end. */
len = 1; len = 1;
@@ -104,6 +108,23 @@ int ares_mkquery(const char *name, int dnsclass, int type, unsigned short id,
if (*name && *(p - 1) != '.') if (*name && *(p - 1) != '.')
len++; len++;
/* Immediately reject names that are longer than the maximum of 255
* bytes that's specified in RFC 1035 ("To simplify implementations,
* the total length of a domain name (i.e., label octets and label
* length octets) is restricted to 255 octets or less."). We aren't
* doing this just to be a stickler about RFCs. For names that are
* too long, 'dnscache' closes its TCP connection to us immediately
* (when using TCP) and ignores the request when using UDP, and
* BIND's named returns ServFail (TCP or UDP). Sending a request
* that we know will cause 'dnscache' to close the TCP connection is
* painful, since that makes any other outstanding requests on that
* connection fail. And sending a UDP request that we know
* 'dnscache' will ignore is bad because resources will be tied up
* until we time-out the request.
*/
if (len > MAXCDNAME)
return ARES_EBADNAME;
*buflen = len + HFIXEDSZ + QFIXEDSZ; *buflen = len + HFIXEDSZ + QFIXEDSZ;
*buf = malloc(*buflen); *buf = malloc(*buflen);
if (!*buf) if (!*buf)

View File

@@ -83,12 +83,20 @@
#define ARES_ID_KEY_LEN 31 #define ARES_ID_KEY_LEN 31
#include "ares_ipv6.h" #include "ares_ipv6.h"
#include "ares_llist.h"
struct query;
struct send_request { struct send_request {
/* Remaining data to send */ /* Remaining data to send */
const unsigned char *data; const unsigned char *data;
size_t len; size_t len;
/* The query for which we're sending this data */
struct query* owner_query;
/* The buffer we're using, if we have our own copy of the packet */
unsigned char *data_storage;
/* Next request in queue */ /* Next request in queue */
struct send_request *next; struct send_request *next;
}; };
@@ -110,13 +118,42 @@ struct server_state {
/* TCP output queue */ /* TCP output queue */
struct send_request *qhead; struct send_request *qhead;
struct send_request *qtail; struct send_request *qtail;
/* Which incarnation of this connection is this? We don't want to
* retransmit requests into the very same socket, but if the server
* closes on us and we re-open the connection, then we do want to
* re-send. */
int tcp_connection_generation;
/* Circular, doubly-linked list of outstanding queries to this server */
struct list_node queries_to_server;
/* Link back to owning channel */
ares_channel channel;
/* Is this server broken? We mark connections as broken when a
* request that is queued for sending times out.
*/
int is_broken;
}; };
/* State to represent a DNS query */
struct query { struct query {
/* Query ID from qbuf, for faster lookup, and current timeout */ /* Query ID from qbuf, for faster lookup, and current timeout */
unsigned short qid; unsigned short qid;
time_t timeout; time_t timeout;
/*
* Links for the doubly-linked lists in which we insert a query.
* These circular, doubly-linked lists that are hash-bucketed based
* the attributes we care about, help making most important
* operations O(1).
*/
struct list_node queries_by_qid; /* hopefully in same cache line as qid */
struct list_node queries_by_timeout;
struct list_node queries_to_server;
struct list_node all_queries;
/* Query buf with length at beginning, for TCP transmission */ /* Query buf with length at beginning, for TCP transmission */
unsigned char *tcpbuf; unsigned char *tcpbuf;
int tcplen; int tcplen;
@@ -130,12 +167,16 @@ struct query {
/* Query status */ /* Query status */
int try; int try;
int server; int server;
int *skip_server; struct query_server_info *server_info; /* per-server state */
int using_tcp; int using_tcp;
int error_status; int error_status;
int timeouts; /* number of timeouts we saw for this request */
};
/* Next query in chain */ /* Per-server state for a query */
struct query *next; struct query_server_info {
int skip_server; /* should we skip server, due to errors, etc? */
int tcp_connection_generation; /* into which TCP connection did we send? */
}; };
/* An IP address pattern; matches an IP address X if X & mask == addr */ /* An IP address pattern; matches an IP address X if X & mask == addr */
@@ -173,6 +214,8 @@ struct ares_channeldata {
int ndots; int ndots;
int udp_port; int udp_port;
int tcp_port; int tcp_port;
int socket_send_buffer_size;
int socket_receive_buffer_size;
char **domains; char **domains;
int ndomains; int ndomains;
struct apattern *sortlist; struct apattern *sortlist;
@@ -188,8 +231,21 @@ struct ares_channeldata {
/* key to use when generating new ids */ /* key to use when generating new ids */
rc4_key id_key; rc4_key id_key;
/* Active queries */ /* Generation number to use for the next TCP socket open/close */
struct query *queries; int tcp_connection_generation;
/* The time at which we last called process_timeouts() */
time_t last_timeout_processed;
/* Circular, doubly-linked list of queries, bucketed various ways.... */
/* All active queries in a single list: */
struct list_node all_queries;
/* Queries bucketed by qid, for quickly dispatching DNS responses: */
#define ARES_QID_TABLE_SIZE 2048
struct list_node queries_by_qid[ARES_QID_TABLE_SIZE];
/* Queries bucketed by timeout, for quickly handling timeouts: */
#define ARES_TIMEOUT_TABLE_SIZE 1024
struct list_node queries_by_timeout[ARES_TIMEOUT_TABLE_SIZE];
ares_sock_state_cb sock_state_cb; ares_sock_state_cb sock_state_cb;
void *sock_state_cb_data; void *sock_state_cb_data;
@@ -200,6 +256,7 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now);
void ares__close_sockets(ares_channel channel, struct server_state *server); void ares__close_sockets(ares_channel channel, struct server_state *server);
int ares__get_hostent(FILE *fp, int family, struct hostent **host); int ares__get_hostent(FILE *fp, int family, struct hostent **host);
int ares__read_line(FILE *fp, char **buf, int *bufsize); int ares__read_line(FILE *fp, char **buf, int *bufsize);
void ares__free_query(struct query *query);
short ares__generate_new_id(rc4_key* key); short ares__generate_new_id(rc4_key* key);
#define ARES_SWAP_BYTE(a,b) \ #define ARES_SWAP_BYTE(a,b) \
@@ -220,4 +277,3 @@ short ares__generate_new_id(rc4_key* key);
#endif #endif
#endif /* __ARES_PRIVATE_H */ #endif /* __ARES_PRIVATE_H */

View File

@@ -21,13 +21,24 @@
#include "nameser.h" #include "nameser.h"
#else #else
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif
#ifdef HAVE_SYS_UIO_H #ifdef HAVE_SYS_UIO_H
#include <sys/uio.h> #include <sys/uio.h>
#endif #endif
#include <netinet/in.h> #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> /* <netinet/tcp.h> may need it */
#endif
#ifdef HAVE_NETINET_TCP_H
#include <netinet/tcp.h> /* for TCP_NODELAY */
#endif
#ifdef HAVE_NETDB_H
#include <netdb.h> #include <netdb.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
#include <arpa/nameser.h> #include <arpa/nameser.h>
#endif
#ifdef HAVE_ARPA_NAMESER_COMPAT_H #ifdef HAVE_ARPA_NAMESER_COMPAT_H
#include <arpa/nameser_compat.h> #include <arpa/nameser_compat.h>
#endif #endif
@@ -43,6 +54,7 @@
#include <sys/filio.h> #include <sys/filio.h>
#endif #endif
#include <assert.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <fcntl.h> #include <fcntl.h>
@@ -61,16 +73,22 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds,
ares_socket_t read_fd, time_t now); ares_socket_t read_fd, time_t now);
static void read_udp_packets(ares_channel channel, fd_set *read_fds, static void read_udp_packets(ares_channel channel, fd_set *read_fds,
ares_socket_t read_fd, time_t now); ares_socket_t read_fd, time_t now);
static void advance_tcp_send_queue(ares_channel channel, int whichserver,
ssize_t num_bytes);
static void process_timeouts(ares_channel channel, time_t now); static void process_timeouts(ares_channel channel, time_t now);
static void process_broken_connections(ares_channel channel, time_t now);
static void process_answer(ares_channel channel, unsigned char *abuf, static void process_answer(ares_channel channel, unsigned char *abuf,
int alen, int whichserver, int tcp, time_t now); int alen, int whichserver, int tcp, time_t now);
static void handle_error(ares_channel channel, int whichserver, time_t now); static void handle_error(ares_channel channel, int whichserver, time_t now);
static struct query *next_server(ares_channel channel, struct query *query, time_t now); static void skip_server(ares_channel channel, struct query *query,
int whichserver);
static void next_server(ares_channel channel, struct query *query, time_t now);
static int configure_socket(int s, ares_channel channel);
static int open_tcp_socket(ares_channel channel, struct server_state *server); static int open_tcp_socket(ares_channel channel, struct server_state *server);
static int open_udp_socket(ares_channel channel, struct server_state *server); static int open_udp_socket(ares_channel channel, struct server_state *server);
static int same_questions(const unsigned char *qbuf, int qlen, static int same_questions(const unsigned char *qbuf, int qlen,
const unsigned char *abuf, int alen); const unsigned char *abuf, int alen);
static struct query *end_query(ares_channel channel, struct query *query, int status, static void end_query(ares_channel channel, struct query *query, int status,
unsigned char *abuf, int alen); unsigned char *abuf, int alen);
/* Something interesting happened on the wire, or there was a timeout. /* Something interesting happened on the wire, or there was a timeout.
@@ -85,6 +103,7 @@ void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
read_tcp_data(channel, read_fds, ARES_SOCKET_BAD, now); read_tcp_data(channel, read_fds, ARES_SOCKET_BAD, now);
read_udp_packets(channel, read_fds, ARES_SOCKET_BAD, now); read_udp_packets(channel, read_fds, ARES_SOCKET_BAD, now);
process_timeouts(channel, now); process_timeouts(channel, now);
process_broken_connections(channel, now);
} }
/* Something interesting happened on the wire, or there was a timeout. /* Something interesting happened on the wire, or there was a timeout.
@@ -155,7 +174,7 @@ static void write_tcp_data(ares_channel channel,
/* Make sure server has data to send and is selected in write_fds or /* Make sure server has data to send and is selected in write_fds or
write_fd. */ write_fd. */
server = &channel->servers[i]; server = &channel->servers[i];
if (!server->qhead || server->tcp_socket == ARES_SOCKET_BAD) if (!server->qhead || server->tcp_socket == ARES_SOCKET_BAD || server->is_broken)
continue; continue;
if(write_fds) { if(write_fds) {
@@ -167,6 +186,14 @@ static void write_tcp_data(ares_channel channel,
continue; continue;
} }
if(write_fds)
/* If there's an error and we close this socket, then open
* another with the same fd to talk to another server, then we
* don't want to think that it was the new socket that was
* ready. This is not disastrous, but is likely to result in
* extra system calls and confusion. */
FD_CLR(server->tcp_socket, write_fds);
/* Count the number of send queue items. */ /* Count the number of send queue items. */
n = 0; n = 0;
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next) for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
@@ -194,27 +221,7 @@ static void write_tcp_data(ares_channel channel,
} }
/* Advance the send queue by as many bytes as we sent. */ /* Advance the send queue by as many bytes as we sent. */
while (wcount) advance_tcp_send_queue(channel, i, wcount);
{
sendreq = server->qhead;
if ((size_t)wcount >= sendreq->len)
{
wcount -= sendreq->len;
server->qhead = sendreq->next;
if (server->qhead == NULL)
{
SOCK_STATE_CALLBACK(channel, server->tcp_socket, 1, 0);
server->qtail = NULL;
}
free(sendreq);
}
else
{
sendreq->data += wcount;
sendreq->len -= wcount;
break;
}
}
} }
else else
{ {
@@ -230,21 +237,38 @@ static void write_tcp_data(ares_channel channel,
} }
/* Advance the send queue by as many bytes as we sent. */ /* Advance the send queue by as many bytes as we sent. */
if ((size_t)scount == sendreq->len) advance_tcp_send_queue(channel, i, scount);
}
}
}
/* Consume the given number of bytes from the head of the TCP send queue. */
static void advance_tcp_send_queue(ares_channel channel, int whichserver,
ssize_t num_bytes)
{
struct send_request *sendreq;
struct server_state *server = &channel->servers[whichserver];
while (num_bytes > 0)
{ {
sendreq = server->qhead;
if ((size_t)num_bytes >= sendreq->len)
{
num_bytes -= sendreq->len;
server->qhead = sendreq->next; server->qhead = sendreq->next;
if (server->qhead == NULL) if (server->qhead == NULL)
{ {
SOCK_STATE_CALLBACK(channel, server->tcp_socket, 1, 0); SOCK_STATE_CALLBACK(channel, server->tcp_socket, 1, 0);
server->qtail = NULL; server->qtail = NULL;
} }
if (sendreq->data_storage != NULL)
free(sendreq->data_storage);
free(sendreq); free(sendreq);
} }
else else
{ {
sendreq->data += scount; sendreq->data += num_bytes;
sendreq->len -= scount; sendreq->len -= num_bytes;
} num_bytes = 0;
} }
} }
} }
@@ -268,7 +292,7 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds,
{ {
/* Make sure the server has a socket and is selected in read_fds. */ /* Make sure the server has a socket and is selected in read_fds. */
server = &channel->servers[i]; server = &channel->servers[i];
if (server->tcp_socket == ARES_SOCKET_BAD) if (server->tcp_socket == ARES_SOCKET_BAD || server->is_broken)
continue; continue;
if(read_fds) { if(read_fds) {
@@ -280,6 +304,14 @@ static void read_tcp_data(ares_channel channel, fd_set *read_fds,
continue; continue;
} }
if(read_fds)
/* If there's an error and we close this socket, then open
* another with the same fd to talk to another server, then we
* don't want to think that it was the new socket that was
* ready. This is not disastrous, but is likely to result in
* extra system calls and confusion. */
FD_CLR(server->tcp_socket, read_fds);
if (server->tcp_lenbuf_pos != 2) if (server->tcp_lenbuf_pos != 2)
{ {
/* We haven't yet read a length word, so read that (or /* We haven't yet read a length word, so read that (or
@@ -358,7 +390,7 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
/* Make sure the server has a socket and is selected in read_fds. */ /* Make sure the server has a socket and is selected in read_fds. */
server = &channel->servers[i]; server = &channel->servers[i];
if (server->udp_socket == ARES_SOCKET_BAD) if (server->udp_socket == ARES_SOCKET_BAD || server->is_broken)
continue; continue;
if(read_fds) { if(read_fds) {
@@ -370,38 +402,69 @@ static void read_udp_packets(ares_channel channel, fd_set *read_fds,
continue; continue;
} }
if(read_fds)
/* If there's an error and we close this socket, then open
* another with the same fd to talk to another server, then we
* don't want to think that it was the new socket that was
* ready. This is not disastrous, but is likely to result in
* extra system calls and confusion. */
FD_CLR(server->udp_socket, read_fds);
/* To reduce event loop overhead, read and process as many
* packets as we can. */
do {
count = sread(server->udp_socket, buf, sizeof(buf)); count = sread(server->udp_socket, buf, sizeof(buf));
if (count == -1 && try_again(SOCKERRNO)) if (count == -1 && try_again(SOCKERRNO))
continue; continue;
else if (count <= 0) else if (count <= 0)
handle_error(channel, i, now); handle_error(channel, i, now);
else
process_answer(channel, buf, (int)count, i, 0, now); process_answer(channel, buf, (int)count, i, 0, now);
} while (count > 0);
} }
} }
/* If any queries have timed out, note the timeout and move them on. */ /* If any queries have timed out, note the timeout and move them on. */
static void process_timeouts(ares_channel channel, time_t now) static void process_timeouts(ares_channel channel, time_t now)
{ {
struct query *query, *next; time_t t; /* the time of the timeouts we're processing */
struct query *query;
struct list_node* list_head;
struct list_node* list_node;
for (query = channel->queries; query; query = next) /* Process all the timeouts that have fired since the last time we
* processed timeouts. If things are going well, then we'll have
* hundreds/thousands of queries that fall into future buckets, and
* only a handful of requests that fall into the "now" bucket, so
* this should be quite quick.
*/
for (t = channel->last_timeout_processed; t <= now; t++)
{ {
next = query->next; list_head = &(channel->queries_by_timeout[t % ARES_TIMEOUT_TABLE_SIZE]);
for (list_node = list_head->next; list_node != list_head; )
{
query = list_node->data;
list_node = list_node->next; /* in case the query gets deleted */
if (query->timeout != 0 && now >= query->timeout) if (query->timeout != 0 && now >= query->timeout)
{ {
query->error_status = ARES_ETIMEOUT; query->error_status = ARES_ETIMEOUT;
next = next_server(channel, query, now); ++query->timeouts;
next_server(channel, query, now);
} }
} }
}
channel->last_timeout_processed = now;
} }
/* Handle an answer from a server. */ /* Handle an answer from a server. */
static void process_answer(ares_channel channel, unsigned char *abuf, static void process_answer(ares_channel channel, unsigned char *abuf,
int alen, int whichserver, int tcp, time_t now) int alen, int whichserver, int tcp, time_t now)
{ {
int id, tc, rcode; int tc, rcode;
unsigned short id;
struct query *query; struct query *query;
struct list_node* list_head;
struct list_node* list_node;
/* If there's no room in the answer for a header, we can't do much /* If there's no room in the answer for a header, we can't do much
* with it. */ * with it. */
@@ -413,12 +476,25 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
tc = DNS_HEADER_TC(abuf); tc = DNS_HEADER_TC(abuf);
rcode = DNS_HEADER_RCODE(abuf); rcode = DNS_HEADER_RCODE(abuf);
/* Find the query corresponding to this packet. */ /* Find the query corresponding to this packet. The queries are
for (query = channel->queries; query; query = query->next) * hashed/bucketed by query id, so this lookup should be quick.
* Note that both the query id and the questions must be the same;
* when the query id wraps around we can have multiple outstanding
* queries with the same query id, so we need to check both the id and
* question.
*/
query = NULL;
list_head = &(channel->queries_by_qid[id % ARES_QID_TABLE_SIZE]);
for (list_node = list_head->next; list_node != list_head;
list_node = list_node->next)
{ {
if (query->qid == id) struct query *q = list_node->data;
if ((q->qid == id) && same_questions(q->qbuf, q->qlen, abuf, alen))
{
query = q;
break; break;
} }
}
if (!query) if (!query)
return; return;
@@ -449,13 +525,7 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
{ {
if (rcode == SERVFAIL || rcode == NOTIMP || rcode == REFUSED) if (rcode == SERVFAIL || rcode == NOTIMP || rcode == REFUSED)
{ {
query->skip_server[whichserver] = 1; skip_server(channel, query, whichserver);
if (query->server == whichserver)
next_server(channel, query, now);
return;
}
if (!same_questions(query->qbuf, query->qlen, abuf, alen))
{
if (query->server == whichserver) if (query->server == whichserver)
next_server(channel, query, now); next_server(channel, query, now);
return; return;
@@ -465,29 +535,72 @@ static void process_answer(ares_channel channel, unsigned char *abuf,
end_query(channel, query, ARES_SUCCESS, abuf, alen); end_query(channel, query, ARES_SUCCESS, abuf, alen);
} }
static void handle_error(ares_channel channel, int whichserver, time_t now) /* Close all the connections that are no longer usable. */
static void process_broken_connections(ares_channel channel, time_t now)
{ {
struct query *query, *next; int i;
for (i = 0; i < channel->nservers; i++)
/* Reset communications with this server. */
ares__close_sockets(channel, &channel->servers[whichserver]);
/* Tell all queries talking to this server to move on and not try
* this server again.
*/
for (query = channel->queries; query; query = next)
{ {
next = query->next; struct server_state *server = &channel->servers[i];
if (query->server == whichserver) if (server->is_broken)
{ {
query->skip_server[whichserver] = 1; handle_error(channel, i, now);
next = next_server(channel, query, now);
} }
} }
} }
static struct query *next_server(ares_channel channel, struct query *query, time_t now) static void handle_error(ares_channel channel, int whichserver, time_t now)
{
struct server_state *server;
struct query *query;
struct list_node list_head;
struct list_node* list_node;
server = &channel->servers[whichserver];
/* Reset communications with this server. */
ares__close_sockets(channel, server);
/* Tell all queries talking to this server to move on and not try
* this server again. We steal the current list of queries that were
* in-flight to this server, since when we call next_server this can
* cause the queries to be re-sent to this server, which will
* re-insert these queries in that same server->queries_to_server
* list.
*/
ares__init_list_head(&list_head);
ares__swap_lists(&list_head, &(server->queries_to_server));
for (list_node = list_head.next; list_node != &list_head; )
{
query = list_node->data;
list_node = list_node->next; /* in case the query gets deleted */
assert(query->server == whichserver);
skip_server(channel, query, whichserver);
next_server(channel, query, now);
}
/* Each query should have removed itself from our temporary list as
* it re-sent itself or finished up...
*/
assert(ares__is_list_empty(&list_head));
}
static void skip_server(ares_channel channel, struct query *query,
int whichserver) {
/* The given server gave us problems with this query, so if we have
* the luxury of using other servers, then let's skip the
* potentially broken server and just use the others. If we only
* have one server and we need to retry then we should just go ahead
* and re-use that server, since it's our only hope; perhaps we
* just got unlucky, and retrying will work (eg, the server timed
* out our TCP connection just as we were sending another request).
*/
if (channel->nservers > 1)
{
query->server_info[whichserver].skip_server = 1;
}
}
static void next_server(ares_channel channel, struct query *query, time_t now)
{ {
/* Advance to the next server or try. */ /* Advance to the next server or try. */
query->server++; query->server++;
@@ -495,19 +608,33 @@ static struct query *next_server(ares_channel channel, struct query *query, time
{ {
for (; query->server < channel->nservers; query->server++) for (; query->server < channel->nservers; query->server++)
{ {
if (!query->skip_server[query->server]) struct server_state *server = &channel->servers[query->server];
/* We don't want to use this server if (1) we decided this
* connection is broken, and thus about to be closed, (2)
* we've decided to skip this server because of earlier
* errors we encountered, or (3) we already sent this query
* over this exact connection.
*/
if (!server->is_broken &&
!query->server_info[query->server].skip_server &&
!(query->using_tcp &&
(query->server_info[query->server].tcp_connection_generation ==
server->tcp_connection_generation)))
{ {
ares__send_query(channel, query, now); ares__send_query(channel, query, now);
return (query->next); return;
} }
} }
query->server = 0; query->server = 0;
/* Only one try if we're using TCP. */ /* You might think that with TCP we only need one try. However,
if (query->using_tcp) * even when using TCP, servers can time-out our connection just
break; * as we're sending a request, or close our connection because
* they die, or never send us a reply because they get wedged or
* tickle a bug that drops our request.
*/
} }
return end_query(channel, query, query->error_status, NULL, 0); end_query(channel, query, query->error_status, NULL, 0);
} }
void ares__send_query(ares_channel channel, struct query *query, time_t now) void ares__send_query(ares_channel channel, struct query *query, time_t now)
@@ -525,7 +652,7 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
{ {
if (open_tcp_socket(channel, server) == -1) if (open_tcp_socket(channel, server) == -1)
{ {
query->skip_server[query->server] = 1; skip_server(channel, query, query->server);
next_server(channel, query, now); next_server(channel, query, now);
return; return;
} }
@@ -536,8 +663,16 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
end_query(channel, query, ARES_ENOMEM, NULL, 0); end_query(channel, query, ARES_ENOMEM, NULL, 0);
return; return;
} }
/* To make the common case fast, we avoid copies by using the
* query's tcpbuf for as long as the query is alive. In the rare
* case where the query ends while it's queued for transmission,
* then we give the sendreq its own copy of the request packet
* and put it in sendreq->data_storage.
*/
sendreq->data_storage = NULL;
sendreq->data = query->tcpbuf; sendreq->data = query->tcpbuf;
sendreq->len = query->tcplen; sendreq->len = query->tcplen;
sendreq->owner_query = query;
sendreq->next = NULL; sendreq->next = NULL;
if (server->qtail) if (server->qtail)
server->qtail->next = sendreq; server->qtail->next = sendreq;
@@ -547,7 +682,8 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
server->qhead = sendreq; server->qhead = sendreq;
} }
server->qtail = sendreq; server->qtail = sendreq;
query->timeout = 0; query->server_info[query->server].tcp_connection_generation =
server->tcp_connection_generation;
} }
else else
{ {
@@ -555,7 +691,7 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
{ {
if (open_udp_socket(channel, server) == -1) if (open_udp_socket(channel, server) == -1)
{ {
query->skip_server[query->server] = 1; skip_server(channel, query, query->server);
next_server(channel, query, now); next_server(channel, query, now);
return; return;
} }
@@ -563,21 +699,36 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
if (swrite(server->udp_socket, query->qbuf, query->qlen) == -1) if (swrite(server->udp_socket, query->qbuf, query->qlen) == -1)
{ {
/* FIXME: Handle EAGAIN here since it likely can happen. */ /* FIXME: Handle EAGAIN here since it likely can happen. */
query->skip_server[query->server] = 1; skip_server(channel, query, query->server);
next_server(channel, query, now); next_server(channel, query, now);
return; return;
} }
}
query->timeout = now query->timeout = now
+ ((query->try == 0) ? channel->timeout + ((query->try == 0) ? channel->timeout
: channel->timeout << query->try / channel->nservers); : channel->timeout << query->try / channel->nservers);
} /* Keep track of queries bucketed by timeout, so we can process
* timeout events quickly.
*/
ares__remove_from_list(&(query->queries_by_timeout));
ares__insert_in_list(
&(query->queries_by_timeout),
&(channel->queries_by_timeout[query->timeout %
ARES_TIMEOUT_TABLE_SIZE]));
/* Keep track of queries bucketed by server, so we can process server
* errors quickly.
*/
ares__remove_from_list(&(query->queries_to_server));
ares__insert_in_list(&(query->queries_to_server),
&(server->queries_to_server));
} }
/* /*
* nonblock() set the given socket to either blocking or non-blocking mode * setsocknonblock sets the given socket to either blocking or non-blocking mode
* based on the 'nonblock' boolean argument. This function is highly portable. * based on the 'nonblock' boolean argument. This function is highly portable.
*/ */
static int nonblock(ares_socket_t sockfd, /* operate on this */ static int setsocknonblock(ares_socket_t sockfd, /* operate on this */
int nonblock /* TRUE or FALSE */) int nonblock /* TRUE or FALSE */)
{ {
#undef SETBLOCK #undef SETBLOCK
@@ -645,9 +796,36 @@ static int nonblock(ares_socket_t sockfd, /* operate on this */
#endif #endif
} }
static int configure_socket(int s, ares_channel channel)
{
setsocknonblock(s, TRUE);
#if defined(FD_CLOEXEC) && !defined(MSDOS)
/* Configure the socket fd as close-on-exec. */
if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1)
return -1;
#endif
/* Set the socket's send and receive buffer sizes. */
if ((channel->socket_send_buffer_size > 0) &&
setsockopt(s, SOL_SOCKET, SO_SNDBUF,
(void *)&channel->socket_send_buffer_size,
sizeof(channel->socket_send_buffer_size)) == -1)
return -1;
if ((channel->socket_receive_buffer_size > 0) &&
setsockopt(s, SOL_SOCKET, SO_RCVBUF,
(void *)&channel->socket_receive_buffer_size,
sizeof(channel->socket_receive_buffer_size)) == -1)
return -1;
return 0;
}
static int open_tcp_socket(ares_channel channel, struct server_state *server) static int open_tcp_socket(ares_channel channel, struct server_state *server)
{ {
ares_socket_t s; ares_socket_t s;
int opt;
struct sockaddr_in sockin; struct sockaddr_in sockin;
/* Acquire a socket. */ /* Acquire a socket. */
@@ -655,8 +833,26 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
if (s == ARES_SOCKET_BAD) if (s == ARES_SOCKET_BAD)
return -1; return -1;
/* Set the socket non-blocking. */ /* Configure it. */
nonblock(s, TRUE); if (configure_socket(s, channel) < 0)
{
close(s);
return -1;
}
/*
* Disable the Nagle algorithm (only relevant for TCP sockets, and thus not in
* configure_socket). In general, in DNS lookups we're pretty much interested
* in firing off a single request and then waiting for a reply, so batching
* isn't very interesting in general.
*/
opt = 1;
if (setsockopt(s, IPPROTO_TCP, TCP_NODELAY,
(void *)&opt, sizeof(opt)) == -1)
{
close(s);
return -1;
}
/* Connect to the server. */ /* Connect to the server. */
memset(&sockin, 0, sizeof(sockin)); memset(&sockin, 0, sizeof(sockin));
@@ -675,6 +871,7 @@ static int open_tcp_socket(ares_channel channel, struct server_state *server)
SOCK_STATE_CALLBACK(channel, s, 1, 0); SOCK_STATE_CALLBACK(channel, s, 1, 0);
server->tcp_buffer_pos = 0; server->tcp_buffer_pos = 0;
server->tcp_socket = s; server->tcp_socket = s;
server->tcp_connection_generation = ++channel->tcp_connection_generation;
return 0; return 0;
} }
@@ -689,7 +886,11 @@ static int open_udp_socket(ares_channel channel, struct server_state *server)
return -1; return -1;
/* Set the socket non-blocking. */ /* Set the socket non-blocking. */
nonblock(s, TRUE); if (configure_socket(s, channel) < 0)
{
close(s);
return -1;
}
/* Connect to the server. */ /* Connect to the server. */
memset(&sockin, 0, sizeof(sockin)); memset(&sockin, 0, sizeof(sockin));
@@ -787,34 +988,92 @@ static int same_questions(const unsigned char *qbuf, int qlen,
return 1; return 1;
} }
static struct query *end_query (ares_channel channel, struct query *query, int status, static void end_query (ares_channel channel, struct query *query, int status,
unsigned char *abuf, int alen) unsigned char *abuf, int alen)
{ {
struct query **q, *next;
int i; int i;
query->callback(query->arg, status, abuf, alen); /* First we check to see if this query ended while one of our send
for (q = &channel->queries; *q; q = &(*q)->next) * queues still has pointers to it.
*/
for (i = 0; i < channel->nservers; i++)
{ {
if (*q == query) struct server_state *server = &channel->servers[i];
break; struct send_request *sendreq;
for (sendreq = server->qhead; sendreq; sendreq = sendreq->next)
if (sendreq->owner_query == query)
{
sendreq->owner_query = NULL;
assert(sendreq->data_storage == NULL);
if (status == ARES_SUCCESS)
{
/* We got a reply for this query, but this queued
* sendreq points into this soon-to-be-gone query's
* tcpbuf. Probably this means we timed out and queued
* the query for retransmission, then received a
* response before actually retransmitting. This is
* perfectly fine, so we want to keep the connection
* running smoothly if we can. But in the worst case
* we may have sent only some prefix of the query,
* with some suffix of the query left to send. Also,
* the buffer may be queued on multiple queues. To
* prevent dangling pointers to the query's tcpbuf and
* handle these cases, we just give such sendreqs
* their own copy of the query packet.
*/
sendreq->data_storage = malloc(sendreq->len);
if (sendreq->data_storage != NULL)
{
memcpy(sendreq->data_storage, sendreq->data, sendreq->len);
sendreq->data = sendreq->data_storage;
} }
*q = query->next; }
if (*q) if ((status != ARES_SUCCESS) || (sendreq->data_storage == NULL))
next = (*q)->next; {
else /* We encountered an error (probably a timeout,
next = NULL; * suggesting the DNS server we're talking to is
free(query->tcpbuf); * probably unreachable, wedged, or severely
free(query->skip_server); * overloaded) or we couldn't copy the request, so
free(query); * mark the connection as broken. When we get to
* process_broken_connections() we'll close the
* connection and try to re-send requests to another
* server.
*/
server->is_broken = 1;
/* Just to be paranoid, zero out this sendreq... */
sendreq->data = NULL;
sendreq->len = 0;
}
}
}
/* Invoke the callback */
query->callback(query->arg, status, query->timeouts, abuf, alen);
ares__free_query(query);
/* Simple cleanup policy: if no queries are remaining, close all /* Simple cleanup policy: if no queries are remaining, close all
* network sockets unless STAYOPEN is set. * network sockets unless STAYOPEN is set.
*/ */
if (!channel->queries && !(channel->flags & ARES_FLAG_STAYOPEN)) if (!(channel->flags & ARES_FLAG_STAYOPEN) &&
ares__is_list_empty(&(channel->all_queries)))
{ {
for (i = 0; i < channel->nservers; i++) for (i = 0; i < channel->nservers; i++)
ares__close_sockets(channel, &channel->servers[i]); ares__close_sockets(channel, &channel->servers[i]);
} }
return (next); }
void ares__free_query(struct query *query)
{
/* Remove the query from all the lists in which it is linked */
ares__remove_from_list(&(query->queries_by_qid));
ares__remove_from_list(&(query->queries_by_timeout));
ares__remove_from_list(&(query->queries_to_server));
ares__remove_from_list(&(query->all_queries));
/* Zero out some important stuff, to help catch bugs */
query->callback = NULL;
query->arg = NULL;
/* Deallocate the memory associated with the query */
free(query->tcpbuf);
free(query->server_info);
free(query);
} }

View File

@@ -22,7 +22,7 @@ ares_query \- Initiate a single-question DNS query
.B #include <ares.h> .B #include <ares.h>
.PP .PP
.B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, .B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP,
.B unsigned char *\fIabuf\fP, int \fIalen\fP) .B int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP)
.PP .PP
.B void ares_query(ares_channel \fIchannel\fP, const char *\fIname\fP, .B void ares_query(ares_channel \fIchannel\fP, const char *\fIname\fP,
.B int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP, .B int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP,
@@ -124,6 +124,11 @@ The name service channel
.I channel .I channel
is being destroyed; the query will not be completed. is being destroyed; the query will not be completed.
.PP .PP
The callback argument
.I timeouts
reports how many times a query timed out during the execution of the
given request.
.PP
If the query completed (even if there was something wrong with it, as If the query completed (even if there was something wrong with it, as
indicated by some of the above error codes), the callback argument indicated by some of the above error codes), the callback argument
.I abuf .I abuf

View File

@@ -37,7 +37,7 @@ struct qquery {
void *arg; void *arg;
}; };
static void qcallback(void *arg, int status, unsigned char *abuf, int alen); static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen);
void ares__rc4(rc4_key* key, unsigned char *buffer_ptr, int buffer_len) void ares__rc4(rc4_key* key, unsigned char *buffer_ptr, int buffer_len)
{ {
@@ -53,13 +53,13 @@ void ares__rc4(rc4_key* key, unsigned char *buffer_ptr, int buffer_len)
state = &key->state[0]; state = &key->state[0];
for(counter = 0; counter < buffer_len; counter ++) for(counter = 0; counter < buffer_len; counter ++)
{ {
x = (x + 1) % 256; x = (unsigned char)((x + 1) % 256);
y = (state[x] + y) % 256; y = (unsigned char)((state[x] + y) % 256);
ARES_SWAP_BYTE(&state[x], &state[y]); ARES_SWAP_BYTE(&state[x], &state[y]);
xorIndex = (state[x] + state[y]) % 256; xorIndex = (unsigned char)((state[x] + state[y]) % 256);
buffer_ptr[counter] ^= state[xorIndex]; buffer_ptr[counter] = (unsigned char)(buffer_ptr[counter]^state[xorIndex]);
} }
key->x = x; key->x = x;
key->y = y; key->y = y;
@@ -67,13 +67,17 @@ void ares__rc4(rc4_key* key, unsigned char *buffer_ptr, int buffer_len)
static struct query* find_query_by_id(ares_channel channel, int id) static struct query* find_query_by_id(ares_channel channel, int id)
{ {
int qid; unsigned short qid;
struct query* q; struct list_node* list_head;
struct list_node* list_node;
DNS_HEADER_SET_QID(((unsigned char*)&qid), id); DNS_HEADER_SET_QID(((unsigned char*)&qid), id);
/* Find the query corresponding to this packet. */ /* Find the query corresponding to this packet. */
for (q = channel->queries; q; q = q->next) list_head = &(channel->queries_by_qid[qid % ARES_QID_TABLE_SIZE]);
for (list_node = list_head->next; list_node != list_head;
list_node = list_node->next)
{ {
struct query *q = list_node->data;
if (q->qid == qid) if (q->qid == qid)
return q; return q;
} }
@@ -110,7 +114,8 @@ void ares_query(ares_channel channel, const char *name, int dnsclass,
&qlen); &qlen);
if (status != ARES_SUCCESS) if (status != ARES_SUCCESS)
{ {
callback(arg, status, NULL, 0); if (qbuf != NULL) free(qbuf);
callback(arg, status, 0, NULL, 0);
return; return;
} }
@@ -121,7 +126,7 @@ void ares_query(ares_channel channel, const char *name, int dnsclass,
if (!qquery) if (!qquery)
{ {
ares_free_string(qbuf); ares_free_string(qbuf);
callback(arg, ARES_ENOMEM, NULL, 0); callback(arg, ARES_ENOMEM, 0, NULL, 0);
return; return;
} }
qquery->callback = callback; qquery->callback = callback;
@@ -132,14 +137,14 @@ void ares_query(ares_channel channel, const char *name, int dnsclass,
ares_free_string(qbuf); ares_free_string(qbuf);
} }
static void qcallback(void *arg, int status, unsigned char *abuf, int alen) static void qcallback(void *arg, int status, int timeouts, unsigned char *abuf, int alen)
{ {
struct qquery *qquery = (struct qquery *) arg; struct qquery *qquery = (struct qquery *) arg;
unsigned int ancount; unsigned int ancount;
int rcode; int rcode;
if (status != ARES_SUCCESS) if (status != ARES_SUCCESS)
qquery->callback(qquery->arg, status, abuf, alen); qquery->callback(qquery->arg, status, timeouts, abuf, alen);
else else
{ {
/* Pull the response code and answer count from the packet. */ /* Pull the response code and answer count from the packet. */
@@ -168,7 +173,7 @@ static void qcallback(void *arg, int status, unsigned char *abuf, int alen)
status = ARES_EREFUSED; status = ARES_EREFUSED;
break; break;
} }
qquery->callback(qquery->arg, status, abuf, alen); qquery->callback(qquery->arg, status, timeouts, abuf, alen);
} }
free(qquery); free(qquery);
} }

View File

@@ -22,7 +22,7 @@ ares_search \- Initiate a DNS query with domain search
.B #include <ares.h> .B #include <ares.h>
.PP .PP
.B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, .B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP,
.B unsigned char *\fIabuf\fP, int \fIalen\fP) .B int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP)
.PP .PP
.B void ares_search(ares_channel \fIchannel\fP, const char *\fIname\fP, .B void ares_search(ares_channel \fIchannel\fP, const char *\fIname\fP,
.B int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP, .B int \fIdnsclass\fP, int \fItype\fP, ares_callback \fIcallback\fP,
@@ -125,6 +125,11 @@ The name service channel
.I channel .I channel
is being destroyed; the query will not be completed. is being destroyed; the query will not be completed.
.PP .PP
The callback argument
.I timeouts
reports how many times a query timed out during the execution of the
given request.
.PP
If a query completed successfully, the callback argument If a query completed successfully, the callback argument
.I abuf .I abuf
points to a result buffer of length points to a result buffer of length

View File

@@ -41,10 +41,12 @@ struct search_query {
int status_as_is; /* error status from trying as-is */ int status_as_is; /* error status from trying as-is */
int next_domain; /* next search domain to try */ int next_domain; /* next search domain to try */
int trying_as_is; /* current query is for name as-is */ int trying_as_is; /* current query is for name as-is */
int timeouts; /* number of timeouts we saw for this request */
int ever_got_nodata; /* did we ever get ARES_ENODATA along the way? */
}; };
static void search_callback(void *arg, int status, unsigned char *abuf, static void search_callback(void *arg, int status, int timeouts,
int alen); unsigned char *abuf, int alen);
static void end_squery(struct search_query *squery, int status, static void end_squery(struct search_query *squery, int status,
unsigned char *abuf, int alen); unsigned char *abuf, int alen);
static int cat_domain(const char *name, const char *domain, char **s); static int cat_domain(const char *name, const char *domain, char **s);
@@ -64,7 +66,7 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
status = single_domain(channel, name, &s); status = single_domain(channel, name, &s);
if (status != ARES_SUCCESS) if (status != ARES_SUCCESS)
{ {
callback(arg, status, NULL, 0); callback(arg, status, 0, NULL, 0);
return; return;
} }
if (s) if (s)
@@ -80,7 +82,7 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
squery = malloc(sizeof(struct search_query)); squery = malloc(sizeof(struct search_query));
if (!squery) if (!squery)
{ {
callback(arg, ARES_ENOMEM, NULL, 0); callback(arg, ARES_ENOMEM, 0, NULL, 0);
return; return;
} }
squery->channel = channel; squery->channel = channel;
@@ -88,7 +90,7 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
if (!squery->name) if (!squery->name)
{ {
free(squery); free(squery);
callback(arg, ARES_ENOMEM, NULL, 0); callback(arg, ARES_ENOMEM, 0, NULL, 0);
return; return;
} }
squery->dnsclass = dnsclass; squery->dnsclass = dnsclass;
@@ -96,6 +98,8 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
squery->status_as_is = -1; squery->status_as_is = -1;
squery->callback = callback; squery->callback = callback;
squery->arg = arg; squery->arg = arg;
squery->timeouts = 0;
squery->ever_got_nodata = 0;
/* Count the number of dots in name. */ /* Count the number of dots in name. */
ndots = 0; ndots = 0;
@@ -132,18 +136,20 @@ void ares_search(ares_channel channel, const char *name, int dnsclass,
/* failed, free the malloc()ed memory */ /* failed, free the malloc()ed memory */
free(squery->name); free(squery->name);
free(squery); free(squery);
callback(arg, status, NULL, 0); callback(arg, status, 0, NULL, 0);
} }
} }
} }
static void search_callback(void *arg, int status, unsigned char *abuf, static void search_callback(void *arg, int status, int timeouts,
int alen) unsigned char *abuf, int alen)
{ {
struct search_query *squery = (struct search_query *) arg; struct search_query *squery = (struct search_query *) arg;
ares_channel channel = squery->channel; ares_channel channel = squery->channel;
char *s; char *s;
squery->timeouts += timeouts;
/* Stop searching unless we got a non-fatal error. */ /* Stop searching unless we got a non-fatal error. */
if (status != ARES_ENODATA && status != ARES_ESERVFAIL if (status != ARES_ENODATA && status != ARES_ESERVFAIL
&& status != ARES_ENOTFOUND) && status != ARES_ENOTFOUND)
@@ -153,6 +159,17 @@ static void search_callback(void *arg, int status, unsigned char *abuf,
/* Save the status if we were trying as-is. */ /* Save the status if we were trying as-is. */
if (squery->trying_as_is) if (squery->trying_as_is)
squery->status_as_is = status; squery->status_as_is = status;
/*
* If we ever get ARES_ENODATA along the way, record that; if the search
* should run to the very end and we got at least one ARES_ENODATA,
* then callers like ares_gethostbyname() may want to try a T_A search
* even if the last domain we queried for T_AAAA resource records
* returned ARES_ENOTFOUND.
*/
if (status == ARES_ENODATA)
squery->ever_got_nodata = 1;
if (squery->next_domain < channel->ndomains) if (squery->next_domain < channel->ndomains)
{ {
/* Try the next domain. */ /* Try the next domain. */
@@ -176,15 +193,20 @@ static void search_callback(void *arg, int status, unsigned char *abuf,
ares_query(channel, squery->name, squery->dnsclass, squery->type, ares_query(channel, squery->name, squery->dnsclass, squery->type,
search_callback, squery); search_callback, squery);
} }
else {
if (squery->status_as_is == ARES_ENOTFOUND && squery->ever_got_nodata) {
end_squery(squery, ARES_ENODATA, NULL, 0);
}
else else
end_squery(squery, squery->status_as_is, NULL, 0); end_squery(squery, squery->status_as_is, NULL, 0);
} }
}
} }
static void end_squery(struct search_query *squery, int status, static void end_squery(struct search_query *squery, int status,
unsigned char *abuf, int alen) unsigned char *abuf, int alen)
{ {
squery->callback(squery->arg, status, abuf, alen); squery->callback(squery->arg, status, squery->timeouts, abuf, alen);
free(squery->name); free(squery->name);
free(squery); free(squery);
} }

View File

@@ -22,7 +22,7 @@ ares_send \- Initiate a DNS query
.B #include <ares.h> .B #include <ares.h>
.PP .PP
.B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP, .B typedef void (*ares_callback)(void *\fIarg\fP, int \fIstatus\fP,
.B unsigned char *\fIabuf\fP, int \fIalen\fP) .B int \fItimeouts\fP, unsigned char *\fIabuf\fP, int \fIalen\fP)
.PP .PP
.B void ares_send(ares_channel \fIchannel\fP, const unsigned char *\fIqbuf\fP, .B void ares_send(ares_channel \fIchannel\fP, const unsigned char *\fIqbuf\fP,
.B int \fIqlen\fP, ares_callback \fIcallback\fP, void *\fIarg\fP) .B int \fIqlen\fP, ares_callback \fIcallback\fP, void *\fIarg\fP)
@@ -79,6 +79,11 @@ The name service channel
.I channel .I channel
is being destroyed; the query will not be completed. is being destroyed; the query will not be completed.
.PP .PP
The callback argument
.I timeouts
reports how many times a query timed out during the execution of the
given request.
.PP
If the query completed, the callback argument If the query completed, the callback argument
.I abuf .I abuf
points to a result buffer of length points to a result buffer of length

View File

@@ -44,7 +44,7 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
/* Verify that the query is at least long enough to hold the header. */ /* Verify that the query is at least long enough to hold the header. */
if (qlen < HFIXEDSZ || qlen >= (1 << 16)) if (qlen < HFIXEDSZ || qlen >= (1 << 16))
{ {
callback(arg, ARES_EBADQUERY, NULL, 0); callback(arg, ARES_EBADQUERY, 0, NULL, 0);
return; return;
} }
@@ -52,22 +52,23 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
query = malloc(sizeof(struct query)); query = malloc(sizeof(struct query));
if (!query) if (!query)
{ {
callback(arg, ARES_ENOMEM, NULL, 0); callback(arg, ARES_ENOMEM, 0, NULL, 0);
return; return;
} }
query->tcpbuf = malloc(qlen + 2); query->tcpbuf = malloc(qlen + 2);
if (!query->tcpbuf) if (!query->tcpbuf)
{ {
free(query); free(query);
callback(arg, ARES_ENOMEM, NULL, 0); callback(arg, ARES_ENOMEM, 0, NULL, 0);
return; return;
} }
query->skip_server = malloc(channel->nservers * sizeof(int)); query->server_info = malloc(channel->nservers *
if (!query->skip_server) sizeof(query->server_info[0]));
if (!query->server_info)
{ {
free(query->tcpbuf); free(query->tcpbuf);
free(query); free(query);
callback(arg, ARES_ENOMEM, NULL, 0); callback(arg, ARES_ENOMEM, 0, NULL, 0);
return; return;
} }
@@ -93,13 +94,28 @@ void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
query->try = 0; query->try = 0;
query->server = 0; query->server = 0;
for (i = 0; i < channel->nservers; i++) for (i = 0; i < channel->nservers; i++)
query->skip_server[i] = 0; {
query->server_info[i].skip_server = 0;
query->server_info[i].tcp_connection_generation = 0;
}
query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > PACKETSZ; query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > PACKETSZ;
query->error_status = ARES_ECONNREFUSED; query->error_status = ARES_ECONNREFUSED;
query->timeouts = 0;
/* Chain the query into this channel's query list. */ /* Initialize our list nodes. */
query->next = channel->queries; ares__init_list_node(&(query->queries_by_qid), query);
channel->queries = query; ares__init_list_node(&(query->queries_by_timeout), query);
ares__init_list_node(&(query->queries_to_server), query);
ares__init_list_node(&(query->all_queries), query);
/* Chain the query into the list of all queries. */
ares__insert_in_list(&(query->all_queries), &(channel->all_queries));
/* Keep track of queries bucketed by qid, so we can process DNS
* responses quickly.
*/
ares__insert_in_list(
&(query->queries_by_qid),
&(channel->queries_by_qid[query->qid % ARES_QID_TABLE_SIZE]));
/* Perform the first query action. */ /* Perform the first query action. */
time(&now); time(&now);

View File

@@ -46,6 +46,8 @@ const char *ares_strerror(int code)
"Illegal hints flags specified" "Illegal hints flags specified"
}; };
DEBUGASSERT(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))); if(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)))
return errtext[code]; return errtext[code];
else
return "unknown";
} }

View File

@@ -26,23 +26,34 @@
#include "ares.h" #include "ares.h"
#include "ares_private.h" #include "ares_private.h"
/* WARNING: Beware that this is linear in the number of outstanding
* requests! You are probably far better off just calling ares_process()
* once per second, rather than calling ares_timeout() to figure out
* when to next call ares_process().
*/
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
struct timeval *tvbuf) struct timeval *tvbuf)
{ {
struct query *query; struct query *query;
struct list_node* list_head;
struct list_node* list_node;
time_t now; time_t now;
time_t offset, min_offset; /* these use time_t since some 32 bit systems time_t offset, min_offset; /* these use time_t since some 32 bit systems
still use 64 bit time_t! (like VS2005) */ still use 64 bit time_t! (like VS2005) */
/* No queries, no timeout (and no fetch of the current time). */ /* No queries, no timeout (and no fetch of the current time). */
if (!channel->queries) if (ares__is_list_empty(&(channel->all_queries)))
return maxtv; return maxtv;
/* Find the minimum timeout for the current set of queries. */ /* Find the minimum timeout for the current set of queries. */
time(&now); time(&now);
min_offset = -1; min_offset = -1;
for (query = channel->queries; query; query = query->next)
list_head = &(channel->all_queries);
for (list_node = list_head->next; list_node != list_head;
list_node = list_node->next)
{ {
query = list_node->data;
if (query->timeout == 0) if (query->timeout == 0)
continue; continue;
offset = query->timeout - now; offset = query->timeout - now;

View File

@@ -4,12 +4,12 @@
#define ARES__VERSION_H #define ARES__VERSION_H
#define ARES_VERSION_MAJOR 1 #define ARES_VERSION_MAJOR 1
#define ARES_VERSION_MINOR 4 #define ARES_VERSION_MINOR 5
#define ARES_VERSION_PATCH 1 #define ARES_VERSION_PATCH 0
#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ #define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\
(ARES_VERSION_MINOR<<8)|\ (ARES_VERSION_MINOR<<8)|\
(ARES_VERSION_PATCH)) (ARES_VERSION_PATCH))
#define ARES_VERSION_STR "1.4.1-CVS" #define ARES_VERSION_STR "1.5.0-CVS"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@@ -146,11 +146,6 @@
#define ssize_t int #define ssize_t int
#endif #endif
/* Define to 'int' if socklen_t is not an available 'typedefed' type */
#ifndef HAVE_WS2TCPIP_H
#define socklen_t int
#endif
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
/* STRUCT RELATED */ /* STRUCT RELATED */
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */

View File

@@ -117,6 +117,43 @@ dnl gethostbyname_r() version
dnl ********************************************************************** dnl **********************************************************************
CURL_DETECT_ICC([CFLAGS="$CFLAGS -we 147"]) CURL_DETECT_ICC([CFLAGS="$CFLAGS -we 147"])
dnl **********************************************************************
dnl platform/compiler/architecture specific checks/flags
dnl **********************************************************************
case $host in
#
x86_64*linux*)
#
dnl find out if icc is being used
if test "z$ICC" = "z"; then
CURL_DETECT_ICC
fi
#
if test "$ICC" = "yes"; then
dnl figure out icc version
AC_MSG_CHECKING([icc version])
iccver=`$CC -dumpversion`
iccnhi=`echo $iccver | cut -d . -f1`
iccnlo=`echo $iccver | cut -d . -f2`
iccnum=`(expr $iccnhi "*" 100 + $iccnlo) 2>/dev/null`
AC_MSG_RESULT($iccver)
#
if test "$iccnum" -ge "900" && test "$iccnum" -lt "1000"; then
dnl icc 9.X specific
CFLAGS="$CFLAGS -i-dynamic"
fi
#
if test "$iccnum" -ge "1000"; then
dnl icc 10.X or later
CFLAGS="$CFLAGS -shared-intel"
fi
#
fi
;;
#
esac
dnl ********************************************************************** dnl **********************************************************************
dnl Checks for libraries. dnl Checks for libraries.
dnl ********************************************************************** dnl **********************************************************************
@@ -337,8 +374,10 @@ AC_CHECK_HEADERS(
sys/select.h \ sys/select.h \
sys/socket.h \ sys/socket.h \
sys/ioctl.h \ sys/ioctl.h \
sys/param.h \
netdb.h \ netdb.h \
netinet/in.h \ netinet/in.h \
netinet/tcp.h \
net/if.h \ net/if.h \
errno.h \ errno.h \
stdbool.h \ stdbool.h \
@@ -600,6 +639,7 @@ AC_CHECK_MEMBER(struct addrinfo.ai_flags,
AC_CHECK_FUNCS( bitncmp \ AC_CHECK_FUNCS( bitncmp \
gettimeofday \
if_indextoname, if_indextoname,
dnl if found dnl if found
[], [],
@@ -801,4 +841,4 @@ if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then
[a suitable file/device to read random data from]) [a suitable file/device to read random data from])
fi fi
AC_OUTPUT(Makefile) AC_OUTPUT(Makefile libcares.pc)

20
ares/libcares.pc.in Normal file
View File

@@ -0,0 +1,20 @@
#***************************************************************************
# Project ___ __ _ _ __ ___ ___
# / __|____ / _` | '__/ _ \/ __|
# | (_|_____| (_| | | | __/\__ \
# \___| \__,_|_| \___||___/
# $id: $
#
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: c-ares
URL: http://daniel.haxx.se/projects/c-ares/
Description: asyncronous DNS lookup library
Version: @VERSION@
Requires:
Requires.private:
Cflags: -I${includedir}
Libs: -L${libdir} -lcares

View File

@@ -32,7 +32,9 @@ struct iovec
int ares_writev (SOCKET s, const struct iovec *vector, size_t count); int ares_writev (SOCKET s, const struct iovec *vector, size_t count);
#define writev(s,vect,count) ares_writev(s,vect,count) #define writev(s,vect,count) ares_writev(s,vect,count)
#ifndef HAVE_GETTIMEOFDAY
struct timezone { int dummy; }; struct timezone { int dummy; };
#endif
int ares_gettimeofday(struct timeval *tv, struct timezone *tz); int ares_gettimeofday(struct timeval *tv, struct timezone *tz);
#define gettimeofday(tv,tz) ares_gettimeofday(tv,tz) #define gettimeofday(tv,tz) ares_gettimeofday(tv,tz)
@@ -147,6 +149,11 @@ typedef enum __ns_opcode {
#define T_CNAME ns_t_cname #define T_CNAME ns_t_cname
#define NS_MAXDNAME 256 /* maximum domain name */
#define MAXDNAME NS_MAXDNAME
#define NS_MAXCDNAME 255 /* maximum compressed domain name */
#define MAXCDNAME NS_MAXCDNAME
#define NS_PACKETSZ 512 /* maximum packet size */ #define NS_PACKETSZ 512 /* maximum packet size */
#define PACKETSZ NS_PACKETSZ #define PACKETSZ NS_PACKETSZ

View File

@@ -97,10 +97,6 @@
#define ssize_t int #define ssize_t int
#endif #endif
#ifndef HAVE_WS2TCPIP_H
#define socklen_t int
#endif
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
/* /*

View File

@@ -91,6 +91,31 @@ struct timeval {
#endif #endif
/*
* Windows build targets have socklen_t definition in
* ws2tcpip.h but some versions of ws2tcpip.h do not
* have the definition. It seems that when the socklen_t
* definition is missing from ws2tcpip.h the definition
* for INET_ADDRSTRLEN is also missing, and that when one
* definition is present the other one also is available.
*/
#if defined(WIN32) && !defined(HAVE_SOCKLEN_T)
# if ( defined(_MSC_VER) && !defined(INET_ADDRSTRLEN) ) || \
(!defined(_MSC_VER) && !defined(HAVE_WS2TCPIP_H) )
# define socklen_t int
# define HAVE_SOCKLEN_T
# endif
#endif
#if defined(__minix)
/* Minix doesn't support recv on TCP sockets */
#define sread(x,y,z) (ssize_t)read((RECV_TYPE_ARG1)(x), \
(RECV_TYPE_ARG2)(y), \
(RECV_TYPE_ARG3)(z))
#elif defined(HAVE_RECV)
/* /*
* The definitions for the return type and arguments types * The definitions for the return type and arguments types
* of functions recv() and send() belong and come from the * of functions recv() and send() belong and come from the
@@ -113,7 +138,6 @@ struct timeval {
* SEND_TYPE_RETV must also be defined. * SEND_TYPE_RETV must also be defined.
*/ */
#ifdef HAVE_RECV
#if !defined(RECV_TYPE_ARG1) || \ #if !defined(RECV_TYPE_ARG1) || \
!defined(RECV_TYPE_ARG2) || \ !defined(RECV_TYPE_ARG2) || \
!defined(RECV_TYPE_ARG3) || \ !defined(RECV_TYPE_ARG3) || \
@@ -136,7 +160,14 @@ struct timeval {
#endif #endif
#endif /* HAVE_RECV */ #endif /* HAVE_RECV */
#ifdef HAVE_SEND
#if defined(__minix)
/* Minix doesn't support send on TCP sockets */
#define swrite(x,y,z) (ssize_t)write((SEND_TYPE_ARG1)(x), \
(SEND_TYPE_ARG2)(y), \
(SEND_TYPE_ARG3)(z))
#elif defined(HAVE_SEND)
#if !defined(SEND_TYPE_ARG1) || \ #if !defined(SEND_TYPE_ARG1) || \
!defined(SEND_QUAL_ARG2) || \ !defined(SEND_QUAL_ARG2) || \
!defined(SEND_TYPE_ARG2) || \ !defined(SEND_TYPE_ARG2) || \
@@ -358,5 +389,96 @@ typedef int sig_atomic_t;
#endif #endif
/*
* We use this ZERO_NULL to avoid picky compiler warnings,
* when assigning a NULL pointer to a function pointer var.
*/
#define ZERO_NULL 0
#if defined (__LP64__) && defined(__hpux) && !defined(_XOPEN_SOURCE_EXTENDED)
#include <sys/socket.h>
/* HP-UX has this oddity where it features a few functions that don't work
with socklen_t so we need to convert to ints
This is due to socklen_t being a 64bit int under 64bit ABI, but the
pre-xopen (default) interfaces require an int, which is 32bits.
Therefore, Anytime socklen_t is passed by pointer, the libc function
truncates the 64bit socklen_t value by treating it as a 32bit value.
Note that some socket calls are allowed to have a NULL pointer for
the socklen arg.
*/
inline static int Curl_hp_getsockname(int s, struct sockaddr *name,
socklen_t *namelen)
{
int rc;
if(namelen) {
int len = *namelen;
rc = getsockname(s, name, &len);
*namelen = len;
}
else
rc = getsockname(s, name, 0);
return rc;
}
inline static int Curl_hp_getsockopt(int s, int level, int optname,
void *optval, socklen_t *optlen)
{
int rc;
if(optlen) {
int len = *optlen;
rc = getsockopt(s, level, optname, optval, &len);
*optlen = len;
}
else
rc = getsockopt(s, level, optname, optval, 0);
return rc;
}
inline static int Curl_hp_accept(int sockfd, struct sockaddr *addr,
socklen_t *addrlen)
{
int rc;
if(addrlen) {
int len = *addrlen;
rc = accept(sockfd, addr, &len);
*addrlen = len;
}
else
rc = accept(sockfd, addr, 0);
return rc;
}
inline static ssize_t Curl_hp_recvfrom(int s, void *buf, size_t len, int flags,
struct sockaddr *from,
socklen_t *fromlen)
{
ssize_t rc;
if(fromlen) {
int fromlen32 = *fromlen;
rc = recvfrom(s, buf, len, flags, from, &fromlen32);
*fromlen = fromlen32;
}
else {
rc = recvfrom(s, buf, len, flags, from, 0);
}
return rc;
}
#define getsockname(a,b,c) Curl_hp_getsockname((a),(b),(c))
#define getsockopt(a,b,c,d,e) Curl_hp_getsockopt((a),(b),(c),(d),(e))
#define accept(a,b,c) Curl_hp_accept((a),(b),(c))
#define recvfrom(a,b,c,d,e,f) Curl_hp_recvfrom((a),(b),(c),(d),(e),(f))
#endif /* HPUX work-around */
#endif /* __SETUP_ONCE_H */ #endif /* __SETUP_ONCE_H */

View File

@@ -137,6 +137,10 @@ SOURCE=..\..\ares_init.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\ares_llist.c
# End Source File
# Begin Source File
SOURCE=..\..\ares_mkquery.c SOURCE=..\..\ares_mkquery.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@@ -213,6 +217,10 @@ SOURCE=..\..\ares_ipv6.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\..\ares_llist.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

@@ -55,6 +55,7 @@ AC_SUBST(AR)
if test "x$AR" = "xar-was-not-found-by-configure"; then if test "x$AR" = "xar-was-not-found-by-configure"; then
AC_MSG_WARN([ar was not found, this may ruin your chances to build fine]) AC_MSG_WARN([ar was not found, this may ruin your chances to build fine])
fi fi
AC_SUBST(libext)
dnl figure out the libcurl version dnl figure out the libcurl version
VERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curlver.h` VERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curlver.h`
@@ -89,6 +90,8 @@ dnl initialize all the info variables
curl_manual_msg="no (--enable-manual)" curl_manual_msg="no (--enable-manual)"
curl_verbose_msg="enabled (--disable-verbose)" curl_verbose_msg="enabled (--disable-verbose)"
curl_sspi_msg="no (--enable-sspi)" curl_sspi_msg="no (--enable-sspi)"
curl_ldap_msg="no (--enable-ldap / --with-ldap-lib / --with-lber-lib)"
curl_ldaps_msg="no (--enable-ldaps)"
dnl dnl
dnl Save anything in $LIBS for later dnl Save anything in $LIBS for later
@@ -219,6 +222,45 @@ CURL_CHECK_HEADER_WINSOCK
CURL_CHECK_HEADER_WINSOCK2 CURL_CHECK_HEADER_WINSOCK2
CURL_CHECK_HEADER_WS2TCPIP CURL_CHECK_HEADER_WS2TCPIP
CURL_CHECK_HEADER_WINLDAP
CURL_CHECK_HEADER_WINBER
dnl **********************************************************************
dnl platform/compiler/architecture specific checks/flags
dnl **********************************************************************
case $host in
#
x86_64*linux*)
#
dnl find out if icc is being used
if test "z$ICC" = "z"; then
CURL_DETECT_ICC
fi
#
if test "$ICC" = "yes"; then
dnl figure out icc version
AC_MSG_CHECKING([icc version])
iccver=`$CC -dumpversion`
iccnhi=`echo $iccver | cut -d . -f1`
iccnlo=`echo $iccver | cut -d . -f2`
iccnum=`(expr $iccnhi "*" 100 + $iccnlo) 2>/dev/null`
AC_MSG_RESULT($iccver)
#
if test "$iccnum" -ge "900" && test "$iccnum" -lt "1000"; then
dnl icc 9.X specific
CFLAGS="$CFLAGS -i-dynamic"
fi
#
if test "$iccnum" -ge "1000"; then
dnl icc 10.X or later
CFLAGS="$CFLAGS -shared-intel"
fi
#
fi
;;
#
esac
dnl ************************************************************ dnl ************************************************************
dnl switch off particular protocols dnl switch off particular protocols
@@ -284,6 +326,32 @@ AC_HELP_STRING([--disable-ldap],[Disable LDAP support]),
esac ], esac ],
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
) )
AC_MSG_CHECKING([whether to support ldaps])
AC_ARG_ENABLE(ldaps,
AC_HELP_STRING([--enable-ldaps],[Enable LDAPS support])
AC_HELP_STRING([--disable-ldaps],[Disable LDAPS support]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS])
AC_SUBST(CURL_DISABLE_LDAPS, [1])
;;
*) if test x$CURL_DISABLE_LDAP = x1 ; then
AC_MSG_RESULT(LDAP support needs to be enabled in order to enable LDAPS support!)
AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS])
AC_SUBST(CURL_DISABLE_LDAPS, [1])
else
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_LDAP_SSL, 1, [Use LDAPS implementation])
curl_ldaps_msg="enabled"
fi
;;
esac ],
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_LDAPS, 1, [to disable LDAPS])
AC_SUBST(CURL_DISABLE_LDAPS, [1])
)
AC_MSG_CHECKING([whether to support dict]) AC_MSG_CHECKING([whether to support dict])
AC_ARG_ENABLE(dict, AC_ARG_ENABLE(dict,
AC_HELP_STRING([--enable-dict],[Enable DICT support]) AC_HELP_STRING([--enable-dict],[Enable DICT support])
@@ -500,55 +568,82 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
) )
dnl dl lib?
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
dnl ********************************************************************** dnl **********************************************************************
dnl Check for the name of dynamic OpenLDAP libraries dnl Check for LDAP
dnl ********************************************************************** dnl **********************************************************************
LDAPLIBNAME="" LDAPLIBNAME=""
AC_ARG_WITH(ldap-lib, AC_ARG_WITH(ldap-lib,
AC_HELP_STRING([--with-ldap-lib=libname],[Specify name of dynamic ldap lib file]), AC_HELP_STRING([--with-ldap-lib=libname],[Specify name of ldap lib file]),
[LDAPLIBNAME="$withval"]) [LDAPLIBNAME="$withval"])
LBERLIBNAME="" LBERLIBNAME=""
AC_ARG_WITH(lber-lib, AC_ARG_WITH(lber-lib,
AC_HELP_STRING([--with-lber-lib=libname],[Specify name of dynamic lber lib file]), AC_HELP_STRING([--with-lber-lib=libname],[Specify name of lber lib file]),
[LBERLIBNAME="$withval"]) [LBERLIBNAME="$withval"])
if test x$CURL_DISABLE_LDAP != x1 ; then if test x$CURL_DISABLE_LDAP != x1 ; then
CURL_CHECK_HEADER_LBER
CURL_CHECK_HEADER_LDAP
CURL_CHECK_HEADER_LDAPSSL
CURL_CHECK_HEADER_LDAP_SSL
if test -z "$LDAPLIBNAME" ; then if test -z "$LDAPLIBNAME" ; then
case $host in case $host in
*-*-cygwin | *-*-mingw* | *-*-pw32*) *-*-cygwin* | *-*-mingw* | *-*-pw32*)
dnl Windows uses a single and unique OpenLDAP DLL name dnl Windows uses a single and unique OpenLDAP DLL name
LDAPLIBNAME="wldap32.dll" LDAPLIBNAME="wldap32"
LBERLIBNAME="no" LBERLIBNAME="no"
;; ;;
esac esac
fi fi
if test "$LDAPLIBNAME" ; then if test "$LDAPLIBNAME" ; then
AC_DEFINE_UNQUOTED(DL_LDAP_FILE, "$LDAPLIBNAME") AC_CHECK_LIB("$LDAPLIBNAME", ldap_init,, [
AC_MSG_CHECKING([name of dynamic library ldap]) AC_MSG_WARN(["$LDAPLIBNAME" is not an LDAP library: LDAP disabled])
AC_MSG_RESULT($LDAPLIBNAME) AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
AC_SUBST(CURL_DISABLE_LDAP, [1])])
else else
dnl Try to find the right ldap library name for this system dnl Try to find the right ldap libraries for this system
CURL_DLLIB_NAME(DL_LDAP_FILE, ldap) CURL_CHECK_LIBS_LDAP
case X-"$curl_cv_ldap_LIBS" in
X-unknown)
AC_MSG_WARN([Cannot find libraries for LDAP support: LDAP disabled])
AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
AC_SUBST(CURL_DISABLE_LDAP, [1])
;;
esac
fi fi
fi
if test x$CURL_DISABLE_LDAP != x1 ; then
if test "$LBERLIBNAME" ; then if test "$LBERLIBNAME" ; then
dnl If name is "no" then don't define this variable at all dnl If name is "no" then don't define this library at all
dnl (it's only needed if libldap.so's dependencies are broken). dnl (it's only needed if libldap.so's dependencies are broken).
if test "$LBERLIBNAME" != "no" ; then if test "$LBERLIBNAME" != "no" ; then
AC_DEFINE_UNQUOTED(DL_LBER_FILE, "$LBERLIBNAME") AC_CHECK_LIB("$LBERLIBNAME", ber_free,, [
AC_MSG_WARN(["$LBERLIBNAME" is not an LBER library: LDAP disabled])
AC_DEFINE(CURL_DISABLE_LDAP, 1, [to disable LDAP])
AC_SUBST(CURL_DISABLE_LDAP, [1])])
fi fi
AC_MSG_CHECKING([name of dynamic library lber]) fi
AC_MSG_RESULT($LBERLIBNAME) fi
if test x$CURL_DISABLE_LDAP != x1 ; then
AC_CHECK_FUNCS([ldap_url_parse])
if test "$LDAPLIBNAME" = "wldap32"; then
curl_ldap_msg="enabled (winldap)"
AC_DEFINE(CURL_LDAP_WIN, 1, [Use W$ LDAP implementation])
case $host in
*-*-cygwin* | *-*-pw32*)
AC_DEFINE(CURL_LDAP_HYBRID, 1, [W$ LDAP with non-W$ compiler])
;;
esac
else else
dnl Try to find the right lber library name for this system curl_ldap_msg="enabled (OpenLDAP)"
CURL_DLLIB_NAME(DL_LBER_FILE, lber)
fi fi
fi fi
@@ -1262,6 +1357,7 @@ if test X"$OPT_LIBSSH2" != Xno; then
curl_ssh_msg="enabled (libSSH2)" curl_ssh_msg="enabled (libSSH2)"
LIBSSH2_ENABLED=1 LIBSSH2_ENABLED=1
AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use])) AC_DEFINE(USE_LIBSSH2, 1, [if libSSH2 is in use]))
AC_SUBST(USE_LIBSSH2, [1])
if test X"$OPT_LIBSSH2" != Xoff && if test X"$OPT_LIBSSH2" != Xoff &&
test "$LIBSSH2_ENABLED" != "1"; then test "$LIBSSH2_ENABLED" != "1"; then
@@ -1417,6 +1513,14 @@ if test "$OPENSSL_ENABLED" != "1" -a "$GNUTLS_ENABLED" != "1"; then
version="unknown" version="unknown"
gtlsprefix=$OPT_GNUTLS gtlsprefix=$OPT_GNUTLS
fi fi
dnl Check for functionPK11_CreateGenericObject
dnl this is needed for using the PEM PKCS#11 module
AC_CHECK_LIB(nss3, PK11_CreateGenericObject-d,
[
AC_DEFINE(HAVE_PK11_CREATEGENERICOBJECT, 1, [if you have the function PK11_CreateGenericObject])
AC_SUBST(HAVE_PK11_CREATEGENERICOBJECT, [1])
])
if test -n "$addlib"; then if test -n "$addlib"; then
CLEANLIBS="$LIBS" CLEANLIBS="$LIBS"
@@ -1468,7 +1572,7 @@ dnl **********************************************************************
dnl Check for the CA bundle dnl Check for the CA bundle
dnl ********************************************************************** dnl **********************************************************************
if test X"$USE_GNUTLS$OPENSSL_ENABLED" != "X"; then if test X"$USE_NSS$USE_GNUTLS$OPENSSL_ENABLED" != "X"; then
AC_MSG_CHECKING([CA cert bundle install path]) AC_MSG_CHECKING([CA cert bundle install path])
@@ -1716,7 +1820,6 @@ AC_CHECK_HEADERS(
termio.h \ termio.h \
sgtty.h \ sgtty.h \
fcntl.h \ fcntl.h \
dlfcn.h \
alloca.h \ alloca.h \
time.h \ time.h \
io.h \ io.h \
@@ -1839,6 +1942,7 @@ AC_CHECK_FUNCS( strtoll \
select \ select \
strdup \ strdup \
strstr \ strstr \
strcasestr \
strtok_r \ strtok_r \
uname \ uname \
strcasecmp \ strcasecmp \
@@ -1858,7 +1962,6 @@ AC_CHECK_FUNCS( strtoll \
strlcat \ strlcat \
getpwuid \ getpwuid \
geteuid \ geteuid \
dlopen \
utime \ utime \
sigsetjmp \ sigsetjmp \
basename \ basename \
@@ -2138,7 +2241,6 @@ AC_HELP_STRING([--disable-verbose],[Disable verbose strings]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_VERBOSE_STRINGS, 1, [to disable verbose strings]) AC_DEFINE(CURL_DISABLE_VERBOSE_STRINGS, 1, [to disable verbose strings])
AC_SUBST(CURL_DISABLE_VERBOSE_STRINGS)
curl_verbose_msg="no" curl_verbose_msg="no"
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
@@ -2161,7 +2263,7 @@ AC_HELP_STRING([--disable-sspi],[Disable SSPI]),
if test "$ac_cv_native_windows" = "yes"; then if test "$ac_cv_native_windows" = "yes"; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support])
AC_SUBST(USE_WINDOWS_SSPI) AC_SUBST(USE_WINDOWS_SSPI, [1])
curl_sspi_msg="yes" curl_sspi_msg="yes"
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -2211,7 +2313,6 @@ AC_HELP_STRING([--disable-crypto-auth],[Disable cryptographic authentication]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_CRYPTO_AUTH, 1, [to disable cryptographic authentication]) AC_DEFINE(CURL_DISABLE_CRYPTO_AUTH, 1, [to disable cryptographic authentication])
AC_SUBST(CURL_DISABLE_CRYPTO_AUTH)
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -2230,7 +2331,6 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_COOKIES, 1, [to disable cookies support]) AC_DEFINE(CURL_DISABLE_COOKIES, 1, [to disable cookies support])
AC_SUBST(CURL_DISABLE_COOKIES)
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
;; ;;
@@ -2257,9 +2357,7 @@ AC_HELP_STRING([--disable-hidden-symbols],[Leave all symbols with default visibi
if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then if $CC --help --verbose 2>&1 | grep fvisibility= > /dev/null ; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(CURL_HIDDEN_SYMBOLS, 1, [to enable hidden symbols]) AC_DEFINE(CURL_HIDDEN_SYMBOLS, 1, [to enable hidden symbols])
AC_SUBST(CURL_HIDDEN_SYMBOLS)
AC_DEFINE(CURL_EXTERN_SYMBOL, [__attribute__ ((visibility ("default")))], [to make a symbol visible]) AC_DEFINE(CURL_EXTERN_SYMBOL, [__attribute__ ((visibility ("default")))], [to make a symbol visible])
AC_SUBST(CURL_EXTERN_SYMBOL)
CFLAGS="$CFLAGS -fvisibility=hidden" CFLAGS="$CFLAGS -fvisibility=hidden"
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -2270,9 +2368,7 @@ AC_HELP_STRING([--disable-hidden-symbols],[Leave all symbols with default visibi
if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then if $CC 2>&1 | grep flags >/dev/null && $CC -flags | grep xldscope= >/dev/null ; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(CURL_HIDDEN_SYMBOLS, 1, [to enable hidden symbols]) AC_DEFINE(CURL_HIDDEN_SYMBOLS, 1, [to enable hidden symbols])
AC_SUBST(CURL_HIDDEN_SYMBOLS)
AC_DEFINE(CURL_EXTERN_SYMBOL, [__global], [to make a symbol visible]) AC_DEFINE(CURL_EXTERN_SYMBOL, [__global], [to make a symbol visible])
AC_SUBST(CURL_EXTERN_SYMBOL)
CFLAGS="$CFLAGS -xldscope=hidden" CFLAGS="$CFLAGS -xldscope=hidden"
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -2363,4 +2459,6 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
Verbose errors: ${curl_verbose_msg} Verbose errors: ${curl_verbose_msg}
SSPI support: ${curl_sspi_msg} SSPI support: ${curl_sspi_msg}
ca cert path: ${ca} ca cert path: ${ca}
LDAP support: ${curl_ldap_msg}
LDAPS support: ${curl_ldaps_msg}
]) ])

View File

@@ -41,10 +41,11 @@ Available values for OPTION include:
--cflags pre-processor and compiler flags --cflags pre-processor and compiler flags
--checkfor [version] check for (lib)curl of the specified version --checkfor [version] check for (lib)curl of the specified version
--features 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
--protocols newline separated list of enabled protocols
--static-libs static libcurl library linking information
--version output version information --version output version information
--vernum output the version information as a number (hexadecimal) --vernum output the version information as a number (hexadecimal)
EOF EOF
@@ -131,12 +132,19 @@ while test $# -gt 0; do
if test "@CURL_DISABLE_LDAP@" != "1"; then if test "@CURL_DISABLE_LDAP@" != "1"; then
echo "LDAP" echo "LDAP"
fi fi
if test "@CURL_DISABLE_LDAPS@" != "1"; then
echo "LDAPS"
fi
if test "@CURL_DISABLE_DICT@" != "1"; then if test "@CURL_DISABLE_DICT@" != "1"; then
echo "DICT" echo "DICT"
fi fi
if test "@CURL_DISABLE_TFTP@" != "1"; then if test "@CURL_DISABLE_TFTP@" != "1"; then
echo "TFTP" echo "TFTP"
fi fi
if test "@USE_LIBSSH2@" = "1"; then
echo "SCP"
echo "SFTP"
fi
;; ;;
--version) --version)
echo libcurl @VERSION@ echo libcurl @VERSION@
@@ -193,6 +201,10 @@ while test $# -gt 0; do
fi fi
;; ;;
--static-libs)
echo @libdir@/libcurl.@libext@ @LDFLAGS@ @LIBCURL_LIBS@ @LIBS@
;;
*) *)
echo "unknown option: $1" echo "unknown option: $1"
usage 1 usage 1

View File

@@ -32,7 +32,7 @@ C
C++ C++
Written by Jean-Philippe Barrette-LaPierre Written by Jean-Philippe Barrette-LaPierre
http://rrette.com/curlpp.html http://rrette.com/textpattern/index.php?s=cURLpp
Ch Ch
@@ -82,9 +82,12 @@ Lisp
Lua Lua
LuaCURL Written by Alexander Marinov luacurl by Alexander Marinov
http://luacurl.luaforge.net/ http://luacurl.luaforge.net/
Lua-cURL by J<>rgen H<>tzel
http://luaforge.net/projects/lua-curl/
Mono Mono
Written by Jeffrey Phillips Written by Jeffrey Phillips
@@ -92,7 +95,7 @@ Mono
.NET .NET
libcurl-net Written by Jeffrey Phillips libcurl-net by Jeffrey Phillips
http://sourceforge.net/projects/libcurl-net/ http://sourceforge.net/projects/libcurl-net/
Object-Pascal Object-Pascal
@@ -127,12 +130,12 @@ PostgreSQL
Python Python
PycURL is written by Kjetil Jacobsen PycURL by Kjetil Jacobsen
http://pycurl.sourceforge.net/ http://pycurl.sourceforge.net/
R R
RCurl is written by Duncan Temple Lang RCurl by Duncan Temple Lang
http://www.omegahat.org/RCurl/ http://www.omegahat.org/RCurl/
Rexx Rexx
@@ -147,32 +150,36 @@ Ruby
Scheme Scheme
Bigloo binding written by Kirill Lisovsky Bigloo binding by Kirill Lisovsky
http://curl.haxx.se/libcurl/scheme/ http://curl.haxx.se/libcurl/scheme/
S-Lang S-Lang
S-Lang binding written by John E Davis S-Lang binding by John E Davis
http://www.jedsoft.org/slang/modules/curl.html http://www.jedsoft.org/slang/modules/curl.html
Smalltalk Smalltalk
Smalltalk binding written by Danil Osipchuk Smalltalk binding by Danil Osipchuk
http://www.squeaksource.com/CurlPlugin/ http://www.squeaksource.com/CurlPlugin/
SP-Forth
SP-Forth binding by ygrek
http://www.forth.org.ru/~ac/lib/lin/curl/
SPL SPL
SPL binding written by Clifford Wolf SPL binding by Clifford Wolf
http://www.clifford.at/spl/ http://www.clifford.at/spl/
Tcl Tcl
Tclcurl is written by Andr<64>s Garc<72>a Tclcurl 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
Visual Basic Visual Basic
libcurl-vb is written by Jeffrey Phillips libcurl-vb by Jeffrey Phillips
http://sourceforge.net/projects/libcurl-vb/ http://sourceforge.net/projects/libcurl-vb/
Q Q

View File

@@ -8,7 +8,7 @@ $Id$
BUGS BUGS
Curl and libcurl have grown substantially since the beginning. At the time Curl and libcurl have grown substantially since the beginning. At the time
of writing (August 2003), there are about 40000 lines of source code, and by of writing (July 2007), there are about 47000 lines of source code, and by
the time you read this it has probably grown even more. the time you read this it has probably grown even more.
Of course there are lots of bugs left. And lots of misfeatures. Of course there are lots of bugs left. And lots of misfeatures.
@@ -39,6 +39,7 @@ WHAT TO REPORT
- your operating system's name and version number (uname -a under a unix - your operating system's name and version number (uname -a under a unix
is fine) is fine)
- what version of curl you're using (curl -V is fine) - what version of curl you're using (curl -V is fine)
- versions of the used libraries that libcurl is built to use
- what URL you were working with (if possible), at least which protocol - what URL you were working with (if possible), at least which protocol
and anything and everything else you think matters. Tell us what you and anything and everything else you think matters. Tell us what you

View File

@@ -10,16 +10,46 @@
mind when you decide to contribute to the project. This concerns new features mind when you decide to contribute to the project. This concerns new features
as well as corrections to existing flaws or bugs. as well as corrections to existing flaws or bugs.
Join the Community 1. Learning cURL
1.1 Join the Community
1.2 License
1.3 What To Read
2. cURL Coding Standards
2.1 Naming
2.2 Indenting
2.3 Commenting
2.4 Line Lengths
2.5 General Style
2.6 Non-clobbering All Over
2.7 Platform Dependent Code
2.8 Write Separate Patches
2.9 Patch Against Recent Sources
2.10 Document
2.11 Test Cases
3. Pushing Out Your Changes
3.1 Write Access to CVS Repository
3.2 How To Make a Patch
3.3 How to get your changes into the main sources
==============================================================================
1. Learning cURL
1.1 Join the Community
Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing
list(s). Read up on details before you post questions. Read this file before list(s). Read up on details before you post questions. Read this file before
you start sending patches! We prefer patches and discussions being held on you start sending patches! We prefer patches and discussions being held on
the mailing list(s), not sent to individuals. the mailing list(s), not sent to individuals.
Before posting to one of the curl mailing lists, please read up on the mailing
list etiquette: http://curl.haxx.se/mail/etiquette.html
We also hang out on IRC in #curl on irc.freenode.net We also hang out on IRC in #curl on irc.freenode.net
License 1.2. License
When contributing with code, you agree to put your changes and new code under When contributing with code, you agree to put your changes and new code under
the same license curl and libcurl is already using unless stated and agreed the same license curl and libcurl is already using unless stated and agreed
@@ -43,14 +73,16 @@ License
give credit but also to keep a trace back to who made what changes. Please give credit but also to keep a trace back to who made what changes. Please
always provide us with your full real name when contributing! always provide us with your full real name when contributing!
What To Read 1.3 What To Read
Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the Source code, the man pages, the INTERNALS document, TODO, KNOWN_BUGS, the
most recent CHANGES. Just lurking on the libcurl mailing list is gonna give most recent CHANGES. Just lurking on the libcurl mailing list is gonna give
you a lot of insights on what's going on right now. Asking there is a good you a lot of insights on what's going on right now. Asking there is a good
idea too. idea too.
Naming 2. cURL Coding Standards
2.1 Naming
Try using a non-confusing naming scheme for your new functions and variable Try using a non-confusing naming scheme for your new functions and variable
names. It doesn't necessarily have to mean that you should use the same as in names. It doesn't necessarily have to mean that you should use the same as in
@@ -61,7 +93,7 @@ Naming
See the INTERNALS document on how we name non-exported library-global See the INTERNALS document on how we name non-exported library-global
symbols. symbols.
Indenting 2.2 Indenting
Please try using the same indenting levels and bracing method as all the Please try using the same indenting levels and bracing method as all the
other code already does. It makes the source code a lot easier to follow if other code already does. It makes the source code a lot easier to follow if
@@ -70,7 +102,7 @@ Indenting
using spaces only (no tabs) and having the opening brace ({) on the same line using spaces only (no tabs) and having the opening brace ({) on the same line
as the if() or while(). as the if() or while().
Commenting 2.3 Commenting
Comment your source code extensively using C comments (/* comment */), DO NOT Comment your source code extensively using C comments (/* comment */), DO NOT
use C++ comments (// this style). Commented code is quality code and enables use C++ comments (// this style). Commented code is quality code and enables
@@ -78,12 +110,16 @@ Commenting
replaced when someone wants to extend things, since other persons' source replaced when someone wants to extend things, since other persons' source
code can get quite hard to read. code can get quite hard to read.
General Style 2.4 Line Lengths
We try to keep source lines shorter than 80 columns.
2.5 General Style
Keep your functions small. If they're small you avoid a lot of mistakes and Keep your functions small. If they're small you avoid a lot of mistakes and
you don't accidentally mix up variables etc. you don't accidentally mix up variables etc.
Non-clobbering All Over 2.6 Non-clobbering All Over
When you write new functionality or fix bugs, it is important that you don't When you write new functionality or fix bugs, it is important that you don't
fiddle all over the source files and functions. Remember that it is likely fiddle all over the source files and functions. Remember that it is likely
@@ -92,14 +128,14 @@ Non-clobbering All Over
functionality, try writing it in a new source file. If you fix bugs, try to functionality, try writing it in a new source file. If you fix bugs, try to
fix one bug at a time and send them as separate patches. fix one bug at a time and send them as separate patches.
Platform Dependent Code 2.7 Platform Dependent Code
Use #ifdef HAVE_FEATURE to do conditional code. We avoid checking for Use #ifdef HAVE_FEATURE to do conditional code. We avoid checking for
particular operating systems or hardware in the #ifdef lines. The particular operating systems or hardware in the #ifdef lines. The
HAVE_FEATURE shall be generated by the configure script for unix-like systems HAVE_FEATURE shall be generated by the configure script for unix-like systems
and they are hard-coded in the config-[system].h files for the others. and they are hard-coded in the config-[system].h files for the others.
Separate Patches 2.8 Write Separate Patches
It is annoying when you get a huge patch from someone that is said to fix 511 It is annoying when you get a huge patch from someone that is said to fix 511
odd problems, but discussions and opinions don't agree with 510 of them - or odd problems, but discussions and opinions don't agree with 510 of them - or
@@ -110,14 +146,14 @@ Separate Patches
description exactly what they correct so that all patches can be selectively description exactly what they correct so that all patches can be selectively
applied by the maintainer or other interested parties. applied by the maintainer or other interested parties.
Patch Against Recent Sources 2.9 Patch Against Recent Sources
Please try to get the latest available sources to make your patches Please try to get the latest available sources to make your patches
against. It makes the life of the developers so much easier. The very best is against. It makes the life of the developers so much easier. The very best is
if you get the most up-to-date sources from the CVS repository, but the if you get the most up-to-date sources from the CVS repository, but the
latest release archive is quite OK as well! latest release archive is quite OK as well!
Document 2.10 Document
Writing docs is dead boring and one of the big problems with many open source Writing docs is dead boring and one of the big problems with many open source
projects. Someone's gotta do it. It makes it a lot easier if you submit a projects. Someone's gotta do it. It makes it a lot easier if you submit a
@@ -128,16 +164,7 @@ Document
ASCII files. All HTML files on the web site and in the release archives are ASCII files. All HTML files on the web site and in the release archives are
generated from the nroff/ASCII versions. generated from the nroff/ASCII versions.
Write Access to CVS Repository 2.11 Test Cases
If you are a frequent contributor, or have another good reason, you can of
course get write access to the CVS repository and then you'll be able to
check-in all your changes straight into the CVS tree instead of sending all
changes by mail as patches. Just ask if this is what you'd want. You will be
required to have posted a few quality patches first, before you can be
granted write access.
Test Cases
Since the introduction of the test suite, we can quickly verify that the main Since the introduction of the test suite, we can quickly verify that the main
features are working as they're supposed to. To maintain this situation and features are working as they're supposed to. To maintain this situation and
@@ -146,7 +173,18 @@ Test Cases
test case that verifies that it works as documented. If every submitter also test case that verifies that it works as documented. If every submitter also
posts a few test cases, it won't end up as a heavy burden on a single person! posts a few test cases, it won't end up as a heavy burden on a single person!
How To Make a Patch 3. Pushing Out Your Changes
3.1 Write Access to CVS Repository
If you are a frequent contributor, or have another good reason, you can of
course get write access to the CVS repository and then you'll be able to
check-in all your changes straight into the CVS tree instead of sending all
changes by mail as patches. Just ask if this is what you'd want. You will be
required to have posted a few quality patches first, before you can be
granted write access.
3.2 How To Make a Patch
Keep a copy of the unmodified curl sources. Make your changes in a separate Keep a copy of the unmodified curl sources. Make your changes in a separate
source tree. When you think you have something that you want to offer the source tree. When you think you have something that you want to offer the
@@ -166,7 +204,7 @@ How To Make a Patch
For unix-like operating systems: For unix-like operating systems:
http://www.fsf.org/software/patch/patch.html http://www.gnu.org/software/patch/patch.html
http://www.gnu.org/directory/diffutils.html http://www.gnu.org/directory/diffutils.html
For Windows: For Windows:
@@ -174,7 +212,7 @@ How To Make a Patch
http://gnuwin32.sourceforge.net/packages/patch.htm http://gnuwin32.sourceforge.net/packages/patch.htm
http://gnuwin32.sourceforge.net/packages/diffutils.htm http://gnuwin32.sourceforge.net/packages/diffutils.htm
How to get your patches into the libcurl sources 3.3 How to get your changes into the main sources
1. Submit your patch to the curl-library mailing list 1. Submit your patch to the curl-library mailing list
@@ -189,5 +227,5 @@ How to get your patches into the libcurl sources
simply drop such patches from my TODO list. simply drop such patches from my TODO list.
5. If you've followed the above mentioned paragraphs and your patch still 5. If you've followed the above mentioned paragraphs and your patch still
hasn't been incorporated after some weeks, consider resubmitting them to hasn't been incorporated after some weeks, consider resubmitting it to the
the list. list.

View File

@@ -1,4 +1,4 @@
Updated: February 11, 2007 (http://curl.haxx.se/docs/faq.html) Updated: July 30, 2007 (http://curl.haxx.se/docs/faq.html)
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@@ -68,6 +68,7 @@ FAQ
4.12 Why do I get "certificate verify failed" ? 4.12 Why do I get "certificate verify failed" ?
4.13 Why is curl -R on Windows one hour off? 4.13 Why is curl -R on Windows one hour off?
4.14 Redirects work in browser but not with curl! 4.14 Redirects work in browser but not with curl!
4.15 FTPS doesn't work
5. libcurl Issues 5. libcurl Issues
5.1 Is libcurl thread-safe? 5.1 Is libcurl thread-safe?
@@ -289,13 +290,13 @@ FAQ
Some facts to use as input to the math: Some facts to use as input to the math:
curl packages are downloaded from the curl.haxx.se and mirrors almost one curl packages are downloaded from the curl.haxx.se and mirrors over a
million times per year. curl is installed by default with most Linux million times per year. curl is installed by default with most Linux
distributions. curl is installed by default with Mac OS X. curl and libcurl distributions. curl is installed by default with Mac OS X. curl and libcurl
as used by numerous applications that include libcurl binaries in their as used by numerous applications that include libcurl binaries in their
distribution packages (like Adobe Acrobat Reader and Google Earth). distribution packages (like Adobe Acrobat Reader and Google Earth).
More than 60 known named companies use curl in commercial environments and More than 70 known named companies use curl in commercial environments and
products. More than 100 known named open source projects depend on products. More than 100 known named open source projects depend on
(lib)curl. (lib)curl.
@@ -374,7 +375,7 @@ FAQ
2.4 Does curl support Socks (RFC 1928) ? 2.4 Does curl support Socks (RFC 1928) ?
Yes, SOCKS5 is supported. Yes, SOCKS 4 and 5 are supported.
3. Usage problems 3. Usage problems
@@ -446,6 +447,10 @@ FAQ
curl -O ftp://download.com/coolfile -Q '-DELE coolfile' curl -O ftp://download.com/coolfile -Q '-DELE coolfile'
or rename a file after upload:
curl -T infile ftp://upload.com/dir/ -Q "-RNFR infile" -Q "-RNTO newname"
3.8 How do I tell curl to follow HTTP redirects? 3.8 How do I tell curl to follow HTTP redirects?
Curl does not follow so-called redirects by default. The Location: header Curl does not follow so-called redirects by default. The Location: header
@@ -824,6 +829,20 @@ FAQ
manually figure out what the page is set to do, or you write a script that manually figure out what the page is set to do, or you write a script that
parses the results and fetches the new URL. parses the results and fetches the new URL.
4.15 FTPS doesn't work
curl supports FTPS (sometimes known as FTP-SSL) both implicit and explicit
mode.
When a URL is used that starts with FTPS://, curl assumes implicit SSL on
the control connection and will therefore immediately connect and try to
speak SSL. FTPS:// connections default to port 990.
To use explicit FTPS, you use a FTP:// URL and the --ftp-ssl option (or one
of its related flavours). This is the most common method, and the one
mandated by RFC4217. This kind of connection then of course uses the
standard FTP port 21 by default.
5. libcurl Issues 5. libcurl Issues
@@ -1099,14 +1118,14 @@ FAQ
In the cURL project we call this module PHP/CURL to differentiate it from In the cURL project we call this module PHP/CURL to differentiate it from
curl the command line tool and libcurl the library. The PHP team however curl the command line tool and libcurl the library. The PHP team however
does not refer to it like this (for unknown reasons). They call it plain does not refer to it like this (for unknown reasons). They call it plain
CURL (often using all caps) which causes much confusion to users which in CURL (often using all caps) or sometimes ext/curl, but both cause much
turn gives us a higher question load. confusion to users which in turn gives us a higher question load.
7.2 Who write PHP/CURL? 7.2 Who write PHP/CURL?
PHP/CURL is a module that comes with the regular PHP package. It depends and PHP/CURL is a module that comes with the regular PHP package. It depends and
uses libcurl, so you need to have libcurl installed properly first before uses libcurl, so you need to have libcurl installed properly first before
PHP/CURL can be used. PHP/CURL is written by Sterling Hughes. PHP/CURL can be used. PHP/CURL was initially written by Sterling Hughes.
7.3 Can I perform multiple requests using the same handle? 7.3 Can I perform multiple requests using the same handle?

View File

@@ -73,7 +73,7 @@ HTTPS (*1)
FTP FTP
- download - download
- authentication - authentication
- kerberos4 (*5) - kerberos4 (*5), kerberos5 (*3)
- active/passive using PORT, EPRT, PASV or EPSV - active/passive using PORT, EPRT, PASV or EPSV
- single file size information (compare to HTTP HEAD) - single file size information (compare to HTTP HEAD)
- 'type=' URL support - 'type=' URL support

View File

@@ -85,15 +85,6 @@ UNIX
LDFLAGS=-R/usr/local/ssl/lib ./configure --with-ssl 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
(as suggested by Doug Kaufman)
MORE OPTIONS MORE OPTIONS
To force configure to use the standard cc compiler if both cc and gcc are To force configure to use the standard cc compiler if both cc and gcc are
@@ -143,6 +134,12 @@ UNIX
To build with NSS support instead of OpenSSL for SSL/TLS, note that To build with NSS support instead of OpenSSL for SSL/TLS, note that
you need to use both --without-ssl and --with-nss. you need to use both --without-ssl and --with-nss.
To get GSSAPI support, build with --with-gssapi and have the MIT or
Heimdal Kerberos 5 packages installed.
To get support for SCP and SFTP, build with --with-libssh2 and have
libssh2 0.16 or later installed.
Win32 Win32
===== =====
@@ -173,9 +170,17 @@ Win32
MingW32 MingW32
------- -------
Run the 'mingw32.bat' file to get the proper environment variables set, Make sure that MinGW32's bin dir is in the search path, for example:
then run 'make mingw32' in the root dir. Use 'make mingw32-ssl' to build
curl SSL enabled. set PATH=c:\mingw32\bin;%PATH%
then run 'mingw32-make mingw32' in the root dir. There are other
make targets available to build libcurl with more features, use:
'mingw32-make mingw32-zlib' to build with Zlib support;
'mingw32-make mingw32-ssl-zlib' to build with SSL and Zlib enabled;
'mingw32-make mingw32-ssh2-ssl-zlib' to build with SSH2, SSL, Zlib;
'mingw32-make mingw32-ssh2-ssl-sspi-zlib' to build with SSH2, SSL, Zlib
and SSPI support.
If you have any problems linking libraries or finding header files, be sure If you have any problems linking libraries or finding header files, be sure
to verify that the provided "Makefile.m32" files use the proper paths, and to verify that the provided "Makefile.m32" files use the proper paths, and
@@ -183,19 +188,38 @@ Win32
environment variables, for example: environment variables, for example:
set ZLIB_PATH=c:\zlib-1.2.3 set ZLIB_PATH=c:\zlib-1.2.3
set OPENSSL_PATH=c:\openssl-0.9.8d set OPENSSL_PATH=c:\openssl-0.9.8e
set LIBSSH2_PATH=c:\libssh2-0.15 set LIBSSH2_PATH=c:\libssh2-0.17
ATTENTION: if you want to build with libssh2 support you have to use latest ATTENTION: if you want to build with libssh2 support you have to use latest
sources fetched from CVS - the current 0.14 release will NOT work! version 0.17 - previous versions will NOT work with 7.17.0 and later!
Use 'make mingw32-ssh2-ssl' to build curl with SSH2 and SSL enabled. Use 'mingw32-make mingw32-ssh2-ssl-zlib' to build with SSH2 and SSL enabled.
It is now also possible to build with other LDAP SDKs than MS LDAP;
currently it is possible to build with native Win32 OpenLDAP, or with the
Novell CLDAP SDK. If you want to use these you need to set these vars:
set LDAP_SDK=c:\openldap
set USE_LDAP_OPENLDAP=1
or for using the Novell SDK:
set USE_LDAP_NOVELL=1
If you want to enable LDAPS support then set LDAPS=1.
- optional MingW32-built OpenlDAP SDK available from:
http://www.gknw.net/mirror/openldap/
- optional recent Novell CLDAP SDK available from:
http://developer.novell.com/ndk/cldap.htm
Cygwin Cygwin
------ ------
Almost identical to the unix installation. Run the configure script in the Almost identical to the unix installation. Run the configure script in the
curl root with 'sh configure'. Make sure you have the sh executable in curl root with 'sh configure'. Make sure you have the sh executable in
/bin/ or you'll see the configure fail towards the end. /bin/ or you'll see the configure fail toward the end.
Run 'make' Run 'make'
@@ -233,7 +257,7 @@ Win32
Before running nmake define the OPENSSL_PATH environment variable with Before running nmake define the OPENSSL_PATH environment variable with
the root/base directory of OpenSSL, for example: the root/base directory of OpenSSL, for example:
set OPENSSL_PATH=c:\openssl-0.9.8d set OPENSSL_PATH=c:\openssl-0.9.8e
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
directory. 'nmake vc-ssl' will create a libcurl static and dynamic directory. 'nmake vc-ssl' will create a libcurl static and dynamic
@@ -307,6 +331,7 @@ Win32
CURL_DISABLE_TELNET disables TELNET CURL_DISABLE_TELNET disables TELNET
CURL_DISABLE_DICT disables DICT CURL_DISABLE_DICT disables DICT
CURL_DISABLE_FILE disables FILE CURL_DISABLE_FILE disables FILE
CURL_DISABLE_TFTP disables TFTP
If you want to set any of these defines you have the following If you want to set any of these defines you have the following
possibilities: possibilities:
@@ -399,7 +424,7 @@ VMS
Facility - basically 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 Error code - the err codes assigned by the application
Sev. - severity: Even = error, off = non error Sev. - severity: Even = error, off = non error
0 = Warning 0 = Warning
1 = Success 1 = Success
@@ -409,7 +434,7 @@ VMS
<5-7> reserved. <5-7> reserved.
This all presents itself with: This all presents itself with:
%<FACILITY>-<SeV>-<Errorname>, <Error message> %<FACILITY>-<Sev>-<Errorname>, <Error message>
See also the src/curlmsg.msg file, it has the source for the messages In See also the src/curlmsg.msg file, it has the source for the messages In
src/main.c a section is devoted to message status values, the globalvalues src/main.c a section is devoted to message status values, the globalvalues
@@ -484,18 +509,33 @@ NetWare
http://www.gknw.net/development/prgtools/ http://www.gknw.net/development/prgtools/
- recent Novell LibC SDK available 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); - or recent Novell CLib SDK available from:
http://developer.novell.com/ndk/clib.htm
- optional recent Novell CLDAP SDK available from:
http://developer.novell.com/ndk/cldap.htm
- optional zlib sources (static or dynamic linking with zlib.imp);
sources with NetWare Makefile can be obtained from: sources with NetWare Makefile can be obtained from:
http://www.gknw.net/mirror/zlib/ http://www.gknw.net/mirror/zlib/
- optional OpenSSL sources (version 0.9.8 or later which builds with BSD); - optional OpenSSL sources (version 0.9.8 or later build with BSD sockets);
you can find precompiled packages at:
http://www.gknw.net/development/ossl/netware/
for CLIB-based builds OpenSSL needs to be patched to build with BSD
sockets (currently only a winsock-based CLIB build is supported):
http://www.gknw.net/development/ossl/netware/patches/v_0.9.8e/openssl-0.9.8e.diff
- optional SSH2 sources (version 0.17 or later);
Set a search path to your compiler, linker and tools; on Linux make Set a search path to your compiler, linker and tools; on Linux make
sure that the var OSTYPE contains the string 'linux'; and then type sure that the var OSTYPE contains the string 'linux'; set the var
'make netware' from the top source directory; other tagets available NDKBASE to point to the base of your Novell NDK; and then type
'make netware' from the top source directory; other targets available
are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares'; are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares';
if you need other combinations you can control the build with the if you need other combinations you can control the build with the
environment variables WITH_SSL, WITH_ZLIB, WITH_ARES and ENABLE_IPV6. environment variables WITH_SSL, WITH_ZLIB, WITH_ARES, WITH_SSH2, and
I found on some Linux systems (RH9) that OS detection didnt work although ENABLE_IPV6; you can set LINK_STATIC=1 to link curl.nlm statically.
By default LDAP support is enabled, however currently you will need a patch
in order to use the CLDAP NDK with BSD sockets (Novell Bug 300237):
http://www.gknw.net/test/curl/cldap_ndk/ldap_ndk.diff
I found on some Linux systems (RH9) that OS detection didn't 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...
Any help in testing appreciated! Any help in testing appreciated!
@@ -578,29 +618,40 @@ eCos
Minix Minix
===== =====
curl can be compiled on Minix 3 using gcc or ACK (starting with curl can be compiled on Minix 3 using gcc or ACK (starting with
ver. 3.1.3). The gcc and bash packages must be installed first. ver. 3.1.3). The default heap size allocated to several required
The default heap size allocated to bash is inadequate for running programs is inadequate for configuring and compiling curl and will
configure and will result in out of memory errors. Increase it with result in strange errors unless fixed (which only needs to be done
the command: once).
chmem =2048000 /usr/local/bin/bash ACK
---
Make sure gcc and bash are in the PATH with the command: Increase heap sizes with the commands:
export PATH=/usr/gnu/bin:$PATH
then configure curl with a command like this:
./configure CC=gcc GREP=grep AR=/usr/gnu/bin/gar --disable-ldap
Then simply run 'make'.
To compile with the ACK C compiler:
chmem =1024000 /usr/lib/em_cemcom.ansi chmem =1024000 /usr/lib/em_cemcom.ansi
chmem =512000 /usr/lib/i386/as chmem =512000 /usr/lib/i386/as
./configure CC=cc LD=cc GREP=grep CPPFLAGS=-D_POSIX_SOURCE=1 \
--disable-ldap If you have bash installed:
chmem =2048000 /usr/local/bin/bash
Configure and compile with:
./configure CC=cc LD=cc GREP=grep CPPFLAGS=-D_POSIX_SOURCE=1
make
GCC
---
If you have bash installed:
chmem =2048000 /usr/local/bin/bash
Make sure gcc is in your PATH with the command:
export PATH=/usr/gnu/bin:$PATH
then configure and compile curl with:
./configure CC=gcc GREP=grep AR=/usr/gnu/bin/gar
make make
@@ -663,6 +714,9 @@ REDUCING SIZE
./configure CFLAGS='-Os' ... ./configure CFLAGS='-Os' ...
Note that newer compilers often produce smaller code than older versions
due to better optimization.
Be sure to specify as many --disable- and --without- flags on the 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 command-line as you can to disable all the libcurl features that you
know your application is not going to need. Besides specifying the know your application is not going to need. Besides specifying the
@@ -689,9 +743,9 @@ REDUCING SIZE
sections of the shared library using the -R option to objcopy (e.g. the sections of the shared library using the -R option to objcopy (e.g. the
.comment section). .comment section).
Using these techniques it is possible to create an HTTP-only shared Using these techniques it is possible to create an HTTP-only shared libcurl
libcurl library for i386 Linux platforms that is less than 90 KB in library for i386 Linux platforms that is only 96 KiB in size (as of libcurl
size (as of version 7.15.4). version 7.17.1, using gcc 4.2.2).
You may find that statically linking libcurl to your application will You may find that statically linking libcurl to your application will
result in a lower total size. result in a lower total size.
@@ -716,6 +770,7 @@ PORTS
- HP3000 MPE/iX - HP3000 MPE/iX
- MIPS IRIX 6.2, 6.5 - MIPS IRIX 6.2, 6.5
- MIPS Linux - MIPS Linux
- OS/400
- Pocket PC/Win CE 3.0 - Pocket PC/Win CE 3.0
- Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2
- PowerPC Darwin 1.0 - PowerPC Darwin 1.0
@@ -730,6 +785,7 @@ PORTS
- StrongARM (and other ARM) RISC OS 3.1, 4.02 - StrongARM (and other ARM) RISC OS 3.1, 4.02
- StrongARM/ARM7/ARM9 Linux 2.4, 2.6 - StrongARM/ARM7/ARM9 Linux 2.4, 2.6
- StrongARM NetBSD 1.4.1 - StrongARM NetBSD 1.4.1
- TPF
- Ultrix 4.3a - Ultrix 4.3a
- UNICOS 9.0 - UNICOS 9.0
- i386 BeOS - i386 BeOS

View File

@@ -1,4 +1,3 @@
Updated for curl 7.9.1 on November 2, 2001
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@@ -37,8 +36,8 @@ Windows vs Unix
2. Windows requires a couple of init calls for the socket stuff. 2. Windows requires a couple of init calls for the socket stuff.
Those must be made by the application that uses libcurl, in curl that means That's taken care of by the curl_global_init() call, but if other libs also
src/main.c has some code #ifdef'ed to do just that. do it etc there might be reasons for applications to alter that behaviour.
3. The file descriptors for network communication and file operations are 3. The file descriptors for network communication and file operations are
not easily interchangable as in unix. not easily interchangable as in unix.

View File

@@ -3,8 +3,17 @@ 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!
44. --ftp-method nocwd does not handle URLs ending with a slash properly (it 48. If a CONNECT response-headers are larger than BUFSIZE (16KB) when the
should list the contents of that directory). See test case 351. connection is meant to be kept alive (like for NTLM proxy auth), the
function will return prematurely and will confuse the rest of the HTTP
protocol code. This should be very rare.
45. libcurl built to support ipv6 uses getaddrinfo() to resolve host names.
getaddrinfo() sorts the response list which effectively kills how libcurl
deals with round-robin DNS entries. All details:
http://curl.haxx.se/mail/lib-2007-07/0168.html
initial suggested function to use for randomizing the response:
http://curl.haxx.se/mail/lib-2007-07/0178.html
43. There seems to be a problem when connecting to the Microsoft telnet server. 43. There seems to be a problem when connecting to the Microsoft telnet server.
http://curl.haxx.se/bug/view.cgi?id=1720605 http://curl.haxx.se/bug/view.cgi?id=1720605
@@ -56,7 +65,7 @@ may have been fixed since this was written!
IPv6 numerical addresses in URLs. IPv6 numerical addresses in URLs.
29. IPv6 URLs with zone ID is not supported. 29. IPv6 URLs with zone ID is not supported.
http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt http://www.ietf.org/internet-drafts/draft-fenner-literal-zone-02.txt (expired)
specifies the use of a plus sign instead of a percent when specifying zone specifies the use of a plus sign instead of a percent when specifying zone
IDs in URLs to get around the problem of percent signs being IDs in URLs to get around the problem of percent signs being
special. According to the reporter, Firefox deals with the URL _with_ a special. According to the reporter, Firefox deals with the URL _with_ a
@@ -71,7 +80,6 @@ may have been fixed since this was written!
23. SOCKS-related problems: 23. SOCKS-related problems:
A) libcurl doesn't support SOCKS for IPv6. A) libcurl doesn't support SOCKS for IPv6.
B) libcurl doesn't support FTPS over a SOCKS proxy. B) libcurl doesn't support FTPS over a SOCKS proxy.
C) We don't have any test cases for SOCKS proxy.
E) libcurl doesn't support active FTP over a SOCKS proxy E) libcurl doesn't support active FTP over a SOCKS proxy
We probably have even more bugs and lack of features when a SOCKS proxy is We probably have even more bugs and lack of features when a SOCKS proxy is

View File

@@ -809,18 +809,19 @@ CUSTOM OUTPUT
curl -w 'We downloaded %{size_download} bytes\n' www.download.com curl -w 'We downloaded %{size_download} bytes\n' www.download.com
KERBEROS4 FTP TRANSFER KERBEROS FTP TRANSFER
Curl supports kerberos4 for FTP transfers. You need the kerberos package Curl supports kerberos4 and kerberos5/GSSAPI for FTP transfers. You need
installed and used at curl build time for it to be used. the kerberos package installed and used at curl build time for it to be
used.
First, get the krb-ticket the normal way, like with the kauth tool. Then use First, get the krb-ticket the normal way, like with the kinit/kauth tool.
curl in way similar to: Then use curl in way similar to:
curl --krb4 private ftp://krb4site.com -u username:fakepwd curl --krb private ftp://krb4site.com -u username:fakepwd
There's no use for a password on the -u switch, but a blank one will make There's no use for a password on the -u switch, but a blank one will make
curl ask for one and you already entered the real password to kauth. curl ask for one and you already entered the real password to kinit/kauth.
TELNET TELNET

View File

@@ -20,3 +20,7 @@ README.win32
command line similar to this in order to extract a separate text file: command line similar to this in order to extract a separate text file:
curl -M >manual.txt curl -M >manual.txt
Read the INSTALL file for instructions how to compile curl self.

View File

@@ -5,6 +5,7 @@
If you have contributed but are missing here, please let us know! If you have contributed but are missing here, please let us know!
Adam D. Moss Adam D. Moss
Adam Piggott
Adrian Schuur Adrian Schuur
Alan Pinstein Alan Pinstein
Albert Chin-A-Young Albert Chin-A-Young
@@ -20,8 +21,11 @@ Alexander Lazic
Alexander Zhuravlev Alexander Zhuravlev
Alexey Simak Alexey Simak
Alexis Carvalho Alexis Carvalho
Allen Pulsifer
Amol Pattekar Amol Pattekar
Anders Gustafsson
Andi Jahja Andi Jahja
Andre Guibert de Bruet
Andreas Damm Andreas Damm
Andreas Ntaflos Andreas Ntaflos
Andreas Olsson Andreas Olsson
@@ -32,6 +36,7 @@ Andrew Biggs
Andrew Bushnell Andrew Bushnell
Andrew Francis Andrew Francis
Andrew Fuller Andrew Fuller
Andrew Wansink
Andr<EFBFBD>s Garc<72>a Andr<EFBFBD>s Garc<72>a
Andy Cedilnik Andy Cedilnik
Andy Serpa Andy Serpa
@@ -68,10 +73,12 @@ Casey O'Donnell
Chih-Chung Chang Chih-Chung Chang
Chris "Bob Bob" Chris "Bob Bob"
Chris Combes Chris Combes
Chris Flerackers
Chris Gaukroger Chris Gaukroger
Chris Maltby Chris Maltby
Christian Kurz Christian Kurz
Christian Robottom Reis Christian Robottom Reis
Christian Vogt
Christophe Demory Christophe Demory
Christophe Legry Christophe Legry
Christopher R. Palmer Christopher R. Palmer
@@ -79,6 +86,7 @@ Ciprian Badescu
Clarence Gardner Clarence Gardner
Clifford Wolf Clifford Wolf
Cody Jones Cody Jones
Colin Hogben
Colin Watson Colin Watson
Colm Buckley Colm Buckley
Cory Nelson Cory Nelson
@@ -93,6 +101,8 @@ Dan Fandrich
Dan Nelson Dan Nelson
Dan Torop Dan Torop
Dan Zitter Dan Zitter
Daniel Black
Daniel Cater
Daniel Johnson Daniel Johnson
Daniel Stenberg Daniel Stenberg
Daniel at touchtunes Daniel at touchtunes
@@ -101,6 +111,7 @@ Dave Dribin
Dave Halbakken Dave Halbakken
Dave Hamilton Dave Hamilton
Dave May Dave May
Dave Vasilevsky
David Byron David Byron
David Cohen David Cohen
David Eriksson David Eriksson
@@ -163,20 +174,25 @@ Eygene Ryabinkin
Fabrizio Ammollo Fabrizio Ammollo
Fedor Karpelevitch Fedor Karpelevitch
Felix von Leitner Felix von Leitner
Feng Tu
Florian Schoppmann Florian Schoppmann
Forrest Cahoon Forrest Cahoon
Frank Hempel
Frank Keeney Frank Keeney
Frank Ticheler Frank Ticheler
Fred New Fred New
Fred Noz Fred Noz
Frederic Lepied Frederic Lepied
Gautam Mani Gautam Mani
Gavrie Philipson
Gaz Iqbal Gaz Iqbal
Georg Horn Georg Horn
Georg Huettenegger Georg Huettenegger
Georg Wicherski Georg Wicherski
Gerd v. Egidy Gerd v. Egidy
Gerhard Herre Gerhard Herre
Gerrit Bruchh<68>user
Giancarlo Formicuccia
Giaslas Georgios Giaslas Georgios
Gilad Gilad
Gilbert Ramirez Jr. Gilbert Ramirez Jr.
@@ -186,7 +202,9 @@ Giuseppe D'Ambrosio
Glen Nakamura Glen Nakamura
Glen Scott Glen Scott
Greg Hewgill Greg Hewgill
Greg Morse
Greg Onufer Greg Onufer
Greg Zavertnik
Grigory Entin Grigory Entin
Guenole Bescon Guenole Bescon
Guillaume Arluison Guillaume Arluison
@@ -230,6 +248,8 @@ Jan Kunder
Jared Lundell Jared Lundell
Jari Sundell Jari Sundell
Jason S. Priebe Jason S. Priebe
Jay Austin
Jayesh A Shah
Jaz Fresh Jaz Fresh
Jean Jacques Drouin Jean Jacques Drouin
Jean-Claude Chauve Jean-Claude Chauve
@@ -246,6 +266,7 @@ Jesse Noller
Jim Drash Jim Drash
Joe Halpin Joe Halpin
Joel Chen Joel Chen
Jofell Gallardo
Johan Anderson Johan Anderson
Johan Nilsson Johan Nilsson
John Crow John Crow
@@ -278,6 +299,7 @@ Kang-Jin Lee
Karl Moerder Karl Moerder
Karol Pietrzak Karol Pietrzak
Katie Wang Katie Wang
Kees Cook
Keith MacDonald Keith MacDonald
Keith McGuigan Keith McGuigan
Ken Hirsch Ken Hirsch
@@ -292,6 +314,7 @@ Kjetil Jacobsen
Klevtsov Vadim Klevtsov Vadim
Kris Kennaway Kris Kennaway
Krishnendu Majumdar Krishnendu Majumdar
Kristian Gunstone
Kristian K<>hntopp Kristian K<>hntopp
Kyle Sallee Kyle Sallee
Lachlan O'Dea Lachlan O'Dea
@@ -391,6 +414,7 @@ Olaf St
Oren Tirosh Oren Tirosh
P R Schaffner P R Schaffner
Patrick Bihan-Faou Patrick Bihan-Faou
Patrick Monnerat
Patrick Smith Patrick Smith
Paul Harrington Paul Harrington
Paul Marquis Paul Marquis
@@ -405,6 +429,7 @@ Pete Su
Peter Bray Peter Bray
Peter Forret Peter Forret
Peter Heuchert Peter Heuchert
Peter O'Gorman
Peter Pentchev Peter Pentchev
Peter Silva Peter Silva
Peter Su Peter Su
@@ -422,6 +447,7 @@ Pierre
Puneet Pawaia Puneet Pawaia
Quagmire Quagmire
Rafael Sagula Rafael Sagula
Ralf S. Engelschall
Ralph Beckmann Ralph Beckmann
Ralph Mitchell Ralph Mitchell
Ramana Mokkapati Ramana Mokkapati
@@ -434,6 +460,7 @@ Rene Bernhardt
Rene Rebe Rene Rebe
Ricardo Cadime Ricardo Cadime
Rich Gray Rich Gray
Rich Rauenzahn
Richard Archer Richard Archer
Richard Atterer Richard Atterer
Richard Bramante Richard Bramante
@@ -472,6 +499,7 @@ Samuel D
Samuel Listopad Samuel Listopad
Sander Gates Sander Gates
Saul good Saul good
Scott Cantor
Scott Davis Scott Davis
Sebastien Willemijns Sebastien Willemijns
Sergio Ballestrero Sergio Ballestrero
@@ -484,6 +512,8 @@ Siddhartha Prakash Jain
Simon Dick Simon Dick
Simon Josefsson Simon Josefsson
Simon Liu Simon Liu
Song Ma
Sonia Subramanian
Spiridonoff A.V Spiridonoff A.V
Stadler Stephan Stadler Stephan
Stefan Esser Stefan Esser
@@ -495,6 +525,7 @@ Stephen More
Sterling Hughes Sterling Hughes
Steve Green Steve Green
Steve Lhomme Steve Lhomme
Steve Little
Steve Marx Steve Marx
Steve Oliphant Steve Oliphant
Steven Bazyl Steven Bazyl
@@ -505,6 +536,7 @@ S
T. Bharath T. Bharath
T. Yamada T. Yamada
Temprimus Temprimus
Thomas J. Moore
Thomas Klausner Thomas Klausner
Thomas Schwinge Thomas Schwinge
Thomas Tonino Thomas Tonino
@@ -512,6 +544,7 @@ Tim Baker
Tim Bartley Tim Bartley
Tim Costello Tim Costello
Tim Sneddon Tim Sneddon
Tobias Rundstr<74>m
Toby Peterson Toby Peterson
Todd Kulesza Todd Kulesza
Todd Vierling Todd Vierling
@@ -519,6 +552,7 @@ Tom Benoist
Tom Lee Tom Lee
Tom Mattison Tom Mattison
Tom Moers Tom Moers
Tom Regner
Tom Zerucha Tom Zerucha
Tomas Pospisek Tomas Pospisek
Tomas Szepe Tomas Szepe

View File

@@ -52,6 +52,10 @@ TODO
that would risk collide with other apps that use libcurl and that runs that would risk collide with other apps that use libcurl and that runs
configure). configure).
Work on this has been started but hasn't been finished, and the initial
patch and some details are found here:
http://curl.haxx.se/mail/lib-2006-12/0084.html
LIBCURL - multi interface LIBCURL - multi interface
* 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
@@ -72,19 +76,35 @@ TODO
internally use and assume the multi interface. The select()-loop should use internally use and assume the multi interface. The select()-loop should use
curl_multi_socket(). curl_multi_socket().
* curl_multi_handle_control() - this can control the easy handle (while)
added to a multi handle in various ways:
o RESTART, unconditionally restart this easy handle's transfer from the
start, re-init the state
o RESTART_COMPLETED, restart this easy handle's transfer but only if the
existing transfer has already completed and it is in a "finished state".
o STOP, just stop this transfer and consider it completed
o PAUSE?
o RESUME?
DOCUMENTATION DOCUMENTATION
* More and better * More and better
FTP FTP
* PRET is a command that primarily "drftpd" supports, which could be useful
when using libcurl against such a server. It is a non-standard and a rather
oddly designed command, but...
http://curl.haxx.se/bug/feature.cgi?id=1729967
* When trying to connect passively to a server which only supports active
connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
connection. There could be a way to fallback to an active connection (and
vice versa). http://curl.haxx.se/bug/feature.cgi?id=1754793
* Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in * Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in
the process to avoid doing a resolve and connect in vain. the process to avoid doing a resolve and connect in vain.
* Support GSS/Kerberos 5 for ftp file transfer. This will allow user
authentication and file encryption. Possible libraries and example clients
are available from MIT or Heimdal. Requested by Markus Moeller.
* 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
(impossible?) part is to figure out if the server did the right thing or (impossible?) part is to figure out if the server did the right thing or
@@ -96,6 +116,7 @@ TODO
* Make CURLOPT_FTPPORT support an additional port number on the IP/if/name, * Make CURLOPT_FTPPORT support an additional port number on the IP/if/name,
like "blabla:[port]" or possibly even "blabla:[portfirst]-[portsecond]". like "blabla:[port]" or possibly even "blabla:[portfirst]-[portsecond]".
http://curl.haxx.se/bug/feature.cgi?id=1505166
* FTP ASCII transfers do not follow RFC959. They don't convert the data * FTP ASCII transfers do not follow RFC959. They don't convert the data
accordingly. accordingly.
@@ -115,6 +136,9 @@ TODO
never been reported as causing trouble to anyone, but should be considered never been reported as causing trouble to anyone, but should be considered
to use the HTTP version the user has chosen. to use the HTTP version the user has chosen.
* "Better" support for persistent connections over HTTP 1.0
http://curl.haxx.se/bug/feature.cgi?id=1089001
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
@@ -127,6 +151,9 @@ TODO
SSL SSL
* Provide an option that allows for disabling specific SSL versions, such as
SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276
* Provide a libcurl API for setting mutex callbacks in the underlying SSL * Provide a libcurl API for setting mutex callbacks in the underlying SSL
library, so that the same application code can use mutex-locking library, so that the same application code can use mutex-locking
independently of OpenSSL or GnutTLS being used. independently of OpenSSL or GnutTLS being used.
@@ -198,6 +225,11 @@ TODO
CLIENT CLIENT
* Add option that is similar to -O but that takes the output file name from
the Content-Disposition: header, and/or uses the local file name used in
redirections for the cases the server bounces the request further to a
different file (name): http://curl.haxx.se/bug/feature.cgi?id=1364676
* "curl --sync http://example.com/feed[1-100].rss" or * "curl --sync http://example.com/feed[1-100].rss" or
"curl --sync http://example.net/{index,calendar,history}.html" "curl --sync http://example.net/{index,calendar,history}.html"
@@ -217,10 +249,10 @@ TODO
* "curl ftp://site.com/*.txt" * "curl ftp://site.com/*.txt"
* The client could be told to use maximum N simultaneous transfers and then * The client could be told to use maximum N simultaneous parallel transfers
just make sure that happens. It should of course not make more than one and then just make sure that happens. It should of course not make more
connection to the same remote host. This would require the client to use than one connection to the same remote host. This would require the client
the multi interface. to use the multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595
* Extending the capabilities of the multipart formposting. How about leaving * Extending the capabilities of the multipart formposting. How about leaving
the ';type=foo' syntax as it is and adding an extra tag (headers) which the ';type=foo' syntax as it is and adding an extra tag (headers) which
@@ -265,9 +297,6 @@ TODO
and FTP-SSL tests without the stunnel dependency, and it could allow us to and FTP-SSL tests without the stunnel dependency, and it could allow us to
provide test tools built with either OpenSSL or GnuTLS provide test tools built with either OpenSSL or GnuTLS
* Make the test servers able to serve multiple running test suites. Like if
two users run 'make test' at once.
* 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.
@@ -277,6 +306,27 @@ TODO
* Make the test suite work on more platforms. OpenBSD and Mac OS. Remove * Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
fork()s and it should become even more portable. fork()s and it should become even more portable.
NEXT soname bump
* #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
from being output in NOBODY requests over ftp
* Combine some of the error codes to remove duplicates. The original
numbering should not be changed, and the old identifiers would be
macroed to the new ones in an CURL_NO_OLDIES section to help with
backward compatibility.
Candidates for removal and their replacements:
CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND
CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND
CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR
CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT
CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT
CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL
CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
NEXT MAJOR RELEASE NEXT MAJOR RELEASE
* curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a * curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a

View File

@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___ .\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____| .\" * \___|\___/|_| \_\_____|
.\" * .\" *
.\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al. .\" * Copyright (C) 1998 - 2007, 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-config 1 "25 Jan 2004" "Curl 7.15.4" "curl-config manual" .TH curl-config 1 "25 Oct 2007" "Curl 7.17.1" "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
@@ -62,6 +62,9 @@ the time of writing, this list may include HTTP, HTTPS, FTP, FTPS, FILE,
TELNET, LDAP, DICT. Do not assume any particular order. The protocols will 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, 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) one or several protocols in the list. (Added in 7.13.0)
.IP "--static-libs"
Shows the complete set of libs and other linker options you will need in order
to link your application with libcurl statically. (Added in 7.17.1)
.IP "--version" .IP "--version"
Outputs version information about the installed libcurl. Outputs version information about the installed libcurl.
.IP "--vernum" .IP "--vernum"

View File

@@ -21,7 +21,7 @@
.\" * $Id$ .\" * $Id$
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH curl 1 "28 Feb 2007" "Curl 7.16.2" "Curl Manual" .TH curl 1 "21 Sep 2007" "Curl 7.17.1" "Curl Manual"
.SH NAME .SH NAME
curl \- transfer a URL curl \- transfer a URL
.SH SYNOPSIS .SH SYNOPSIS
@@ -35,7 +35,7 @@ FILE). The command is designed to work without user interaction.
curl offers a busload of useful tricks like proxy support, user curl offers a busload of useful tricks like proxy support, user
authentication, ftp upload, HTTP post, SSL connections, cookies, file transfer authentication, ftp upload, HTTP post, SSL connections, cookies, file transfer
resume and more. As you will see below, the amount of features will make your resume and more. As you will see below, the number of features will make your
head spin! head spin!
curl is powered by libcurl for all transfer-related features. See curl is powered by libcurl for all transfer-related features. See
@@ -106,8 +106,8 @@ file instead of overwriting it. If the file doesn't exist, it will be created.
If this option is used twice, the second one will disable append mode again. If this option is used twice, the second one will disable append mode again.
.IP "-A/--user-agent <agent string>" .IP "-A/--user-agent <agent string>"
(HTTP) Specify the User-Agent string to send to the HTTP server. Some badly (HTTP) Specify the User-Agent string to send to the HTTP server. Some badly
done CGIs fail if its not set to "Mozilla/4.0". To encode blanks in the done CGIs fail if this field isn't set to "Mozilla/4.0". To encode blanks in
string, surround the string with single quote marks. This can also be set the string, surround the string with single quote marks. This can also be set
with the \fI-H/--header\fP option of course. with the \fI-H/--header\fP option of course.
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
@@ -330,7 +330,9 @@ them independently.
If curl is built against the NSS SSL library then this option tells If curl is built against the NSS SSL library then this option tells
curl the nickname of the certificate to use within the NSS database defined curl the nickname of the certificate to use within the NSS database defined
by --cacert. by the environment variable SSL_DIR (or by default /etc/pki/nssdb). If the
NSS PEM PKCS#11 module (libnsspem.so) is available then PEM files may be
loaded.
If 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 "--cert-type <type>" .IP "--cert-type <type>"
@@ -352,7 +354,10 @@ The windows version of curl will automatically look for a CA certs file named
Current Working Directory, or in any folder along your PATH. Current Working Directory, or in any folder along your PATH.
If curl is built against the NSS SSL library then this option tells If curl is built against the NSS SSL library then this option tells
curl the directory that the NSS certificate database resides in. curl the nickname of the CA certificate to use within the NSS database
defined by the environment variable SSL_DIR (or by default /etc/pki/nssdb).
If the NSS PEM PKCS#11 module (libnsspem.so) is available then PEM files
may be loaded.
If 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 "--capath <CA certificate directory>" .IP "--capath <CA certificate directory>"
@@ -539,6 +544,11 @@ for you.
See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options. See also the \fI-A/--user-agent\fP and \fI-e/--referer\fP options.
This option can be used multiple times to add/replace/remove multiple headers. This option can be used multiple times to add/replace/remove multiple headers.
.IP "--hostpubmd5"
Pass a string containing 32 hexadecimal digits. The string should be the 128
bit MD5 cheksum of the remote host's public key, curl will refuse the
connection with the host unless the md5sums match. This option is only for SCP
and SFTP transfers. (Added in 7.17.1)
.IP "--ignore-content-length" .IP "--ignore-content-length"
(HTTP) (HTTP)
Ignore the Content-Length header. This is particularly useful for servers Ignore the Content-Length header. This is particularly useful for servers
@@ -593,13 +603,14 @@ private key is. DER, PEM and ENG are supported. If not specified, PEM is
assumed. assumed.
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 "--krb4 <level>" .IP "--krb <level>"
(FTP) Enable Kerberos4 authentication and use. The level must be entered and (FTP) Enable Kerberos authentication and use. The level must be entered and
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 requires that the library was built with Kerberos4 support. This This option requires that the library was built with kerberos4 or GSSAPI
is not very common. Use \fI-V/--version\fP to see if your curl supports it. (GSS-Negotiate) support. This is not very common. Use \fI-V/--version\fP to
see if your curl supports it.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "-K/--config <config file>" .IP "-K/--config <config file>"
@@ -658,6 +669,10 @@ Append this option to any ordinary curl command line, and you will get a
libcurl-using source code written to the file that does the equivalent libcurl-using source code written to the file that does the equivalent
operation of what your command line operation does! operation of what your command line operation does!
NOTE: this does not properly support -F and the sending of multipart
formposts, so in those cases the output program will be missing necessary
calls to \fIcurl_formadd(3)\fP, and possibly more.
If this option is used several times, the last given file name will be used. If this option is used several times, the last given file name will be used.
.IP "--limit-rate <speed>" .IP "--limit-rate <speed>"
Specify the maximum transfer rate you want curl to use. This feature is useful Specify the maximum transfer rate you want curl to use. This feature is useful
@@ -764,6 +779,9 @@ 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. draft-brezak-spnego-http-04.txt.
If you want to enable Negotiate for your proxy authentication, then use
\fI--proxy-negotiate\fP.
This option requires 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.
@@ -834,6 +852,13 @@ You may use this option as many times as you have number of URLs.
(SSL/SSH) Pass phrase for the private key (SSL/SSH) Pass phrase for the private key
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 "--post301"
Tells curl to respect RFC 2616/10.3.2 and not convert POST requests into GET
requests when following a 301 redirection. The non-RFC behaviour is ubiquitous
in web browsers, so curl does the conversion by default to maintain
consistency. However, a server may requires a POST to remain a POST after such
a redirection. This option is meaningful only when using \fI-L/--location\fP
(Added in 7.17.1)
.IP "--proxy-anyauth" .IP "--proxy-anyauth"
Tells curl to pick a suitable authentication method when communicating with Tells curl to pick a suitable authentication method when communicating with
the given proxy. This will cause an extra request/response round-trip. (Added the given proxy. This will cause an extra request/response round-trip. (Added
@@ -853,6 +878,13 @@ Tells curl to use HTTP Digest authentication when communicating with the given
proxy. Use \fI--digest\fP for enabling HTTP Digest with a remote host. proxy. Use \fI--digest\fP for enabling HTTP Digest with a remote host.
If this option is used twice, the second will again disable proxy HTTP Digest. If this option is used twice, the second will again disable proxy HTTP Digest.
.IP "--proxy-negotiate"
Tells curl to use HTTP Negotiate authentication when communicating
with the given proxy. Use \fI--negotiate\fP for enabling HTTP Negotiate
with a remote host.
If this option is used twice, the second will again disable proxy HTTP
Negotiate. (Added in 7.17.1)
.IP "--proxy-ntlm" .IP "--proxy-ntlm"
Tells curl to use HTTP NTLM authentication when communicating with the given Tells curl to use HTTP NTLM authentication when communicating with the given
proxy. Use \fI--ntlm\fP for enabling NTLM with a remote host. proxy. Use \fI--ntlm\fP for enabling NTLM with a remote host.
@@ -908,7 +940,7 @@ the server returns failure for one of the commands, the entire operation
will be aborted. You must send syntactically correct FTP commands as will be aborted. You must send syntactically correct FTP commands as
RFC959 defines to FTP servers, or one of the following commands (with RFC959 defines to FTP servers, or one of the following commands (with
appropriate arguments) to SFTP servers: chgrp, chmod, chown, ln, mkdir, appropriate arguments) to SFTP servers: chgrp, chmod, chown, ln, mkdir,
rename, rm, rmdir, symlink. pwd, rename, rm, rmdir, symlink.
This option can be used multiple times. This option can be used multiple times.
.IP "--random-file <file>" .IP "--random-file <file>"
@@ -1153,7 +1185,7 @@ Automatic decompression of compressed files over HTTP is supported.
.IP "NTLM" .IP "NTLM"
NTLM authentication is supported. NTLM authentication is supported.
.IP "GSS-Negotiate" .IP "GSS-Negotiate"
Negotiate authentication is supported. Negotiate authentication and krb5 for ftp 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!
@@ -1376,8 +1408,6 @@ Unsupported protocol. This build of curl has no support for this protocol.
Failed to initialize. Failed to initialize.
.IP 3 .IP 3
URL malformat. The syntax was not correct. URL malformat. The syntax was not correct.
.IP 4
URL user malformatted. The user-part of the URL syntax was not correct.
.IP 5 .IP 5
Couldn't resolve proxy. The given proxy host could not be resolved. Couldn't resolve proxy. The given proxy host could not be resolved.
.IP 6 .IP 6
@@ -1390,21 +1420,14 @@ FTP weird server reply. The server sent data curl couldn't parse.
FTP access denied. The server denied login or denied access to the particular FTP access denied. The server denied login or denied access to the particular
resource or directory you wanted to reach. Most often you tried to change to a resource or directory you wanted to reach. Most often you tried to change to a
directory that doesn't exist on the server. directory that doesn't exist on the server.
.IP 10
FTP user/password incorrect. Either one or both were not accepted by the
server.
.IP 11 .IP 11
FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request. FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.
.IP 12
FTP weird USER reply. Curl couldn't parse the reply sent to the USER request.
.IP 13 .IP 13
FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request. FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.
.IP 14 .IP 14
FTP weird 227 format. Curl couldn't parse the 227-line the server sent. FTP weird 227 format. Curl couldn't parse the 227-line the server sent.
.IP 15 .IP 15
FTP can't get host. Couldn't resolve the host IP we got in the 227-line. FTP can't get host. Couldn't resolve the host IP we got in the 227-line.
.IP 16
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
@@ -1412,8 +1435,6 @@ 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.
.IP 20
FTP write error. The transfer was reported bad by the server.
.IP 21 .IP 21
FTP quote error. A quote command returned error from the server. FTP quote error. A quote command returned error from the server.
.IP 22 .IP 22
@@ -1422,8 +1443,6 @@ error with the HTTP error code being 400 or above. This return code only
appears if \fI-f/--fail\fP is used. appears if \fI-f/--fail\fP is used.
.IP 23 .IP 23
Write error. Curl couldn't write data to a local filesystem or similar. Write error. Curl couldn't write data to a local filesystem or similar.
.IP 24
Malformed user. User name badly specified.
.IP 25 .IP 25
FTP couldn't STOR file. The server denied the STOR operation, used for FTP FTP couldn't STOR file. The server denied the STOR operation, used for FTP
uploading. uploading.
@@ -1434,17 +1453,12 @@ Out of memory. A memory allocation request failed.
.IP 28 .IP 28
Operation timeout. The specified time-out period was reached according to the Operation timeout. The specified time-out period was reached according to the
conditions. conditions.
.IP 29
FTP couldn't set ASCII. The server returned an unknown reply.
.IP 30 .IP 30
FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT
command, try doing a transfer using PASV instead! command, try doing a transfer using PASV instead!
.IP 31 .IP 31
FTP couldn't use REST. The REST command failed. This command is used for FTP couldn't use REST. The REST command failed. This command is used for
resumed FTP transfers. resumed FTP transfers.
.IP 32
FTP couldn't use SIZE. The SIZE command failed. The command is an extension
to the original FTP spec RFC 959.
.IP 33 .IP 33
HTTP range error. The range "command" didn't work. HTTP range error. The range "command" didn't work.
.IP 34 .IP 34
@@ -1459,20 +1473,14 @@ FILE couldn't read file. Failed to open the file. Permissions?
LDAP cannot bind. LDAP bind operation failed. LDAP cannot bind. LDAP bind operation failed.
.IP 39 .IP 39
LDAP search failed. LDAP search failed.
.IP 40
Library not found. The LDAP library was not found.
.IP 41 .IP 41
Function not found. A required LDAP function was not found. Function not found. A required LDAP function was not found.
.IP 42 .IP 42
Aborted by callback. An application told curl to abort the operation. Aborted by callback. An application told curl to abort the operation.
.IP 43 .IP 43
Internal error. A function was called with a bad parameter. Internal error. A function was called with a bad parameter.
.IP 44
Internal error. A function was called in a bad order.
.IP 45 .IP 45
Interface error. A specified outgoing interface could not be used. Interface error. A specified outgoing interface could not be used.
.IP 46
Bad password entered. An error was signalled when the password was entered.
.IP 47 .IP 47
Too many redirects. When following redirects, curl hit the maximum amount. Too many redirects. When following redirects, curl hit the maximum amount.
.IP 48 .IP 48
@@ -1480,7 +1488,7 @@ Unknown TELNET option specified.
.IP 49 .IP 49
Malformed telnet option. Malformed telnet option.
.IP 51 .IP 51
The remote peer's SSL certificate wasn't ok The peer's SSL certificate or SSH MD5 fingerprint was not ok
.IP 52 .IP 52
The server didn't reply anything, which here is considered an error. The server didn't reply anything, which here is considered an error.
.IP 53 .IP 53
@@ -1491,14 +1499,12 @@ Cannot set SSL crypto engine as default
Failed sending network data Failed sending network data
.IP 56 .IP 56
Failure in receiving network data Failure in receiving network data
.IP 57
Share is in use (internal error)
.IP 58 .IP 58
Problem with the local certificate Problem with the local certificate
.IP 59 .IP 59
Couldn't use specified SSL cipher Couldn't use specified SSL cipher
.IP 60 .IP 60
Problem with the CA cert (path? permission?) Peer certificate cannot be authenticated with known CA certificates
.IP 61 .IP 61
Unrecognized transfer encoding Unrecognized transfer encoding
.IP 62 .IP 62
@@ -1531,6 +1537,14 @@ No such user (TFTP)
Character conversion failed Character conversion failed
.IP 76 .IP 76
Character conversion functions required Character conversion functions required
.IP 77
Problem with reading the SSL CA cert (path? access rights?)
.IP 78
The resource referenced in the URL does not exist
.IP 79
An unspecified error occurred during the SSH session
.IP 80
Failed to shut down the SSL connection
.IP XX .IP XX
There will appear more error codes here in future releases. The existing ones There will appear more error codes here in future releases. The existing ones
are meant to never change. are meant to never change.

View File

@@ -1,2 +1,30 @@
Makefile Makefile
Makefile.in Makefile.in
.deps
.libs
10-at-a-time
anyauthput
cookie_interface
debug
fileupload
fopen
ftpget
ftpgetresp
ftpupload
getinfo
getinmemory
http-post
httpput
https
multi-app
multi-debugcallback
multi-double
multi-post
multi-single
persistant
post-callback
postit2
sepheaders
simple
simplepost
simplessl

View File

@@ -13,7 +13,10 @@
* Written by Michael Wallner * Written by Michael Wallner
*/ */
#include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <curl/multi.h> #include <curl/multi.h>
static const char *urls[] = { static const char *urls[] = {
@@ -106,6 +109,10 @@ int main(void)
cm = curl_multi_init(); cm = curl_multi_init();
/* we can optionally limit the total amount of connections this multi handle
uses */
curl_multi_setopt(cm, CURLMOPT_MAXCONNECTS, MAX);
for (C = 0; C < MAX; ++C) { for (C = 0; C < MAX; ++C) {
init(cm, C); init(cm, C);
} }
@@ -123,22 +130,26 @@ int main(void)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
/* In a real-world program you OF COURSE check the return that maxfd is
bigger than -1 so that the call to select() below makes sense! */
if (curl_multi_timeout(cm, &L)) { if (curl_multi_timeout(cm, &L)) {
fprintf(stderr, "E: curl_multi_timeout\n"); fprintf(stderr, "E: curl_multi_timeout\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
if (L == -1)
L = 100;
if (M == -1) {
sleep(L / 1000);
} else {
T.tv_sec = L/1000; T.tv_sec = L/1000;
T.tv_usec = (L%1000)*1000; T.tv_usec = (L%1000)*1000;
if (0 > select(M+1, &R, &W, &E, &T)) { if (0 > select(M+1, &R, &W, &E, &T)) {
fprintf(stderr, "E: select\n"); fprintf(stderr, "E: select(%i,,,,%li): %i: %s\n",
M+1, L, errno, strerror(errno));
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }
}
while ((msg = curl_multi_info_read(cm, &Q))) { while ((msg = curl_multi_info_read(cm, &Q))) {
if (msg->msg == CURLMSG_DONE) { if (msg->msg == CURLMSG_DONE) {
@@ -155,6 +166,8 @@ int main(void)
} }
if (C < CNT) { if (C < CNT) {
init(cm, C++); init(cm, C++);
U++; /* just to prevent it from remaining at 0 if there are more
URLs to get */
} }
} }
} }

View File

@@ -2,17 +2,30 @@
# $Id$ # $Id$
# #
AUTOMAKE_OPTIONS = foreign no-dependencies AUTOMAKE_OPTIONS = foreign nostdinc
EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \ EXTRA_DIST = README Makefile.example makefile.dj $(COMPLICATED_EXAMPLES)
persistant.c ftpget.c Makefile.example multithread.c getinmemory.c \
ftpupload.c httpput.c simplessl.c ftpgetresp.c http-post.c \ INCLUDES = -I$(top_srcdir)/include
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 \ LIBDIR = $(top_builddir)/lib
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \ CPPFLAGS = -DCURL_NO_OLDIES
anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c \
cookie_interface.c cacertinmem.c synctime.c sampleconv.c ftpuploadresume.c \ # Dependencies
10-at-a-time.c hiperfifo.c ghiper.c LDADD = $(LIBDIR)/libcurl.la
# These are all libcurl example programs to be test compiled
noinst_PROGRAMS = 10-at-a-time anyauthput cookie_interface \
debug fileupload fopen ftpget ftpgetresp ftpupload \
getinfo getinmemory http-post httpput \
https multi-app multi-debugcallback multi-double \
multi-post multi-single persistant post-callback \
postit2 sepheaders simple simplepost simplessl
# These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here.
COMPLICATED_EXAMPLES = \
curlgtk.c curlx.c htmltitle.cc cacertinmem.c ftpuploadresume.c \
ghiper.c hiperfifo.c htmltidy.c multithread.c \
opensslthreadlock.c sampleconv.c synctime.c
all:
@echo "done"

View File

@@ -29,9 +29,8 @@ LDFLAGS = -L/home/dast/lib -L/usr/local/ssl/lib
# We need -lcurl for the curl stuff # We need -lcurl for the curl stuff
# We need -lsocket and -lnsl when on Solaris # We need -lsocket and -lnsl when on Solaris
# We need -lssl and -lcrypto when using libcurl with SSL support # We need -lssl and -lcrypto when using libcurl with SSL support
# We need -ldl for dlopen() if that is in libdl
# We need -lpthread for the pthread example # We need -lpthread for the pthread example
LIBS = -lcurl -lsocket -lnsl -lssl -lcrypto -dl LIBS = -lcurl -lsocket -lnsl -lssl -lcrypto
# Link the target with all objects and libraries # Link the target with all objects and libraries
$(TARGET) : $(OBJS) $(TARGET) : $(OBJS)

View File

@@ -40,7 +40,6 @@ curlx.c - getting file info from the remote cert data
debug.c - showing how to use the debug callback debug.c - showing how to use the debug callback
fileupload.c - uploading to a file:// URL fileupload.c - uploading to a file:// URL
fopen.c - fopen() layer that supports opening URLs and files fopen.c - fopen() layer that supports opening URLs and files
ftp3rdparty.c - FTP 3rd party transfer
ftpget.c - simple getting a file from FTP ftpget.c - simple getting a file from FTP
ftpgetresp.c - get the response strings from the FTP server ftpgetresp.c - get the response strings from the FTP server
ftpupload.c - upload a file to an FTP server ftpupload.c - upload a file to an FTP server
@@ -50,6 +49,7 @@ getinmemory.c - download a file to memory only
ghiper.c - curl_multi_socket() using code with glib-2 ghiper.c - curl_multi_socket() using code with glib-2
hiperfifo.c - downloads all URLs written to the fifo, using hiperfifo.c - downloads all URLs written to the fifo, using
curl_multi_socket() and libevent curl_multi_socket() and libevent
htmltidy.c - download a document and use libtidy to parse the HTML
htmltitle.cc - download a HTML file and extract the <title> tag from a HTML htmltitle.cc - download a HTML file and extract the <title> tag from a HTML
page using libxml page using libxml
http-post.c - HTTP POST http-post.c - HTTP POST
@@ -60,9 +60,9 @@ multi-debugcallback.c - a multi-interface app using the debug callback
multi-double.c - a multi-interface app doing two simultaneous transfers multi-double.c - a multi-interface app doing two simultaneous transfers
multi-post.c - a multi-interface app doing a multipart formpost multi-post.c - a multi-interface app doing a multipart formpost
multi-single.c - a multi-interface app getting a single file multi-single.c - a multi-interface app getting a single file
multithread.c - an example using multi-treading transfering multiple files multithread.c - an example using multi-treading transferring multiple files
opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded opensslthreadlock.c - show how to do locking when using OpenSSL multi-threaded
persistant.c - request two URLs with a persistant connection persistant.c - request two URLs with a persistent connection
post-callback.c - send a HTTP POST using a callback post-callback.c - send a HTTP POST using a callback
postit2.c - send a HTTP multipart formpost postit2.c - send a HTTP multipart formpost
sampleconv.c - showing how a program on a non-ASCII platform would invoke sampleconv.c - showing how a program on a non-ASCII platform would invoke
@@ -72,5 +72,5 @@ sepheaders.c - download headers to a separate file
simple.c - the most simple download a URL source simple.c - the most simple download a URL source
simplepost.c - HTTP POST simplepost.c - HTTP POST
simplessl.c - HTTPS example with certificates many options set simplessl.c - HTTPS example with certificates many options set
synctime.c - Sync local time by extracing date from remote HTTP servers synctime.c - Sync local time by extracting date from remote HTTP servers
10-at-a-time.c - Download many files simultaneously, 10 at a time. 10-at-a-time.c - Download many files simultaneously, 10 at a time.

View File

@@ -11,6 +11,7 @@
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h>
#include <curl/curl.h> #include <curl/curl.h>
@@ -18,6 +19,10 @@
#error "upgrade your libcurl to no less than 7.12.3" #error "upgrade your libcurl to no less than 7.12.3"
#endif #endif
#ifndef TRUE
#define TRUE 1
#endif
/* /*
* This example shows a HTTP PUT operation with authentiction using "any" * 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 * type. It PUTs a file given as a command line argument to the URL also given
@@ -52,7 +57,7 @@ static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
} }
/* read callback function, fread() look alike */ /* read callback function, fread() look alike */
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
size_t retcode; size_t retcode;

View File

@@ -135,4 +135,5 @@ int main(void)
curl_easy_cleanup(ch); curl_easy_cleanup(ch);
curl_global_cleanup(); curl_global_cleanup();
return rv;
} }

View File

@@ -10,6 +10,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h>
#include <errno.h> #include <errno.h>
#include <time.h> #include <time.h>
@@ -74,7 +75,7 @@ main(void)
#define snprintf _snprintf #define snprintf _snprintf
#endif #endif
/* Netscape format cookie */ /* Netscape format cookie */
snprintf(nline, 256, "%s\t%s\t%s\t%s\t%u\t%s\t%s", snprintf(nline, sizeof(nline), "%s\t%s\t%s\t%s\t%lu\t%s\t%s",
".google.com", "TRUE", "/", "FALSE", time(NULL) + 31337, "PREF", "hello google, i like you very much!"); ".google.com", "TRUE", "/", "FALSE", time(NULL) + 31337, "PREF", "hello google, i like you very much!");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if (res != CURLE_OK) { if (res != CURLE_OK) {
@@ -83,7 +84,7 @@ main(void)
} }
/* HTTP-header style cookie */ /* HTTP-header style cookie */
snprintf(nline, 256, snprintf(nline, sizeof(nline),
"Set-Cookie: OLD_PREF=3d141414bf4209321; " "Set-Cookie: OLD_PREF=3d141414bf4209321; "
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com"); "expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline); res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);

View File

@@ -81,6 +81,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <curl/curl.h> #include <curl/curl.h>
#include <openssl/x509v3.h> #include <openssl/x509v3.h>
#include <openssl/x509_vfy.h> #include <openssl/x509_vfy.h>
@@ -94,13 +95,13 @@
#include <openssl/bio.h> #include <openssl/bio.h>
#include <openssl/ssl.h> #include <openssl/ssl.h>
static char *curlx_usage[]={ static const char *curlx_usage[]={
"usage: curlx args\n", "usage: curlx args\n",
" -p12 arg - tia file ", " -p12 arg - tia file ",
" -envpass arg - environement variable which content the tia private key password", " -envpass arg - environement variable which content the tia private key password",
" -out arg - output file (response)- default stdout", " -out arg - output file (response)- default stdout",
" -in arg - input file (request)- default stdin", " -in arg - input file (request)- default stdin",
" -connect arg - URL of the server for the connection ex: www.openevidenve.org", " -connect arg - URL of the server for the connection ex: www.openevidence.org",
" -mimetype arg - MIME type for data in ex : application/timestamp-query or application/dvcs -default application/timestamp-query", " -mimetype arg - MIME type for data in ex : application/timestamp-query or application/dvcs -default application/timestamp-query",
" -acceptmime arg - MIME type acceptable for the response ex : application/timestamp-response or application/dvcs -default none", " -acceptmime arg - MIME type acceptable for the response ex : application/timestamp-response or application/dvcs -default none",
" -accesstype arg - an Object identifier in an AIA/SIA method, e.g. AD_DVCS or ad_timestamping", " -accesstype arg - an Object identifier in an AIA/SIA method, e.g. AD_DVCS or ad_timestamping",
@@ -268,19 +269,21 @@ int main(int argc, char **argv) {
char* mimetype; char* mimetype;
char* mimetypeaccept=NULL; char* mimetypeaccept=NULL;
char* contenttype; char* contenttype;
char** pp; const char** pp;
unsigned char* hostporturl = NULL; unsigned char* hostporturl = NULL;
binaryptr=(char*)malloc(tabLength);
BIO * p12bio ; BIO * p12bio ;
char **args = argv + 1; char **args = argv + 1;
unsigned char * serverurl; unsigned char * serverurl;
sslctxparm p; sslctxparm p;
char *response; char *response;
p.verbose = 0;
CURLcode res; CURLcode res;
struct curl_slist * headers=NULL; struct curl_slist * headers=NULL;
int badarg=0;
binaryptr=(char*)malloc(tabLength);
p.verbose = 0;
p.errorbio = BIO_new_fp (stderr, BIO_NOCLOSE); p.errorbio = BIO_new_fp (stderr, BIO_NOCLOSE);
curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_init(CURL_GLOBAL_DEFAULT);
@@ -292,7 +295,6 @@ int main(int argc, char **argv) {
ERR_load_crypto_strings(); ERR_load_crypto_strings();
int badarg=0;
while (*args && *args[0] == '-') { while (*args && *args[0] == '-') {
if (!strcmp (*args, "-in")) { if (!strcmp (*args, "-in")) {
@@ -407,10 +409,9 @@ int main(int argc, char **argv) {
} }
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))) {
int j=0;
BIO_printf(p.errorbio,"no service URL in user cert " BIO_printf(p.errorbio,"no service URL in user cert "
"cherching in others certificats\n"); "cherching in others certificats\n");
int j=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, if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,
NID_info_access))) NID_info_access)))

View File

@@ -17,7 +17,6 @@ int main(void)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
curl_off_t size;
struct stat file_info; struct stat file_info;
double speed_upload, total_time; double speed_upload, total_time;
FILE *fd; FILE *fd;

View File

@@ -70,7 +70,7 @@ struct fcurl_data
typedef struct fcurl_data URL_FILE; typedef struct fcurl_data URL_FILE;
/* exported functions */ /* exported functions */
URL_FILE *url_fopen(char *url,const char *operation); URL_FILE *url_fopen(const char *url,const char *operation);
int url_fclose(URL_FILE *file); int url_fclose(URL_FILE *file);
int url_feof(URL_FILE *file); int url_feof(URL_FILE *file);
size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file); size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file);
@@ -93,11 +93,11 @@ write_callback(char *buffer,
URL_FILE *url = (URL_FILE *)userp; URL_FILE *url = (URL_FILE *)userp;
size *= nitems; size *= nitems;
rembuff=url->buffer_len - url->buffer_pos;//remaining space in buffer rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */
if(size > rembuff) if(size > rembuff)
{ {
//not enuf space in buffer /* not enough space in buffer */
newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff)); newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff));
if(newbuff==NULL) if(newbuff==NULL)
{ {
@@ -211,7 +211,7 @@ use_buffer(URL_FILE *file,int want)
URL_FILE * URL_FILE *
url_fopen(char *url,const char *operation) url_fopen(const char *url,const char *operation)
{ {
/* this code could check for URLs or types in the 'url' and /* this code could check for URLs or types in the 'url' and
basicly use the real fopen() for standard files */ basicly use the real fopen() for standard files */
@@ -236,7 +236,7 @@ url_fopen(char *url,const char *operation)
curl_easy_setopt(file->handle.curl, CURLOPT_URL, url); curl_easy_setopt(file->handle.curl, CURLOPT_URL, url);
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file); curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file);
curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, FALSE); curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0);
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback);
if(!multi_handle) if(!multi_handle)
@@ -466,7 +466,7 @@ main(int argc, char *argv[])
int nread; int nread;
char buffer[256]; char buffer[256];
char *url; const char *url;
if(argc < 2) if(argc < 2)
{ {
@@ -481,7 +481,7 @@ main(int argc, char *argv[])
outf=fopen("fgets.test","w+"); outf=fopen("fgets.test","w+");
if(!outf) if(!outf)
{ {
perror("couldnt open fgets output file\n"); perror("couldn't open fgets output file\n");
return 1; return 1;
} }
@@ -508,7 +508,7 @@ main(int argc, char *argv[])
outf=fopen("fread.test","w+"); outf=fopen("fread.test","w+");
if(!outf) if(!outf)
{ {
perror("couldnt open fread output file\n"); perror("couldn't open fread output file\n");
return 1; return 1;
} }
@@ -533,7 +533,7 @@ main(int argc, char *argv[])
outf=fopen("rewind.test","w+"); outf=fopen("rewind.test","w+");
if(!outf) if(!outf)
{ {
perror("couldnt open fread output file\n"); perror("couldn't open fread output file\n");
return 1; return 1;
} }

View File

@@ -1,103 +0,0 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* $Id$
*/
#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
/*
* This is an example showing how to transfer a file between two remote hosts.
* 7.13.0 or later required.
*/
int main(void)
{
CURL *curl;
CURLcode res;
char source_url[] = "ftp://remotehost.com/path/to/source";
char target_url[] = "ftp://aotherserver.com/path/to/dest";
char sourceUserPass[] = "user:pass";
char targetUserPass[] = "user:pass";
char url[100];
struct curl_slist *source_pre_cmd = NULL;
struct curl_slist *target_pre_cmd = NULL;
struct curl_slist *source_post_cmd = NULL;
struct curl_slist *target_post_cmd = NULL;
char cmd[] = "PWD"; /* just to test */
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
/* The ordinary URL is the target when speaking 3rd party transfers */
curl_easy_setopt(curl, CURLOPT_URL, target_url);
/* Set a source URL */
curl_easy_setopt(curl, CURLOPT_SOURCE_URL, source_url);
/* 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);
#if 0
/* FTPPORT enables PORT on the target side, instead of PASV. */
curl_easy_setopt(curl, CURLOPT_FTPPORT, ""); /* optional */
#endif
/* build a list of commands to pass to libcurl */
source_pre_cmd = curl_slist_append(source_pre_cmd, cmd);
/* Set a proxy pre-quote command */
curl_easy_setopt(curl, CURLOPT_SOURCE_PREQUOTE, source_pre_cmd);
/* build a list of commands to pass to libcurl */
target_pre_cmd = curl_slist_append(target_pre_cmd, cmd);
/* Set a pre-quote command */
curl_easy_setopt(curl, CURLOPT_PREQUOTE, target_pre_cmd);
/* build a list of commands to pass to libcurl */
source_post_cmd = curl_slist_append(source_post_cmd, cmd);
/* Set a proxy post-quote command */
curl_easy_setopt(curl, CURLOPT_SOURCE_POSTQUOTE, source_post_cmd);
/* build a list of commands to pass to libcurl */
target_post_cmd = curl_slist_append(target_post_cmd, cmd);
/* Set a post-quote command */
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, target_post_cmd);
/* Switch on full protocol/debug output */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
res = curl_easy_perform(curl);
/* clean up the FTP commands list */
curl_slist_free_all(source_pre_cmd);
curl_slist_free_all(target_pre_cmd);
curl_slist_free_all(source_post_cmd);
curl_slist_free_all(target_post_cmd);
/* always cleanup */
curl_easy_cleanup(curl);
if(CURLE_OK != res) {
/* we failed */
fprintf(stderr, "curl told us %d\n", res);
}
}
curl_global_cleanup();
return 0;
}

View File

@@ -22,11 +22,11 @@
*/ */
struct FtpFile { struct FtpFile {
char *filename; const char *filename;
FILE *stream; FILE *stream;
}; };
int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) static int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{ {
struct FtpFile *out=(struct FtpFile *)stream; struct FtpFile *out=(struct FtpFile *)stream;
if(out && !out->stream) { if(out && !out->stream) {
@@ -65,7 +65,7 @@ int main(void)
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
/* Switch on full protocol/debug output */ /* Switch on full protocol/debug output */
curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
res = curl_easy_perform(curl); res = curl_easy_perform(curl);

View File

@@ -21,7 +21,7 @@
* This functionality was introduced in libcurl 7.9.3. * This functionality was introduced in libcurl 7.9.3.
*/ */
size_t static size_t
write_response(void *ptr, size_t size, size_t nmemb, void *data) write_response(void *ptr, size_t size, size_t nmemb, void *data)
{ {
FILE *writehere = (FILE *)data; FILE *writehere = (FILE *)data;
@@ -46,6 +46,8 @@ int main(int argc, char **argv)
/* Get a file listing from sunet */ /* Get a file listing from sunet */
curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.sunet.se/"); curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.sunet.se/");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile); curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile);
/* If you intend to use this on windows with a libcurl DLL, you must use
CURLOPT_WRITEFUNCTION as well */
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_response); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_response);
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, respfile); curl_easy_setopt(curl, CURLOPT_WRITEHEADER, respfile);
res = curl_easy_perform(curl); res = curl_easy_perform(curl);

View File

@@ -14,6 +14,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h>
/* /*
* This example shows an FTP upload, with a rename of the file just after * This example shows an FTP upload, with a rename of the file just after
@@ -31,14 +32,13 @@ 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;
struct curl_slist *headerlist=NULL; struct curl_slist *headerlist=NULL;
char buf_1 [] = "RNFR " UPLOAD_FILE_AS; static const char buf_1 [] = "RNFR " UPLOAD_FILE_AS;
char buf_2 [] = "RNTO " RENAME_FILE_TO; static const char buf_2 [] = "RNTO " RENAME_FILE_TO;
/* get the file size of the local file */ /* get the file size of the local file */
hd = open(LOCAL_FILE, O_RDONLY) ; hd = open(LOCAL_FILE, O_RDONLY) ;
@@ -61,7 +61,7 @@ int main(int argc, char **argv)
headerlist = curl_slist_append(headerlist, buf_2); headerlist = curl_slist_append(headerlist, buf_2);
/* enable uploading */ /* enable uploading */
curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ; curl_easy_setopt(curl, CURLOPT_UPLOAD, 1) ;
/* specify target */ /* specify target */
curl_easy_setopt(curl,CURLOPT_URL, REMOTE_URL); curl_easy_setopt(curl,CURLOPT_URL, REMOTE_URL);

View File

@@ -24,7 +24,9 @@
/* The MinGW headers are missing a few Win32 function definitions, /* The MinGW headers are missing a few Win32 function definitions,
you shouldn't need this if you use VC++ */ you shouldn't need this if you use VC++ */
#ifdef __MINGW32__
int __cdecl _snscanf(const char * input, size_t length, const char * format, ...); int __cdecl _snscanf(const char * input, size_t length, const char * format, ...);
#endif
/* parse headers for Content-Length */ /* parse headers for Content-Length */
@@ -75,7 +77,7 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
return 0; return 0;
} }
curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, TRUE); curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1);
curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath); curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
@@ -91,9 +93,9 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
curl_easy_setopt(curlhandle, CURLOPT_READDATA, f); curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-"); /* disable passive mode */ curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-"); /* disable passive mode */
curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, TRUE); curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1);
curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, TRUE); curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1);
for (c = 0; (r != CURLE_OK) && (c < tries); c++) { for (c = 0; (r != CURLE_OK) && (c < tries); c++) {
/* are we resuming? */ /* are we resuming? */
@@ -108,22 +110,22 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
* because HEADER will dump the headers to stdout * because HEADER will dump the headers to stdout
* without it. * without it.
*/ */
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, TRUE); curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1);
curl_easy_setopt(curlhandle, CURLOPT_HEADER, TRUE); curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1);
r = curl_easy_perform(curlhandle); r = curl_easy_perform(curlhandle);
if (r != CURLE_OK) if (r != CURLE_OK)
continue; continue;
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, FALSE); curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0);
curl_easy_setopt(curlhandle, CURLOPT_HEADER, FALSE); curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0);
fseek(f, uploaded_len, SEEK_SET); fseek(f, uploaded_len, SEEK_SET);
curl_easy_setopt(curlhandle, CURLOPT_FTPAPPEND, TRUE); curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1);
} }
else { /* no */ else { /* no */
curl_easy_setopt(curlhandle, CURLOPT_FTPAPPEND, FALSE); curl_easy_setopt(curlhandle, CURLOPT_APPEND, 0);
} }
r = curl_easy_perform(curlhandle); r = curl_easy_perform(curlhandle);

View File

@@ -26,7 +26,7 @@ struct MemoryStruct {
size_t size; size_t size;
}; };
void *myrealloc(void *ptr, size_t size) static void *myrealloc(void *ptr, size_t size)
{ {
/* There might be a realloc() out there that doesn't like reallocing /* There might be a realloc() out there that doesn't like reallocing
NULL pointers, so we take care of it here */ NULL pointers, so we take care of it here */
@@ -36,7 +36,7 @@ void *myrealloc(void *ptr, size_t size)
return malloc(size); return malloc(size);
} }
size_t static size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{ {
size_t realsize = size * nmemb; size_t realsize = size * nmemb;

View File

@@ -91,9 +91,9 @@ typedef struct _SockInfo {
/* Die if we get a bad CURLMcode somewhere */ /* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(char *where, CURLMcode code) { static void mcode_or_die(const char *where, CURLMcode code) {
if ( CURLM_OK != code ) { if ( CURLM_OK != code ) {
char *s; const char *s;
switch (code) { switch (code) {
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
case CURLM_OK: s="CURLM_OK"; break; case CURLM_OK: s="CURLM_OK"; break;
@@ -259,7 +259,7 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
{ {
GlobalInfo *g = (GlobalInfo*) cbp; GlobalInfo *g = (GlobalInfo*) cbp;
SockInfo *fdp = (SockInfo*) sockp; SockInfo *fdp = (SockInfo*) sockp;
char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" }; static const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" };
MSG_OUT("socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]); MSG_OUT("socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
if (what == CURL_POLL_REMOVE) { if (what == CURL_POLL_REMOVE) {
@@ -402,7 +402,7 @@ static gboolean fifo_cb (GIOChannel *ch, GIOCondition condition, gpointer data)
int init_fifo(void) int init_fifo(void)
{ {
struct stat st; struct stat st;
char *fifo = "hiper.fifo"; const char *fifo = "hiper.fifo";
int socket; int socket;
if (lstat (fifo, &st) == 0) { if (lstat (fifo, &st) == 0) {

View File

@@ -252,7 +252,7 @@ static int sock_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp)
{ {
GlobalInfo *g = (GlobalInfo*) cbp; GlobalInfo *g = (GlobalInfo*) cbp;
SockInfo *fdp = (SockInfo*) sockp; SockInfo *fdp = (SockInfo*) sockp;
char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" }; const char *whatstr[]={ "none", "IN", "OUT", "INOUT", "REMOVE" };
fprintf(MSG_OUT, fprintf(MSG_OUT,
"socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]); "socket callback: s=%d e=%p what=%s ", s, e, whatstr[what]);
@@ -357,7 +357,7 @@ void fifo_cb(int fd, short event, void *arg) {
/* Create a named pipe and tell libevent to monitor it */ /* Create a named pipe and tell libevent to monitor it */
int init_fifo (GlobalInfo *g) { int init_fifo (GlobalInfo *g) {
struct stat st; struct stat st;
char *fifo = "hiper.fifo"; static const char *fifo = "hiper.fifo";
int socket; int socket;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);

View File

@@ -11,6 +11,7 @@
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h>
#include <curl/curl.h> #include <curl/curl.h>
@@ -24,7 +25,7 @@
* http://www.apacheweek.com/features/put * http://www.apacheweek.com/features/put
*/ */
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
size_t retcode; size_t retcode;
@@ -75,10 +76,10 @@ int main(int argc, char **argv)
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
/* enable uploading */ /* enable uploading */
curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ; curl_easy_setopt(curl, CURLOPT_UPLOAD, 1) ;
/* HTTP PUT please */ /* HTTP PUT please */
curl_easy_setopt(curl, CURLOPT_PUT, TRUE); curl_easy_setopt(curl, CURLOPT_PUT, 1);
/* specify target URL, and note that this URL should include a file /* specify target URL, and note that this URL should include a file
name, not only a directory */ name, not only a directory */

View File

@@ -31,7 +31,7 @@ int main(void)
* default bundle, then the CURLOPT_CAPATH option might come handy for * default bundle, then the CURLOPT_CAPATH option might come handy for
* you. * you.
*/ */
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
#endif #endif
#ifdef SKIP_HOSTNAME_VERFICATION #ifdef SKIP_HOSTNAME_VERFICATION

View File

@@ -23,7 +23,7 @@ CSOURCES = fopen.c ftpget.c ftpgetresp.c ftpupload.c getinmemory.c \
multi-post.c multi-single.c persistant.c post-callback.c \ multi-post.c multi-single.c persistant.c post-callback.c \
postit2.c sepheaders.c simple.c simplepost.c simplessl.c \ postit2.c sepheaders.c simple.c simplepost.c simplessl.c \
multi-debugcallback.c fileupload.c getinfo.c anyauthput.c \ multi-debugcallback.c fileupload.c getinfo.c anyauthput.c \
10-at-a-time.c # ftpuploadresume.c ftp3rdparty.c cookie_interface.c 10-at-a-time.c # ftpuploadresume.c cookie_interface.c
PROGRAMS = $(CSOURCES:.c=.exe) PROGRAMS = $(CSOURCES:.c=.exe)

View File

@@ -47,7 +47,7 @@ int main(int argc, char **argv)
curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "http://website.com"); curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "http://website.com");
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://ftpsite.com"); curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://ftpsite.com");
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_UPLOAD, TRUE); curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_UPLOAD, 1);
/* init a multi stack */ /* init a multi stack */
multi_handle = curl_multi_init(); multi_handle = curl_multi_init();

View File

@@ -19,7 +19,6 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
CURL *curl; CURL *curl;
CURLcode res;
CURLM *multi_handle; CURLM *multi_handle;
int still_running; int still_running;
@@ -27,7 +26,7 @@ int main(int argc, char *argv[])
struct curl_httppost *formpost=NULL; struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL; struct curl_httppost *lastptr=NULL;
struct curl_slist *headerlist=NULL; struct curl_slist *headerlist=NULL;
char buf[] = "Expect:"; static const char buf[] = "Expect:";
/* Fill in the file upload field. This makes libcurl load data from /* Fill in the file upload field. This makes libcurl load data from
the given file name when curl_easy_perform() is called. */ the given file name when curl_easy_perform() is called. */
@@ -58,7 +57,6 @@ int main(int argc, char *argv[])
wanted */ wanted */
headerlist = curl_slist_append(headerlist, buf); headerlist = curl_slist_append(headerlist, buf);
if(curl && multi_handle) { if(curl && multi_handle) {
int perform=0;
/* what URL that receives this POST */ /* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, curl_easy_setopt(curl, CURLOPT_URL,

View File

@@ -24,7 +24,7 @@
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
*/ */
char *urls[]= { const char *urls[]= {
"http://curl.haxx.se/", "http://curl.haxx.se/",
"ftp://cool.haxx.se/", "ftp://cool.haxx.se/",
"http://www.contactor.se/", "http://www.contactor.se/",
@@ -59,7 +59,7 @@ int main(int argc, char **argv)
error = pthread_create(&tid[i], error = pthread_create(&tid[i],
NULL, /* default attributes please */ NULL, /* default attributes please */
pull_one_url, pull_one_url,
urls[i]); (void *)urls[i]);
if(0 != error) if(0 != error)
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error); fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
else else

View File

@@ -16,6 +16,11 @@
* Author: Jeremy Brown * Author: Jeremy Brown
*/ */
#include <stdio.h>
#include <pthread.h>
#include <openssl/err.h>
#define MUTEX_TYPE pthread_mutex_t #define MUTEX_TYPE pthread_mutex_t
#define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL) #define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL)
#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) #define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
@@ -25,7 +30,7 @@
void handle_error(const char *file, int lineno, const char *msg){ void handle_error(const char *file, int lineno, const char *msg){
fprintf(stderr, ** %s:%i %s\n, file, lineno, msg); fprintf(stderr, "** %s:%d %s\n", file, lineno, msg);
ERR_print_errors_fp(stderr); ERR_print_errors_fp(stderr);
/* exit(-1); */ /* exit(-1); */
} }

View File

@@ -15,14 +15,14 @@
#include <string.h> #include <string.h>
#include <curl/curl.h> #include <curl/curl.h>
char data[]="this is what we post to the silly web server"; const char data[]="this is what we post to the silly web server";
struct WriteThis { struct WriteThis {
char *readptr; const char *readptr;
int sizeleft; int sizeleft;
}; };
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp) static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{ {
struct WriteThis *pooh = (struct WriteThis *)userp; struct WriteThis *pooh = (struct WriteThis *)userp;
@@ -55,7 +55,7 @@ int main(void)
curl_easy_setopt(curl, CURLOPT_URL, curl_easy_setopt(curl, CURLOPT_URL,
"http://receivingsite.com.pooh/index.cgi"); "http://receivingsite.com.pooh/index.cgi");
/* Now specify we want to POST data */ /* Now specify we want to POST data */
curl_easy_setopt(curl, CURLOPT_POST, TRUE); curl_easy_setopt(curl, CURLOPT_POST, 1);
/* we want to use our own read function */ /* we want to use our own read function */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback); curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

View File

@@ -36,7 +36,7 @@ int main(int argc, char *argv[])
struct curl_httppost *formpost=NULL; struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL; struct curl_httppost *lastptr=NULL;
struct curl_slist *headerlist=NULL; struct curl_slist *headerlist=NULL;
char buf[] = "Expect:"; static const char buf[] = "Expect:";
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);

View File

@@ -16,7 +16,7 @@
#include <curl/types.h> #include <curl/types.h>
#include <curl/easy.h> #include <curl/easy.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
int written = fwrite(ptr, size, nmemb, (FILE *)stream); int written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written; return written;
@@ -25,9 +25,9 @@ size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
CURL *curl_handle; CURL *curl_handle;
char *headerfilename = "head.out"; static const char *headerfilename = "head.out";
FILE *headerfile; FILE *headerfile;
char *bodyfilename = "body.out"; static const char *bodyfilename = "body.out";
FILE *bodyfile; FILE *bodyfile;
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);

View File

@@ -9,6 +9,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <curl/curl.h> #include <curl/curl.h>
int main(void) int main(void)
@@ -16,7 +17,7 @@ int main(void)
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
char *postthis="moo mooo moo moo"; static const char *postthis="moo mooo moo moo";
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {

View File

@@ -38,9 +38,10 @@ int main(int argc, char **argv)
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
FILE *headerfile; FILE *headerfile;
const char *pPassphrase = NULL;
const char *pCertFile = "testcert.pem"; static const char *pCertFile = "testcert.pem";
const char *pCACertFile="cacert.pem"; static const char *pCACertFile="cacert.pem";
const char *pKeyName; const char *pKeyName;
const char *pKeyType; const char *pKeyType;
@@ -57,8 +58,6 @@ int main(int argc, char **argv)
pEngine = NULL; pEngine = NULL;
#endif #endif
const char *pPassphrase = NULL;
headerfile = fopen("dumpit", "w"); headerfile = fopen("dumpit", "w");
curl_global_init(CURL_GLOBAL_DEFAULT); curl_global_init(CURL_GLOBAL_DEFAULT);
@@ -96,7 +95,7 @@ int main(int argc, char **argv)
/* sorry, for engine we must set the passphrase /* sorry, for engine we must set the passphrase
(if the key has one...) */ (if the key has one...) */
if (pPassphrase) if (pPassphrase)
curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,pPassphrase); curl_easy_setopt(curl,CURLOPT_KEYPASSWD,pPassphrase);
/* if we use a key stored in a crypto engine, /* if we use a key stored in a crypto engine,
we must set the key type to "ENG" */ we must set the key type to "ENG" */

View File

@@ -87,7 +87,7 @@ typedef struct
char timeserver[MAX_STRING1]; char timeserver[MAX_STRING1];
} conf_t; } conf_t;
char DefaultTimeServer[4][MAX_STRING1] = const char DefaultTimeServer[4][MAX_STRING1] =
{ {
"http://nist.time.gov/timezone.cgi?UTC/s/0", "http://nist.time.gov/timezone.cgi?UTC/s/0",
"http://www.google.com/", "http://www.google.com/",
@@ -95,8 +95,8 @@ char DefaultTimeServer[4][MAX_STRING1] =
"http://www.worldtime.com/cgi-bin/wt.cgi" "http://www.worldtime.com/cgi-bin/wt.cgi"
}; };
char *DayStr[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; const char *DayStr[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
char *MthStr[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", const char *MthStr[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int ShowAllHeader; int ShowAllHeader;

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