Compare commits

...

204 Commits

Author SHA1 Message Date
Daniel Stenberg
6e1a986e0f 7.14.1 coming right up 2005-09-01 20:54:00 +00:00
Daniel Stenberg
e0785ade35 softened my opinions, added API benefit - Thanks to Eric Cooper 2005-09-01 15:03:45 +00:00
Daniel Stenberg
0177ed6f03 clarify that the ctxfunc is called on all new connects 2005-09-01 13:41:29 +00:00
Daniel Stenberg
c62635a3b5 added DISTRO-DILEMMA 2005-09-01 08:44:39 +00:00
Daniel Stenberg
0177476fd2 added the URL 2005-09-01 08:43:44 +00:00
Daniel Stenberg
76d7dface7 new 2005-09-01 08:35:59 +00:00
Daniel Stenberg
982ba21460 oops, the GNU GSS patch could clobber the CPPFLAGS variable and it thus
broke krb4 builds!
2005-08-31 21:23:47 +00:00
Daniel Stenberg
6081c60556 ocurl release 2005-08-31 20:51:41 +00:00
Daniel Stenberg
2fe3c22108 use it as 'struct addrinfo' so perhaps it builds on mingw again 2005-08-31 06:04:48 +00:00
Gunter Knauf
75dbb3189a quick hack to make it working again on Win32 - however we should consider to set some defaults depending on the compiler architecture we guess we are since it doesnt work well if we prefer building the msvc makefile with gmake instead of nmake because we found gmake first in path.... 2005-08-30 18:37:08 +00:00
Daniel Stenberg
32330300a9 Kevin Lussier pointed out a problem with curllib.dsp 2005-08-29 21:04:26 +00:00
Daniel Stenberg
64414df27e Use the more correct BUILDING_LIBCURL define instead of CURLLIB_EXPORTS.
Kevin Lussier pointed this out!
2005-08-29 20:56:20 +00:00
Daniel Stenberg
f98ec86798 spell-fix 2005-08-29 15:19:38 +00:00
Daniel Stenberg
87bbd13899 Igor Polyakov fixed a rather nasty problem with the threaded name resolver
for Windows, that could lead to an Access Violation when the multi interface
was used due to an issue with how the resolver thread was and was not
terminated.
2005-08-29 14:23:53 +00:00
Daniel Stenberg
51a4493add Added GNU GSS and separate sections for MIT GSS and Heimdal and added info
about what each single lib may be used for.
2005-08-29 13:58:25 +00:00
Daniel Stenberg
5effe8f336 Simon Josefson brought GNU GSS support 2005-08-29 08:42:45 +00:00
Daniel Stenberg
296eb2bd61 1.3.0 coming just up 2005-08-29 07:03:05 +00:00
Daniel Stenberg
9853acba66 Moved the GnuTLS related TODO items from lib/TODO.gnutls to the proper
docs/TODO
2005-08-29 06:59:44 +00:00
Daniel Stenberg
09cb9c782d 4.14 Redirects work in browser but not with curl! 2005-08-26 13:22:39 +00:00
Daniel Stenberg
575ce905b2 ok, the right term (using RFC2616 lingo) for the -X keyword is method and not
request
2005-08-25 12:19:22 +00:00
Daniel Stenberg
54887af471 "Added in 7.14.1" notes and some minor edits 2005-08-25 07:06:50 +00:00
Daniel Stenberg
573350637e CURLINFO_COOKIELIST is added in 7.14.1 2005-08-25 07:06:15 +00:00
Daniel Stenberg
49a16f7121 Theo Borm's example, as was posted here:
http://curl.haxx.se/mail/lib-2005-08/0163.html
2005-08-24 17:07:27 +00:00
Daniel Stenberg
a4773fcbbb Toby Peterson added CURLOPT_IGNORE_CONTENT_LENGTH to the library, accessible
from the command line tool with --ignore-content-length. This will make it
easier to download files from Apache 1.x (and similar) servers that are
still having problems serving files larger than 2 or 4 GB. When this option
is enabled, curl will simply have to wait for the server to close the
connection to signal end of transfer. I wrote test case 269 that runs a
simple test that this works.
2005-08-24 10:57:28 +00:00
Daniel Stenberg
1e038c4bc6 valgrind version 3 renames the --logfile command line option to --log-file... 2005-08-24 10:49:57 +00:00
Daniel Stenberg
6ba19692a3 fixed #26, GnuTLS CA cert verification 2005-08-24 07:45:14 +00:00
Daniel Stenberg
432dfe2b8f Fixed CA cert verification using GnuTLS with the default bundle, which
previously failed due to GnuTLS not allowing x509 v1 CA certs by default.
2005-08-24 07:40:13 +00:00
Daniel Stenberg
a142372750 known bug #26, pretty fatal for anyone who wants to use proper SSL and GnuTLS 2005-08-23 08:51:38 +00:00
Gunter Knauf
f14195f786 enabled statically linked builds. 2005-08-22 02:39:05 +00:00
Daniel Stenberg
9d54f9a6b7 well hit me, that wasn't possible, use 1:0:0 anyway... 2005-08-21 21:27:19 +00:00
Daniel Stenberg
ebb91191bf modified the version-info, we only added functions 2005-08-21 21:25:42 +00:00
Daniel Stenberg
8742e294d4 increase version info 2005-08-21 21:25:07 +00:00
Daniel Stenberg
8882d1fa1b avoid adding a blank dir to the LD_LIBRARY_PATH when OpenSSL is found in a
default dir
2005-08-21 21:15:07 +00:00
Daniel Stenberg
0c37ab5255 Alfredo Tupone provided a fix for the Windows code in get_iphlpapi_dns_info()
when getting the DNS server etc.
2005-08-21 21:09:44 +00:00
Daniel Stenberg
747a05844d Using CURLOPT_COOKIEFILE serveral times add more files to read from. 2005-08-19 21:38:44 +00:00
Daniel Stenberg
c7b7bf32f8 removed the unreachable code warning from gcc debug builds, even the most
recent gcc versions give far too many false positives for this to be valuable
2005-08-19 15:07:50 +00:00
Daniel Stenberg
710ee3b0e0 Norbert Novotny had problems with FTPS and he helped me work out a patch
that made curl run fine in his end. The key was to make sure we do the
SSL/TLS negotiation immediately after the TCP connect is done and not after
a few other commands have been sent like we did previously. I don't consider
this change necessary to obey the standards, I think this server is pickier
than what the specs allow it to be, but I can't see how this modified
libcurl code can add any problems to those who are interpreting the
standards more liberally.
2005-08-19 14:41:09 +00:00
Daniel Stenberg
7a8993892d one german mirror has died while another one was added, and yet another Texas
one!
2005-08-19 07:33:34 +00:00
Daniel Stenberg
5e16a77fa9 Added new contributors from RELEASE-NOTES. The somewhat different sort order
is due to now using emacs to sort but I'm not in a mood to fix it better just
now.
2005-08-19 07:32:14 +00:00
Daniel Stenberg
ef35519696 removed some inaccurate comments about the TYPE_IN_ADDR_T check 2005-08-19 07:02:24 +00:00
Daniel Stenberg
d5baaf7756 The big POST to HTTPS is probably not a bug.
The CONNECT problem is now bug #25 planned to get fixed in next release.
2005-08-19 06:43:25 +00:00
Gunter Knauf
2a94387fc3 minor Makefile fixes. 2005-08-18 16:39:29 +00:00
Gunter Knauf
6a5c2b0fc3 updated NetWare section. 2005-08-18 16:33:45 +00:00
Daniel Stenberg
fc281d6440 detabified 2005-08-18 08:48:31 +00:00
Daniel Stenberg
e22ac39da4 detabify 2005-08-18 08:47:56 +00:00
Daniel Stenberg
34cadb1e54 Harshal Pradhan's use-after-free bug with ares is now known bug #24 to be
fixed after 7.14.1
2005-08-18 08:18:24 +00:00
Daniel Stenberg
94692b904e it isn't strictly necessary to use it after a perform 2005-08-18 06:14:17 +00:00
Daniel Stenberg
18f3087afd removed issue 20 that was about valgrind complaints on other libs/parts, as
we have a fancier valgrind error parser these days and it seems to work rather
well
2005-08-17 09:43:29 +00:00
Daniel Stenberg
15bc228ae9 the SOCKS situation 2005-08-17 09:41:54 +00:00
Daniel Stenberg
2b7a38d032 removed old info about curl_getdate() just simply isn't true and hasn't been
true since the getdate() parser code rewrite
2005-08-17 09:12:08 +00:00
Daniel Stenberg
90e1a6905a remove the typecast to long from time_t, since we now store it as curl_off_t 2005-08-17 09:11:27 +00:00
Daniel Stenberg
c36af24cbd handles expiry times in cookie files that go beyond 32 bits in size 2005-08-17 09:01:07 +00:00
Daniel Stenberg
a676c18502 - Jeff Pohlmeyer found out that if you ask libcurl to load a cookiefile (with
CURLOPT_COOKIEFILE), add a cookie (with CURLOPT_COOKIELIST), tell it to
  write the result to a given cookie jar and then never actually call
  curl_easy_perform() - the given file(s) to read was never read but the
  output file was written and thus it caused a "funny" result.

- While doing some tests for the bug above, I noticed that Firefox generates
  large numbers (for the expire time) in the cookies.txt file and libcurl
  didn't treat them properly. Now it does.
2005-08-17 08:55:43 +00:00
Gunter Knauf
362912ff83 added curl_mvsnprintf to the export list; I appened to the end cause of the numbering ... 2005-08-16 20:12:58 +00:00
Gunter Knauf
46ff13f243 added curl_mvsnprintf to the export list. 2005-08-16 20:11:25 +00:00
Daniel Stenberg
340a67a6f8 client side fixes 2005-08-16 11:40:43 +00:00
Daniel Stenberg
9294c1e76c typecase the isspace() argument to int 2005-08-16 07:32:50 +00:00
Daniel Stenberg
fd704f8de0 recent changes 2005-08-15 21:48:36 +00:00
Daniel Stenberg
d9ca9154d1 Added more verbose "warning" messages to the curl client for cases where it
fails to open/read files etc to help users diagnose why it doesn't do what
you'd expect it to. Converted lots of old messages to use the new generic
function I wrote for this purpose.
2005-08-15 21:48:28 +00:00
Daniel Stenberg
35110eca73 James Bursa identified a libcurl HTTP bug and a good way to repeat it. If a
site responds with bad HTTP response that doesn't contain any header at all,
only a response body, and the write callback returns 0 to abort the
transfer, it didn't have any real effect but the write callback would be
called once more anyway.
2005-08-13 21:28:46 +00:00
Daniel Stenberg
9ad92b3007 added test 268 that makes curl -d @nonexisting 2005-08-12 22:09:21 +00:00
Daniel Stenberg
2f78c96330 clarify 2005-08-12 21:47:05 +00:00
Daniel Stenberg
639857ceb2 o curl -d @filename when 'filename' was not possible to access no longer
converts the request to a GET, but now instead makes it a POST of no data
o The time condition illegal syntax warning is now inhibited if -s is used.
2005-08-12 21:25:44 +00:00
Daniel Stenberg
162f58c53c -H needs no CRLF or similar added 2005-08-12 20:56:12 +00:00
Daniel Stenberg
84c4d96e71 removed old debug left-over infof() call 2005-08-11 21:41:11 +00:00
Daniel Stenberg
c0d343d56d do a POST with NTLM and add two custom headers 2005-08-11 21:33:40 +00:00
Daniel Stenberg
6d14a80608 Added comment about strtoimax() 2005-08-11 20:42:02 +00:00
Gunter Knauf
f451bb7c49 fix for NetWare crossbuilds to display the right config.h when build on Win32. 2005-08-11 18:02:09 +00:00
Daniel Stenberg
20b17d6b04 the debug callback was called with CURLINFO_TEXT with the data size one
too big
2005-08-10 22:57:14 +00:00
Gunter Knauf
bb2317b63c minor Makefile fix. 2005-08-10 21:45:59 +00:00
Gunter Knauf
189461dc98 minor Makefile fix. 2005-08-10 20:45:49 +00:00
Gunter Knauf
69af552bc1 added some more NetWare targets. 2005-08-10 19:26:33 +00:00
Gunter Knauf
0ae6ff9f72 some minor Makefile fixes for SSL. 2005-08-10 19:19:25 +00:00
Gunter Knauf
8b571fbbb1 make ares compile again for NetWare. 2005-08-10 17:03:53 +00:00
Gunter Knauf
f3fcd409d5 make ares compile again for NetWare. 2005-08-10 16:55:06 +00:00
Gunter Knauf
a47532f88a fixed line endings so it works again with gnu make on Win32. 2005-08-10 16:54:00 +00:00
Daniel Stenberg
6c157a404b Christopher R. Palmer fixed the offsets used for date parsings when the time
zone name of a daylight savings time was used. For example, PDT vs PDS. This
flaw was introduced with the new date parser (11 sep 2004 - 7.12.2).
Fortunately, no web server or cookie string etc should be using such time
zone names thus limiting the effect of this bug.
2005-08-09 21:59:31 +00:00
Daniel Stenberg
4f8a49143d mention two other bugs we should fix before release 2005-08-08 23:09:24 +00:00
Daniel Stenberg
493d6033aa Jon Grubbs filed bug report #1249962 which identified a problem with NTLM on a
HTTP proxy if an FTP URL was given. libcurl now properly switches to pure HTTP
internally when an HTTP proxy is used, even for FTP URLs. The problem would
also occur with other multi-pass auth methods.
2005-08-07 22:59:06 +00:00
Daniel Stenberg
8f219af884 When curl is built with GnuTLS, curl-config didn't include "SSL" when
--features was used
2005-08-07 21:45:59 +00:00
Daniel Stenberg
aeb04136f7 Don't prevent FTPS:// through a http proxy, as we cannot know if it works or
not!
2005-08-07 21:39:44 +00:00
Daniel Stenberg
0b8f57bf06 mention our security related mail alias in the "who do I mail" section 2005-08-07 14:36:55 +00:00
Daniel Stenberg
6508d446e1 Support realloc() on a NULL pointer properly (printf(%p) on a NULL pointer
outputs (nil) and not a 0x0 or similar.
2005-08-04 23:05:36 +00:00
Daniel Stenberg
82cb462bb4 killed trailing whitespace, narrowed a few lines to 80 cols 2005-08-04 08:07:44 +00:00
Daniel Stenberg
9a264bf610 mention that the NOBODY reset thing is added in 7.14.1 2005-08-01 11:56:03 +00:00
Daniel Stenberg
57007e80a9 Moved items from TODO-RELEASE to TODO since they're not really bound to happen
in any specific release.
2005-07-30 23:48:07 +00:00
Daniel Stenberg
b6c876bdb6 clarified the PHP/CURL topic a bit more 2005-07-30 23:37:05 +00:00
Daniel Stenberg
57afae79eb correction and added new mirror 2005-07-30 23:19:42 +00:00
Daniel Stenberg
84c2184909 CURLOPT_COOKIELIST change since it no longer modifies the input string contents 2005-07-30 08:27:51 +00:00
Daniel Stenberg
e358a24a75 reset the numcookies counter too (I missed it in the previous commit) 2005-07-28 21:53:09 +00:00
Daniel Stenberg
9da9d00c62 fixed example since this is how the interface works now 2005-07-28 21:51:20 +00:00
Daniel Stenberg
ec3f269d1f now strdups the cookielist inpointer before passed on, as the cookie function
modifies it
2005-07-28 21:50:34 +00:00
Daniel Stenberg
1c388a52a5 curl standard indent/format 2005-07-28 21:49:58 +00:00
Gisle Vanem
34a827bbfe Needs 'struct_stat'. Increased verbosity. 2005-07-28 13:20:27 +00:00
Daniel Stenberg
726b9e2240 If any of the options CURLOPT_HTTPGET, CURLOPT_POST and CURLOPT_HTTPPOST is
set to 1, CURLOPT_NOBODY will now automatically be set to 0.
2005-07-27 22:29:50 +00:00
Daniel Stenberg
2236ba0d20 Peteris Krumins added CURLOPT_COOKIELIST and CURLINFO_COOKIELIST, which is a
simple interface to extracting and setting cookies in libcurl's internal
"cookie jar". See the new cookie_interface.c example code.
2005-07-27 22:17:14 +00:00
Daniel Stenberg
463c0f7096 disabling HTTP should also nullify this function call 2005-07-27 21:44:43 +00:00
Dan Fandrich
e49a7e361c Fixed --without-gnutls 2005-07-27 18:22:21 +00:00
Dan Fandrich
6e87cf5b30 Fixed some typos in output messages. 2005-07-21 22:18:35 +00:00
Dan Fandrich
5872e8dd7e Properly support the options --without-spnego --without-gssapi --without-krb4 2005-07-20 23:00:27 +00:00
Dan Fandrich
e81d4ac8c8 Add -Wdeclaration-after-statement to gcc to detect accidental C99-style
variable declarations.
2005-07-20 21:58:23 +00:00
Daniel Stenberg
4922904991 Simplified the code within curl_easy_perform() that calls Curl_perform().
Pointed out by Bjorn Reese.
2005-07-17 12:44:11 +00:00
Daniel Stenberg
decae2dcda cURLpp 0.5.1 2005-07-15 06:57:36 +00:00
Daniel Stenberg
16bbd13af7 Diego Casorran patches to make (lib)curl build fine on Amiga again 2005-07-13 18:06:40 +00:00
Daniel Stenberg
ee0666c8df better description for HEADERFUNCTION 2005-07-13 09:46:37 +00:00
Daniel Stenberg
a8a8ae2e92 elaborate a bit on how to deal with chunked-encoded trailers that now are
passed to the app using the header callback
2005-07-13 09:37:22 +00:00
Daniel Stenberg
fd1148a728 converted this back to one name per line to make it easier/better to diff
and merge when new names are added
2005-07-13 07:44:53 +00:00
Daniel Stenberg
74c7b41ee7 mention the Rexx/CURL release 2005-07-12 18:20:31 +00:00
Daniel Stenberg
465e19dbe9 Adrian Schuur added trailer support in the chunked encoding stream. The
trailer is then sent to the normal header callback/stream.
2005-07-12 18:15:34 +00:00
Daniel Stenberg
86660c73e5 mention an old idea 2005-07-08 13:28:16 +00:00
Daniel Stenberg
6d8a208df2 mention the exception only once ;-) 2005-07-07 05:43:04 +00:00
Daniel Stenberg
c3a826fdce correction for the 407 with response-body case 2005-07-05 22:07:34 +00:00
Gisle Vanem
c5d6a42abf Update copyright. 2005-07-05 18:07:55 +00:00
Daniel Stenberg
d49c144297 Gisle Vanem came up with a nice little work-around for bug #1230118. It
seems the Windows (MSVC) libc time functions may return data one hour off if
TZ is not set and automatic DST adjustment is enabled. This made
curl_getdate() return wrong value, and it also concerned internal cookie
expirations etc.
2005-07-05 14:57:41 +00:00
Daniel Stenberg
e7de7d5eb3 mention the strerror_r detection fix in configure 2005-07-04 21:53:02 +00:00
Daniel Stenberg
20005a83d2 Andrew Bushnell provided enough info for me to tell that we badly needed to
fix the CONNECT authentication code with multi-pass auth methods (such as
NTLM) as it didn't previously properly ignore response-bodies - in fact it
stopped reading after all response headers had been received. This could
lead to libcurl sending the next request and reading the body from the first
request as response to the second request. (I also renamed the function,
which wasn't strictly necessary but...)

The best fix would to once and for all make the CONNECT code use the
ordinary request sending/receiving code, treating it as any ordinary request
instead of the special-purpose function we have now. It should make it
better for multi-interface too. And possibly lead to less code...

Added test case 265 for this. It doesn't work as a _really_ good test case
since the test proxy is too stupid, but the test case helps when running the
debugger to verify.
2005-07-03 22:25:15 +00:00
Daniel Stenberg
27926030f9 add more info when this script gets confused, and added getaddrinfo and
freeaddrinfo to the trace output
2005-06-30 14:07:52 +00:00
Daniel Stenberg
701de67b79 use %p to printf pointers since %x doesn't work properly on tru64 for this
(and besides, we should be using the same %-code for all pointers)
2005-06-30 13:30:23 +00:00
Daniel Stenberg
883479f01e enable memory debugging on tru64 with ipv6 support by doing a little different
defining, since the system headers themselves redefine getaddrinfo
2005-06-30 13:28:58 +00:00
Dan Fandrich
b37a0b0512 Detect (or at least infer) glibc-style strerror_r even when cross-compiling. 2005-06-30 04:53:05 +00:00
Daniel Stenberg
5c5d5270d2 new Lua binding 2005-06-28 09:08:52 +00:00
Daniel Stenberg
36461fb2aa clarify that ftp ascii transfers don't do right in current libcurl 2005-06-26 10:08:08 +00:00
Daniel Stenberg
d8dcd5e472 added docs about the new proxy string support 2005-06-23 23:07:07 +00:00
Daniel Stenberg
c51b46c982 David Shaw fixes 2005-06-22 22:31:08 +00:00
Daniel Stenberg
b1b63c1dd1 mention more ARMs 2005-06-22 22:30:52 +00:00
Daniel Stenberg
30c93d66eb verify that the URL decoding is done properly too 2005-06-22 22:24:47 +00:00
Daniel Stenberg
3b60bb7259 David Shaw's fix that unifies proxy string treatment so that a proxy given
with CURLOPT_PROXY can use a http:// prefix and user + password. The user
and password fields are now also URL decoded properly.

Test case 264 added to verify.
2005-06-22 22:24:10 +00:00
Daniel Stenberg
c73f8e835f David Shaw's updated version:
It now properly handles code that uses curl_free() (since not all versions of
curl have it), and also fixes a few problems when detecting libcurl on MinGW,
and a linker problem on OSX Panther.
2005-06-22 06:58:11 +00:00
Daniel Stenberg
93558c4299 mistake 2005-06-20 22:32:45 +00:00
Daniel Stenberg
396cff5779 possible windows memory leak fixed by Gisle 2005-06-19 21:38:45 +00:00
Dominick Meglio
336154e729 Added some checks for the addrinfo structure. 2005-06-19 16:58:40 +00:00
Gisle Vanem
bb0aba34fa Ensure thread handle is closed too. 2005-06-14 14:47:21 +00:00
Daniel Stenberg
1dc0ce9562 4.13 Why is curl -R on Windows one hour off? 2005-06-13 18:33:40 +00:00
Daniel Stenberg
e4aee168b5 recent buildconf fiddling 2005-06-13 11:20:51 +00:00
Daniel Stenberg
2c10c895da run libtoolize in the ares dir as well, and modified the output slightly for
all tools run in the ares dir - now shown like "running ares/[tool]"
2005-06-13 10:49:14 +00:00
Daniel Stenberg
c04fae3096 CURLINFO_FILETIME returns the time for GMT 2005-06-11 22:04:41 +00:00
Daniel Stenberg
a214af0830 make sure the found tool is a regular file (and not a dir or something) 2005-06-09 22:43:13 +00:00
Daniel Stenberg
f21bc46e82 Modified to use 'head -n 1' instead of 'head -1' since some versions of head
complains and claims this is deprecated.
2005-06-09 06:45:54 +00:00
Daniel Stenberg
044327a488 Reverted Tupone Alfredo's patch, as it broke NUMEROUS autobuilds. Let's do the
changes in a slower and more controlled manner...
2005-06-07 23:00:06 +00:00
Daniel Stenberg
c4bbcc83b6 Tupone Alfredo's fixes:
1) findtool does look per tool in PATH and think ./perl is the perl
executable, while is just a local directory (I have . in the PATH)

2) I got several warning for head -1 deprecated in favour of head -n 1

3) ares directory is missing some file (missing is missing :-) ) because
automake and friends is not run.

(Let's hope number 2 doesn't break somewhere "out there", if so we can always
search/replace that back.)
2005-06-06 21:19:04 +00:00
Daniel Stenberg
eb162b73c2 first rough version 2005-06-03 21:38:40 +00:00
Daniel Stenberg
29aafb9cea Andres Garcia's text mode fix for the 'data' part 2005-06-03 14:06:03 +00:00
Daniel Stenberg
40eb7d0d48 FIONBIO is in sys/ioctl.h on AIX 2005-06-03 07:39:18 +00:00
Daniel Stenberg
1dcb2b7e65 sigh, define TRUE if not already 2005-06-02 21:10:21 +00:00
Daniel Stenberg
5470b9aa73 William Ahern:
Make UDP sockets non-blocking. I've confirmed that at least on Linux 2.4 a
  read event can come back from poll() on a valid SOCK_DGRAM socket but
  recv(2) will still block. This patch doesn't ignore EAGAIN in
  read_udp_packets(), though maybe it should. (This patch was edited by Daniel
  Stenberg and a new configure test was added (imported from curl's configure)
  to properly detect what non-blocking socket approach to use.)
2005-06-02 11:58:04 +00:00
Daniel Stenberg
050bd7dd0b William Ahern:
I'm not quite sure how this was happening, but I've been seeing PTR queries
  which seem to return empty responses. At least, they were empty when calling
  ares_expand_name() on the record. Here's a patch which guarantees to
  NUL-terminate the expanded name. The old behavior failed to NUL-terminate if
  len was 0, and this was causing strlen() to run past the end of the buffer
  after calling ares_expand_name() and getting ARES_SUCCESS as the return
  value. If q is not greater than *s then it's equal and *s is always
  allocated with at least one byte.
2005-06-02 11:09:10 +00:00
Daniel Stenberg
f75038634f specify the cares lib before the other libs, to make it build fine with mingw
- inspired by Tupone Alfredo's bug report (and patch) #1212940
2005-06-01 21:30:29 +00:00
Daniel Stenberg
300b4a9158 Todd Kulesza reported a flaw in the proxy option, since a numerical IPv6
address was not possible to use. It is now, but requires it written
RFC2732-style, within brackets - which incidently is how you enter numerical
IPv6 addresses in URLs. Test case 263 added to verify.
2005-05-31 13:03:26 +00:00
Daniel Stenberg
52071f3476 added keywords 2005-05-31 12:57:21 +00:00
Daniel Stenberg
42ddd745f8 recent changes 2005-05-29 22:38:34 +00:00
Daniel Stenberg
a7846189cd Eric Cooper reported about a problem with HTTP servers that responds with
binary zeroes within the headers. They confused libcurl to do wrong so the
downloaded headers become incomplete. The fix is now verified with test case
262.
2005-05-29 22:30:48 +00:00
Daniel Stenberg
4762995d1f avoid the sensitive word as it looks bad in some people's eyes 2005-05-27 11:39:07 +00:00
Daniel Stenberg
e3a530eb61 Andrs Garca fixed a warning appearing on windows 2005-05-27 11:01:41 +00:00
Daniel Stenberg
d1235ff058 provide the proper copyright texts for these 2005-05-26 20:56:25 +00:00
Daniel Stenberg
4370e92dbd set LD_LIBRARY_PATH properly even when the openssl lib dir is found using
pkg-config
2005-05-25 22:14:32 +00:00
Daniel Stenberg
50e9522a06 silense a warning 2005-05-25 22:12:57 +00:00
Daniel Stenberg
b5bb9aa8e3 minor rephrase 2005-05-25 13:07:06 +00:00
Daniel Stenberg
cf2e365f23 output the full usec when --trace-time is used 2005-05-25 12:29:09 +00:00
Daniel Stenberg
72e532cb67 no more time/re-start of sockfilt, no more redirect of stdin/stdout when
talking to sockfilt
2005-05-25 12:27:19 +00:00
Daniel Stenberg
ac5635f77d added function for individual ftp slave kills 2005-05-25 12:26:38 +00:00
Daniel Stenberg
640d67c119 modified output logging, fixed the ftpslave killing 2005-05-25 12:26:20 +00:00
Daniel Stenberg
3e79693e3b utilize the whole usec in the log and don't output to stderr if the logfile
can't be opened
2005-05-25 12:04:52 +00:00
Daniel Stenberg
d55d3c2fd0 nicer raw logging and put code into (nicer) functions 2005-05-25 12:04:24 +00:00
Daniel Stenberg
3aced17c75 don't restart sockfilt after only 5 seconds of inactivity 2005-05-24 21:09:49 +00:00
Daniel Stenberg
bac63914db recent action 2005-05-24 21:02:59 +00:00
Daniel Stenberg
6a63c51f7c Andres Garcia's mode=text patch to make these do fine on Windows 2005-05-24 10:03:13 +00:00
Daniel Stenberg
632cf13767 add test case 261, response code 226 to TYPE 2005-05-24 09:40:58 +00:00
Daniel Stenberg
e7012a515c Now allow TYPE responses to be any 2xx code, and log if it isn't 200. 2005-05-24 09:39:56 +00:00
Daniel Stenberg
6b638af92f removed leftover debug message ("moo moo") 2005-05-22 17:54:11 +00:00
Daniel Stenberg
c654b79c53 added keywords 2005-05-21 22:38:19 +00:00
Daniel Stenberg
bee7b874ea added -nobuildconf 2005-05-20 11:24:55 +00:00
Daniel Stenberg
9c3fc592f7 keywords added 2005-05-20 11:15:24 +00:00
Daniel Stenberg
4eab7a1ebc shorter name 2005-05-20 11:15:15 +00:00
Daniel Stenberg
3d985688e4 sum up 2005-05-20 11:14:44 +00:00
Daniel Stenberg
17ea2631cd Add support for text mode on stdout tests as well, and add the mode=text
to the docs.
2005-05-20 10:40:32 +00:00
Daniel Stenberg
b749910e6c include ctype.h for isdigit() 2005-05-19 09:55:53 +00:00
Daniel Stenberg
eff36caea8 additional fix for the malformed URL fix of yday 2005-05-19 07:21:18 +00:00
Daniel Stenberg
6ff092f140 removed duplicate 2005-05-19 07:12:16 +00:00
Daniel Stenberg
28bb36e53d three fixes since 7.14.0 2005-05-18 20:02:07 +00:00
Daniel Stenberg
4a091bbd8a Bug report #1204435 identified a problem with malformed URLs like
"http://somehost?data" as it added a slash too much in the request ("GET
/?data/"...). Added test case 260 to verify.
2005-05-18 20:01:01 +00:00
Daniel Stenberg
e99a6b813e update 2005-05-18 20:00:50 +00:00
Daniel Stenberg
b9e5302f27 adjusted the strerror_r test more, use _REENTRANT instead of _THREAD_SAFE
when looking for the prototype
2005-05-18 15:15:00 +00:00
Daniel Stenberg
dd7b6aef39 The configure check for strerror_r() failed to detect the proper API at
times, like on my HP-UX 10.20 tests. And then lib/strerror.c badly assumed
the glibc version if the posix define wasn't set (since it _had_ found a
strerror_r).
2005-05-18 13:24:23 +00:00
Daniel Stenberg
910b8b6a69 #15 is now fixed 2005-05-18 10:38:21 +00:00
Daniel Stenberg
c3207e215f clarified for GnuTLS 2005-05-18 10:14:25 +00:00
Daniel Stenberg
f83be11b85 several updates 2005-05-18 10:12:08 +00:00
Daniel Stenberg
45bce1062a ignore resolve too 2005-05-18 10:05:38 +00:00
Daniel Stenberg
8cb344bf3c use less code and prevent compiler warning 2005-05-18 10:01:46 +00:00
Daniel Stenberg
fcc4518cdc removed the separate table with download links, and extended the curl site
list with all current mirrors
2005-05-18 09:26:57 +00:00
Daniel Stenberg
c84839eb91 scan for gmake and make to prefer gmake on systems that have it 2005-05-17 12:07:08 +00:00
Daniel Stenberg
1f878aee69 Made test case 241 precheck that the given name resolves to an ipv6 address,
or the test is skipped. Ideally, we should let this test case go over a few
frequently used IPv6 localhost aliases...
2005-05-17 10:27:11 +00:00
Daniel Stenberg
84fd4686e2 Moved more generic functions to util.[ch]
Added resolve.c to simply resolve a given host name
2005-05-17 10:22:22 +00:00
Daniel Stenberg
ede9fb4fcc check if getsockname() returns failure before using the address it provides 2005-05-17 09:18:17 +00:00
Daniel Stenberg
723aef71e8 reduced typecasts, from two to one 2005-05-17 09:15:21 +00:00
Dominick Meglio
48964a911e More of the same 2005-05-17 04:20:58 +00:00
Dominick Meglio
6a35cb60fd More compiler warning cleanups 2005-05-17 04:18:41 +00:00
Daniel Stenberg
1e51c3a832 bad formatting 2005-05-16 22:30:00 +00:00
Dominick Meglio
205dda2b39 Made ares_free_hostent man page refer to ares_parse_aaaa_reply 2005-05-16 19:23:57 +00:00
Dominick Meglio
1c18d19da0 Cleaned up some compile warnings 2005-05-16 19:14:25 +00:00
Dominick Meglio
645729e943 Added ares_getnameinfo which mimics the getnameinfo API 2005-05-16 18:06:54 +00:00
Daniel Stenberg
f425a25c98 Modified the gmtime_r check to not check for it until the "check for a working
one" is made, and only if that test runs ok we define it as present. Unless
crosscompiling, since then we use the former AC_CHECK_FUNCS method.
2005-05-16 15:09:26 +00:00
Daniel Stenberg
aaace2e802 define GMTIME_R to 0 if not working 2005-05-16 14:53:48 +00:00
Daniel Stenberg
3f16d9fbc9 attempt to detect a bad (as in HPUX 10.20 bad) gmtime_r function 2005-05-16 14:40:10 +00:00
Daniel Stenberg
3afc57bab8 start working on 7.14.1 2005-05-16 13:27:41 +00:00
160 changed files with 5801 additions and 2039 deletions

242
CHANGES
View File

@@ -7,6 +7,248 @@
Changelog Changelog
Version 7.14.1 (1 September 2005)
Daniel (29 August 2005)
- Kevin Lussier pointed out a problem with curllib.dsp and how to fix it.
- Igor Polyakov fixed a rather nasty problem with the threaded name resolver
for Windows, that could lead to an Access Violation when the multi interface
was used due to an issue with how the resolver thread was and was not
terminated.
- Simon Josefsson brought a patch that allows curl to get built to use GNU GSS
instead of MIT/Heimdal for GSS capabilities.
Daniel (24 August 2005)
- Toby Peterson added CURLOPT_IGNORE_CONTENT_LENGTH to the library, accessible
from the command line tool with --ignore-content-length. This will make it
easier to download files from Apache 1.x (and similar) servers that are
still having problems serving files larger than 2 or 4 GB. When this option
is enabled, curl will simply have to wait for the server to close the
connection to signal end of transfer. I wrote test case 269 that runs a
simple test to verify that this works.
- (Trying hard to exclude emotions now.) valgrind version 3 suddenly renamed
the --logfile command line option to --log-file, and thus the test script
valgrind autodetection now has yet another version check to do and then it
alters the valgrind command line accordingly.
- Fixed CA cert verification using GnuTLS with the default bundle, which
previously failed due to GnuTLS not allowing x509 v1 CA certs by default.
Ralph Mitchell reported.
Daniel (19 August 2005)
- Norbert Novotny had problems with FTPS and he helped me work out a patch
that made curl run fine in his end. The key was to make sure we do the
SSL/TLS negotiation immediately after the TCP connect is done and not after
a few other commands have been sent like we did previously. I don't consider
this change necessary to obey the standards, I think this server is pickier
than what the specs allow it to be, but I can't see how this modified
libcurl code can add any problems to those who are interpreting the
standards more liberally.
Daniel (17 August 2005)
- Jeff Pohlmeyer found out that if you ask libcurl to load a cookiefile (with
CURLOPT_COOKIEFILE), add a cookie (with CURLOPT_COOKIELIST), tell it to
write the result to a given cookie jar and then never actually call
curl_easy_perform() - the given file(s) to read was never read but the
output file was written and thus it caused a "funny" result.
- While doing some tests for the bug above, I noticed that Firefox generates
large numbers (for the expire time) in the cookies.txt file and libcurl
didn't treat them properly. Now it does.
Daniel (15 August 2005)
- Added more verbose "warning" messages to the curl client for cases where it
fails to open/read files etc to help users diagnose why it doesn't do what
you'd expect it to. Converted lots of old messages to use the new generic
function I wrote for this purpose.
Daniel (13 August 2005)
- James Bursa identified a libcurl HTTP bug and a good way to repeat it. If a
site responds with bad HTTP response that doesn't contain any header at all,
only a response body, and the write callback returns 0 to abort the
transfer, it didn't have any real effect but the write callback would be
called once more anyway.
Daniel (12 August 2005)
- Based on Richard Clayton's reports, I found out that using curl -d @filename
when 'filename' was not possible to access made curl use a GET request
instead.
- The time condition illegal syntax warning is now inhibited if -s is used.
Daniel (10 August 2005)
- Mario Schroeder found out that one of the debug callbacks calls that regards
SSL data with the CURLINFO_TEXT type claimed that the data was one byte
larger than it actually is, thus falsely telling the application that the
terminating zero was part of the data.
Daniel (9 August 2005)
- Christopher R. Palmer fixed the offsets used for date parsings when the time
zone name of a daylight savings time was used. For example, PDT vs PDS. This
flaw was introduced with the new date parser (11 sep 2004 - 7.12.2).
Fortunately, no web server or cookie string etc should be using such time
zone names thus limiting the effect of this bug.
Daniel (8 August 2005)
- Jon Grubbs filed bug report #1249962 which identified a problem with NTLM on
a HTTP proxy if an FTP URL was given. libcurl now properly switches to pure
HTTP internally when an HTTP proxy is used, even for FTP URLs. The problem
would also occur with other multi-pass auth methods.
Daniel (7 August 2005)
- When curl is built with GnuTLS, curl-config didn't include "SSL" when
--features was used.
Daniel (28 July 2005)
- If any of the options CURLOPT_HTTPGET, CURLOPT_POST and CURLOPT_HTTPPOST is
set to 1, CURLOPT_NOBODY will now automatically be set to 0.
Daniel (27 July 2005)
- Dan Fandrich changes over the last week: fixed numerous minor configure
option parsing flaws: --without-gnutls, --without-spnego --without-gssapi
and --without-krb4. Spellfixed several error messages.
- Peteris Krumins added CURLOPT_COOKIELIST and CURLINFO_COOKIELIST, which is a
simple interface to extracting and setting cookies in libcurl's internal
"cookie jar". See the new cookie_interface.c example code.
Daniel (13 July 2005)
- Diego Casorran provided patches to make curl build fine on Amiga again.
Daniel (12 July 2005)
- Adrian Schuur added trailer support in the chunked encoding stream. The
trailer is then sent to the normal header callback/stream. I wrote up test
case 266 to verify the basic functionality. Do note that test case 34
contains a flawed chunked encoding stream that still works the same.
Daniel (5 July 2005)
- Gisle Vanem came up with a nice little work-around for bug #1230118. It
seems the Windows (MSVC) libc time functions may return data one hour off if
TZ is not set and automatic DST adjustment is enabled. This made
curl_getdate() return wrong value, and it also concerned internal cookie
expirations etc.
Daniel (4 July 2005)
- Andrew Bushnell provided enough info for me to tell that we badly needed to
fix the CONNECT authentication code with multi-pass auth methods (such as
NTLM) as it didn't previously properly ignore response-bodies - in fact it
stopped reading after all response headers had been received. This could
lead to libcurl sending the next request and reading the body from the first
request as response to the second request. (I also renamed the function,
which wasn't strictly necessary but...)
The best fix would to once and for all make the CONNECT code use the
ordinary request sending/receiving code, treating it as any ordinary request
instead of the special-purpose function we have now. It should make it
better for multi-interface too. And possibly lead to less code...
Added test case 265 for this. It doesn't work as a _really_ good test case
since the test proxy is too stupid, but the test case helps when running the
debugger to verify.
Daniel (30 June 2005)
- Dan Fandrich improved the configure script's ability to figure out what kind
of strerror_r() API that is used when cross-compiling. If __GLIB__ is
defined, it assumes the glibc API. If not, it issues a notice as before that
the user needs to manually edit lib/config.h for this.
Daniel (23 June 2005)
- David Shaw's fix that unifies proxy string treatment so that a proxy given
with CURLOPT_PROXY can use a http:// prefix and user + password. The user
and password fields are now also URL decoded properly. Test case 264 added
to verify.
Daniel (22 June 2005)
- David Shaw updated libcurl.m4
Daniel (14 June 2005)
- Gisle Vanem fixed a potential thread handle leak. Bug report #1216500.
Comment in http://curl.haxx.se/mail/lib-2005-06/0059.html
Daniel (13 June 2005)
- Made buildconf run libtoolize in the ares dir too (inspired by Tupone's
reverted patch).
Daniel (9 June 2005)
- Incorporated Tupone's findtool fix in buildconf (slightly edited)
- Incorporated Tupone's head -n fix in buildconf.
Daniel (8 June 2005)
- Reverted Tupone's patch again, it broke numerous autobuilds. Let's apply it
in pieces, one by one and see what we need to adjust to work all over.
Daniel (6 June 2005)
- Tupone Alfredo fixed three problems in buildconf:
1) findtool does look per tool in PATH and think ./perl is the perl
executable, while is just a local directory (I have . in the PATH)
2) I got several warning for head -1 deprecated in favour of head -n 1
3) ares directory is missing some file (missing is missing :-) ) because
automake and friends is not run.
Daniel (3 June 2005)
- Added docs/libcurl/getinfo-times, based on feedback from 'Edi':
http://curl.haxx.se/feedback/display.cgi?id=11178325798299&support=yes
- Andres Garcia provided yet another text mode patch for several test cases so
that they do text comparisions better on Windows (newline-wise).
Daniel (1 June 2005)
- The configure check for c-ares now adds the cares lib before the other libs,
to make it build fine with mingw. Inspired by Tupone Alfredo's bug report
(and patch) #1212940
Daniel (31 May 2005)
- Todd Kulesza reported a flaw in the proxy option, since a numerical IPv6
address was not possible to use. It is now, but requires it written
RFC2732-style, within brackets - which incidently is how you enter numerical
IPv6 addresses in URLs. Test case 263 added to verify.
Daniel (30 May 2005)
- Eric Cooper reported about a problem with HTTP servers that responds with
binary zeroes within the headers. They confused libcurl to do wrong so the
downloaded headers become incomplete. The fix is now verified with test case
262.
Daniel (25 May 2005)
- Fixed problems with the test suite, and in particular the FTP test cases
since it previously was failing every now and then in a nonsense manner.
- --trace-time now outputs the full microsecond, all 6 digits.
Daniel (24 May 2005)
- Andres Garcia provided a text mode patch for several test cases so that they
do text comparisions better on Windows (newline-wise).
- Any 2xx response (and not just 200) is now considered a fine response to
TYPE, as some servers obviously sends a 226 there. Added test case 261 to
verify. Based on a question/report by Georg Wicherski.
Daniel (20 May 2005)
- Improved runtests.pl to allow stdout tests to be mode=text as well, just
as file comparisons already supports. Added this info to the FILEFORMAT
docs.
Daniel (18 May 2005)
- John McGowan identified a problem in bug report #1204435 with malformed URLs
like "http://somehost?data" as it added a slash too much in the request
("GET /?data/"...). Added test case 260 to verify.
- The configure check for strerror_r() failed to detect the proper API at
times, like on HP-UX 10.20. Then lib/strerror.c badly assumed the glibc
version if the posix define wasn't set (since it _had_ found a strerror_r).
Daniel (16 May 2005)
- The gmtime_r() function in HP-UX 10.20 is broken. About 13 test cases fail
due to this. There's now a configure check that attempts to detect the bad
function and not use it on such systems.
Version 7.14.0 (16 May 2005) Version 7.14.0 (16 May 2005)
Daniel (13 May 2005) Daniel (13 May 2005)

View File

@@ -200,9 +200,21 @@ netware:
$(MAKE) -C lib -f Makefile.netware $(MAKE) -C lib -f Makefile.netware
$(MAKE) -C src -f Makefile.netware $(MAKE) -C src -f Makefile.netware
netware-ares:
$(MAKE) -C lib -f Makefile.netware WITH_ARES=1
$(MAKE) -C src -f Makefile.netware WITH_ARES=1
netware-ssl: netware-ssl:
$(MAKE) -C lib -f Makefile.netware SSL=1 $(MAKE) -C lib -f Makefile.netware WITH_SSL=1
$(MAKE) -C src -f Makefile.netware SSL=1 $(MAKE) -C src -f Makefile.netware WITH_SSL=1
netware-ssl-zlib:
$(MAKE) -C lib -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
$(MAKE) -C src -f Makefile.netware WITH_SSL=1 WITH_ZLIB=1
netware-zlib:
$(MAKE) -C lib -f Makefile.netware WITH_ZLIB=1
$(MAKE) -C src -f Makefile.netware WITH_ZLIB=1
netware-clean: netware-clean:
$(MAKE) -C lib -f Makefile.netware clean $(MAKE) -C lib -f Makefile.netware clean

37
README
View File

@@ -26,50 +26,37 @@ CONTACT
If you have problems, questions, ideas or suggestions, please contact us If you have problems, questions, ideas or suggestions, please contact us
by posting to a suitable mailing list. See http://curl.haxx.se/mail/ by posting to a suitable mailing list. See http://curl.haxx.se/mail/
Many major contributors to the project are listed in the THANKS document. All contributors to the project are listed in the THANKS document.
WEB SITE WEB SITE
Visit the curl web site or mirrors for the latest news: Visit the curl web site or mirrors for the latest news and downloads:
Sweden -- http://curl.haxx.se/ Sweden -- http://curl.haxx.se/
Australia -- http://curl.planetmirror.com/ Australia -- http://curl.planetmirror.com/
Austria -- http://curl.gds.tuwien.ac.at/ Austria -- http://curl.gds.tuwien.ac.at/
Canada -- http://curl.meulie.net/
Denmark -- http://curl.cofman.dk/ Denmark -- http://curl.cofman.dk/
Estonia -- http://curl.wildyou.net/ Estonia -- http://curl.wildyou.net/
France -- http://curl.mirror.internet.tp/ France -- http://curl.mirror.internet.tp/
Germany -- http://curl.kgt.org/ Germany -- http://curl.miscellaneousmirror.org/
Germany -- http://curl.mirror.at.stealer.net/ Germany -- http://curl.mirror.at.stealer.net/
Germany -- http://curl.mirroring.de/
Germany -- http://curl.mons-new-media.de/
Germany -- http://curl.netmirror.org/ Germany -- http://curl.netmirror.org/
Russia -- http://curl.tsuren.net/ Russia -- http://curl.tsuren.net/
Taiwan -- http://curl.cs.pu.edu.tw/ Taiwan -- http://curl.cs.pu.edu.tw/
Thailand -- http://curl.siamu.ac.th/ Thailand -- http://curl.siamu.ac.th/
US (AZ) -- http://curl.islandofpoker.com/
US (CA) -- http://curl.mirror.redwire.net/ US (CA) -- http://curl.mirror.redwire.net/
US (CA) -- http://curl.mirrormonster.com/ US (CA) -- http://curl.mirrormonster.com/
US (CA) -- http://curl.signal42.com/ US (CA) -- http://curl.signal42.com/
US (CA) -- http://curl.tolix.org/
US (CA) -- http://curl.webhosting76.com/
US (TX) -- http://curl.109k.com/ US (TX) -- http://curl.109k.com/
US (TX) -- http://curl.mirrors.cyberservers.net/
DOWNLOAD US (TX) -- http://curl.seekmeup.com/
US (TX) -- http://curl.hostingzero.com/
The official download mirror sites are:
Australia -- http://curl.planetmirror.com/download.html
Austria -- http://curl.gds.tuwien.ac.at/download.html
Estonia -- http://curl.wildyou.net/download.html
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
Germany -- http://curl.mirror.at.stealer.net/download.html
Germany -- http://curl.netmirror.org/download.html
Germany -- http://www.mirrorspace.org/curl/
Hongkong -- http://www.execve.net/curl/
Russia -- http://curl.tsuren.net/download.html
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
Sweden -- http://cool.haxx.se/curl/
Taiwan -- http://curl.cs.pu.edu.tw/download.html
Thailand -- http://curl.siamu.ac.th/download.html
US (CA) -- http://curl.mirror.redwire.net/download.html
US (CA) -- http://curl.mirrormonster.com/download.html
US (CA) -- http://curl.signal42.com/download.html
US (TX) -- http://curl.109k.com/download.html
CVS CVS

View File

@@ -1,58 +1,74 @@
Curl and libcurl 7.14.0 Curl and libcurl 7.14.1
Public curl release number: 88 Public curl release number: 89
Releases counted from the very beginning: 115 Releases counted from the very beginning: 116
Available command line options: 107 Available command line options: 108
Available curl_easy_setopt() options: 122 Available curl_easy_setopt() options: 123
Number of public functions in libcurl: 46 Number of public functions in libcurl: 46
Amount of public web site mirrors: 23 Amount of public web site mirrors: 25
Number of known libcurl bindings: 31 Number of known libcurl bindings: 31
Number of contributors: 437 Number of contributors: 447
This release includes the following changes: This release includes the following changes:
o modified default HTTP request headers o GNU GSS support
o curl --trace-time added for time stamping trace logs o --ignore-content-length and CURLOPT_IGNORE_CONTENT_LENGTH added
o curl now respects the SSL_CERT_DIR and SSL_CERT_PATH environment variables o negotiates data connection SSL earlier when doing FTPS with PASV
o more search paths for curl's default .curlrc config file check o CURLOPT_COOKIELIST and CURLINFO_COOKIELIST
o GnuTLS support, use configure --with-gnutls. Work on this was sponsored o trailer support for chunked encoded data streams
by The Written Word. o -x/CURL_PROXY strings may now contain user+password
o --trace-time now outputs the full microsecond, all 6 digits
This release includes the following bugfixes: This release includes the following bugfixes:
o uses select() instead of poll() even on Mac OS X 10.4 o MSVC build problem with the DSP file
o reconnected proxy use with NTLM auth on the same handle o windows threaded resolver access violation with multi interface
o warns about bad -z date syntax o test suite works with valgrind 3
o docs/THANKS now contains all known contributors o CA cert verification with GnuTLS builds
o builds out-of-the-box on (presumably ipv6-enabled) AIX 4.3 hosts o handles expiry times in cookie files that go beyond 32 bits in size
o curl --head could wrongly complain on bad chunked-encoding o several client problems with files, such as doing -d @file when the file
o --interface SIGSEGVed on a bad address isn't readable now gets a warning displayed
o kill the HTTPS server better when stopping the test suite o write callback abort didn't always "take"
o builds fine with VS2005 on x64 o the curl -z "bad syntax" warning is now hidden when -s is used
o auth fix for HTTP redirects and .netrc usage o curl -d @nonexisting no longer makes a GET
o FTP uploads show the progress meter easier o minor debug callback data size
o MSVC makefile fixes for static libcurl builds o date parsing of dates including daylight savings time zone names
o configure fix for static libcurl build on Windows o using NTLM over proxy with an FTP URL
o --retry-delay o curl-config --features now displays SSL when built with GnuTLS too
o POST with read callback now uses Expect: 100-continue o CURLOPT_HTTPGET, CURLOPT_POST and CURLOPT_HTTPPOST reset CURLOPT_NOBODY
o CURLOPT_PORT didn't actually use the set port number o builds fine on AmigaOS again
o HTTP 304 response with Content-Length: header o corrected date parsing on Windows with auto-DST-adjust enabled
o time-conditioned FTP uploads o treats CONNECT 407 responses with bodies better during Digest/NTLM auth
o improved strerror_r() API guessing when cross-compiling
o debug builds work on Tru64
o improved libcurl.m4
o possible memory leak in windows name resolves
o c-ares enabled build with mingw
o proxy host set with numerical IPv6 address
o better treatment of binary zeroes in HTTP response headers
o fixed the notorious FTP server failure in the test suite
o better checking of text output in the test suite on windows
o FTP servers' TYPE command response check made less strict
o URL-without-slash as in http://somehost?data
o strerror_r() configure check for HP-UX 10.20 (and others)
o time parse work-around on HP-UX 10.20 since its gmtime_r() is broken
Other curl-related news since the previous public release: Other curl-related news since the previous public release:
o http://curl.mirroring.de/ is a new german curl mirror o cURLpp 0.5.2 was released at http://rrette.com/curlpp.html
o pycurl 7.13.2: http://pycurl.sf.net/ o Rexx/CURL 1.3 was released at http://rexxcurl.sf.net/
o TclCurl 0.13.2: http://personal1.iddeo.es/andresgarci/tclcurl/english/ o http://curl.miscellaneousmirror.org is a new German curl mirror
o http://curl.webhosting76.com/ is a new US curl mirror o LuaCURL by Alexander Marinov at http://luacurl.luaforge.net/
o http://curl.meulie.net/ is a new Canadian curl mirror o http://curl.hostingzero.com/ is a new US curl mirror
o ocurl 0.2.1 was released at http://sourceforge.net/projects/ocurl
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:
Christophe Legry, Cory Nelson, Gisle Vanem, Dan Fandrich, Toshiyuki Maezawa, John McGowan, Georg Wicherski, Andres Garcia, Eric Cooper, Todd Kulesza,
Olivier, Andres Garcia, Dave Dribin, Alex Suykov, Cory Nelson, Fred New, Tupone Alfredo, Gisle Vanem, David Shaw, Andrew Bushnell, Dan Fandrich,
Paul Moore, Alexander Zhuravlev, Bryan Henderson, Jeremy Brown, Allan, Adrian Schuur, Diego Casorran, Peteris Krumins, Jon Grubbs, Christopher
Grigory Entin R. Palmer, Mario Schroeder, Richard Clayton, James Bursa, Jeff Pohlmeyer,
Norbert Novotny, Toby Peterson, Simon Josefsson, Igor Polyakov, Kevin Lussier
Thanks! (and sorry if I forgot to mention someone) Thanks! (and sorry if I forgot to mention someone)

View File

@@ -1,40 +1,12 @@
Issues not sorted in any particular order. Issues not sorted in any particular order.
To get fixed in 7.14.0 (planned release: May/June 2005) To get fixed in 7.14.1 (planned release: August 2005)
====================== ======================
- Make the tests run better on more platforms. To get fixed in 7.14.2 (planned release: October 2005)
To get fixed in 7.14.1 (planned release: June 2005)
====================== ======================
58 - Fix KNOWN_BUGS #19: "FTP 3rd party transfers with the multi interface 60 - CONNECT 407 responses that kills the connection
doesn't work"
47 - Peter Sylvester's patch for SRP on the TLS layer 63 -
Awaits OpenSSL support for this, no need to support this in libcurl before
there's an OpenSSL release that does it.
To get fixed in 7.15.0
======================
55 - Add a function to the multi interface that gets file descriptors, as an
alternative to the curl_multi_fdset(). This is necessary to allow apps to
properly avoid the FD_SETSIZE problem.
56 - Make curl_easy_perform() a wrapper-function that simply creates a multi
handle, adds the easy handle to it, runs curl_multi_perform() until the
transfer is done, then detach the easy handle, destroy the multi handle
and return the easy handle's return code. This will thus make everything
internally use and assume the multi interface. The select()-loop should
use the new function from (55).
To get fixed in 7.16.0
======================
57 - Add an interface to libcurl for getting and setting cookies from an easy
handle. One idea: http://curl.haxx.se/mail/lib-2004-12/0195.html the
older idea: http://curl.haxx.se/dev/COOKIES. We need to settle on some
middle ground I guess.
60 -

View File

@@ -192,8 +192,7 @@ AC_DEFUN([TYPE_SOCKLEN_T],
]) ])
dnl Check for in_addr_t: it is used to receive the return code of inet_addr() dnl Check for in_addr_t: it is used to receive the return code of inet_addr()
dnl and a few other things. If not found, we set it to unsigned int, as even dnl and a few other things.
dnl 64-bit implementations use to set it to a 32-bit type.
AC_DEFUN([TYPE_IN_ADDR_T], AC_DEFUN([TYPE_IN_ADDR_T],
[ [
AC_CHECK_TYPE([in_addr_t], ,[ AC_CHECK_TYPE([in_addr_t], ,[
@@ -417,34 +416,25 @@ dnl int strerror_r(int errnum, char *buf, size_t n);
dnl dnl
AC_DEFUN([CURL_CHECK_STRERROR_R], AC_DEFUN([CURL_CHECK_STRERROR_R],
[ [
dnl determine of strerror_r is present AC_CHECK_FUNCS(strerror_r)
AC_CHECK_FUNCS(strerror_r,[
if test "x$ac_cv_func_strerror_r" = "xyes"; then
AC_MSG_CHECKING(whether strerror_r is declared) AC_MSG_CHECKING(whether strerror_r is declared)
AC_EGREP_CPP(strerror_r,[ AC_EGREP_CPP(strerror_r,[
#include <string.h>],[ #include <string.h>],[
strerror_r="yes"
AC_MSG_RESULT(yes)],[ AC_MSG_RESULT(yes)],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING(whether strerror_r with -D_THREAD_SAFE is declared) AC_MSG_CHECKING(whether strerror_r with -D_REENTRANT is declared)
AC_EGREP_CPP(strerror_r,[ AC_EGREP_CPP(strerror_r,[
#define _THREAD_SAFE #define _REENTRANT
#include <string.h>],[ #include <string.h>],[
strerror_r="yes" CPPFLAGS="-D_REENTRANT $CPPFLAGS"
CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS"
AC_MSG_RESULT(yes)], AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no))])]) AC_MSG_RESULT(no)
AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
if test "x$strerror_r" = "xyes"; then ) dnl with _THREAD_SAFE
]) dnl plain cpp for it
dnl check if strerror_r is properly declared in the headers
AC_CHECK_DECL(strerror_r, ,
AC_DEFINE(HAVE_NO_STRERROR_R_DECL, 1, [we have no strerror_r() proto])
,
[#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
])
dnl determine if this strerror_r() is glibc or POSIX dnl determine if this strerror_r() is glibc or POSIX
AC_MSG_CHECKING([for a glibc strerror_r API]) AC_MSG_CHECKING([for a glibc strerror_r API])
@@ -466,8 +456,20 @@ main () {
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()]) AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
AC_MSG_RESULT([yes]), AC_MSG_RESULT([yes]),
AC_MSG_RESULT([no]), AC_MSG_RESULT([no]),
dnl cross-compiling!
AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!]) dnl Use an inferior method of strerror_r detection while cross-compiling
AC_EGREP_CPP(yes, [
#include <features.h>
#ifdef __GLIBC__
yes
#endif
],
dnl looks like glibc, so assume a glibc-style strerror_r()
GLIBC_STRERROR_R="1"
AC_DEFINE(HAVE_GLIBC_STRERROR_R, 1, [we have a glibc-style strerror_r()])
AC_MSG_RESULT([yes]),
AC_MSG_NOTICE([cannot determine strerror_r() style: edit lib/config.h manually!])
) dnl while cross-compiling
) )
if test -z "$GLIBC_STRERROR_R"; then if test -z "$GLIBC_STRERROR_R"; then
@@ -756,15 +758,18 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
fi fi
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
dnl on i686-Linux as it gives us heaps with false positives dnl on i686-Linux as it gives us heaps with false positives.
dnl Also, on gcc 4.0.X it is totally unbearable and complains all
dnl over making it unusable for generic purposes. Let's not use it.
if test "$gccnum" -ge "303"; then if test "$gccnum" -ge "303"; then
dnl gcc 3.3 and later dnl gcc 3.3 and later
WARN="$WARN -Wendif-labels -Wstrict-prototypes" WARN="$WARN -Wendif-labels -Wstrict-prototypes"
fi fi
if test "$gccnum" -ge "304"; then if test "$gccnum" -ge "304"; then
# try -Wunreachable-code on gcc 3.4 # try these on gcc 3.4
WARN="$WARN -Wunreachable-code" WARN="$WARN -Wdeclaration-after-statement"
fi fi
for flag in $CPPFLAGS; do for flag in $CPPFLAGS; do

View File

@@ -1,5 +1,41 @@
Changelog for the c-ares project Changelog for the c-ares project
Version 1.3.0 (August 29, 2004)
* August 21
- Alfredo Tupone provided a fix for the Windows code in get_iphlpapi_dns_info()
when getting the DNS server etc.
* June 19
- Added some checks for the addrinfo structure.
* June 2
- William Ahern:
Make UDP sockets non-blocking. I've confirmed that at least on Linux 2.4 a
read event can come back from poll() on a valid SOCK_DGRAM socket but
recv(2) will still block. This patch doesn't ignore EAGAIN in
read_udp_packets(), though maybe it should. (This patch was edited by Daniel
Stenberg and a new configure test was added (imported from curl's configure)
to properly detect what non-blocking socket approach to use.)
I'm not quite sure how this was happening, but I've been seeing PTR queries
which seem to return empty responses. At least, they were empty when calling
ares_expand_name() on the record. Here's a patch which guarantees to
NUL-terminate the expanded name. The old behavior failed to NUL-terminate if
len was 0, and this was causing strlen() to run past the end of the buffer
after calling ares_expand_name() and getting ARES_SUCCESS as the return
value. If q is not greater than *s then it's equal and *s is always
allocated with at least one byte.
* May 16
- Added ares_getnameinfo which mimics the getnameinfo API (another feature
that could use testing).
* May 14 * May 14
- Added an inet_ntop function from BIND for systems that do not have it. - Added an inet_ntop function from BIND for systems that do not have it.

View File

@@ -15,7 +15,7 @@ EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \
$(MSVCFILES) AUTHORS $(MSVCFILES) AUTHORS
VER=-version-info 0:0:0 VER=-version-info 1: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

@@ -1,17 +1,18 @@
CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c \ CSOURCES = ares_fds.c ares_process.c ares_free_hostent.c ares_query.c \
ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \ ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \
ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c \ ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c \
ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c \ ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c \
ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c \ ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c \
windows_port.c ares_expand_string.c ares_parse_ptr_reply.c \ windows_port.c ares_expand_string.c ares_parse_ptr_reply.c \
ares_parse_aaaa_reply.c inet_net_pton.c bitncmp.c inet_ntop.c ares_parse_aaaa_reply.c ares_getnameinfo.c inet_net_pton.c bitncmp.c \
inet_ntop.c
HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h nameser.h \
inet_net_pton.h ares_ipv6.h bitncmp.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
MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \ MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \
ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \ ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3 \
ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \ ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3 \
ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \ ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3 \
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3 \
ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 ares_getnameinfo.3

View File

@@ -89,7 +89,7 @@ LDFLAGS = -T
AR = ar AR = ar
ARFLAGS = -cq ARFLAGS = -cq
CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing CFLAGS += -fno-builtin -fpack-struct -fpcc-struct-return -fno-strict-aliasing
CFLAGS += -Wall -Wno-format # -pedantic 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
@@ -104,7 +104,7 @@ 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 -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__ # CFLAGS += -D__ANSIC__
else else
@@ -304,6 +304,8 @@ config.h: Makefile.netware
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ @echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_PF_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_IN6_ADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@ @echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@ @echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
ifdef NW_WINSOCK ifdef NW_WINSOCK

View File

@@ -1,148 +1,291 @@
dnl Check for how to set a socket to non-blocking state. There seems to exist
dnl We create a function for detecting which compiler we use and then set as dnl four known different ways, with the one used almost everywhere being POSIX
dnl pendantic compiler options as possible for that particular compiler. The dnl and XPG3, while the other different ways for different systems (old BSD,
dnl options are only used for debug-builds. dnl Windows and Amiga).
dnl
dnl This is a copy of the original found in curl's configure script. Don't dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
dnl modify this one, edit the one in curl and copy it back here when that one dnl O_NONBLOCK define is found but does not work. This condition is attempted
dnl is changed. dnl to get caught in this script by using an excessive number of #ifdefs...
dnl
AC_DEFUN([CURL_CC_DEBUG_OPTS], AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
[ [
if test "$GCC" = "yes"; then AC_MSG_CHECKING([non-blocking sockets style])
dnl figure out gcc version! AC_TRY_COMPILE([
AC_MSG_CHECKING([gcc version]) /* headers for O_NONBLOCK test */
gccver=`$CC -dumpversion` #include <sys/types.h>
num1=`echo $gccver | cut -d . -f1` #include <unistd.h>
num2=`echo $gccver | cut -d . -f2` #include <fcntl.h>
gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null` ],[
AC_MSG_RESULT($gccver) /* try to compile O_NONBLOCK */
AC_MSG_CHECKING([if this is icc in disguise]) #if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER], # if defined(__SVR4) || defined(__srv4__)
dnl action if the text is found, this it has not been replaced by the # define PLATFORM_SOLARIS
dnl cpp # else
ICC="no" # define PLATFORM_SUNOS4
AC_MSG_RESULT([no]), # endif
dnl the text was not found, it was replaced by the cpp #endif
ICC="yes" #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4)
AC_MSG_RESULT([yes]) # define PLATFORM_AIX_V3
) #endif
if test "$ICC" = "yes"; then #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
dnl this is icc, not gcc. #error "O_NONBLOCK does not work on this platform"
#endif
dnl ICC warnings we ignore: int socket;
dnl * 279 warns on static conditions in while expressions int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
dnl * 269 warns on our "%Od" printf formatters for curl_off_t output: ],[
dnl "invalid format string conversion" dnl the O_NONBLOCK test was fine
nonblock="O_NONBLOCK"
WARN="-wd279,269" AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])
],[
if test "$gccnum" -gt "600"; then dnl the code was bad, try a different program now, test 2
dnl icc 6.0 and older doesn't have the -Wall flag
WARN="-Wall $WARN" AC_TRY_COMPILE([
fi /* headers for FIONBIO test */
else dnl $ICC = yes #include <unistd.h>
dnl #include <stropts.h>
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare" ],[
/* FIONBIO source test (old-style unix) */
dnl -Wcast-align is a bit too annoying ;-) int socket;
int flags = ioctl(socket, FIONBIO, &flags);
if test "$gccnum" -ge "296"; then ],[
dnl gcc 2.96 or later dnl FIONBIO test was good
WARN="$WARN -Wfloat-equal" nonblock="FIONBIO"
AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
if test "$gccnum" -gt "296"; then ],[
dnl this option does not exist in 2.96 dnl FIONBIO test was also bad
WARN="$WARN -Wno-format-nonliteral" dnl the code was bad, try a different program now, test 3
fi
AC_TRY_COMPILE([
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on /* headers for ioctlsocket test (cygwin?) */
dnl on i686-Linux as it gives us heaps with false positives #include <windows.h>
if test "$gccnum" -ge "303"; then ],[
dnl gcc 3.3 and later /* ioctlsocket source code */
WARN="$WARN -Wendif-labels -Wstrict-prototypes" int socket;
fi unsigned long flags = ioctlsocket(socket, FIONBIO, &flags);
fi ],[
dnl ioctlsocket test was good
for flag in $CPPFLAGS; do nonblock="ioctlsocket"
case "$flag" in AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
-I*) ],[
dnl include path dnl ioctlsocket didnt compile!, go to test 4
add=`echo $flag | sed 's/^-I/-isystem /g'`
WARN="$WARN $add" AC_TRY_LINK([
;; /* headers for IoctlSocket test (Amiga?) */
esac #include <sys/ioctl.h>
done ],[
/* IoctlSocket source code */
fi dnl $ICC = no int socket;
int flags = IoctlSocket(socket, FIONBIO, (long)1);
CFLAGS="$CFLAGS $WARN" ],[
dnl ioctlsocket test was good
fi dnl $GCC = yes nonblock="IoctlSocket"
AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
dnl strip off optimizer flags ],[
NEWFLAGS="" dnl Ioctlsocket didnt compile, do test 5!
for flag in $CFLAGS; do AC_TRY_COMPILE([
case "$flag" in /* headers for SO_NONBLOCK test (BeOS) */
-O*) #include <socket.h>
dnl echo "cut off $flag" ],[
;; /* SO_NONBLOCK source code */
*) long b = 1;
NEWFLAGS="$NEWFLAGS $flag" int socket;
;; int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
esac ],[
done dnl the SO_NONBLOCK test was good
CFLAGS=$NEWFLAGS nonblock="SO_NONBLOCK"
AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])
]) dnl end of AC_DEFUN() ],[
dnl test 5 didnt compile!
nonblock="nada"
dnl This macro determines if the specified struct exists in the specified file AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
dnl Syntax: ])
dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found]) dnl end of fifth test
AC_DEFUN([CARES_CHECK_STRUCT], [ ])
AC_MSG_CHECKING([for struct $2]) dnl end of forth test
AC_TRY_COMPILE([$1],
[ ])
struct $2 struct_instance; dnl end of third test
], ac_struct="yes", ac_found="no")
if test "$ac_struct" = "yes" ; then ])
AC_MSG_RESULT(yes) dnl end of second test
$3
else ])
AC_MSG_RESULT(no) dnl end of non-blocking try-compile test
$4 AC_MSG_RESULT($nonblock)
fi
]) if test "$nonblock" = "nada"; then
AC_MSG_WARN([non-block sockets disabled])
dnl This macro determines if the specified constant exists in the specified file fi
dnl Syntax: ])
dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found])
dnl We create a function for detecting which compiler we use and then set as
AC_DEFUN([CARES_CHECK_CONSTANT], [ dnl pendantic compiler options as possible for that particular compiler. The
AC_MSG_CHECKING([for $2]) dnl options are only used for debug-builds.
AC_EGREP_CPP(VARIABLEWASDEFINED,
[ dnl This is a copy of the original found in curl's configure script. Don't
$1 dnl modify this one, edit the one in curl and copy it back here when that one
dnl is changed.
#ifdef $2
VARIABLEWASDEFINED AC_DEFUN([CURL_CC_DEBUG_OPTS],
#else [
NJET if test "$GCC" = "yes"; then
#endif
], ac_constant="yes", ac_constant="no" dnl figure out gcc version!
) AC_MSG_CHECKING([gcc version])
if test "$ac_constant" = "yes" ; then gccver=`$CC -dumpversion`
AC_MSG_RESULT(yes) num1=`echo $gccver | cut -d . -f1`
$3 num2=`echo $gccver | cut -d . -f2`
else gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
AC_MSG_RESULT(no) AC_MSG_RESULT($gccver)
$4
fi AC_MSG_CHECKING([if this is icc in disguise])
]) AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
dnl action if the text is found, this it has not been replaced by the
dnl cpp
ICC="no"
AC_MSG_RESULT([no]),
dnl the text was not found, it was replaced by the cpp
ICC="yes"
AC_MSG_RESULT([yes])
)
if test "$ICC" = "yes"; then
dnl this is icc, not gcc.
dnl ICC warnings we ignore:
dnl * 279 warns on static conditions in while expressions
dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
dnl "invalid format string conversion"
WARN="-wd279,269"
if test "$gccnum" -gt "600"; then
dnl icc 6.0 and older doesn't have the -Wall flag
WARN="-Wall $WARN"
fi
else dnl $ICC = yes
dnl
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wundef -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare"
dnl -Wcast-align is a bit too annoying ;-)
if test "$gccnum" -ge "296"; then
dnl gcc 2.96 or later
WARN="$WARN -Wfloat-equal"
if test "$gccnum" -gt "296"; then
dnl this option does not exist in 2.96
WARN="$WARN -Wno-format-nonliteral"
fi
dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
dnl on i686-Linux as it gives us heaps with false positives
if test "$gccnum" -ge "303"; then
dnl gcc 3.3 and later
WARN="$WARN -Wendif-labels -Wstrict-prototypes"
fi
fi
for flag in $CPPFLAGS; do
case "$flag" in
-I*)
dnl include path
add=`echo $flag | sed 's/^-I/-isystem /g'`
WARN="$WARN $add"
;;
esac
done
fi dnl $ICC = no
CFLAGS="$CFLAGS $WARN"
fi dnl $GCC = yes
dnl strip off optimizer flags
NEWFLAGS=""
for flag in $CFLAGS; do
case "$flag" in
-O*)
dnl echo "cut off $flag"
;;
*)
NEWFLAGS="$NEWFLAGS $flag"
;;
esac
done
CFLAGS=$NEWFLAGS
]) dnl end of AC_DEFUN()
dnl This macro determines if the specified struct exists in the specified file
dnl Syntax:
dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found])
AC_DEFUN([CARES_CHECK_STRUCT], [
AC_MSG_CHECKING([for struct $2])
AC_TRY_COMPILE([$1],
[
struct $2 struct_instance;
], ac_struct="yes", ac_found="no")
if test "$ac_struct" = "yes" ; then
AC_MSG_RESULT(yes)
$3
else
AC_MSG_RESULT(no)
$4
fi
])
dnl This macro determins if the specified struct contains a specific member.
dnl Syntax:
dnl CARES_CHECK_STRUCT_MEMBER(headers, struct name, member name, if found, [if not found])
AC_DEFUN([CARES_CHECK_STRUCT_MEMBER], [
AC_MSG_CHECKING([if struct $2 has member $3])
AC_TRY_COMPILE([$1],
[
struct $2 struct_instance;
struct_instance.$3 = 0;
], ac_struct="yes", ac_found="no")
if test "$ac_struct" = "yes" ; then
AC_MSG_RESULT(yes)
$4
else
AC_MSG_RESULT(no)
$5
fi
])
dnl This macro determines if the specified constant exists in the specified file
dnl Syntax:
dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found])
AC_DEFUN([CARES_CHECK_CONSTANT], [
AC_MSG_CHECKING([for $2])
AC_EGREP_CPP(VARIABLEWASDEFINED,
[
$1
#ifdef $2
VARIABLEWASDEFINED
#else
NJET
#endif
], ac_constant="yes", ac_constant="no"
)
if test "$ac_constant" = "yes" ; then
AC_MSG_RESULT(yes)
$3
else
AC_MSG_RESULT(no)
$4
fi
])

View File

@@ -29,12 +29,14 @@
#if defined(WATT32) #if defined(WATT32)
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/socket.h>
#include <tcp.h> #include <tcp.h>
#elif defined(WIN32) #elif defined(WIN32)
#include <winsock.h> #include <winsock.h>
#include <windows.h> #include <windows.h>
#else #else
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/socket.h>
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
@@ -64,6 +66,9 @@ extern "C" {
#define ARES_EDESTRUCTION 16 #define ARES_EDESTRUCTION 16
#define ARES_EBADSTR 17 #define ARES_EBADSTR 17
/* ares_getnameinfo error codes */
#define ARES_EBADFLAGS 18
/* Flag values */ /* Flag values */
#define ARES_FLAG_USEVC (1 << 0) #define ARES_FLAG_USEVC (1 << 0)
#define ARES_FLAG_PRIMARY (1 << 1) #define ARES_FLAG_PRIMARY (1 << 1)
@@ -85,6 +90,24 @@ extern "C" {
#define ARES_OPT_DOMAINS (1 << 7) #define ARES_OPT_DOMAINS (1 << 7)
#define ARES_OPT_LOOKUPS (1 << 8) #define ARES_OPT_LOOKUPS (1 << 8)
/* Nameinfo flag values */
#define ARES_NI_NOFQDN (1 << 0)
#define ARES_NI_NUMERICHOST (1 << 1)
#define ARES_NI_NAMEREQD (1 << 2)
#define ARES_NI_NUMERICSERV (1 << 3)
#define ARES_NI_DGRAM (1 << 4)
#define ARES_NI_TCP 0
#define ARES_NI_UDP ARES_NI_DGRAM
#define ARES_NI_SCTP (1 << 5)
#define ARES_NI_DCCP (1 << 6)
#define ARES_NI_NUMERICSCOPE (1 << 7)
#define ARES_NI_LOOKUPHOST (1 << 8)
#define ARES_NI_LOOKUPSERVICE (1 << 9)
/* Reserved for future use */
#define ARES_NI_IDN (1 << 10)
#define ARES_NI_ALLOW_UNASSIGNED (1 << 11)
#define ARES_NI_USE_STD3_ASCII_RULES (1 << 12)
struct ares_options { struct ares_options {
int flags; int flags;
int timeout; int timeout;
@@ -101,12 +124,15 @@ struct ares_options {
struct hostent; struct hostent;
struct timeval; struct timeval;
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, unsigned char *abuf,
int alen); int alen);
typedef void (*ares_host_callback)(void *arg, int status, typedef void (*ares_host_callback)(void *arg, int status,
struct hostent *hostent); struct hostent *hostent);
typedef void (*ares_nameinfo_callback)(void *arg, int status,
char *node, char *service);
int ares_init(ares_channel *channelptr); int ares_init(ares_channel *channelptr);
int ares_init_options(ares_channel *channelptr, struct ares_options *options, int ares_init_options(ares_channel *channelptr, struct ares_options *options,
@@ -123,7 +149,9 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family,
ares_host_callback callback, void *arg); ares_host_callback callback, void *arg);
void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
int family, ares_host_callback callback, void *arg); int family, ares_host_callback callback, void *arg);
void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa,
socklen_t salen, int flags, ares_nameinfo_callback callback,
void *arg);
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds); int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds);
struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv, struct timeval *ares_timeout(ares_channel channel, struct timeval *maxtv,
struct timeval *tv); struct timeval *tv);

View File

@@ -106,6 +106,8 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
/* Nuke the trailing period if we wrote one. */ /* Nuke the trailing period if we wrote one. */
if (q > *s) if (q > *s)
*(q - 1) = 0; *(q - 1) = 0;
else
*q = 0; /* zero terminate */
return ARES_SUCCESS; return ARES_SUCCESS;
} }

View File

@@ -28,8 +28,8 @@ The
.I ares_free_hostent .I ares_free_hostent
function frees a function frees a
.B struct hostent .B struct hostent
allocated by one of the functions \fIares_parse_a_reply(3)\fP or allocated by one of the functions \fIares_parse_a_reply(3)\fP,
\fIares_parse_ptr_reply(3)\fP. \fIares_parse_aaaa_reply(3)\fP, or \fIares_parse_ptr_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
@@ -37,6 +37,7 @@ the callback functions for \fIares_gethostbyname(3)\fP or
host structures when the callback returns. host 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_ptr_reply (3) .BR ares_parse_ptr_reply (3)
.SH AUTHOR .SH AUTHOR
Greg Hudson, MIT Information Systems Greg Hudson, MIT Information Systems

View File

@@ -68,7 +68,7 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen,
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, NULL);
@@ -107,7 +107,7 @@ static void next_lookup(struct addr_query *aquery)
switch (*p) switch (*p)
{ {
case 'b': case 'b':
if (aquery->family == AF_INET) if (aquery->family == AF_INET)
{ {
addr = ntohl(aquery->addr.addr4.s_addr); addr = ntohl(aquery->addr.addr4.s_addr);
a1 = (int)((addr >> 24) & 0xff); a1 = (int)((addr >> 24) & 0xff);

View File

@@ -124,10 +124,10 @@ static void next_lookup(struct host_query *hquery)
case 'b': case 'b':
/* 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, host_callback,
hquery); 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);
return; return;
@@ -174,7 +174,7 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen)
hquery->family = AF_INET; hquery->family = AF_INET;
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);
} }
else if (status == ARES_EDESTRUCTION) else if (status == ARES_EDESTRUCTION)
end_hquery(hquery, status, NULL); end_hquery(hquery, status, NULL);
else else
@@ -342,13 +342,13 @@ static int get_address_index(struct in_addr *addr, struct apattern *sortlist,
continue; continue;
if (sortlist[i].type == PATTERN_MASK) if (sortlist[i].type == PATTERN_MASK)
{ {
if ((addr->s_addr & sortlist[i].mask.addr.addr4.s_addr) if ((addr->s_addr & sortlist[i].mask.addr.addr4.s_addr)
== sortlist[i].addr.addr4.s_addr) == sortlist[i].addr.addr4.s_addr)
break; break;
} }
else else
{ {
if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr, if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr,
sortlist[i].mask.bits)) sortlist[i].mask.bits))
break; break;
} }

145
ares/ares_getnameinfo.3 Normal file
View File

@@ -0,0 +1,145 @@
.\" $Id$
.\"
.\" Copyright 2005 by Dominick Meglio.
.\"
.\" 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.
.\"
.TH ARES_GETNAMEINFO 3 "16 May 2005"
.SH NAME
ares_getnameinfo \- Address-to-nodename translation in protocol-independent manner
.SH SYNOPSIS
.nf
.B #include <ares.h>
.PP
.B typedef void (*ares_nameinfo_callback)(void *\fIarg\fP, int \fIstatus\fP,
.B char *\fInode\fP, char *\fIservice\fP)
.PP
.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 void *\fIarg\fP)
.fi
.SH DESCRIPTION
The
.B ares_getnameinfo
function is defined for protocol-independent address translation. The function
is a combination of \fIares_gethostbyaddr(3)\fP and \fIgetservbyport(3)\fP. The function will
translate the address either by executing a host query on the name service channel
identified by
.IR channel
or it will attempt to resolve it locally if possible.
The parameters
.I sa
and
.I len
give the address as a sockaddr structure, and
.I flags
gives the options that the function will use. Valid flags are listed below:
.TP 19
.B ARES_NI_NOFQDN
Only the nodename portion of the FQDN is returned for local hosts.
.TP 19
.B ARES_NI_NUMERICHOST
The numeric form of the hostname is returned rather than the name.
.TP 19
.B ARES_NI_NAMEREQD
An error is returned if the hostname cannot be found in the DNS.
.TP 19
.B ARES_NI_NUMERICSERV
The numeric form of the service is returned rather than the name.
.TP 19
.B ARES_NI_TCP
The service name is to be looked up for the TCP protocol.
.TP 19
.B ARES_NI_UDP
The service name is to be looked up for the UDP protocol.
.TP 19
.B ARES_NI_SCTP
The service name is to be looked up for the SCTP protocol.
.TP 19
.B ARES_NI_DCCP
The service name is to be looked up for the DCCP protocol.
.TP 19
.B ARES_NI_NUMERICSCOPE
The numeric form of the scope ID is returned rather than the name.
.TP 19
.B ARES_NI_LOOKUPHOST
A hostname lookup is being requested.
.TP 19
.B ARES_NI_LOOKUPSERVICE
A service name lookup is being requested.
.PP
When the query
is complete or has
failed, the ares library will invoke \fIcallback\fP. Completion or failure of
the query may happen immediately, or may happen during a later call to
\fIares_process(3)\fP, \fIares_destroy(3)\fP or \fIares_cancel(3)\fP.
.PP
The callback argument
.I arg
is copied from the
.B ares_getnameinfo
argument
.IR arg .
The callback argument
.I status
indicates whether the query succeeded and, if not, how it failed. It
may have any of the following values:
.TP 19
.B ARES_SUCCESS
The host lookup completed successfully.
.TP 19
.B ARES_ENOTIMP
The ares library does not know how to look up addresses of type
.IR family .
.TP 19
.B ARES_ENOTFOUND
The address
.I addr
was not found.
.TP 19
.B ARES_ENOMEM
Memory was exhausted.
.TP 19
.B ARES_EDESTRUCTION
The name service channel
.I channel
is being destroyed; the query will not be completed.
.TP 19
.B ARES_EBADFLAGS
The
.I flags
parameter contains an illegal value.
.PP
On successful completion of the query, the callback argument
.I node
contains a string representing the hostname (assuming
.B ARES_NI_LOOKUPHOST
was specified). Additionally,
.I service
contains a string representing the service name (assuming
.B ARES_NI_LOOKUPSERVICE
was specified).
If the query did not complete successfully, or one of the values
was not requested,
.I node
or
.I service
will be
.BR NULL .
.SH SEE ALSO
.BR ares_process (3),
.BR ares_getaddrinfo (3)
.SH AUTHOR
Dominick Meglio
.br
Copyright 2005 by Dominick Meglio.

331
ares/ares_getnameinfo.c Normal file
View File

@@ -0,0 +1,331 @@
/* Copyright 2005 by Dominick Meglio
*
* 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 <sys/types.h>
#include <ctype.h>
#if defined(WIN32) && !defined(WATT32)
#include "nameser.h"
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>
#ifdef HAVE_ARPA_NAMESER_COMPAT_H
#include <arpa/nameser_compat.h>
#endif
#endif
#ifdef HAVE_NET_IF_H
#include <net/if.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ares.h"
#include "ares_private.h"
#include "ares_ipv6.h"
#include "inet_ntop.h"
#ifdef WATT32
#undef WIN32
#endif
struct nameinfo_query {
ares_nameinfo_callback callback;
void *arg;
union {
struct sockaddr_in addr4;
struct sockaddr_in6 addr6;
} addr;
int family;
int flags;
};
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
#define IPBUFSIZ 40+IF_NAMESIZE
#else
#define IPBUFSIZ 40
#endif
static void nameinfo_callback(void *arg, int status, struct hostent *host);
static char *lookup_service(unsigned short port, int flags, char *buf);
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int scopeid, char *buf);
#endif
static char *ares_striendstr(const char *s1, const char *s2);
void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa, socklen_t salen,
int flags, ares_nameinfo_callback callback, void *arg)
{
struct sockaddr_in *addr;
struct sockaddr_in6 *addr6;
struct nameinfo_query *niquery;
/* Verify the buffer size */
if (salen == sizeof(struct sockaddr_in))
addr = (struct sockaddr_in *)sa;
else if (salen == sizeof(struct sockaddr_in6))
addr6 = (struct sockaddr_in6 *)sa;
else
{
callback(arg, ARES_ENOTIMP, NULL, NULL);
return;
}
/* If neither, assume they want a host */
if (!(flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST))
flags |= ARES_NI_LOOKUPHOST;
/* All they want is a service, no need for DNS */
if ((flags & ARES_NI_LOOKUPSERVICE) && !(flags & ARES_NI_LOOKUPHOST))
{
char buf[33], *service;
unsigned int port = 0;
if (salen == sizeof(struct sockaddr_in))
port = addr->sin_port;
else
port = addr6->sin6_port;
service = lookup_service(port, flags, buf);
callback(arg, ARES_SUCCESS, NULL, service);
return;
}
/* They want a host lookup */
if ((flags & ARES_NI_LOOKUPHOST))
{
/* A numeric host can be handled without DNS */
if ((flags & ARES_NI_NUMERICHOST))
{
unsigned int port = 0;
char ipbuf[IPBUFSIZ];
char srvbuf[32];
char *service = NULL;
ipbuf[0] = 0;
/* Specifying not to lookup a host, but then saying a host
* is required has to be illegal.
*/
if (flags & ARES_NI_NAMEREQD)
{
callback(arg, ARES_EBADFLAGS, NULL, NULL);
return;
}
if (salen == sizeof(struct sockaddr_in6))
{
ares_inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, IPBUFSIZ);
port = addr6->sin6_port;
/* If the system supports scope IDs, use it */
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
append_scopeid(addr6, flags, ipbuf);
#endif
}
else
{
ares_inet_ntop(AF_INET, &addr->sin_addr, ipbuf, IPBUFSIZ);
port = addr->sin_port;
}
/* They also want a service */
if (flags & ARES_NI_LOOKUPSERVICE)
service = lookup_service(port, flags, srvbuf);
callback(arg, ARES_SUCCESS, ipbuf, service);
return;
}
/* This is where a DNS lookup becomes necessary */
else
{
niquery = malloc(sizeof(struct nameinfo_query));
if (!niquery)
{
callback(arg, ARES_ENOMEM, NULL, NULL);
return;
}
niquery->callback = callback;
niquery->arg = arg;
niquery->flags = flags;
if (sa->sa_family == AF_INET)
{
niquery->family = AF_INET;
memcpy(&niquery->addr.addr4, addr, sizeof(addr));
ares_gethostbyaddr(channel, &addr->sin_addr, sizeof(struct in_addr), AF_INET,
nameinfo_callback, niquery);
}
else
{
niquery->family = AF_INET6;
memcpy(&niquery->addr.addr6, addr6, sizeof(addr6));
ares_gethostbyaddr(channel, &addr6->sin6_addr, sizeof(struct in6_addr), AF_INET6,
nameinfo_callback, niquery);
}
}
}
}
static void nameinfo_callback(void *arg, int status, struct hostent *host)
{
struct nameinfo_query *niquery = (struct nameinfo_query *) arg;
char srvbuf[33];
char *service = NULL;
if (status == ARES_SUCCESS)
{
/* They want a service too */
if (niquery->flags & ARES_NI_LOOKUPSERVICE)
{
if (niquery->family == AF_INET)
service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, srvbuf);
else
service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, srvbuf);
}
/* NOFQDN means we have to strip off the domain name portion.
We do this by determining our own domain name, then searching the string
for this domain name and removing it.
*/
if (niquery->flags & ARES_NI_NOFQDN)
{
char buf[255];
char *domain;
gethostname(buf, 255);
if ((domain = strchr(buf, '.')))
{
char *end = ares_striendstr(host->h_name, domain);
if (end)
*end = 0;
}
}
niquery->callback(niquery->arg, ARES_SUCCESS, host->h_name, service);
return;
}
/* We couldn't find the host, but it's OK, we can use the IP */
else if (status == ARES_ENOTFOUND && !(niquery->flags & ARES_NI_NAMEREQD))
{
char ipbuf[IPBUFSIZ];
if (niquery->family == AF_INET)
ares_inet_ntop(AF_INET, &niquery->addr.addr4.sin_addr, ipbuf, IPBUFSIZ);
else
{
ares_inet_ntop(AF_INET6, &niquery->addr.addr6.sin6_addr, ipbuf, IPBUFSIZ);
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
append_scopeid(&niquery->addr.addr6, niquery->flags, ipbuf);
#endif
}
/* They want a service too */
if (niquery->flags & ARES_NI_LOOKUPSERVICE)
{
if (niquery->family == AF_INET)
service = lookup_service(niquery->addr.addr4.sin_port, niquery->flags, srvbuf);
else
service = lookup_service(niquery->addr.addr6.sin6_port, niquery->flags, srvbuf);
}
niquery->callback(niquery->arg, ARES_SUCCESS, ipbuf, service);
return;
}
niquery->callback(niquery->arg, status, NULL, NULL);
free(niquery);
}
static char *lookup_service(unsigned short port, int flags, char *buf)
{
if (port)
{
/* Just return the port as a string */
if (flags & ARES_NI_NUMERICSERV)
sprintf(buf, "%u", ntohs(port));
else
{
struct servent *se;
const char *proto;
if (flags & ARES_NI_UDP)
proto = "udp";
else if (flags & ARES_NI_SCTP)
proto = "sctp";
else if (flags & ARES_NI_DCCP)
proto = "dccp";
else
proto = "tcp";
se = getservbyport(port, proto);
if (se && se->s_name)
strcpy(buf, se->s_name);
else
sprintf(buf, "%u", ntohs(port));
}
return buf;
}
return NULL;
}
#ifdef HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID
static char *append_scopeid(struct sockaddr_in6 *addr6, unsigned int flags, char *buf)
{
char tmpbuf[IF_NAMESIZE + 1];
tmpbuf[0] = '%';
#ifdef HAVE_IF_INDEXTONAME
if ((flags & ARES_NI_NUMERICSCOPE) || (!IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr)
&& !IN6_IS_ADDR_MC_LINKLOCAL(&addr6->sin6_addr)))
{
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);
}
else
{
if (if_indextoname(addr6->sin6_scope_id, &tmpbuf[1]) == NULL)
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);
}
#else
sprintf(&tmpbuf[1], "%u", addr6->sin6_scope_id);
#endif
strcat(buf, tmpbuf);
return buf;
}
#endif
/* Determines if s1 ends with the string in s2 (case-insensitive) */
static char *ares_striendstr(const char *s1, const char *s2)
{
const char *c1, *c2, *c1_begin;
size_t s1_len = strlen(s1), s2_len = strlen(s2);
/* If the substr is longer than the full str, it can't match */
if (s2_len > s1_len)
return NULL;
/* Jump to the end of s1 minus the length of s2 */
c1_begin = s1+s1_len-s2_len;
c1 = (const char *)c1_begin;
c2 = s2;
while (c2 < s2+s2_len)
{
if (tolower(*c1) != tolower(*c2))
return NULL;
else
{
c1++;
c2++;
}
}
if (c2 == c1 && c2 == NULL)
return (char *)c1_begin;
return NULL;
}

View File

@@ -327,6 +327,7 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
size_t ip_size = sizeof("255.255.255.255,")-1; size_t ip_size = sizeof("255.255.255.255,")-1;
size_t left = ret_size; size_t left = ret_size;
char *ret = ret_buf; char *ret = ret_buf;
HRESULT res;
if (!fi) if (!fi)
return (0); return (0);
@@ -339,7 +340,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
if (!GetNetworkParams) if (!GetNetworkParams)
goto quit; goto quit;
if ((*GetNetworkParams) (fi, &size) != ERROR_BUFFER_OVERFLOW) res = (*GetNetworkParams) (fi, &size);
if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
goto quit; goto quit;
fi = alloca (size); fi = alloca (size);
@@ -843,7 +845,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q)) while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q))
q++; q++;
memcpy(ipbuf, str, (int)(q-str)); memcpy(ipbuf, str, (int)(q-str));
ipbuf[(int)(q-str)] = 0; ipbuf[(int)(q-str)] = 0;
/* Find the prefix */ /* Find the prefix */
if (*q == '/') if (*q == '/')
{ {
@@ -858,7 +860,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
ipbufpfx[0] = 0; ipbufpfx[0] = 0;
/* Lets see if it is CIDR */ /* Lets see if it is CIDR */
/* First we'll try IPv6 */ /* First we'll try IPv6 */
if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, &pat.addr.addr6, if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf,
&pat.addr.addr6,
sizeof(pat.addr.addr6))) > 0) sizeof(pat.addr.addr6))) > 0)
{ {
pat.type = PATTERN_CIDR; pat.type = PATTERN_CIDR;
@@ -867,8 +870,8 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
if (!sortlist_alloc(sortlist, nsort, &pat)) if (!sortlist_alloc(sortlist, nsort, &pat))
return ARES_ENOMEM; return ARES_ENOMEM;
} }
if (ipbufpfx && if (ipbufpfx &&
(bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4, (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4,
sizeof(pat.addr.addr4))) > 0) sizeof(pat.addr.addr4))) > 0)
{ {
pat.type = PATTERN_CIDR; pat.type = PATTERN_CIDR;
@@ -890,7 +893,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
else else
natural_mask(&pat); natural_mask(&pat);
pat.family = AF_INET; pat.family = AF_INET;
pat.type = PATTERN_MASK; pat.type = PATTERN_MASK;
if (!sortlist_alloc(sortlist, nsort, &pat)) if (!sortlist_alloc(sortlist, nsort, &pat))
return ARES_ENOMEM; return ARES_ENOMEM;
} }
@@ -1011,7 +1014,8 @@ static const char *try_option(const char *p, const char *q, const char *opt)
} }
#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)
{ {
struct apattern *newsort; struct apattern *newsort;
newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern));

View File

@@ -28,6 +28,31 @@ struct in6_addr
}; };
#endif #endif
#ifndef HAVE_STRUCT_SOCKADDR_IN6
struct sockaddr_in6
{
unsigned short sin6_family;
unsigned short sin6_port;
unsigned long sin6_flowinfo;
struct in6_addr sin6_addr;
unsigned int sin6_scope_id;
};
#endif
#ifndef HAVE_STRUCT_ADDRINFO
struct addrinfo
{
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
size_t ai_addrlen;
char *ai_cannonname;
struct sockaddr *ai_addr;
struct addrinfo *ai_next;
};
#endif
#ifndef NS_IN6ADDRSZ #ifndef NS_IN6ADDRSZ
#if SIZEOF_STRUCT_IN6_ADDR == 0 #if SIZEOF_STRUCT_IN6_ADDR == 0
/* We cannot have it set to zero, so we pick a fixed value here */ /* We cannot have it set to zero, so we pick a fixed value here */
@@ -45,4 +70,12 @@ struct in6_addr
#define NS_INT16SZ 2 #define NS_INT16SZ 2
#endif #endif
#ifndef IF_NAMESIZE
#ifdef IFNAMSIZ
#define IF_NAMESIZE IFNAMSIZ
#else
#define IF_NAMESIZE 256
#endif
#endif
#endif /* ARES_IPV6_H */ #endif /* ARES_IPV6_H */

View File

@@ -33,6 +33,10 @@
#define writev(s,v,c) writev_s(s,v,c) #define writev(s,v,c) writev_s(s,v,c)
#endif #endif
#ifdef NETWARE
#include <time.h>
#endif
#define DEFAULT_TIMEOUT 5 #define DEFAULT_TIMEOUT 5
#define DEFAULT_TRIES 4 #define DEFAULT_TRIES 4
#ifndef INADDR_NONE #ifndef INADDR_NONE

View File

@@ -33,6 +33,12 @@
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
#include <unistd.h> #include <unistd.h>
#endif #endif
#ifdef HAVE_SYS_IOCTL_H
#include <sys/ioctl.h>
#endif
#ifdef NETWARE
#include <sys/filio.h>
#endif
#endif #endif
#include <string.h> #include <string.h>
@@ -45,6 +51,11 @@
#include "ares_dns.h" #include "ares_dns.h"
#include "ares_private.h" #include "ares_private.h"
#ifndef TRUE
/* at least Solaris 7 does not have TRUE at this point */
#define TRUE 1
#endif
#if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS) #if (defined(WIN32) || defined(WATT32)) && !defined(MSDOS)
#define GET_ERRNO() WSAGetLastError() #define GET_ERRNO() WSAGetLastError()
#else #else
@@ -466,13 +477,76 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now)
} }
} }
/*
* nonblock() set the given socket to either blocking or non-blocking mode
* based on the 'nonblock' boolean argument. This function is highly portable.
*/
static int nonblock(ares_socket_t sockfd, /* operate on this */
int nonblock /* TRUE or FALSE */)
{
#undef SETBLOCK
#define SETBLOCK 0
#ifdef HAVE_O_NONBLOCK
/* most recent unix versions */
int flags;
flags = fcntl(sockfd, F_GETFL, 0);
if (TRUE == nonblock)
return fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
else
return fcntl(sockfd, F_SETFL, flags & (~O_NONBLOCK));
#undef SETBLOCK
#define SETBLOCK 1
#endif
#if defined(HAVE_FIONBIO) && (SETBLOCK == 0)
/* older unix versions */
int flags;
flags = nonblock;
return ioctl(sockfd, FIONBIO, &flags);
#undef SETBLOCK
#define SETBLOCK 2
#endif
#if defined(HAVE_IOCTLSOCKET) && (SETBLOCK == 0)
/* Windows? */
unsigned long flags;
flags = nonblock;
return ioctlsocket(sockfd, FIONBIO, &flags);
#undef SETBLOCK
#define SETBLOCK 3
#endif
#if defined(HAVE_IOCTLSOCKET_CASE) && (SETBLOCK == 0)
/* presumably for Amiga */
return IoctlSocket(sockfd, FIONBIO, (long)nonblock);
#undef SETBLOCK
#define SETBLOCK 4
#endif
#if defined(HAVE_SO_NONBLOCK) && (SETBLOCK == 0)
/* BeOS */
long b = nonblock ? 1 : 0;
return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
#undef SETBLOCK
#define SETBLOCK 5
#endif
#ifdef HAVE_DISABLED_NONBLOCKING
return 0; /* returns success */
#undef SETBLOCK
#define SETBLOCK 6
#endif
#if (SETBLOCK == 0)
#error "no non-blocking method was found/used/set"
#endif
}
static int open_tcp_socket(ares_channel channel, struct server_state *server) static int open_tcp_socket(ares_channel channel, struct server_state *server)
{ {
#if defined(WIN32)
u_long flags;
#else
int flags;
#endif
ares_socket_t s; ares_socket_t s;
struct sockaddr_in sockin; struct sockaddr_in sockin;
@@ -482,25 +556,7 @@ static int open_tcp_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 defined(WIN32) || defined(WATT32)
flags = 1;
ioctlsocket(s, FIONBIO, &flags);
#else
flags = fcntl(s, F_GETFL, 0);
if (flags == -1)
{
closesocket(s);
return -1;
}
flags |= O_NONBLOCK;
if (fcntl(s, F_SETFL, flags) == -1)
{
closesocket(s);
return -1;
}
#endif
/* Connect to the server. */ /* Connect to the server. */
memset(&sockin, 0, sizeof(sockin)); memset(&sockin, 0, sizeof(sockin));
@@ -531,6 +587,9 @@ static int open_udp_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. */
nonblock(s, TRUE);
/* Connect to the server. */ /* Connect to the server. */
memset(&sockin, 0, sizeof(sockin)); memset(&sockin, 0, sizeof(sockin));
sockin.sin_family = AF_INET; sockin.sin_family = AF_INET;

View File

@@ -38,7 +38,8 @@ const char *ares_strerror(int code)
"Error reading file", "Error reading file",
"Out of memory", "Out of memory",
"Channel is being destroyed", "Channel is being destroyed",
"Misformatted string" "Misformatted string",
"Illegal flags specified"
}; };
assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext))); assert(code >= 0 && code < (int)(sizeof(errtext) / sizeof(*errtext)));

View File

@@ -1,274 +1,351 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT(ares_init.c) AC_INIT(ares_init.c)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
AM_MAINTAINER_MODE AM_MAINTAINER_MODE
AM_INIT_AUTOMAKE(c-ares, CVS) AM_INIT_AUTOMAKE(c-ares, CVS)
AC_PROG_CC AC_PROG_CC
AC_PROG_INSTALL AC_PROG_INSTALL
case $host_os in case $host_os in
solaris*) solaris*)
AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used]) AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used])
;; ;;
esac esac
# check for ssize_t # check for ssize_t
AC_CHECK_TYPE(ssize_t, , AC_CHECK_TYPE(ssize_t, ,
AC_DEFINE(ssize_t, int, [the signed version of size_t])) AC_DEFINE(ssize_t, int, [the signed version of size_t]))
AC_SEARCH_LIBS(gethostbyname, nsl) AC_SEARCH_LIBS(gethostbyname, nsl)
AC_SEARCH_LIBS(socket, socket) AC_SEARCH_LIBS(socket, socket)
dnl ************************************************************ dnl ************************************************************
dnl Option to switch on debug options. This makes an assumption that dnl Option to switch on debug options. This makes an assumption that
dnl this is built as an 'ares' subdir in the curl source tree. Subject for dnl this is built as an 'ares' subdir in the curl source tree. Subject for
dnl improval in the future! dnl improval in the future!
dnl dnl
AC_MSG_CHECKING([whether to enable debug options]) AC_MSG_CHECKING([whether to enable debug options])
AC_ARG_ENABLE(debug, AC_ARG_ENABLE(debug,
AC_HELP_STRING([--enable-debug],[Enable pedantic debug options]) AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
AC_HELP_STRING([--disable-debug],[Disable debug options]), AC_HELP_STRING([--disable-debug],[Disable debug options]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
dnl when doing the debug stuff, use static library only dnl when doing the debug stuff, use static library only
AC_DISABLE_SHARED AC_DISABLE_SHARED
dnl Checks for standard header files, to make memdebug.h inclusions bettter dnl Checks for standard header files, to make memdebug.h inclusions bettter
AC_HEADER_STDC AC_HEADER_STDC
dnl the entire --enable-debug is a hack that lives and runs on top of dnl the entire --enable-debug is a hack that lives and runs on top of
dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier
AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl]) AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl])
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include" CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include"
CFLAGS="$CFLAGS -g" CFLAGS="$CFLAGS -g"
dnl set compiler "debug" options to become more picky, and remove dnl set compiler "debug" options to become more picky, and remove
dnl optimize options from CFLAGS dnl optimize options from CFLAGS
CURL_CC_DEBUG_OPTS CURL_CC_DEBUG_OPTS
;; ;;
esac ], esac ],
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
) )
AC_PROG_LIBTOOL AC_PROG_LIBTOOL
dnl check for a few basic system headers we need dnl check for a few basic system headers we need
AC_CHECK_HEADERS( AC_CHECK_HEADERS(
sys/types.h \ sys/types.h \
sys/time.h \ sys/time.h \
sys/select.h \ sys/select.h \
sys/socket.h \ sys/socket.h \
winsock.h \ sys/ioctl.h \
netinet/in.h \ winsock.h \
arpa/nameser.h \ netinet/in.h \
arpa/nameser_compat.h \ net/if.h \
arpa/inet.h, , , arpa/nameser.h \
[ arpa/nameser_compat.h \
#ifdef HAVE_SYS_TYPES_H arpa/inet.h, , ,
#include <sys/types.h> [
#endif #ifdef HAVE_SYS_TYPES_H
dnl We do this default-include simply to make sure that the nameser_compat.h #include <sys/types.h>
dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1 #endif
dnl (and others?) is not designed to allow this. dnl We do this default-include simply to make sure that the nameser_compat.h
#ifdef HAVE_ARPA_NAMESER_H dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1
#include <arpa/nameser.h> dnl (and others?) is not designed to allow this.
#endif #ifdef HAVE_ARPA_NAMESER_H
] #include <arpa/nameser.h>
) #endif
dnl check for AF_INET6 dnl *Sigh* these are needed in order for net/if.h to get properly detected.
CARES_CHECK_CONSTANT( #ifdef HAVE_SYS_SOCKET_H
[ #include <sys/socket.h>
#ifdef HAVE_SYS_TYPES_H #endif
#include <sys/types.h> #ifdef HAVE_WINSOCK_H
#endif #include <winsock.h>
#ifdef HAVE_SYS_SOCKET_H #endif
#include <sys/socket.h> ]
#endif )
#ifdef HAVE_WINSOCK_H
#include <winsock.h> AC_CHECK_TYPE(socklen_t, ,
#endif AC_DEFINE(socklen_t, int, [the length of a socket address]),
[
], [PF_INET6], #ifdef HAVE_SYS_TYPES_H
AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.]) #include <sys/types.h>
) #endif
#ifdef HAVE_SYS_SOCKET_H
dnl check for PF_INET6 #include <sys/socket.h>
CARES_CHECK_CONSTANT( #endif
[ #ifdef HAVE_WINSOCK_H
#ifdef HAVE_SYS_TYPES_H #include <winsock.h>
#include <sys/types.h> #endif
#endif ])
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> dnl check for AF_INET6
#endif CARES_CHECK_CONSTANT(
#ifdef HAVE_WINSOCK_H [
#include <winsock.h> #ifdef HAVE_SYS_TYPES_H
#endif #include <sys/types.h>
#endif
], [AF_INET6], #ifdef HAVE_SYS_SOCKET_H
AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.]) #include <sys/socket.h>
) #endif
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
dnl check for the in6_addr structure #endif
CARES_CHECK_STRUCT(
[ ], [PF_INET6],
#ifdef HAVE_SYS_TYPES_H AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.])
#include <sys/types.h> )
#endif
#ifdef HAVE_WINSOCK_H dnl check for PF_INET6
#include <winsock.h> CARES_CHECK_CONSTANT(
#endif [
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_SYS_TYPES_H
#include <netinet/in.h> #include <sys/types.h>
#endif #endif
], [in6_addr], #ifdef HAVE_SYS_SOCKET_H
AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) #include <sys/socket.h>
) #endif
#ifdef HAVE_WINSOCK_H
dnl check for inet_pton #include <winsock.h>
AC_CHECK_FUNCS(inet_pton) #endif
dnl Some systems have it, but not IPv6
if test "$ac_cv_func_inet_pton" = "yes" ; then ], [AF_INET6],
AC_MSG_CHECKING(if inet_pton supports IPv6) AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.])
AC_TRY_RUN( )
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> dnl check for the in6_addr structure
#endif CARES_CHECK_STRUCT(
#ifdef HAVE_SYS_SOCKET_H [
#include <sys/socket.h> #ifdef HAVE_SYS_TYPES_H
#endif #include <sys/types.h>
#ifdef HAVE_WINSOCK_H #endif
#include <winsock.h> #ifdef HAVE_WINSOCK_H
#endif #include <winsock.h>
#ifdef HAVE_NETINET_IN_H #endif
#include <netinet/in.h> #ifdef HAVE_NETINET_IN_H
#endif #include <netinet/in.h>
int main() #endif
{ ], [in6_addr],
struct in6_addr addr6; AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.])
if (inet_pton(AF_INET6, "::1", &addr6) < 1) )
exit(1);
else dnl check for the sockaddr_in6 structure
exit(0); CARES_CHECK_STRUCT(
} [
], [ #ifdef HAVE_SYS_TYPES_H
AC_MSG_RESULT(yes) #include <sys/types.h>
AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.]) #endif
], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) #ifdef HAVE_WINSOCK_H
fi #include <winsock.h>
dnl Check for inet_net_pton #endif
AC_CHECK_FUNCS(inet_net_pton) #ifdef HAVE_NETINET_IN_H
dnl Again, some systems have it, but not IPv6 #include <netinet/in.h>
if test "$ac_cv_func_inet_net_pton" = "yes" ; then #endif
AC_MSG_CHECKING(if inet_net_pton supports IPv6) ], [sockaddr_in6],
AC_TRY_RUN( AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1,
[ [Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes
#ifdef HAVE_SYS_TYPES_H )
#include <sys/types.h>
#endif if test "$ac_have_sockaddr_in6" = "yes" ; then
#ifdef HAVE_SYS_SOCKET_H CARES_CHECK_STRUCT_MEMBER(
#include <sys/socket.h> [
#endif #ifdef HAVE_SYS_TYPES_H
#ifdef HAVE_WINSOCK_H #include <sys/types.h>
#include <winsock.h> #endif
#endif #ifdef HAVE_WINSOCK_H
#ifdef HAVE_NETINET_IN_H #include <winsock.h>
#include <netinet/in.h> #endif
#endif #ifdef HAVE_NETINET_IN_H
int main() #include <netinet/in.h>
{ #endif
struct in6_addr addr6; ], [sockaddr_in6], [sin6_scope_id],
if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1) AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1,
exit(1); [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.])
else )
exit(0); fi
}
], [ dnl check for the addrinfo structure
AC_MSG_RESULT(yes) CARES_CHECK_STRUCT(
AC_DEFINE_UNQUOTED(HAVE_INET_NET_PTON_IPV6,1,[Define to 1 if inet_net_pton supports IPv6.]) [
], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) #ifdef HAVE_SYS_TYPES_H
fi #include <sys/types.h>
#endif
#ifdef HAVE_WINSOCK_H
dnl Check for inet_ntop #include <winsock.h>
AC_CHECK_FUNCS(inet_ntop) #endif
dnl Again, some systems have it, but not IPv6 #ifdef HAVE_NETINET_IN_H
if test "$ac_cv_func_inet_ntop" = "yes" ; then #include <netinet/in.h>
AC_MSG_CHECKING(if inet_ntop supports IPv6) #endif
AC_TRY_RUN( ], [addrinfo],
[ AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1,
#ifdef HAVE_SYS_TYPES_H [Define to 1 if you have struct addrinfo.])
#include <sys/types.h> )
#endif
#ifdef HAVE_SYS_SOCKET_H dnl check for inet_pton
#include <sys/socket.h> AC_CHECK_FUNCS(inet_pton)
#endif dnl Some systems have it, but not IPv6
#ifdef HAVE_WINSOCK_H if test "$ac_cv_func_inet_pton" = "yes" ; then
#include <winsock.h> AC_MSG_CHECKING(if inet_pton supports IPv6)
#endif AC_TRY_RUN(
#ifdef HAVE_NETINET_IN_H [
#include <netinet/in.h> #ifdef HAVE_SYS_TYPES_H
#endif #include <sys/types.h>
#include <errno.h> #endif
int main() #ifdef HAVE_SYS_SOCKET_H
{ #include <sys/socket.h>
struct in6_addr addr6; #endif
char buf[128]; #ifdef HAVE_WINSOCK_H
if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT) #include <winsock.h>
exit(1); #endif
else #ifdef HAVE_NETINET_IN_H
exit(0); #include <netinet/in.h>
} #endif
], [ int main()
AC_MSG_RESULT(yes) {
AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.]) struct in6_addr addr6;
], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) if (inet_pton(AF_INET6, "::1", &addr6) < 1)
fi exit(1);
else
AC_CHECK_SIZEOF(struct in6_addr, , exit(0);
[ }
#ifdef HAVE_SYS_TYPES_H ], [
#include <sys/types.h> AC_MSG_RESULT(yes)
#endif AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.])
#ifdef HAVE_SYS_SOCKET_H ], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
#include <sys/socket.h> fi
#endif dnl Check for inet_net_pton
#ifdef HAVE_WINSOCK_H AC_CHECK_FUNCS(inet_net_pton)
#include <winsock.h> dnl Again, some systems have it, but not IPv6
#endif if test "$ac_cv_func_inet_net_pton" = "yes" ; then
#ifdef HAVE_NETINET_IN_H AC_MSG_CHECKING(if inet_net_pton supports IPv6)
#include <netinet/in.h> AC_TRY_RUN(
#endif [
] #ifdef HAVE_SYS_TYPES_H
) #include <sys/types.h>
AC_CHECK_SIZEOF(struct in_addr, , #endif
[ #ifdef HAVE_SYS_SOCKET_H
#ifdef HAVE_SYS_TYPES_H #include <sys/socket.h>
#include <sys/types.h> #endif
#endif #ifdef HAVE_WINSOCK_H
#ifdef HAVE_SYS_SOCKET_H #include <winsock.h>
#include <sys/socket.h> #endif
#endif #ifdef HAVE_NETINET_IN_H
#ifdef HAVE_WINSOCK_H #include <netinet/in.h>
#include <winsock.h> #endif
#endif int main()
#ifdef HAVE_NETINET_IN_H {
#include <netinet/in.h> struct in6_addr addr6;
#endif if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1)
] exit(1);
) else
exit(0);
AC_CHECK_FUNCS(bitncmp) }
], [
AC_MSG_RESULT(yes)
AC_OUTPUT(Makefile) AC_DEFINE_UNQUOTED(HAVE_INET_NET_PTON_IPV6,1,[Define to 1 if inet_net_pton supports IPv6.])
], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
fi
dnl Check for inet_ntop
AC_CHECK_FUNCS(inet_ntop)
dnl Again, some systems have it, but not IPv6
if test "$ac_cv_func_inet_ntop" = "yes" ; then
AC_MSG_CHECKING(if inet_ntop supports IPv6)
AC_TRY_RUN(
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#include <errno.h>
int main()
{
struct in6_addr addr6;
char buf[128];
if (inet_ntop(AF_INET6, &addr6, buf, 128) == 0 && errno == EAFNOSUPPORT)
exit(1);
else
exit(0);
}
], [
AC_MSG_RESULT(yes)
AC_DEFINE_UNQUOTED(HAVE_INET_NTOP_IPV6,1,[Define to 1 if inet_ntop supports IPv6.])
], AC_MSG_RESULT(no),AC_MSG_RESULT(no))
fi
AC_CHECK_SIZEOF(struct in6_addr, ,
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
]
)
AC_CHECK_SIZEOF(struct in_addr, ,
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_WINSOCK_H
#include <winsock.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
]
)
AC_CHECK_FUNCS([bitncmp if_indextoname])
CURL_CHECK_NONBLOCKING_SOCKET
AC_OUTPUT(Makefile)

View File

@@ -19,6 +19,7 @@
#else #else
/* simple work-around for now, for systems without configure support */ /* simple work-around for now, for systems without configure support */
#define ssize_t int #define ssize_t int
#define socklen_t int
#endif #endif
/* Recent autoconf versions define these symbols in config.h. We don't want /* Recent autoconf versions define these symbols in config.h. We don't want

View File

@@ -13,7 +13,7 @@ findtool(){
IFS=":" IFS=":"
for path in $PATH for path in $PATH
do do
if test -r "$path/$file"; then if test -f "$path/$file"; then
echo "$path/$file" echo "$path/$file"
return return
fi fi
@@ -24,7 +24,7 @@ findtool(){
# autoconf 2.57 or newer # autoconf 2.57 or newer
# #
need_autoconf="2.57" need_autoconf="2.57"
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
if test -z "$ac_version"; then if test -z "$ac_version"; then
echo "buildconf: autoconf not found." echo "buildconf: autoconf not found."
echo " You need autoconf version $need_autoconf or newer installed." echo " You need autoconf version $need_autoconf or newer installed."
@@ -45,7 +45,7 @@ echo "buildconf: autoconf version $ac_version (ok)"
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# autoheader 2.50 or newer # autoheader 2.50 or newer
# #
ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'` ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -n 1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
if test -z "$ah_version"; then if test -z "$ah_version"; then
echo "buildconf: autoheader not found." echo "buildconf: autoheader not found."
echo " You need autoheader version 2.50 or newer installed." echo " You need autoheader version 2.50 or newer installed."
@@ -67,7 +67,7 @@ echo "buildconf: autoheader version $ah_version (ok)"
# automake 1.7 or newer # automake 1.7 or newer
# #
need_automake="1.7" need_automake="1.7"
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'` am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -n 1| sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//' -e 's/\(.*\)\(-p.*\)/\1/'`
if test -z "$am_version"; then if test -z "$am_version"; then
echo "buildconf: automake not found." echo "buildconf: automake not found."
echo " You need automake version $need_automake or newer installed." echo " You need automake version $need_automake or newer installed."
@@ -113,7 +113,7 @@ fi
# set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found # set the LIBTOOLIZE here so that glibtoolize is used if glibtool was found
LIBTOOLIZE="${libtool}ize" LIBTOOLIZE="${libtool}ize"
lt_pversion=`$libtool --version 2>/dev/null|head -1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'` lt_pversion=`$libtool --version 2>/dev/null|head -n 1|sed -e 's/^[^0-9]*//g' -e 's/[- ].*//'`
if test -z "$lt_pversion"; then if test -z "$lt_pversion"; then
echo "buildconf: libtool not found." echo "buildconf: libtool not found."
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed" echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
@@ -160,7 +160,7 @@ fi
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# m4 check # m4 check
# #
m4=`${M4:-m4} --version 2>/dev/null|head -1`; m4=`${M4:-m4} --version 2>/dev/null|head -n 1`;
m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'` m4_version=`echo $m4 | sed -e 's/^.* \([0-9]\)/\1/' -e 's/[a-z]* *$//'`
if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then if { echo $m4 | grep "GNU" >/dev/null 2>&1; } then
@@ -199,9 +199,11 @@ ${AUTOCONF:-autoconf} || die "The autoconf command failed"
if test -d ares; then if test -d ares; then
cd ares cd ares
echo "buildconf: running aclocal in the ares directory" echo "buildconf: running ares/libtoolize"
${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed"
echo "buildconf: running ares/aclocal"
${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed" ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The ares aclocal command failed"
echo "buildconf: running autoconf in the ares directory" echo "buildconf: running ares/autoconf"
${AUTOCONF:-autoconf} || die "The ares autoconf command failed" ${AUTOCONF:-autoconf} || die "The ares autoconf command failed"
cd .. cd ..
fi fi

View File

@@ -567,14 +567,15 @@ OPT_KRB4=off
AC_ARG_WITH(krb4,dnl AC_ARG_WITH(krb4,dnl
AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[ AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[
OPT_KRB4="$withval" OPT_KRB4="$withval"
if test X"$OPT_KRB4" != Xyes if test X"$OPT_KRB4" != Xno; then
then want_krb4="yes"
LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff" if test X"$OPT_KRB4" != Xyes; then
KRB4LIB="$OPT_KRB4/lib$libsuff" LDFLAGS="$LDFLAGS -L$OPT_KRB4/lib$libsuff"
CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include" KRB4LIB="$OPT_KRB4/lib$libsuff"
KRB4INC="$OPT_KRB4/include" CPPFLAGS="$CPPFLAGS -I$OPT_KRB4/include"
KRB4INC="$OPT_KRB4/include"
fi
fi fi
want_krb4="yes"
]) ])
AC_MSG_CHECKING([if Kerberos4 support is requested]) AC_MSG_CHECKING([if Kerberos4 support is requested])
@@ -643,10 +644,13 @@ dnl **********************************************************************
AC_ARG_WITH(spnego, AC_ARG_WITH(spnego,
AC_HELP_STRING([--with-spnego=DIR], AC_HELP_STRING([--with-spnego=DIR],
[Specify location of SPNEGO library fbopenssl]), [Specify location of SPNEGO library fbopenssl]), [
[ SPNEGO_ROOT="$withval" SPNEGO_ROOT="$withval"
want_spnego="yes" ] if test x"$SPNEGO_ROOT" != xno; then
) want_spnego="yes"
fi
])
AC_MSG_CHECKING([if SPNEGO support is requested]) AC_MSG_CHECKING([if SPNEGO support is requested])
if test x"$want_spnego" = xyes; then if test x"$want_spnego" = xyes; then
@@ -683,19 +687,24 @@ AC_ARG_WITH(gssapi-includes,
AC_ARG_WITH(gssapi-libs, AC_ARG_WITH(gssapi-libs,
AC_HELP_STRING([--with-gssapi-libs=DIR], AC_HELP_STRING([--with-gssapi-libs=DIR],
[Specify location of GSSAPI libs]), [Specify location of GSSAPI libs]),
[ GSSAPI_LIBS="-L$withval -lgssapi" [ GSSAPI_LIBS="-L$withval"
want_gss="yes" ] want_gss="yes" ]
) )
AC_ARG_WITH(gssapi, AC_ARG_WITH(gssapi,
AC_HELP_STRING([--with-gssapi=DIR], AC_HELP_STRING([--with-gssapi=DIR],
[Where to look for GSSAPI]), [Where to look for GSSAPI]), [
[ GSSAPI_ROOT="$withval" GSSAPI_ROOT="$withval"
want_gss="yes" ] if test x"$GSSAPI_ROOT" != xno; then
) want_gss="yes"
fi
])
save_CPPFLAGS="$CPPFLAGS"
AC_MSG_CHECKING([if GSSAPI support is requested]) AC_MSG_CHECKING([if GSSAPI support is requested])
if test x"$want_gss" = xyes; then if test x"$want_gss" = xyes; then
AC_MSG_RESULT(yes)
if test -z "$GSSAPI_INCS"; then if test -z "$GSSAPI_INCS"; then
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi` GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
@@ -704,8 +713,49 @@ if test x"$want_gss" = xyes; then
fi fi
fi fi
CPPFLAGS="$CPPFLAGS $GSSAPI_INCS" CPPFLAGS="$CPPFLAGS $GSSAPI_INCS"
if test -z "$GSSAPI_LIB_DIR"; then AC_CHECK_HEADER(gss.h,
[
dnl found in the given dirs
AC_DEFINE(HAVE_GSSGNU, 1, [if you have the GNU gssapi libraries])
gnu_gss=yes
],
[
dnl not found, check Heimdal
AC_CHECK_HEADER(gssapi.h,
[
dnl found in the given dirs
AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries])
],
[
dnl not found, check in gssapi/ subdir
AC_CHECK_HEADER(gssapi/gssapi.h,
[
dnl found
AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries])
],
[
dnl no header found, disabling GSS
want_gss=no
AC_MSG_WARN(disabling GSSAPI since no header files was found)
]
)
]
)
]
)
else
AC_MSG_RESULT(no)
fi
if test x"$want_gss" = xyes; then
AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries])
curl_gss_msg="enabled (MIT/Heimdal)"
if test -n "$gnu_gss"; then
curl_gss_msg="enabled (GNU GSS)"
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR -lgss"
elif test -z "$GSSAPI_LIB_DIR"; then
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi` gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
LDFLAGS="$LDFLAGS $gss_ldflags" LDFLAGS="$LDFLAGS $gss_ldflags"
@@ -715,31 +765,10 @@ if test x"$want_gss" = xyes; then
LDFLAGS="$LDFLAGS -lgssapi" LDFLAGS="$LDFLAGS -lgssapi"
fi fi
else else
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR" LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR -lgssapi"
fi fi
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GSSAPI, 1, [if you have the gssapi libraries])
curl_gss_msg="enabled"
AC_CHECK_HEADER(gssapi.h,
[
dnl found in the given dirs
AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries])
],
[
dnl not found, check in gssapi/ subdir
AC_CHECK_HEADER(gssapi/gssapi.h,
dnl found
AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries])
)
]
)
else else
AC_MSG_RESULT(no) CPPFLAGS="$save_CPPFLAGS"
fi fi
dnl ********************************************************************** dnl **********************************************************************
@@ -768,20 +797,24 @@ if test X"$OPT_SSL" != Xno; then
dnl only do pkg-config magic when not cross-compiling dnl only do pkg-config magic when not cross-compiling
PKGTEST="yes" PKGTEST="yes"
fi fi
EXTRA_SSL=/usr/local/ssl ;; PREFIX_OPENSSL=/usr/local/ssl
LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff"
;;
off) off)
dnl no --with-ssl option given, just check default places dnl no --with-ssl option given, just check default places
if test x$cross_compiling != xyes; then if test x$cross_compiling != xyes; then
dnl only do pkg-config magic when not cross-compiling dnl only do pkg-config magic when not cross-compiling
PKGTEST="yes" PKGTEST="yes"
fi fi
EXTRA_SSL= ;; PREFIX_OPENSSL=
;;
*) *)
dnl check the given --with-ssl spot dnl check the given --with-ssl spot
PKGTEST="no" PKGTEST="no"
EXTRA_SSL=$OPT_SSL PREFIX_OPENSSL=$OPT_SSL
LDFLAGS="$LDFLAGS -L$EXTRA_SSL/lib$libsuff" LIB_OPENSSL="$PREFIX_OPENSSL/lib$libsuff"
CPPFLAGS="$CPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include" LDFLAGS="$LDFLAGS -L$LIB_OPENSSL"
CPPFLAGS="$CPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include"
;; ;;
esac esac
@@ -803,6 +836,8 @@ if test X"$OPT_SSL" != Xno; then
SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null` SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null`
SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null` SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null`
LIB_OPENSSL=`echo $SSL_LDFLAGS | sed -e 's/-L//g'`
dnl use the values pkg-config reported dnl use the values pkg-config reported
LIBS="$LIBS $SSL_LIBS" LIBS="$LIBS $SSL_LIBS"
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS" CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
@@ -832,8 +867,8 @@ if test X"$OPT_SSL" != Xno; then
HAVECRYPTO="yes" HAVECRYPTO="yes"
LIBS="-lcrypto $LIBS" LIBS="-lcrypto $LIBS"
],[ ],[
LDFLAGS="$CLEANLDFLAGS -L$EXTRA_SSL/lib$libsuff" LDFLAGS="$CLEANLDFLAGS -L$LIB_OPENSSL"
CPPFLAGS="$CLEANCPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include" CPPFLAGS="$CLEANCPPFLAGS -I$PREFIX_OPENSSL/include/openssl -I$PREFIX_OPENSSL/include"
AC_CHECK_LIB(crypto, CRYPTO_add_lock,[ AC_CHECK_LIB(crypto, CRYPTO_add_lock,[
HAVECRYPTO="yes" HAVECRYPTO="yes"
LIBS="-lcrypto $LIBS"], [ LIBS="-lcrypto $LIBS"], [
@@ -918,11 +953,15 @@ if test X"$OPT_SSL" != Xno; then
fi fi
if test "$OPENSSL_ENABLED" = "1"; then if test "$OPENSSL_ENABLED" = "1"; then
dnl when the ssl shared libs were found in a path that the run-time linker if test -n "$LIB_OPENSSL"; then
dnl doesn't search through, we need to add it to LD_LIBRARY_PATH to dnl when the ssl shared libs were found in a path that the run-time
dnl prevent further configure tests to fail due to this dnl linker doesn't search through, we need to add it to LD_LIBRARY_PATH
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$EXTRA_SSL/lib$libsuff" dnl to prevent further configure tests to fail due to this
export LD_LIBRARY_PATH
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_OPENSSL"
export LD_LIBRARY_PATH
AC_MSG_NOTICE([Added $LIB_OPENSSL to LD_LIBRARY_PATH])
fi
fi fi
fi fi
@@ -964,7 +1003,7 @@ dnl FIX: only check for GnuTLS if OpenSSL is not enabled
dnl ---------------------------------------------------- dnl ----------------------------------------------------
dnl Default to compiler & linker defaults for GnuTLS files & libraries. dnl Default to compiler & linker defaults for GnuTLS files & libraries.
OPT_GNUTLS=off OPT_GNUTLS=no
AC_ARG_WITH(gnutls,dnl AC_ARG_WITH(gnutls,dnl
AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to the installation root (default: /usr/local/)]) AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to the installation root (default: /usr/local/)])
@@ -973,7 +1012,7 @@ AC_HELP_STRING([--without-gnutls], [disable GnuTLS detection]),
if test "$OPENSSL_ENABLED" != "1"; then if test "$OPENSSL_ENABLED" != "1"; then
if test X"$OPT_GNUTLS" != Xoff; then if test X"$OPT_GNUTLS" != Xno; then
if test "x$OPT_GNUTLS" = "xyes"; then if test "x$OPT_GNUTLS" = "xyes"; then
check=`libgnutls-config --version 2>/dev/null` check=`libgnutls-config --version 2>/dev/null`
if test -n "$check"; then if test -n "$check"; then
@@ -1023,6 +1062,7 @@ if test "$OPENSSL_ENABLED" != "1"; then
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlsprefix/lib$libsuff" LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlsprefix/lib$libsuff"
export LD_LIBRARY_PATH export LD_LIBRARY_PATH
AC_MSG_NOTICE([Added $gtlsprefix/lib$libsuff to LD_LIBRARY_PATH])
fi fi
fi fi
@@ -1168,7 +1208,6 @@ case "$LIBIDN" in
dnl if there is a given path, check that FIRST dnl if there is a given path, check that FIRST
if test -n "$LIBIDN"; then if test -n "$LIBIDN"; then
if test "x$LIBIDN" != "xyes"; then if test "x$LIBIDN" != "xyes"; then
AC_MSG_WARN([moo moo $LIBIDN])
oldLDFLAGS=$LDFLAGS oldLDFLAGS=$LDFLAGS
oldCPPFLAGS=$CPPFLAGS oldCPPFLAGS=$CPPFLAGS
LDFLAGS="$LDFLAGS -L$LIBIDN/lib" LDFLAGS="$LDFLAGS -L$LIBIDN/lib"
@@ -1254,7 +1293,7 @@ else
dnl is there a strerror_r() dnl is there a strerror_r()
CURL_CHECK_STRERROR_R() CURL_CHECK_STRERROR_R()
AC_CHECK_FUNCS( gmtime_r ) checkfor_gmtime_r="yes"
fi fi
dnl for recent AIX versions, we skip all the thread-safe checks above since dnl for recent AIX versions, we skip all the thread-safe checks above since
@@ -1290,7 +1329,47 @@ if test "x$RECENTAIX" = "xyes"; then
dnl is there a strerror_r() dnl is there a strerror_r()
CURL_CHECK_STRERROR_R() CURL_CHECK_STRERROR_R()
AC_CHECK_FUNCS( gmtime_r ) checkfor_gmtime_r="yes"
fi
if test x$cross_compiling != xyes; then
if test x$checkfor_gmtime_r = xyes; then
dnl if gmtime_r was found, verify that it actuall works, as (at least) HPUX
dnl 10.20 is known to have a buggy one. If it doesn't work, disable use of
dnl it.
AC_MSG_CHECKING([if gmtime_r exists and works])
AC_RUN_IFELSE([[
#include <time.h>
int main(void)
{
time_t local = 1170352587;
struct tm *gmt;
struct tm keeper;
putenv("TZ=CST6CDT");
tzset();
gmt = gmtime_r(&local, &keeper);
if(gmt) {
return 0;
}
return 1; /* failure */
}
]],
dnl success, do nothing
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GMTIME_R, 1, [if you have (a working) gmtime_r])
,
dnl failure, now disable the function
AC_MSG_RESULT(no)
,
dnl not invoked when crosscompiling)
])
fi
else
dnl and for crosscompilings
AC_CHECK_FUNCS(gmtime_r)
fi fi
@@ -1603,7 +1682,7 @@ AC_HELP_STRING([--disable-ares],[Disable ares for name lookups]),
AC_SUBST(HAVE_ARES) AC_SUBST(HAVE_ARES)
curl_ares_msg="enabled" curl_ares_msg="enabled"
LIBS="$LIBS -lcares" LIBS="-lcares $LIBS"
dnl For backwards compatibility default to includes/lib in srcdir/ares dnl For backwards compatibility default to includes/lib in srcdir/ares
dnl If a value is specified it is assumed that the libs are in $val/lib dnl If a value is specified it is assumed that the libs are in $val/lib

View File

@@ -60,7 +60,9 @@ while test $# -gt 0; do
--feature|--features) --feature|--features)
if test "@USE_SSLEAY@" = "1"; then if test "@USE_SSLEAY@" = "1"; then
echo "SSL" echo "SSL"
NTLM=1 NTLM=1 # OpenSSL implies NTLM
elif test -n "@USE_GNUTLS@"; then
echo "SSL"
fi fi
if test "@KRB4_ENABLED@" = "1"; then if test "@KRB4_ENABLED@" = "1"; then
echo "KRB4" echo "KRB4"

View File

@@ -82,8 +82,8 @@ Lisp
Lua Lua
Written by Steve Dekorte LuaCURL Written by Alexander Marinov
http://curl.haxx.se/libcurl/lua/ http://luacurl.luaforge.net/
Mono Mono

186
docs/DISTRO-DILEMMA Normal file
View File

@@ -0,0 +1,186 @@
Date: September 1, 2005
Author: Daniel Stenberg <daniel@haxx.se>
URL: http://curl.haxx.se/legal/distro-dilemma.html
Condition
This document is written to describe the sitution as it is right now. libcurl
7.14.0 is currently the latest version available. Things may (or perhaps
will) of course change in the future.
This document reflects my view and understanding of these things. Please tell
me where and how you think I'm wrong, and I'll try to correct my mistakes.
Background
The Free Software Foundation has deemed the Original BSD license[1] to be
"incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but
the point is the same: if you distribute a binary version of a GPL program,
it MUST NOT be linked with any Original BSD-licenced parts or
libraries. Doing so will violate the GPL license. For a long time, very many
GPL licensed programs have avoided this license mess by adding an
exception[8] to their license. And many others have just closed their eyes
for this problem.
libcurl is MIT-style[4] licensed - how on earth did this dilemma fall onto
our plates?
libcurl is only a little library. libcurl can be built to use OpenSSL for its
SSL/TLS capabilities. OpenSSL is basically Original BSD licensed[5].
If libcurl built to use OpenSSL is used by a GPL-licensed application and you
decide to distribute a binary version of it (Linux distros - for example -
tend to), you have a clash. GPL vs Original BSD.
This dilemma is not libcurl-specific nor is it specific to any particular
Linux distro.
Part of the Operating System
This would not be a problem if the used lib would be considered part of the
uderlying operating system, as then the GPL license has an exception
clause[6] that allows applications to use such libs without having to be
allowed to distribute it or its sources. Possibly some distros will claim
that OpenSSL is part of their operating system.
Debian does however not take this stance and has officially(?) claimed that
OpenSSL is not a required part of the Debian operating system
Debian-legal
In August 2004 I figured I should start pulling people's attention to this to
see if anyone has any bright ideas or if they would dismiss my worries based
on some elegant writing I had missed somewhere:
My post to debian-legal on August 12 2004:
http://lists.debian.org/debian-legal/2004/08/msg00279.html
Several people agreed then that this is a known and rather big problem, but
the following discussion didn't result in much.
GnuTLS
With the release of libcurl 7.14.0 (May 2005), it can now get built to use
GnuTLS instead of OpenSSL. GnuTLS is a LGPL[7] licensed library that offers a
matching set of features as OpenSSL does. Now, you can build and distribute
an SSL capable libcurl without including any Original BSD licensed code.
I believe Debian is the first distro to provide libcurl/GnutTLS packages.
GnuTLS vs OpenSSL
While these two libraries offer similar features, they are not equal. Both
libraries have features the other one lacks. libcurl does not (yet) offer a
standardized stable ABI if you decide to switch from using libcurl-openssl to
libcurl-gnutls or vice versa. The GnuTLS support is very recent in libcurl
and it has not been tested nor used very extensively, while the OpenSSL
equivalent code has been used and thus matured for more than seven (7) years.
In August 2005, the debian-devel mailing list discovered the license issue as
a GPL licensed application wanted SSL capabilities from libcurl and thus was
forced to use the GnuTLS powered libcurl. For a reason that is unknown to me,
the application authors didn't want to or was unable to add an exception to
their GPL license. Alas, the license problem hit the fan again.
The Better License, Original BSD or LGPL?
It isn't obvious or without debate to any objective interested party that
either of these licenses are the "better" or even the "preferred" one in a
generic situation.
Instead, I think we should accept the fact that the SSL/TLS libraries and
their different licenses will fit different applications and their authors
differently depending on the applications' licenses and their general usage
pattern (considering how LGPL libraries can be burdonsome for embedded
systems usage).
More SSL Libraries
In libcurl, there's no stopping us here. There are at least a few more Open
Source/Free SSL/TLS libraries and we would very much like to support them as
well, to offer application authors an even wider scope of choice.
Application Angle of this Problem
libcurl is built to use one SSL/TLS library. It uses a single fixed name (by
default), and applications are built/linked to use that single lib. Replacing
one libcurl instance with another one that uses the other SSL/TLS library
might break one or more applications (due to ABI differences and/or different
feature set). You want your application to use the libcurl it was built for.
Project cURL Angle of this Problem
We distribute libcurl and everyone may build libcurl with either library. At
their choice. This problem is not directly a problem of ours. It merely
affects users - GPL application authors only - of our lib as it comes
included and delivered on some distros.
Distro Angle of this Problem
A distro can provide separate libcurls built with different SSL/TLS libraries
to work around this, but at least Debian seems to be very hostile against
such an approach, probably since it makes things like devel packages for the
different libs collide since they would provide the same include files and
man pages etc.
Fixing the Only Problem
The only problem is thus for distributions that want to offer libcurl
versions built with more than one SSL/TLS library.
Since multiple libcurl binaries using different names are ruled out, we need
to come up with a way to have one single libcurl that someone uses different
underlying libraries. The best(?) approach currently suggested involves this:
A new intermediate library (named lib2 so far in the discussions) with the
single purpose of providing libcurl with SSL/TLS capabilities. It would have
a unified API and ABI no matter what underlying library it would use.
There would be one lib2 binary provided for each supported SSL/TLS library.
For example: lib2-openssl, lib2-gnutls, lib2-yassl, lib2-matrixssl and
lib2-nossl. Yes, take note of the last one that provides the lib2 ABI but
that lacks the actual powers.
When libcurl is built and linked, it will be linked against a lib2 with the
set ABI.
When you link an app against libcurl, it would also need to provide one of
the (many) lib2 libs to decide what approach that fits the app. An app that
doesn't want SSL at all would still need to link with the lib2-nossl lib.
GPL apps can pick the lib2-gnutls, others may pick the lib2-openssl.
This concept works equally well both for shared and static libraries.
A positive side effect of this approach could be a more generic "de facto"
standard API for SSL/TLS libraries.
When Will This Happen
Note again that this is not a problem in curl, it doesn't solve any actual
technical problems in our project. Don't hold your breath for this to happen
very soon (if at all) unless you step forward and contribute.
The suggestion that is outlined above is still only a suggestion. Feel free
to bring a better idea!
Also, to keep in mind: I don't want this new concept to have too much of an
impact on the existing code. Preferably it should be possible to build the
code like today (without the use of lib2), should you decide to ignore the
problems outlined in this document.
Footnotes
[1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6
[2] = http://www.fsf.org/licensing/essays/bsd.html
[3] = http://www.fsf.org/licensing/licenses/gpl.html
[4] = http://curl.haxx.se/docs/copyright.html
[5] = http://www.openssl.org/source/license.html
[6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3
[7] = http://www.fsf.org/licensing/licenses/lgpl.html
[8] = http://en.wikipedia.org/wiki/OpenSSL_exception
Feedback/Updates provided by
Eric Cooper

View File

@@ -1,4 +1,4 @@
Updated: April 13, 2005 (http://curl.haxx.se/docs/faq.html) Updated: August 26, 2005 (http://curl.haxx.se/docs/faq.html)
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@@ -64,6 +64,8 @@ FAQ
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
4.11 Why does my HTTP range requests return the full document? 4.11 Why does my HTTP range requests return the full document?
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.14 Redirects work in browser but not with curl!
5. libcurl Issues 5. libcurl Issues
5.1 Is libcurl thread-safe? 5.1 Is libcurl thread-safe?
@@ -132,11 +134,11 @@ FAQ
We pronounce curl and cURL with an initial k sound: [kurl]. We pronounce curl and cURL with an initial k sound: [kurl].
NOTE: there are numerous sub-projects and related projects that also use the There are numerous sub-projects and related projects that also use the word
word curl in the project names in various combinations, but you should take curl in the project names in various combinations, but you should take
notice that this FAQ is directed at the command-line tool named curl (and notice that this FAQ is directed at the command-line tool named curl (and
libcurl the library), and may therefore not be valid for other curl-related libcurl the library), and may therefore not be valid for other curl-related
projects. projects. (There is however a small section for the PHP/CURL in this FAQ.)
1.2 What is libcurl? 1.2 What is libcurl?
@@ -197,15 +199,14 @@ FAQ
1.5 Who makes curl? 1.5 Who makes curl?
curl and libcurl are not made by any single individual. Sure, Daniel curl and libcurl are not made by any single individual. Daniel Stenberg is
Stenberg writes the major parts, but other persons' submissions are project leader and main developer, but other persons' submissions are
important and crucial. Anyone can contribute and post their changes and important and crucial. Anyone can contribute and post their changes and
improvements and have them inserted in the main sources (of course on the improvements and have them inserted in the main sources (of course on the
condition that developers agree on that the fixes are good). condition that developers agree on that the fixes are good).
The list of contributors in the docs/THANKS file is only a small part of all The full list of the more than 400 contributors is found in the docs/THANKS
the people that every day provide us with bug reports, suggestions, ideas file.
and source code.
curl is developed by a community, with Daniel at the wheel. curl is developed by a community, with Daniel at the wheel.
@@ -220,12 +221,8 @@ FAQ
have sponsored certain parts of the development in the past and I hope some have sponsored certain parts of the development in the past and I hope some
will continue to do so in the future. will continue to do so in the future.
If you want to support our project with a donation or similar, one way of If you want to support our project, consider a donation or a banner-program
doing that would be to buy "gift certificates" at useful online shopping or even better: by helping us coding, documenting, testing etc.
sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor
us through a banner-program or even better: by helping us coding,
documenting, testing etc. You're welcome to send us a buck using paypal, as
described here: http://curl.haxx.se/donation.html
1.7 What about CURL from curl.com? 1.7 What about CURL from curl.com?
@@ -256,6 +253,12 @@ FAQ
users thanks to the web based archives of the mailing lists), thus saving us users thanks to the web based archives of the mailing lists), thus saving us
from having to repeat ourselves even more. Thanks for respecting this. from having to repeat ourselves even more. Thanks for respecting this.
If you have found or simply suspect a security problem in curl or libcurl,
mail curl-security at haxx.se (closed list of receivers, mails are not
disclosed) and tell. Then we can produce a fix in a timely manner before the
flaw is announced to the world, thus lessen the impact the problem will have
on existing users.
2. Install Related Problems 2. Install Related Problems
@@ -396,6 +399,8 @@ FAQ
curl -L http://redirector.com curl -L http://redirector.com
Not all redirects are HTTP ones, see 4.14
3.9 How do I use curl in my favorite programming language? 3.9 How do I use curl in my favorite programming language?
There exist many language interfaces/bindings for curl that integrates it There exist many language interfaces/bindings for curl that integrates it
@@ -734,6 +739,28 @@ FAQ
Details are also in the SSLCERTS file in the release archives, found online Details are also in the SSLCERTS file in the release archives, found online
here: http://curl.haxx.se/docs/sslcerts.html here: http://curl.haxx.se/docs/sslcerts.html
4.13 Why is curl -R on Windows one hour off?
During daylight savings time, when -R is used, curl will set a time that
appears one hour off. This happens due to a flaw in how Windows stores and
uses file modification times and it is not easily worked around. For details
on this problem, read this: http://www.codeproject.com/datetime/dstbugs.asp
4.14 Redirects work in browser but not with curl!
curl supports HTTP redirects fine (see item 3.8). Browsers generally support
at least two other ways to perform directs that curl does not:
1 - Meta tags. You can write a HTML tag that will cause the browser to
redirect to another given URL after a certain time.
2 - Javascript. You can write a javascript program embeded in a HTML page
that redirects the browser to another given URL.
There is no way to make curl follow these redirects. You must either
manually figure out what the page is set to do, or you write a script that
parses the results and fetches the new URL.
5. libcurl Issues 5. libcurl Issues
@@ -754,7 +781,7 @@ FAQ
need to provide locking function(s) for libgcrypt (which is used by GnuTLS need to provide locking function(s) for libgcrypt (which is used by GnuTLS
for the crypto functions). for the crypto functions).
[informative link missing] http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
5.2 How can I receive all data into a large memory chunk? 5.2 How can I receive all data into a large memory chunk?
@@ -978,8 +1005,13 @@ FAQ
7.1 What is PHP/CURL? 7.1 What is PHP/CURL?
The module for PHP that makes it possible for PHP programs to access curl- The module for PHP that makes it possible for PHP programs to access curl-
functions from within PHP. We often call it PHP/CURL to differentiate from functions from within PHP.
curl the command line tool and libcurl the library.
In the cURL project we call this module PHP/CURL to differentiate it from
curl the command line tool and libcurl the library. The PHP team however
does not refer to it like this (for unknown reasons). They call it plain
CURL (often using all caps) which causes much confusion to users which in
turn gives us a higher question load.
7.2 Who write PHP/CURL? 7.2 Who write PHP/CURL?

View File

@@ -62,11 +62,11 @@ HTTP
HTTPS (*1) HTTPS (*1)
- (all the HTTP features) - (all the HTTP features)
- using certificates - using client certificates
- verify server certificate - verify server certificate
- via http-proxy - via http-proxy
- select desired encryption - select desired encryption
- force usage of a specific SSL version (SSLv2, SSLv3 or TLSv1) - force usage of a specific SSL version (SSLv2(*7), SSLv3 or TLSv1)
FTP FTP
- download - download
@@ -118,9 +118,10 @@ FILE
FOOTNOTES FOOTNOTES
========= =========
*1 = requires OpenSSL *1 = requires OpenSSL or GnuTLS
*2 = requires OpenLDAP *2 = requires OpenLDAP
*3 = requires a GSSAPI-compliant library, such as Heimdal or similar. *3 = requires a GSSAPI-compliant library, such as Heimdal or similar.
*4 = requires FBopenssl *4 = requires FBopenssl
*5 = requires a krb4 library, such as the MIT one or similar. *5 = requires a krb4 library, such as the MIT one or similar.
*6 = requires c-ares *6 = requires c-ares
*7 = requires OpenSSL specificly, as GnuTLS only supports SSLv3 and TLSv1

View File

@@ -462,21 +462,19 @@ NetWare
- optional zlib sources (at the moment only dynamic linking with zlib.imp); - optional zlib sources (at the moment only dynamic linking with zlib.imp);
sources with NetWare Makefile can be obtained from: sources with NetWare Makefile can be obtained from:
http://www.gknw.com/mirror/zlib/ http://www.gknw.com/mirror/zlib/
- optional OpenSSL sources (version 0.9.8 or later which builds with BSD);
Set a search path to your compiler, linker and tools; if you want to have Set a search path to your compiler, linker and tools; on Linux make
zlib support then set the environment var ZLIB_PATH pointing to your zlib sure that the var OSTYPE contains the string 'linux'; and then type
sources, on Linux make sure the var OSTYPE contains the string 'linux'; 'make netware' from the top source directory; other tagets available
and finally type 'make netware' from the top source directory... are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares';
I found on some Linux systems (RH9) that OS detection didnlt work although if you need other combinations you can control the build with the
environment variables WITH_SSL, WITH_ZLIB, WITH_ARES and ENABLE_IPV6.
I found on some Linux systems (RH9) that OS detection didnt work although
a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...; with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...
other options are currently not supported, although partly prepared.
The Ares lib builds arlready fine, and both test tools work fine at least
when build with CodeWarrior...; don't know yet why they fail when build with
gcc though; if you want to compile with Ares support then set an env var
WITH_ARES=1; I've not tested yet including libares into curl.
Any help in testing appreciated! Any help in testing appreciated!
Builds automatically created 4 times a day from current CVS are here: Builds automatically created 8 times a day from current CVS are here:
http://www.gknw.com/mirror/curl/autobuilds/ http://www.gknw.com/mirror/curl/autobuilds/
the status of these builds can be viewed at the autobuild table: the status of these builds can be viewed at the autobuild table:
http://curl.haxx.se/auto/ http://curl.haxx.se/auto/
@@ -588,7 +586,7 @@ PORTS
- Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10
- Sparc SunOS 4.1.X - Sparc SunOS 4.1.X
- StrongARM (and other ARM) RISC OS 3.1, 4.02 - StrongARM (and other ARM) RISC OS 3.1, 4.02
- StrongARM Linux 2.4 - StrongARM/ARM7/ARM9 Linux 2.4, 2.6
- StrongARM NetBSD 1.4.1 - StrongARM NetBSD 1.4.1
- Ultrix 4.3a - Ultrix 4.3a
- i386 BeOS - i386 BeOS

View File

@@ -3,6 +3,22 @@ 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!
25. When doing a CONNECT request with curl it doesn't properly handle if the
proxy closes the connection within the authentication "negotiation phase".
Like if you do HTTPS or similar over a proxy and you use perhaps
--proxy-anyauth. There's work in progress on this problem, and a recent
patch was posted here: http://curl.haxx.se/mail/lib-2005-08/0074.html
24. Harshal Pradhan's Use-after-free with libcurl+ares. This probably occurs
because there is a pending ares callback that gets called after the
connection struct has been freed in libcurl:
http://curl.haxx.se/mail/lib-2005-08/0022.html
Fixing this properly most likely requires a new c-ares function.
23. We don't support SOCKS for IPv6. We don't support FTPS over a SOCKS proxy.
We don't have any test cases for SOCKS proxy. We probably have even more
bugs and lack of features when a SOCKS proxy is used.
22. Sending files to a FTP server using curl on VMS, might lead to curl 22. Sending files to a FTP server using curl on VMS, might lead to curl
complaining on "unaligned file size" on completion. The problem is related complaining on "unaligned file size" on completion. The problem is related
to VMS file structures and the perceived file sizes stat() returns. A to VMS file structures and the perceived file sizes stat() returns. A
@@ -18,14 +34,6 @@ may have been fixed since this was written!
specification). The receiver will convert the data from the standard specification). The receiver will convert the data from the standard
form to his own internal form. form to his own internal form.
20. valgrind errors occur too often when 'make test' is used. It is because
too many third-party libs and tools have problems. When curl is built
without --disable-shared, the testing is done with a front-end script which
makes the valgrind testing include (ba)sh as well and that often causes
valgrind errors. Either we improve the valgrind error scanner a lot to
better identify (lib)curl errors only, or we disable valgrind checking by
default.
19. FTP 3rd party transfers with the multi interface doesn't work. Test: 19. FTP 3rd party transfers with the multi interface doesn't work. Test:
define CURL_MULTIEASY, rebuild curl, run test case 230 - 232. define CURL_MULTIEASY, rebuild curl, run test case 230 - 232.
@@ -42,10 +50,6 @@ may have been fixed since this was written!
would not meaningfully support NUL characters within RFC 959 <string>, would not meaningfully support NUL characters within RFC 959 <string>,
anyway (e.g., UNIX pathnames may not contain NUL). anyway (e.g., UNIX pathnames may not contain NUL).
15. Test case 241 fails on all systems that support IPv6 but that don't have
the host name 'ip6-localhost' in /etc/hosts (or similar) since the test case
uses that host name to test the IPv6 name to address resolver.
14. Test case 165 might fail on system which has libidn present, but with an 14. Test case 165 might fail on system which has libidn present, but with an
old iconv version (2.1.3 is a known bad version), since it doesn't recognize old iconv version (2.1.3 is a known bad version), since it doesn't recognize
the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the

View File

@@ -12,12 +12,11 @@ I am not a lawyer and this is not legal advice!
One common dilemma is that GPL[1]-licensed code is not allowed to be linked One common dilemma is that GPL[1]-licensed code is not allowed to be linked
with code licensed under the Original BSD license (with the announcement with code licensed under the Original BSD license (with the announcement
clause, unless there's a specified exception in the GPL-licensed module). You clause). You may still build your own copies that use them all, but
may still build your own copies that use them all, but distributing them as distributing them as binaries would be to violate the GPL license - unless you
binaries would be to violate the GPL license - unless you accompany your accompany your license with an exception[2]. This particular problem was
license with an exception[2]. This particular problem was addressed when the addressed when the Modified BSD license was created, which does not have the
Modified BSD license was created, which does not have the annoncement clause annoncement clause that collides with GPL.
that collides with GPL.
libcurl http://curl.haxx.se/docs/copyright.html libcurl http://curl.haxx.se/docs/copyright.html
@@ -28,29 +27,30 @@ libcurl http://curl.haxx.se/docs/copyright.html
OpenSSL http://www.openssl.org/source/license.html OpenSSL http://www.openssl.org/source/license.html
Uses an Original BSD-style license with an announement clause that (May be used for SSL/TLS support) Uses an Original BSD-style license
makes it "incompatible" with GPL. You are not allowed to ship binaries with an announement clause that makes it "incompatible" with GPL. You
that link with OpenSSL that includes GPL code (unless that specific are not allowed to ship binaries that link with OpenSSL that includes
GPL code includes an exception for OpenSSL - a habit that is growing GPL code (unless that specific GPL code includes an exception for
more and more common). If OpenSSL's licensing is a problem for you, OpenSSL - a habit that is growing more and more common). If OpenSSL's
consider using GnuTLS instead. licensing is a problem for you, consider using GnuTLS instead.
GnuTLS http://www.gnutls.org/ GnuTLS http://www.gnutls.org/
Uses the LGPL[3] license. If this is a problem for you, consider using (May be used for SSL/TLS support) Uses the LGPL[3] license. If this is
OpenSSL instead. Also note that GnuTLS itself depends on and uses a problem for you, consider using OpenSSL instead. Also note that
other libs (libgcrypt and libgpg-error) and they too are LGPL- or GnuTLS itself depends on and uses other libs (libgcrypt and
GPL-licensed. libgpg-error) and they too are LGPL- or GPL-licensed.
c-ares http://daniel.haxx.se/projects/c-ares/license.html c-ares http://daniel.haxx.se/projects/c-ares/license.html
Uses an MIT license that is very liberal and imposes no restrictions (Used for asynchronous name resolves) Uses an MIT license that is very
on any other library or part you may link with. liberal and imposes no restrictions on any other library or part you
may link with.
zlib http://www.gzip.org/zlib/zlib_license.html zlib http://www.gzip.org/zlib/zlib_license.html
Uses an MIT-style license that shouldn't collide with any other (Used for compressed Transfer-Encoding support) Uses an MIT-style
library. license that shouldn't collide with any other library.
krb4 krb4
@@ -60,33 +60,43 @@ krb4
of the code in libcurl that is written to deal with Kerberos4 likewise of the code in libcurl that is written to deal with Kerberos4 likewise
have such a license. have such a license.
GSSAPI MIT Kerberos http://web.mit.edu/kerberos/www/dist/
While nothing in particular says that a GSS/Kerberos5 library must use (May be used for GSS support) MIT licensed, that shouldn't collide
any particular license, the one I've used (Heimdal) is Original BSD- with any other parts.
licensed with the announcement clause.
Heimdal http://www.pdc.kth.se/heimdal/
(May be used for GSS support) Heimdal is Original BSD licensed with
the announcement clause.
GNU GSS http://www.gnu.org/software/gss/
(May be used for GSS support) GNU GSS is GPL licensed. Note that you
may not distribute binary curl packages that uses this if you build
curl to also link and use any Original BSD licensed libraries!
fbopenssl fbopenssl
Unclear license. Based on its name, I assume that it uses the OpenSSL (Used for SPNEGO support) Unclear license. Based on its name, I assume
license and thus shares the same issues as described for OpenSSL that it uses the OpenSSL license and thus shares the same issues as
above. described for OpenSSL above.
libidn http://www.gnu.org/licenses/lgpl.html libidn http://www.gnu.org/licenses/lgpl.html
Uses the GNU Lesser General Public License. LGPL is a variation of GPL (Used for IDNA support) Uses the GNU Lesser General Public
with slightly less aggressive "copyleft". This license requires more License. LGPL is a variation of GPL with slightly less aggressive
requirements to be met when distributing binaries, see the license for "copyleft". This license requires more requirements to be met when
details. Also note that if you distribute a binary that includes this distributing binaries, see the license for details. Also note that if
library, you must also include the full LGPL license text. Please you distribute a binary that includes this library, you must also
properly point out what parts of the distributed package that the include the full LGPL license text. Please properly point out what
license addresses. parts of the distributed package that the license addresses.
OpenLDAP http://www.openldap.org/software/release/license.html OpenLDAP http://www.openldap.org/software/release/license.html
Uses a Modified BSD-style license. Since libcurl uses OpenLDAP as a (Used for LDAP support) Uses a Modified BSD-style license. Since
shared library only, I have not heard of anyone that ships OpenLDAP libcurl uses OpenLDAP as a shared library only, I have not heard of
linked with libcurl in an app. anyone that ships OpenLDAP linked with libcurl in an app.
[1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html

View File

@@ -17,7 +17,7 @@ CLEANFILES = $(GENHTMLPAGES) $(PDFPAGES)
EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \ EXTRA_DIST = MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS SSLCERTS \
README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \ README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS VERSIONS \
KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \ KNOWN_BUGS BINDINGS $(man_MANS) $(HTMLPAGES) HISTORY INSTALL \
$(PDFPAGES) LICENSE-MIXING README.netware $(PDFPAGES) LICENSE-MIXING README.netware DISTRO-DILEMMA
MAN2HTML= roffit < $< >$@ MAN2HTML= roffit < $< >$@

View File

@@ -4,91 +4,450 @@
If you have contributed but are missing here, please let us know! If you have contributed but are missing here, please let us know!
Alan Pinstein, Albert Chin-A-Young, Albert Choy, Aleksandar Milivojevic, Alex Adrian Schuur
aka WindEagle, Alex Neblett, Alex Suykov, Alexander Kourakos, Alexander Alan Pinstein
Krasnostavsky, Alexander Zhuravlev, Alexis Carvalho, Andi Jahja, Andreas Damm, Albert Chin-A-Young
Andreas Olsson, Andreas Rieke, Andrew Francis, Andrew Fuller, Andr<64>s Garc<72>a, Albert Choy
Andy Cedilnik, Andy Serpa, Angus Mackay, Antoine Calando, Anton Kalmykov, Aleksandar Milivojevic
Arkadiusz Miskiewicz, Augustus Saunders, Avery Fay, Ben Greear, Benjamin Alex aka WindEagle
Gerard, Bertrand Demiddelaer, Bjorn Reese, Bj<42>rn Stenberg, Bob Schader, Brad Alex Neblett
Burdick, Brent Beardsley, Brian Akins, Brian R Duffy, Bruce Mitchener, Bryan Alex Suykov
Henderson, Bryan Henderson , Bryan Kemp, Caolan McNamara, Casey O'Donnell, Alexander Kourakos
Chih-Chung Chang, Chris "Bob Bob", Chris Combes, Chris Gaukroger, Chris Alexander Krasnostavsky
Maltby, Christian Kurz, Christian Robottom Reis, Christophe Demory, Christophe Alexander Zhuravlev
Legry, Christopher R. Palmer, Clarence Gardner, Clifford Wolf, Cody Jones, Alexis Carvalho
Colin Watson, Colm Buckley, Cory Nelson, Craig Davison, Craig Markwardt, Cris Andi Jahja
Bailiff, Cyrill Osterwalder, Damien Adant, Dan Becker, Dan C, Dan Fandrich, Andr<EFBFBD>s Garc<72>a
Dan Torop, Dan Zitter, Daniel at touchtunes, Daniel Stenberg, Dave Dribin, Andreas Damm
Dave Halbakken, Dave Hamilton, Dave May, David Byron, David Cohen, David Andreas Olsson
Eriksson, David Houlder, David Hull, David J Meyer, David James, David Kimdon, Andreas Rieke
David LeBlanc, David Odin, David Phillips, David Shaw, David Tarendash, David Andres Garcia
Thiel, Detlef Schmier, Diego Casorran, Dimitris Sarris, Dinar, Dirk Andrew Bushnell
Eddelbuettel, Dirk Manske, Dolbneff A.V, Domenico Andreoli, Dominick Meglio, Andrew Francis
Doug Kaufman, Doug Porter, Douglas E. Wegscheid, Douglas R. Horner, Dustin Andrew Fuller
Boswell, Dylan Ellicott, Dylan Salisbury, Early Ehlinger, Edin Kadribasic, Andy Cedilnik
Ellis Pritchard, Emiliano Ida, Enrico Scholz, Enrik Berkhan, Eric Lavigne, Andy Serpa
Eric Melville, Eric Rautman, Eric Thelin, Eric Vergnaud, Eric Young, Erick Angus Mackay
Nuwendam, Erwan Legrand, Erwin Authried, Evan Jordan, Fabrizio Ammollo, Fedor Antoine Calando
Karpelevitch, Felix von Leitner, Florian Schoppmann, Forrest Cahoon, Frank Anton Kalmykov
Keeney, Frank Ticheler, Fred New, Fred Noz, Frederic Lepied, Gautam Mani, Gaz Arkadiusz Miskiewicz
Iqbal, Georg Horn, Georg Huettenegger, Gerd v. Egidy, Gerhard Herre, Giaslas Augustus Saunders
Georgios, Gilad, Gilbert Ramirez Jr., Gisle Vanem, Giuseppe Attardi, Giuseppe Avery Fay
D'Ambrosio, Glen Nakamura, Glen Scott, Greg Hewgill, Greg Onufer, Grigory Ben Greear
Entin, Guenole Bescon, Guillaume Arluison, Gustaf Hui, Gwenole Beauchesne, Benjamin Gerard
G<EFBFBD>tz Babin-Ebell, G<>nter Knauf, Hamish Mackenzie, Hanno Kranzhoff, Hans Bertrand Demiddelaer
Steegers, Hardeep Singh, Harshal Pradhan, Heikki Korpela, Henrik Storner, Bj<EFBFBD>rn Stenberg
Hzhijun, Ian Ford, Ian Gulliver, Ian Wilkes, Ignacio Vazquez-Abrams, Ilguiz Bjorn Reese
Latypov, Ingo Ralf Blum, Ingo Wilken, Jacky Lam, Jacob Meuser, James Bursa, Bob Schader
James Clancy, James Cone, James Gallagher, James Griffiths, James MacMillan, Brad Burdick
Jamie Lokier, Jamie Wilkinson, Jason S. Priebe, Jean-Claude Chauve, Jean-Louis Brent Beardsley
Lemaire, Jean-Marc Ranger, Jean-Philippe Barrette-LaPierre, Jeff Lawson, Jeff Brian Akins
Phillips, Jeffrey Pohlmeyer, Jeremy Friesner, Jesper Jensen, Jesse Noller, Jim Brian R Duffy
Drash, Joe Halpin, Joel Chen, Johan Anderson, Johan Nilsson, John Crow, John Bruce Mitchener
Janssen, John Lask, John McGowan, Jon Travis, Jon Turner, Jonas Forsman, Bryan Henderson
Jonatan Lander, Jonathan Hseu, Jongki Suwandi, Josh Kapell, Juan F. Codagnone, Bryan Henderson
Juan Ignacio Herv<72>s, Juergen Wilke, Jukka Pihl, Julian Noble, Jun-ichiro Bryan Kemp
itojun Hagino, Jurij Smakov, J<>rg Mueller-Tolk, J<>rn Hartroth, Kai Sommerfeld, Caolan McNamara
Kai-Uwe Rommel, Kang-Jin Lee, Karol Pietrzak, Keith MacDonald, Keith McGuigan, Casey O'Donnell
Ken Hirsch, Ken Rastatter, Kevin Fisk, Kevin Roth, Kimmo Kinnunen, Kjell Chih-Chung Chang
Ericson, Kjetil Jacobsen, Klevtsov Vadim, Kris Kennaway, Krishnendu Majumdar, Chris "Bob Bob"
Kristian K<>hntopp, Kyle Sallee, Lachlan O'Dea, Larry Campbell, Larry Fahnoe, Chris Combes
Lars Gustafsson, Lars J. Aas, Lars Nilsson, Lars Torben Wilson, Legoff Chris Gaukroger
Vincent, Lehel Bernadt, Len Krause, Linas Vepstas, Ling Thio, Linus Nielsen Chris Maltby
Feltzing, Loic Dachary, Loren Kirkby, Luca Altea, Luca Alteas, Lucas Adamski, Christian Kurz
Lukasz Czekierda, Luke Call, Luong Dinh Dung, Maciej W. Rozycki, Marc Boucher, Christian Robottom Reis
Marcelo Juchem , Marcin Konicki, Marco G. Salvagno, Marcus Webster, Mark Christophe Demory
Butler, Markus Moeller, Markus Oberhumer, Martijn Koster, Martin C. Martin, Christophe Legry
Martin Hedenfalk, Marty Kuhrt, Maruko, Massimiliano Ziccardi, Mathias Christopher R. Palmer
Axelsson, Mats Lidell, Matt Veenstra, Matthew Blain, Matthew Clarke, Maurice Clarence Gardner
Barnum, Mekonikum, Mettgut Jamalla, Michael Benedict, Michael Curtis, Michael Clifford Wolf
Mealling, Michal Bonino, Mihai Ionescu, Mike Bytnar, Mike Dobbs, Miklos Cody Jones
Nemeth, Mitz Wark, Mohamed Lrhazi, Mohun Biswas, Moonesamy, Nathan O'Sullivan, Colin Watson
Naveen Noel, Neil Dunbar, Neil Spring, Nic Roets, Nick Gimbrone, Nick Humfrey, Colm Buckley
Nico Baggus, Nicolas Berloquin, Nicolas Croiset, Niels van Tongeren, Nikita Cory Nelson
Schmidt, nk, Nodak Sodak, Oren Tirosh, P R Schaffner, Patrick Bihan-Faou, Craig Davison
Patrick Smith, Paul Harrington, Paul Marquis, Paul Moore, Paul Nolan, Pavel Craig Markwardt
Cenek, Pavel Orehov, Pawel A. Gajda, Pedro Neves, Pete Su, Peter Bray, Peter Cris Bailiff
Forret, Peter Pentchev, Peter Sylvester, Peter Todd, Peter Verhas, Peter Cyrill Osterwalder
Wullinger, Phil Karn, Philip Gladstone, Philippe Hameau, Philippe Raoult, Damien Adant
Pierre, Puneet Pawaia, Rafael Sagula, Ralph Beckmann, Ralph Mitchell, Ramana Dan Becker
Mokkapati, Randy McMurchy, Reinout van Schouwen, Renaud Chaillat, Renaud Dan C
Duhaut, Rene Bernhardt, Rene Rebe, Ricardo Cadime, Rich Gray, Richard Archer, Dan Fandrich
Richard Atterer, Richard Bramante, Richard Cooper, Richard Gorton, Richard Dan Torop
Prescott, Rick Jones, Rick Richardson, Rob Stanzel, Robert D. Young, Robert Dan Zitter
Olson, Robert Weaver, Robin Kay, Rodney Simmons, Roland Krikava, Roland Daniel at touchtunes
Zimmermann, Roman Koifman, Ron Zapp, Rosimildo da Silva, Roy Shan, Rune Daniel Stenberg
Kleveland, Ryan Nelson, S. Moonesamy, Salvador D<>vila, Salvatore Sorrentino, Dave Dribin
Sampo Kellomaki, Samuel D<>az Garc<72>a, Samuel Listopad, Sander Gates, Saul good, Dave Halbakken
Sebastien Willemijns, Sergio Ballestrero, Seshubabu Pasam, Shard, Shawn Dave Hamilton
Poulson, Siddhartha Prakash Jain, Simon Dick, Simon Liu, Spiridonoff A.V, Dave May
Stadler Stephan, Stefan Ulrich, Stephan Bergmann, Stephen Kick, Stephen More, David Byron
Sterling Hughes, Steve Green, Steve Lhomme, Steve Marx, Steve Oliphant, Steven David Cohen
Bazyl, Steven G. Johnson, Stoned Elipot, Sven Neuhaus, swalkaus at yahoo.com, David Eriksson
S<EFBFBD>bastien Willemijns, T. Bharath, T. Yamada, Thomas Schwinge, Thomas Tonino, David Houlder
Tim Baker, Tim Bartley, Tim Costello, Tim Sneddon, Toby Peterson, Tom Benoist, David Hull
Tom Lee, Tom Mattison, Tom Moers, Tom Zerucha, Tomas Pospisek, Tomas Szepe, David J Meyer
Tomasz Lacki, Tommy Tam, Ton Voon, Tor Arntsen, Torsten Foertsch, Toshiyuki David James
Maezawa, Traian Nicolescu, Troels Walsted Hansen, Troy Engel, Ulrich Zadow, David Kimdon
Vincent Bronner, Vincent Penquerc'h, Vincent Sanders, Vojtech Janota, Vojtech David LeBlanc
Minarik, Walter J. Mack, Wayne Haigh, Werner Koch, Wesley Laxton, Wez Furlong, David Odin
Wilfredo Sanchez, Wojciech Zwiefka, Yarram Sunil, Zvi Har'El David Phillips
David Shaw
David Tarendash
David Thiel
Detlef Schmier
Diego Casorran
Dimitris Sarris
Dinar
Dirk Eddelbuettel
Dirk Manske
Dolbneff A.V
Domenico Andreoli
Dominick Meglio
Doug Kaufman
Doug Porter
Douglas E. Wegscheid
Douglas R. Horner
Dustin Boswell
Dylan Ellicott
Dylan Salisbury
Early Ehlinger
Edin Kadribasic
Ellis Pritchard
Emiliano Ida
Enrico Scholz
Enrik Berkhan
Eric Cooper
Eric Lavigne
Eric Melville
Eric Rautman
Eric Thelin
Eric Vergnaud
Eric Young
Erick Nuwendam
Erwan Legrand
Erwin Authried
Evan Jordan
Fabrizio Ammollo
Fedor Karpelevitch
Felix von Leitner
Florian Schoppmann
Forrest Cahoon
Frank Keeney
Frank Ticheler
Fred New
Fred Noz
Frederic Lepied
G<EFBFBD>nter Knauf
G<EFBFBD>tz Babin-Ebell
Gautam Mani
Gaz Iqbal
Georg Horn
Georg Huettenegger
Georg Wicherski
Gerd v. Egidy
Gerhard Herre
Giaslas Georgios
Gilad
Gilbert Ramirez Jr.
Gisle Vanem
Giuseppe Attardi
Giuseppe D'Ambrosio
Glen Nakamura
Glen Scott
Greg Hewgill
Greg Onufer
Grigory Entin
Guenole Bescon
Guillaume Arluison
Gustaf Hui
Gwenole Beauchesne
Hamish Mackenzie
Hanno Kranzhoff
Hans Steegers
Hardeep Singh
Harshal Pradhan
Heikki Korpela
Henrik Storner
Hzhijun
Ian Ford
Ian Gulliver
Ian Wilkes
Ignacio Vazquez-Abrams
Ilguiz Latypov
Ingo Ralf Blum
Ingo Wilken
J<EFBFBD>rg Mueller-Tolk
J<EFBFBD>rn Hartroth
Jacky Lam
Jacob Meuser
James Bursa
James Clancy
James Cone
James Gallagher
James Griffiths
James MacMillan
Jamie Lokier
Jamie Wilkinson
Jason S. Priebe
Jean-Claude Chauve
Jean-Louis Lemaire
Jean-Marc Ranger
Jean-Philippe Barrette-LaPierre
Jeff Lawson
Jeff Phillips
Jeff Pohlmeyer
Jeffrey Pohlmeyer
Jeremy Friesner
Jesper Jensen
Jesse Noller
Jim Drash
Joe Halpin
Joel Chen
Johan Anderson
Johan Nilsson
John Crow
John Janssen
John Lask
John McGowan
Jon Grubbs
Jon Travis
Jon Turner
Jonas Forsman
Jonatan Lander
Jonathan Hseu
Jongki Suwandi
Josh Kapell
Juan F. Codagnone
Juan Ignacio Herv<72>s
Juergen Wilke
Jukka Pihl
Julian Noble
Jun-ichiro itojun Hagino
Jurij Smakov
Kai Sommerfeld
Kai-Uwe Rommel
Kang-Jin Lee
Karol Pietrzak
Keith MacDonald
Keith McGuigan
Ken Hirsch
Ken Rastatter
Kevin Fisk
Kevin Roth
Kimmo Kinnunen
Kjell Ericson
Kjetil Jacobsen
Klevtsov Vadim
Kris Kennaway
Krishnendu Majumdar
Kristian K<>hntopp
Kyle Sallee
Lachlan O'Dea
Larry Campbell
Larry Fahnoe
Lars Gustafsson
Lars J. Aas
Lars Nilsson
Lars Torben Wilson
Legoff Vincent
Lehel Bernadt
Len Krause
Linas Vepstas
Ling Thio
Linus Nielsen Feltzing
Loic Dachary
Loren Kirkby
Luca Altea
Luca Alteas
Lucas Adamski
Lukasz Czekierda
Luke Call
Luong Dinh Dung
Maciej W. Rozycki
Marc Boucher
Marcelo Juchem
Marcin Konicki
Marco G. Salvagno
Marcus Webster
Mario Schroeder
Mark Butler
Markus Moeller
Markus Oberhumer
Martijn Koster
Martin C. Martin
Martin Hedenfalk
Marty Kuhrt
Maruko
Massimiliano Ziccardi
Mathias Axelsson
Mats Lidell
Matt Veenstra
Matthew Blain
Matthew Clarke
Maurice Barnum
Mekonikum
Mettgut Jamalla
Michael Benedict
Michael Curtis
Michael Mealling
Michal Bonino
Mihai Ionescu
Mike Bytnar
Mike Dobbs
Miklos Nemeth
Mitz Wark
Mohamed Lrhazi
Mohun Biswas
Moonesamy
Nathan O'Sullivan
Naveen Noel
Neil Dunbar
Neil Spring
Nic Roets
Nick Gimbrone
Nick Humfrey
Nico Baggus
Nicolas Berloquin
Nicolas Croiset
Niels van Tongeren
Nikita Schmidt
nk
Nodak Sodak
Oren Tirosh
P R Schaffner
Patrick Bihan-Faou
Patrick Smith
Paul Harrington
Paul Marquis
Paul Moore
Paul Nolan
Pavel Cenek
Pavel Orehov
Pawel A. Gajda
Pedro Neves
Pete Su
Peter Bray
Peter Forret
Peter Pentchev
Peter Sylvester
Peter Todd
Peter Verhas
Peter Wullinger
Peteris Krumins
Phil Karn
Philip Gladstone
Philippe Hameau
Philippe Raoult
Pierre
Puneet Pawaia
Rafael Sagula
Ralph Beckmann
Ralph Mitchell
Ramana Mokkapati
Randy McMurchy
Reinout van Schouwen
Renaud Chaillat
Renaud Duhaut
Rene Bernhardt
Rene Rebe
Ricardo Cadime
Rich Gray
Richard Archer
Richard Atterer
Richard Bramante
Richard Clayton
Richard Cooper
Richard Gorton
Richard Prescott
Rick Jones
Rick Richardson
Rob Stanzel
Robert D. Young
Robert Olson
Robert Weaver
Robin Kay
Rodney Simmons
Roland Krikava
Roland Zimmermann
Roman Koifman
Ron Zapp
Rosimildo da Silva
Roy Shan
Rune Kleveland
Ryan Nelson
S<EFBFBD>bastien Willemijns
S. Moonesamy
Salvador D<>vila
Salvatore Sorrentino
Sampo Kellomaki
Samuel D<>az Garc<72>a
Samuel Listopad
Sander Gates
Saul good
Sebastien Willemijns
Sergio Ballestrero
Seshubabu Pasam
Shard
Shawn Poulson
Siddhartha Prakash Jain
Simon Dick
Simon Liu
Spiridonoff A.V
Stadler Stephan
Stefan Ulrich
Stephan Bergmann
Stephen Kick
Stephen More
Sterling Hughes
Steve Green
Steve Lhomme
Steve Marx
Steve Oliphant
Steven Bazyl
Steven G. Johnson
Stoned Elipot
Sven Neuhaus
swalkaus at yahoo.com
T. Bharath
T. Yamada
Thomas Schwinge
Thomas Tonino
Tim Baker
Tim Bartley
Tim Costello
Tim Sneddon
Toby Peterson
Todd Kulesza
Tom Benoist
Tom Lee
Tom Mattison
Tom Moers
Tom Zerucha
Tomas Pospisek
Tomas Szepe
Tomasz Lacki
Tommy Tam
Ton Voon
Tor Arntsen
Torsten Foertsch
Toshiyuki Maezawa
Traian Nicolescu
Troels Walsted Hansen
Troy Engel
Tupone Alfredo
Ulrich Zadow
Vincent Bronner
Vincent Penquerc'h
Vincent Sanders
Vojtech Janota
Vojtech Minarik
Walter J. Mack
Wayne Haigh
Werner Koch
Wesley Laxton
Wez Furlong
Wilfredo Sanchez
Wojciech Zwiefka
Yarram Sunil
Zvi Har'El

View File

@@ -40,6 +40,9 @@ TODO
* Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and * Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and
GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan. GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan.
* Add option that changes the interval in which the progress callback is
called at most.
LIBCURL - multi interface LIBCURL - multi interface
* Add a curl_multi_fdset() alternative. this allows apps to avoid the * Add a curl_multi_fdset() alternative. this allows apps to avoid the
@@ -58,6 +61,17 @@ TODO
ready to accept read data. Today libcurl feeds the data as soon as it is ready to accept read data. Today libcurl feeds the data as soon as it is
available for reading, no matter what. available for reading, no matter what.
* Add curl_multi_socket() and family to the multi interface that gets file
descriptors, as an alternative to the curl_multi_fdset(). This is necessary
to allow apps to properly avoid the FD_SETSIZE problem.
* Make curl_easy_perform() a wrapper-function that simply creates a multi
handle, adds the easy handle to it, runs curl_multi_perform() until the
transfer is done, then detach the easy handle, destroy the multi handle and
return the easy handle's return code. This will thus make everything
internally use and assume the multi interface. The select()-loop should use
curl_multi_socket().
DOCUMENTATION DOCUMENTATION
* More and better * More and better
@@ -149,6 +163,25 @@ TODO
latter two could be alternatives for those looking to reduce the footprint latter two could be alternatives for those looking to reduce the footprint
of libcurl built with OpenSSL or GnuTLS. of libcurl built with OpenSSL or GnuTLS.
* Peter Sylvester's patch for SRP on the TLS layer.
Awaits OpenSSL support for this, no need to support this in libcurl before
there's an OpenSSL release that does it.
* make the configure --with-ssl option first check for OpenSSL and then for
GnuTLS if OpenSSL wasn't detected.
GnuTLS
* Get NTLM working using the functions provided by libgcrypt, since GnuTLS
already depends on that to function. Not strictly SSL/TLS related, but
hey... Another option is to get available DES and MD4 source code from the
cryptopp library. They are fine license-wise, but are C++.
* SSL engine stuff?
* Work out a common method with Peter Sylvester's OpenSSL-patch for SRP
on the TLS to provide name and password
LDAP LDAP
* Look over the implementation. The looping will have to "go away" from the * Look over the implementation. The looping will have to "go away" from the

View File

@@ -21,7 +21,7 @@
.\" * $Id$ .\" * $Id$
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH curl 1 "28 Apr 2005" "Curl 7.14.0" "Curl Manual" .TH curl 1 "12 Aug 2005" "Curl 7.14.1" "Curl Manual"
.SH NAME .SH NAME
curl \- transfer a URL curl \- transfer a URL
.SH SYNOPSIS .SH SYNOPSIS
@@ -421,9 +421,19 @@ set headers without knowing perfectly well what you're doing. Replacing an
internal header with one without content on the right side of the colon will internal header with one without content on the right side of the colon will
prevent that header from appearing. prevent that header from appearing.
curl will make sure that each header you add/replace get sent with the proper
end of line marker, you should thus \fBnot\fP add that as a part of the header
content: do not add newlines or carriage returns they will only mess things up
for you.
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 "--ignore-content-length"
(HTTP)
Ignore the Content-Length header. This is particularly useful for servers
running Apache 1.x, which will report incorrect Content-Length for files
larger than 2 gigabytes.
.IP "-i/--include" .IP "-i/--include"
(HTTP) (HTTP)
Include the HTTP-header in the output. The HTTP-header includes things Include the HTTP-header in the output. The HTTP-header includes things
@@ -958,11 +968,11 @@ SSPI is supported. If you use NTLM and set a blank user name, curl will
authenticate with your current user and password. authenticate with your current user and password.
.RE .RE
.IP "-w/--write-out <format>" .IP "-w/--write-out <format>"
Defines what to display after a completed and successful operation. The format Defines what to display on stdout after a completed and successful
is a string that may contain plain text mixed with any number of variables. The operation. The format is a string that may contain plain text mixed with any
string can be specified as "string", to get read from a particular file you number of variables. The string can be specified as "string", to get read from
specify it "@filename" and to tell curl to read the format from stdin you a particular file you specify it "@filename" and to tell curl to read the
write "@-". format from stdin you write "@-".
The variables present in the output format will be substituted by the value or The variables present in the output format will be substituted by the value or
text that curl thinks fit, as described below. All variables are specified text that curl thinks fit, as described below. All variables are specified
@@ -1058,12 +1068,16 @@ transparently be converted to HTTP. It means that certain protocol specific
operations might not be available. This is not the case if you can tunnel operations might not be available. This is not the case if you can tunnel
through the proxy, as done with the \fI-p/--proxytunnel\fP option. through the proxy, as done with the \fI-p/--proxytunnel\fP option.
Starting with 7.14.1, the proxy host can be specified the exact same way as
the proxy environment variables, include protocol prefix (http://) and
embedded user + password.
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 "-X/--request <command>" .IP "-X/--request <command>"
(HTTP) (HTTP) Specifies a custom request method to use when communicating with the
Specifies a custom request to use when communicating with the HTTP server. HTTP server. The specified request will be used instead of the method
The specified request will be used instead of the standard GET. Read the otherwise used (which defaults to GET). Read the HTTP 1.1 specification for
HTTP 1.1 specification for details and explanations. details and explanations.
(FTP) (FTP)
Specifies a custom FTP command to use instead of LIST when doing file lists Specifies a custom FTP command to use instead of LIST when doing file lists

View File

@@ -10,7 +10,8 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \
post-callback.c multi-app.c multi-double.c multi-single.c \ post-callback.c multi-app.c multi-double.c multi-single.c \
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \ multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \ multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c anyauthput.c htmltitle.cc htmltidy.c opensslthreadlock.c \
cookie_interface.c cacertinmem.c
all: all:
@echo "done" @echo "done"

138
docs/examples/cacertinmem.c Normal file
View File

@@ -0,0 +1,138 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* $Id$
*
* Example using a "in core" PEM certificate to retrieve a https page.
* Written by Theo Borm
*/
/* on a netBSD system with OPENSSL& LIBCURL installed from
* pkgsrc (using default paths) this program can be compiled using:
* gcc -I/usr/pkg/include -L/usr/pkg/lib -lcurl -Wl,-R/usr/pkg/lib -lssl
* -lcrypto -lz -o curlcacerttest curlcacerttest.c
* on other operating systems you may want to change paths to headers
* and libraries
*/
#include <openssl/ssl.h>
#include <curl/curl.h>
#include <stdio.h>
size_t writefunction( void *ptr, size_t size, size_t nmemb, void *stream)
{
fwrite(ptr,size,nmemb,stream);
return(nmemb*size);
}
static CURLcode sslctx_function(CURL * curl, void * sslctx, void * parm)
{
X509_STORE * store;
X509 * cert=NULL;
BIO * bio;
char * mypem = /* www.cacert.org */
"-----BEGIN CERTIFICATE-----\n"\
"MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290\n"\
"IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB\n"\
"IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA\n"\
"Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO\n"\
"BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi\n"\
"MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ\n"\
"ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\n"\
"CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ\n"\
"8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6\n"\
"zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y\n"\
"fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7\n"\
"w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc\n"\
"G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k\n"\
"epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q\n"\
"laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ\n"\
"QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU\n"\
"fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826\n"\
"YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w\n"\
"ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY\n"\
"gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe\n"\
"MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0\n"\
"IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy\n"\
"dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw\n"\
"czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0\n"\
"dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl\n"\
"aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC\n"\
"AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg\n"\
"b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB\n"\
"ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc\n"\
"nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg\n"\
"18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c\n"\
"gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl\n"\
"Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY\n"\
"sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T\n"\
"SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF\n"\
"CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum\n"\
"GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk\n"\
"zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW\n"\
"omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD\n"\
"-----END CERTIFICATE-----\n";
/* get a BIO */
bio=BIO_new_mem_buf(mypem, -1);
/* use it to read the PEM formatted certificate from memory into an X509
* structure that SSL can use
*/
PEM_read_bio_X509(bio, &cert, 0, NULL);
if (cert == NULL)
printf("PEM_read_bio_X509 failed...\n");
/* get a pointer to the X509 certificate store (which may be empty!) */
store=SSL_CTX_get_cert_store((SSL_CTX *)sslctx);
/* add our certificate to this store */
if (X509_STORE_add_cert(store, cert)==0)
printf("error adding certificate\n");
/* all set to go */
return CURLE_OK ;
}
int main(void)
{
CURL * ch;
CURLcode rv;
rv=curl_global_init(CURL_GLOBAL_ALL);
ch=curl_easy_init();
rv=curl_easy_setopt(ch,CURLOPT_VERBOSE, 0);
rv=curl_easy_setopt(ch,CURLOPT_HEADER, 0);
rv=curl_easy_setopt(ch,CURLOPT_NOPROGRESS, 1);
rv=curl_easy_setopt(ch,CURLOPT_NOSIGNAL, 1);
rv=curl_easy_setopt(ch,CURLOPT_WRITEFUNCTION, *writefunction);
rv=curl_easy_setopt(ch,CURLOPT_WRITEDATA, stdout);
rv=curl_easy_setopt(ch,CURLOPT_HEADERFUNCTION, *writefunction);
rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr);
rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM");
rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1);
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.cacert.org/");
/* first try: retrieve page without cacerts' certificate -> will fail
*/
rv=curl_easy_perform(ch);
if (rv==CURLE_OK)
printf("*** transfer succeeded ***\n");
else
printf("*** transfer failed ***\n");
/* second try: retrieve page using cacerts' certificate -> will succeed
* load the certificate by installing a function doing the nescessary
* "modifications" to the SSL CONTEXT just before link init
*/
rv=curl_easy_setopt(ch,CURLOPT_SSL_CTX_FUNCTION, *sslctx_function);
rv=curl_easy_perform(ch);
if (rv==CURLE_OK)
printf("*** transfer succeeded ***\n");
else
printf("*** transfer failed ***\n");
curl_easy_cleanup(ch);
curl_global_cleanup();
}

View File

@@ -0,0 +1,110 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* This example shows usage of simple cookie interface.
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <curl/curl.h>
static void
print_cookies(CURL *curl)
{
CURLcode res;
struct curl_slist *cookies;
struct curl_slist *nc;
int i;
printf("Cookies, curl knows:\n");
res = curl_easy_getinfo(curl, CURLINFO_COOKIELIST, &cookies);
if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n", curl_easy_strerror(res));
exit(1);
}
nc = cookies, i = 1;
while (nc) {
printf("[%d]: %s\n", i, nc->data);
nc = nc->next;
i++;
}
if (i == 1) {
printf("(none)\n");
}
curl_slist_free_all(cookies);
}
int
main(void)
{
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl) {
char nline[256];
curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/"); /* google.com sets "PREF" cookie */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
return 1;
}
print_cookies(curl);
printf("Erasing curl's knowledge of cookies!\n");
curl_easy_setopt(curl, CURLOPT_COOKIELIST, "ALL");
print_cookies(curl);
printf("-----------------------------------------------\n"
"Setting a cookie \"PREF\" via cookie interface:\n");
#ifdef WIN32
#define snprintf _snprintf
#endif
/* Netscape format cookie */
snprintf(nline, 256, "%s\t%s\t%s\t%s\t%u\t%s\t%s",
".google.com", "TRUE", "/", "FALSE", time(NULL) + 31337, "PREF", "hello google, i like you very much!");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
return 1;
}
/* HTTP-header style cookie */
snprintf(nline, 256,
"Set-Cookie: OLD_PREF=3d141414bf4209321; "
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com");
res = curl_easy_setopt(curl, CURLOPT_COOKIELIST, nline);
if (res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_setopt failed: %s\n", curl_easy_strerror(res));
return 1;
}
print_cookies(curl);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
fprintf(stderr, "Curl perform failed: %s\n", curl_easy_strerror(res));
return 1;
}
}
else {
fprintf(stderr, "Curl init failed!\n");
return 1;
}
curl_global_cleanup();
return 0;
}

View File

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

View File

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

View File

@@ -15,9 +15,9 @@ Request internal information from the curl session with this function. The
third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a
pointer to a struct curl_slist * or a pointer to a double (as this pointer to a struct curl_slist * or a pointer to a double (as this
documentation describes further down). The data pointed-to will be filled in documentation describes further down). The data pointed-to will be filled in
accordingly and can be relied upon only if the function returns CURLE_OK. accordingly and can be relied upon only if the function returns CURLE_OK. Use
This function is intended to get used AFTER a performed transfer, all results this function AFTER a performed transfer if you want to get transfer- oriented
from this function are undefined until the transfer is completed. data.
You should not free the memory returned by this function unless it is You should not free the memory returned by this function unless it is
explictly mentioned below. explictly mentioned below.
@@ -35,12 +35,14 @@ this.
Pass a pointer to a long to receive the last received proxy response code to a Pass a pointer to a long to receive the last received proxy response code to a
CONNECT request. CONNECT request.
.IP CURLINFO_FILETIME .IP CURLINFO_FILETIME
Pass a pointer to a long to receive the remote time of the retrieved Pass a pointer to a long to receive the remote time of the retrieved document
document. If you get -1, it can be because of many reasons (unknown, the (in number of seconds since 1 jan 1970 in the GMT/UTC time zone). If you get
server hides it or the server doesn't support the command that tells document -1, it can be because of many reasons (unknown, the server hides it or the
time etc) and the time of the document is unknown. Note that you must tell the server doesn't support the command that tells document time etc) and the time
server to collect this information before the transfer is made, by using the of the document is unknown. Note that you must tell the server to collect this
CURLOPT_FILETIME option to \fIcurl_easy_setopt(3)\fP. (Added in 7.5) information before the transfer is made, by using the CURLOPT_FILETIME option
to \fIcurl_easy_setopt(3)\fP or you will unconditionally get a -1 back. (Added
in 7.5)
.IP CURLINFO_TOTAL_TIME .IP CURLINFO_TOTAL_TIME
Pass a pointer to a double to receive the total transaction time in seconds Pass a pointer to a double to receive the total transaction time in seconds
for the previous transfer. This time does not include the connect time, so if for the previous transfer. This time does not include the connect time, so if
@@ -132,6 +134,13 @@ counted). Combined with \fICURLINFO_REDIRECT_COUNT\fP you are able to know
how many times libcurl successfully reused existing connection(s) or not. See how many times libcurl successfully reused existing connection(s) or not. See
the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries
to make persistent connections to save time. (Added in 7.12.3) to make persistent connections to save time. (Added in 7.12.3)
.IP CURLINFO_COOKIELIST
Pass a pointer to a 'struct curl_slist *' to receive a linked-list of all
cookies cURL knows (expired ones, too). Don't forget to
\fIcurl_slist_free_all(3)\fP the list after it has been used. If there are no
cookies (cookies for the handle have not been enabled or simply none have been
received) 'struct curl_slist *' will be set to point to NULL. (Added in
7.14.1)
.SH RETURN VALUE .SH RETURN VALUE
If the operation was successful, CURLE_OK is returned. Otherwise an If the operation was successful, CURLE_OK is returned. Otherwise an
appropriate error code will be returned. appropriate error code will be returned.

View File

@@ -21,7 +21,7 @@
.\" * $Id$ .\" * $Id$
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH curl_easy_setopt 3 "12 May 2005" "libcurl 7.14.0" "libcurl Manual" .TH curl_easy_setopt 3 "28 Jul 2005" "libcurl 7.14.1" "libcurl Manual"
.SH NAME .SH NAME
curl_easy_setopt - set options for a curl easy handle curl_easy_setopt - set options for a curl easy handle
.SH SYNOPSIS .SH SYNOPSIS
@@ -171,20 +171,30 @@ argument in the progress callback set with \fICURLOPT_PROGRESSFUNCTION\fP.
.IP CURLOPT_HEADERFUNCTION .IP CURLOPT_HEADERFUNCTION
Function pointer that should match the following prototype: \fIsize_t Function pointer that should match the following prototype: \fIsize_t
function( void *ptr, size_t size, size_t nmemb, void *stream);\fP. This function( void *ptr, size_t size, size_t nmemb, void *stream);\fP. This
function gets called by libcurl as soon as there is received header data that function gets called by libcurl as soon as it has received header data. The
needs to be written down. The headers are guaranteed to be written one-by-one header callback will be called once for each header and only complete header
and only complete lines are written. Parsing headers should be easy enough lines are passed on to the callback. Parsing headers should be easy enough
using this. The size of the data pointed to by \fIptr\fP is \fIsize\fP using this. The size of the data pointed to by \fIptr\fP is \fIsize\fP
multiplied with \fInmemb\fP. The pointer named \fIstream\fP will be the one multiplied with \fInmemb\fP. Do not assume that the header line is zero
you passed to libcurl with the \fICURLOPT_WRITEHEADER\fP option. Return the terminated! The pointer named \fIstream\fP is the one you set with the
number of bytes actually written or return -1 to signal error to the library \fICURLOPT_WRITEHEADER\fP option. The callback function must return the number
of bytes actually taken care of, or return -1 to signal error to the library
(it will cause it to abort the transfer with a \fICURLE_WRITE_ERROR\fP return (it will cause it to abort the transfer with a \fICURLE_WRITE_ERROR\fP return
code). code).
Since 7.14.1: When a server sends a chunked encoded transfer, it may contain a
trailer. That trailer is identical to a HTTP header and if such a trailer is
received it is passed to the application using this callback as well. There
are several ways to detect it being a trailer and not an ordinary header: 1)
it comes after the response-body. 2) it comes after the final header line (CR
LF) 3) a Trailer: header among the response-headers mention what header to
expect in the trailer.
.IP CURLOPT_WRITEHEADER .IP CURLOPT_WRITEHEADER
Pass a pointer to be used to write the header part of the received data to. If (This option is also known as \fBCURLOPT_HEADERDATA\fP) Pass a pointer to be
you don't use your own callback to take care of the writing, this must be a used to write the header part of the received data to. If you don't use your
valid FILE *. See also the \fICURLOPT_HEADERFUNCTION\fP option above on how to own callback to take care of the writing, this must be a valid FILE *. See
set a custom get-all-headers callback. also the \fICURLOPT_HEADERFUNCTION\fP option above on how to set a custom
get-all-headers callback.
.IP CURLOPT_DEBUGFUNCTION .IP CURLOPT_DEBUGFUNCTION
Function pointer that should match the following prototype: \fIint Function pointer that should match the following prototype: \fIint
curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP
@@ -223,6 +233,9 @@ perform operation will return the error code from this callback function. Set
the \fIparm\fP argument with the \fICURLOPT_SSL_CTX_DATA\fP option. This the \fIparm\fP argument with the \fICURLOPT_SSL_CTX_DATA\fP option. This
option was introduced in 7.11.0. option was introduced in 7.11.0.
This function will get called on all new connections made to a server, during
the SSL negotiation. The SSL_CTX pointer will be a new one every time.
\fBNOTE:\fP To use this properly, a non-trivial amount of knowledge of the \fBNOTE:\fP To use this properly, a non-trivial amount of knowledge of the
openssl libraries is necessary. Using this function allows for example to use openssl libraries is necessary. Using this function allows for example to use
openssl callbacks to add additional validation code for certificates, and even openssl callbacks to add additional validation code for certificates, and even
@@ -274,15 +287,20 @@ be prefixed with [protocol]:// since any such prefix will be ignored. The
proxy's port number may optionally be specified with the separate option proxy's port number may optionally be specified with the separate option
\fICURLOPT_PROXYPORT\fP. \fICURLOPT_PROXYPORT\fP.
\fBNOTE:\fP when you tell the library to use an HTTP proxy, libcurl will When you tell the library to use an HTTP proxy, libcurl will transparently
transparently convert operations to HTTP even if you specify an FTP URL convert operations to HTTP even if you specify an FTP URL etc. This may have
etc. This may have an impact on what other features of the library you can an impact on what other features of the library you can use, such as
use, such as \fICURLOPT_QUOTE\fP and similar FTP specifics that don't work \fICURLOPT_QUOTE\fP and similar FTP specifics that don't work unless you
unless you tunnel through the HTTP proxy. Such tunneling is activated with tunnel through the HTTP proxy. Such tunneling is activated with
\fICURLOPT_HTTPPROXYTUNNEL\fP. \fICURLOPT_HTTPPROXYTUNNEL\fP.
\fBNOTE2:\fP libcurl respects the environment variables \fBhttp_proxy\fP, libcurl respects the environment variables \fBhttp_proxy\fP, \fBftp_proxy\fP,
\fBftp_proxy\fP, \fBall_proxy\fP etc, if any of those is set. \fBall_proxy\fP etc, if any of those is set. The \fICURLOPT_PROXY\fP option
does however override any possibly set environment variables.
Starting with 7.14.1, the proxy host string can be specified the exact same
way as the proxy environment variables, include protocol prefix (http://) and
embedded user + password.
.IP CURLOPT_PROXYPORT .IP CURLOPT_PROXYPORT
Pass a long with this option to set the proxy port to connect to unless it is Pass a long with this option to set the proxy port to connect to unless it is
specified in the proxy string \fICURLOPT_PROXY\fP. specified in the proxy string \fICURLOPT_PROXY\fP.
@@ -511,8 +529,11 @@ adding a header like "Transfer-Encoding: chunked" with
\fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must \fICURLOPT_HTTPHEADER\fP. With HTTP 1.0 or without chunked transfer, you must
specify the size in the request. specify the size in the request.
NOTE: if you have issued a POST request and want to make a HEAD or GET When setting \fICURLOPT_POST\fP to a non-zero value, it will automatically set
instead, you must explictly pick the new request type using \fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
If you issue a POST request and then want to make a HEAD or GET using the same
re-used handle, you must explictly set the new request type using
\fICURLOPT_NOBODY\fP or \fICURLOPT_HTTPGET\fP or similar. \fICURLOPT_NOBODY\fP or \fICURLOPT_HTTPGET\fP or similar.
.IP CURLOPT_POSTFIELDS .IP CURLOPT_POSTFIELDS
Pass a char * as parameter, which should be the full data to post in an HTTP Pass a char * as parameter, which should be the full data to post in an HTTP
@@ -550,6 +571,9 @@ must remain intact until you close this curl handle again with
Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header. Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual. You can disable this header with \fICURLOPT_HTTPHEADER\fP as usual.
When setting \fICURLOPT_HTTPPOST\fP, it will automatically set
\fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
.IP CURLOPT_REFERER .IP CURLOPT_REFERER
Pass a pointer to a zero terminated string as parameter. It will be used to Pass a pointer to a zero terminated string as parameter. It will be used to
set the Referer: header in the http request sent to the remote server. This set the Referer: header in the http request sent to the remote server. This
@@ -620,6 +644,9 @@ dumped to a file.
Given an empty or non-existing file or by passing the empty string (""), this Given an empty or non-existing file or by passing the empty string (""), this
option will enable cookies for this curl handle, making it understand and option will enable cookies for this curl handle, making it understand and
parse received cookies and then use matching cookies in future request. parse received cookies and then use matching cookies in future request.
If you use this option multiple times, you just add more files to read.
Subsequent files will add more cookies.
.IP CURLOPT_COOKIEJAR .IP CURLOPT_COOKIEJAR
Pass a file name as char *, zero terminated. This will make libcurl write all Pass a file name as char *, zero terminated. This will make libcurl write all
internally known cookies to the specified file when \fIcurl_easy_cleanup(3)\fP internally known cookies to the specified file when \fIcurl_easy_cleanup(3)\fP
@@ -640,10 +667,18 @@ cookies" from the previous session. By default, libcurl always stores and
loads all cookies, independent if they are session cookies are not. Session loads all cookies, independent if they are session cookies are not. Session
cookies are cookies without expiry date and they are meant to be alive and cookies are cookies without expiry date and they are meant to be alive and
existing for this "session" only. existing for this "session" only.
.IP CURLOPT_COOKIELIST
Pass a char * to a cookie string. Cookie can be either in Netscape / Mozilla
format or just regular HTTP-style header (Set-Cookie: ...) format. If cURL
cookie engine was not enabled it will enable its cookie engine. Passing a
magic string \&"ALL" will erase all cookies known by cURL. (Added in 7.14.1)
.IP CURLOPT_HTTPGET .IP CURLOPT_HTTPGET
Pass a long. If the long is non-zero, this forces the HTTP request to get back Pass a long. If the long is non-zero, this forces the HTTP request to get back
to GET. usable if a POST, HEAD, PUT or a custom request have been used to GET. usable if a POST, HEAD, PUT or a custom request have been used
previously using the same curl handle. previously using the same curl handle.
When setting \fICURLOPT_HTTPGET\fP to a non-zero value, it will automatically
set \fICURLOPT_NOBODY\fP to 0 (since 7.14.1).
.IP CURLOPT_HTTP_VERSION .IP CURLOPT_HTTP_VERSION
Pass a long, set to one of the values described below. They force libcurl to Pass a long, set to one of the values described below. They force libcurl to
use the specific HTTP versions. This is not sensible to do unless you have a use the specific HTTP versions. This is not sensible to do unless you have a
@@ -656,6 +691,12 @@ it thinks fit.
Enforce HTTP 1.0 requests. Enforce HTTP 1.0 requests.
.IP CURL_HTTP_VERSION_1_1 .IP CURL_HTTP_VERSION_1_1
Enforce HTTP 1.1 requests. Enforce HTTP 1.1 requests.
.IP CURLOPT_IGNORE_CONTENT_LENGTH
Ignore the Content-Length header. This is useful for Apache 1.x (and similar
servers) which will report incorrect content length for files over 2
gigabytes. If this option is used, curl will not be able to accurately report
progress, and will simply stop the download when the server ends the
connection. (added in 7.14.1)
.RE .RE
.SH FTP OPTIONS .SH FTP OPTIONS
.IP CURLOPT_FTPPORT .IP CURLOPT_FTPPORT
@@ -770,11 +811,15 @@ this data is sent off using the ACCT command. (Added in 7.13.0)
.SH PROTOCOL OPTIONS .SH PROTOCOL OPTIONS
.IP CURLOPT_TRANSFERTEXT .IP CURLOPT_TRANSFERTEXT
A non-zero parameter tells the library to use ASCII mode for ftp transfers, A non-zero parameter tells the library to use ASCII mode for ftp transfers,
instead of the default binary transfer. For LDAP transfers it gets the data in instead of the default binary transfer. For win32 systems it does not set the
plain text instead of HTML and for win32 systems it does not set the stdout to stdout to binary mode. This option can be usable when transferring text data
binary mode. This option can be usable when transferring text data between between systems with different views on certain characters, such as newlines
systems with different views on certain characters, such as newlines or or similar.
similar.
\fBNOTE:\fP libcurl does not do a complete ASCII conversion when doing ASCII
transfers over FTP. This is a known limitation/flaw that nobody has
rectified. libcurl simply sets the mode to ascii and performs a standard
transfer.
.IP CURLOPT_CRLF .IP CURLOPT_CRLF
Convert Unix newlines to CRLF newlines on transfers. Convert Unix newlines to CRLF newlines on transfers.
.IP CURLOPT_RANGE .IP CURLOPT_RANGE
@@ -818,9 +863,8 @@ A non-zero parameter tells the library to not include the body-part in the
output. This is only relevant for protocols that have separate header and body output. This is only relevant for protocols that have separate header and body
parts. On HTTP(S) servers, this will make libcurl do a HEAD request. parts. On HTTP(S) servers, this will make libcurl do a HEAD request.
To change back to GET, you should use \fICURLOPT_HTTPGET\fP. To change back to To change request to GET, you should use \fICURLOPT_HTTPGET\fP. Change request
POST, you should use \fICURLOPT_POST\fP. Setting \fICURLOPT_NOBODY\fP to zero to POST with \fICURLOPT_POST\fP etc.
has no effect.
.IP CURLOPT_INFILESIZE .IP CURLOPT_INFILESIZE
When uploading a file to a remote site, this option should be used to tell When uploading a file to a remote site, this option should be used to tell
libcurl what the expected size of the infile is. This value should be passed libcurl what the expected size of the infile is. This value should be passed

View File

@@ -90,7 +90,7 @@ followed by a pointer to a string to a name, will make libcurl use the given
name in the file upload part, instead of the actual file name given to name in the file upload part, instead of the actual file name given to
\fICURLFORM_FILE\fP. \fICURLFORM_FILE\fP.
.IP BCURLFORM_BUFFER .IP CURLFORM_BUFFER
followed by a string, tells libcurl that a buffer is to be used to upload data followed by a string, tells libcurl that a buffer is to be used to upload data
instead of using a file. The given string is used as the value of the file instead of using a file. The given string is used as the value of the file
name field in the content header. name field in the content header.

View File

@@ -2,7 +2,7 @@
.\" nroff -man [file] .\" nroff -man [file]
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_getdate 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" .TH curl_getdate 3 "12 Aug 2005" "libcurl 7.0" "libcurl Manual"
.SH NAME .SH NAME
curl_getdate - Convert an date string to number of seconds since January 1, curl_getdate - Convert an date string to number of seconds since January 1,
1970 1970
@@ -26,7 +26,7 @@ order of the items is immaterial. A date string may contain many flavors of
items: items:
.TP 0.8i .TP 0.8i
.B calendar date items .B calendar date items
Can be specified several ways. Month names can only be three-letter Can be specified several ways. Month names can only be three-letter english
abbrivations, numbers can be zero-prefixed and the year may use 2 or 4 digits. abbrivations, numbers can be zero-prefixed and the year may use 2 or 4 digits.
Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6. Examples: 06 Nov 1994, 06-Nov-94 and Nov-94 6.
.TP .TP
@@ -94,7 +94,7 @@ crippled mktime(), \fIcurl_getdate\fP will return -1 in this case.
.SH REWRITE .SH REWRITE
The former version of this function was built with yacc and was not only very The former version of this function was built with yacc and was not only very
large, it was also never quite understood and it wasn't possible to build with large, it was also never quite understood and it wasn't possible to build with
non-GNU tools since only Bison could make it thread-safe! non-GNU tools since only GNU Bison could make it thread-safe!
The rewrite was done for 7.12.2. The new one is much smaller and use simpler The rewrite was done for 7.12.2. The new one is much smaller and use simpler
code. code.

View File

@@ -0,0 +1,27 @@
An overview of the six time values available from curl_easy_getinfo()
curk_easy_perform()
|
|--NT
|--|--CT
|--|--|--PT
|--|--|--|--ST
|--|--|--TT
|--|--|--|--|--RT
NT = CURLINFO_NAMELOOKUP_TIME. The time it took from the start until the name
resolving was completed.
CT = CURLINFO_CONNECT_TIME. The time it took from the start until the connect
to the remote host (or proxy) was completed.
PT = CURLINFO_PRETRANSFER_TIME. The time it took from the start until the file
transfer is just about to begin. This includes all pre-transfer commands
and negotiations that are specific to the particular protocol(s)
involved.
ST = CURLINFO_STARTTRANSFER_TIME. The time it took from the start until the
first byte is just about to be transferred.
TT = CURLINFO_TOTAL_TIME. Time of the previous transfer. This time does not
include the connect time (CT), so if you want the complete operation
time, you should add that.
RT = CURLINFO_REDIRECT_TIME. The time it took for all redirection steps
include name lookup, connect, pretransfer and transfer before final
transaction was started. So, this is zero if no redirection took place.

View File

@@ -196,8 +196,7 @@ Initiating the SSL Engine failed
The remote server denied curl to login (Added in 7.13.1) The remote server denied curl to login (Added in 7.13.1)
.SH "CURLMcode" .SH "CURLMcode"
This is the generic return code used by functions in the libcurl multi This is the generic return code used by functions in the libcurl multi
interface. Also consider \fIcurl_multi_strerror(3)\fI. interface. Also consider \fIcurl_multi_strerror(3)\fP.
.IP "CURLM_CALL_MULTI_PERFORM (-1)" .IP "CURLM_CALL_MULTI_PERFORM (-1)"
This is not really an error. It means you should call This is not really an error. It means you should call
\fIcurl_multi_perform(3)\fP again without doing select() or similar in between. \fIcurl_multi_perform(3)\fP again without doing select() or similar in between.
@@ -213,9 +212,7 @@ You are doomed.
This can only be returned if libcurl bugs. Please report it to us! This can only be returned if libcurl bugs. Please report it to us!
.SH "CURLSHcode" .SH "CURLSHcode"
The "share" interface will return a CURLSHcode to indicate when an error has The "share" interface will return a CURLSHcode to indicate when an error has
occurred. Also consider \fIcurl_share_strerror(3)\fI. occurred. Also consider \fIcurl_share_strerror(3)\fP.
CURLSHcode is one of the following:
.IP "CURLSHE_OK (0)" .IP "CURLSHE_OK (0)"
All fine. Proceed as usual. All fine. Proceed as usual.
.IP "CURLSHE_BAD_OPTION (1)" .IP "CURLSHE_BAD_OPTION (1)"

View File

@@ -1,7 +1,7 @@
# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION], # LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
# [ACTION-IF-YES], [ACTION-IF-NO]) # [ACTION-IF-YES], [ACTION-IF-NO])
# ---------------------------------------------------------- # ----------------------------------------------------------
# David Shaw <dshaw@jabberwocky.com> Jan-23-2005 # David Shaw <dshaw@jabberwocky.com> Jun-21-2005
# #
# Checks for libcurl. DEFAULT-ACTION is the string yes or no to # Checks for libcurl. DEFAULT-ACTION is the string yes or no to
# specify whether to default to --with-libcurl or --without-libcurl. # specify whether to default to --with-libcurl or --without-libcurl.
@@ -32,13 +32,7 @@
# found is after version 7.7.2, the first version that included the # found is after version 7.7.2, the first version that included the
# curl-config script. Note that it is very important for people # curl-config script. Note that it is very important for people
# packaging binary versions of libcurl to include this script! # packaging binary versions of libcurl to include this script!
# Without curl-config, we can only make educated guesses as to what # Without curl-config, we can only guess what protocols are available.
# protocols are available. Specifically, we assume that all of HTTP,
# FTP, GOPHER, FILE, TELNET, LDAP, and DICT exist, and (if SSL exists)
# HTTPS is present. All of these protocols existed when libcurl was
# first created in version 7, so this is a safe assumption. If the
# version is 7.11.0 or later, FTPS is assumed to be present as well.
# FTPS existed before then, but was not yet fully standards compliant.
AC_DEFUN([LIBCURL_CHECK_CONFIG], AC_DEFUN([LIBCURL_CHECK_CONFIG],
[ [
@@ -103,6 +97,15 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
fi fi
if test x"$LIBCURL" = "x" ; then if test x"$LIBCURL" = "x" ; then
LIBCURL=`$_libcurl_config --libs` LIBCURL=`$_libcurl_config --libs`
# This is so silly, but Apple actually has a bug in their
# curl-config script. Fixed in Tiger, but there are still
# lots of Panther installs around.
case "${host}" in
powerpc-apple-darwin7*)
LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'`
;;
esac
fi fi
# All curl-config scripts support --feature # All curl-config scripts support --feature
@@ -130,8 +133,8 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
[ [
_libcurl_save_cppflags=$CPPFLAGS _libcurl_save_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS" CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
_libcurl_save_ldflags=$LDFLAGS _libcurl_save_libs=$LIBS
LDFLAGS="$LDFLAGS $LIBCURL" LIBS="$LIBS $LIBCURL"
AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[ AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[
/* Try and use a few common options to force a failure if we are /* Try and use a few common options to force a failure if we are
@@ -147,12 +150,30 @@ x=CURLOPT_VERBOSE;
]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no) ]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no)
CPPFLAGS=$_libcurl_save_cppflags CPPFLAGS=$_libcurl_save_cppflags
LDFLAGS=$_libcurl_save_ldflags LIBS=$_libcurl_save_libs
unset _libcurl_save_cppflags unset _libcurl_save_cppflags
unset _libcurl_save_ldflags unset _libcurl_save_libs
]) ])
if test $libcurl_cv_lib_curl_usable = yes ; then if test $libcurl_cv_lib_curl_usable = yes ; then
# Does curl_free() exist in this version of libcurl?
# If not, fake it with free()
_libcurl_save_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
_libcurl_save_libs=$LIBS
LIBS="$LIBS $LIBCURL"
AC_CHECK_FUNC(curl_free,,
AC_DEFINE(curl_free,free,
[Define curl_free() as free() if our version of curl lacks curl_free.]))
CPPFLAGS=$_libcurl_save_cppflags
LIBS=$_libcurl_save_libs
unset _libcurl_save_cppflags
unset _libcurl_save_libs
AC_DEFINE(HAVE_LIBCURL,1, AC_DEFINE(HAVE_LIBCURL,1,
[Define to 1 if you have a functional curl library.]) [Define to 1 if you have a functional curl library.])
AC_SUBST(LIBCURL_CPPFLAGS) AC_SUBST(LIBCURL_CPPFLAGS)

View File

@@ -890,6 +890,12 @@ typedef enum {
"account" info */ "account" info */
CINIT(FTP_ACCOUNT, OBJECTPOINT, 134), CINIT(FTP_ACCOUNT, OBJECTPOINT, 134),
/* feed cookies into cookie engine */
CINIT(COOKIELIST, OBJECTPOINT, 135),
/* ignore Content-Length */
CINIT(IGNORE_CONTENT_LENGTH, LONG, 136),
CURLOPT_LASTENTRY /* the last unused */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;
@@ -1202,11 +1208,10 @@ CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
* DESCRIPTION * DESCRIPTION
* *
* Returns the time, in seconds since 1 Jan 1970 of the time string given in * Returns the time, in seconds since 1 Jan 1970 of the time string given in
* the first argument. The time argument in the second parameter is for cases * the first argument. The time argument in the second parameter is unused
* where the specified time is relative now, like 'two weeks' or 'tomorrow' * and should be set to NULL.
* etc.
*/ */
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *now); CURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);
#define CURLINFO_STRING 0x100000 #define CURLINFO_STRING 0x100000
#define CURLINFO_LONG 0x200000 #define CURLINFO_LONG 0x200000
@@ -1244,6 +1249,7 @@ typedef enum {
CURLINFO_OS_ERRNO = CURLINFO_LONG + 25, CURLINFO_OS_ERRNO = CURLINFO_LONG + 25,
CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26, CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26,
CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27, CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27,
CURLINFO_COOKIELIST = CURLINFO_SLIST + 28,
/* Fill in new entries below here! */ /* Fill in new entries below here! */
CURLINFO_LASTONE = 28 CURLINFO_LASTONE = 28

View File

@@ -28,7 +28,7 @@
/* This is the version number of the libcurl package from which this header /* This is the version number of the libcurl package from which this header
file origins: */ file origins: */
#define LIBCURL_VERSION "7.14.0-CVS" #define LIBCURL_VERSION "7.14.1-CVS"
/* This is the numeric version of the libcurl version number, meant for easier /* This is the numeric version of the libcurl version number, meant for easier
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
@@ -44,12 +44,12 @@
always a greater number in a more recent release. It makes comparisons with always a greater number in a more recent release. It makes comparisons with
greater than and less than work. greater than and less than work.
*/ */
#define LIBCURL_VERSION_NUM 0x070e00 #define LIBCURL_VERSION_NUM 0x070e01
/* The numeric version number is also available "in parts" by using these /* The numeric version number is also available "in parts" by using these
defines: */ defines: */
#define LIBCURL_VERSION_MAJOR 7 #define LIBCURL_VERSION_MAJOR 7
#define LIBCURL_VERSION_MINOR 14 #define LIBCURL_VERSION_MINOR 14
#define LIBCURL_VERSION_PATCH 0 #define LIBCURL_VERSION_PATCH 1
#endif /* __CURL_CURLVER_H */ #endif /* __CURL_CURLVER_H */

View File

@@ -13,15 +13,17 @@ NDKBASE = c:/novell
endif endif
# Edit the path below to point to the base of your Zlib sources. # Edit the path below to point to the base of your Zlib sources.
#ZLIB_PATH = ../../zlib-1.2.2 ifndef ZLIB_PATH
ZLIB_PATH = ../../zlib-1.2.3
endif
# Edit the path below to point to the base of your OpenSSL package. # Edit the path below to point to the base of your OpenSSL package.
ifndef OPENSSL_PATH ifndef OPENSSL_PATH
OPENSSL_PATH = ../../openssl-0.9.7g OPENSSL_PATH = ../../openssl-0.9.8
endif endif
ifndef INSTDIR ifndef INSTDIR
INSTDIR = ../curl-$(LIBCURL_VERSION_STR)-bin-nw INSTDIR = ..$(DS)curl-$(LIBCURL_VERSION_STR)-bin-nw
endif endif
# Edit the vars below to change NLM target settings. # Edit the vars below to change NLM target settings.
@@ -103,8 +105,6 @@ else
endif endif
endif endif
LDLIBS =
NDK_ROOT = $(NDKBASE)/ndk NDK_ROOT = $(NDKBASE)/ndk
SDK_CLIB = $(NDK_ROOT)/nwsdk SDK_CLIB = $(NDK_ROOT)/nwsdk
SDK_LIBC = $(NDK_ROOT)/libc SDK_LIBC = $(NDK_ROOT)/libc
@@ -114,21 +114,26 @@ INCLUDES = -I. -I../include
ifdef WITH_ARES ifdef WITH_ARES
INCLUDES += -I../ares INCLUDES += -I../ares
LIBCARES = ../ares/libcares.lib LDLIBS = ../ares/libcares.lib
endif endif
ifdef ZLIB_PATH ifdef WITH_SSL
INCLUDES += -I$(ZLIB_PATH)
IMPORTS = @$(ZLIB_PATH)/nw/zlib.imp
MODULES = libz.nlm
endif
ifdef SSL
INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_libc -I$(OPENSSL_PATH)/outinc_nw_libc/openssl
LIBSSL = $(OPENSSL_PATH)/out_nw_libc/crypto.lib $(OPENSSL_PATH)/out_nw_libc/ssl.lib LDLIBS += $(OPENSSL_PATH)/out_nw_libc/crypto.lib $(OPENSSL_PATH)/out_nw_libc/ssl.lib
IMPORTS += GetProcessSwitchCount RunningProcess
endif
ifdef WITH_ZLIB
INCLUDES += -I$(ZLIB_PATH)
ifdef LINK_STATIC
LDLIBS += $(ZLIB_PATH)/nw/libz.lib
else
IMPORTS += @$(ZLIB_PATH)/nw/libz.imp
MODULES += libz.nlm
endif
endif endif
ifeq ($(LIBARCH),LIBC) ifeq ($(LIBARCH),LIBC)
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
INCLUDES += -I$(SDK_LIBC)/include/winsock # INCLUDES += -I$(SDK_LIBC)/include/winsock
# INCLUDES += -I$(SDK_LDAP)/libc/inc # INCLUDES += -I$(SDK_LDAP)/libc/inc
CFLAGS += -D_POSIX_SOURCE CFLAGS += -D_POSIX_SOURCE
# CFLAGS += -D__ANSIC__ # CFLAGS += -D__ANSIC__
@@ -152,13 +157,16 @@ endif
ifeq ($(findstring linux,$(OSTYPE)),linux) ifeq ($(findstring linux,$(OSTYPE)),linux)
DL = ' DL = '
DS = /
#-include $(NDKBASE)/nlmconv/ncpfs.inc #-include $(NDKBASE)/nlmconv/ncpfs.inc
else
DS = \\
endif endif
# Makefile.inc provides the CSOURCES and HHEADERS defines # Makefile.inc provides the CSOURCES and HHEADERS defines
include Makefile.inc include Makefile.inc
OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(LIBCARES) $(LIBSSL) OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(strip $(CSOURCES))) $(LDLIBS)
OBJL = $(OBJS) $(OBJDIR)/nwlib.o OBJL = $(OBJS) $(OBJDIR)/nwlib.o
@@ -189,6 +197,9 @@ install: $(INSTDIR) all
@$(CP) ../COPYING $(INSTDIR) @$(CP) ../COPYING $(INSTDIR)
@$(CP) ../README $(INSTDIR) @$(CP) ../README $(INSTDIR)
@$(CP) ../RELEASE-NOTES $(INSTDIR) @$(CP) ../RELEASE-NOTES $(INSTDIR)
ifdef WITH_SSL
@$(CP) ca-bundle.crt $(INSTDIR)
endif
clean: clean:
-$(RM) config.h ca-bundle.h -$(RM) config.h ca-bundle.h
@@ -274,11 +285,8 @@ ifdef IMPORTS
@echo $(DL)import $(IMPORTS)$(DL) >> $@ @echo $(DL)import $(IMPORTS)$(DL) >> $@
endif endif
ifeq ($(LD),nlmconv) ifeq ($(LD),nlmconv)
ifdef WITH_ARES ifdef LDLIBS
@echo $(DL)input $(LIBCARES)$(DL) >> $@ @echo $(DL)input $(LDLIBS)$(DL) >> $@
endif
ifdef SSL
@echo $(DL)input $(LIBSSL)$(DL) >> $@
endif endif
@echo $(DL)input $(OBJL)$(DL) >> $@ @echo $(DL)input $(OBJL)$(DL) >> $@
@echo $(DL)input $(PRELUDE)$(DL) >> $@ @echo $(DL)input $(PRELUDE)$(DL) >> $@
@@ -336,6 +344,13 @@ config.h: Makefile.netware
@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ @echo $(DL)#define SIZEOF_CURL_OFF_T 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_IN6_ADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN_ADDR 4$(DL) >> $@
ifdef DISABLE_LDAP ifdef DISABLE_LDAP
@echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@ @echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@
else else
@@ -355,11 +370,11 @@ endif
ifdef WITH_ARES ifdef WITH_ARES
@echo $(DL)#define USE_ARES 1$(DL) >> $@ @echo $(DL)#define USE_ARES 1$(DL) >> $@
endif endif
ifdef ZLIB_PATH ifdef WITH_ZLIB
@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@ @echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@
@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@ @echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@
endif endif
ifdef SSL ifdef WITH_SSL
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@ @echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@ @echo $(DL)#define USE_OPENSSL 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@ @echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@

View File

@@ -1,17 +0,0 @@
Things to fix for the GnuTLS support
====================================
* make the configure --with-ssl option first check for OpenSSL and then for
GnuTLS if OpenSSL wasn't detected.
* Get NTLM working using the functions provided by libgcrypt, since GnuTLS
already depends on that to function. Not strictly SSL/TLS related, but
hey... Another option is to get available DES and MD4 source code from the
cryptopp library. They are fine license-wise, but are C++.
* SSL engine stuff?
SRP for TLS
* Work out a common method with Peter Sylvester's OpenSSL-patch for SRP
on the TLS to provide name and password

View File

@@ -22,28 +22,53 @@
***************************************************************************/ ***************************************************************************/
#include "amigaos.h" #include "amigaos.h"
#include <stdio.h> /* for stderr */ #include <amitcp/socketbasetags.h>
struct Library *SocketBase = NULL; struct Library *SocketBase = NULL;
extern int errno, h_errno;
#ifdef __libnix__
#include <stabs.h>
void __request(const char *msg);
#else
# define __request( msg ) Printf( msg "\n\a")
#endif
void amiga_cleanup() void amiga_cleanup()
{ {
if(SocketBase) if(SocketBase) {
CloseLibrary(SocketBase); CloseLibrary(SocketBase);
SocketBase = NULL;
SocketBase = NULL; }
} }
BOOL amiga_init() BOOL amiga_init()
{ {
if(!SocketBase) if(!SocketBase)
SocketBase = OpenLibrary("bsdsocket.library", 4); SocketBase = OpenLibrary("bsdsocket.library", 4);
if(!SocketBase) { if(!SocketBase) {
fprintf(stderr, "No TCP/IP Stack running!\n\a"); __request("No TCP/IP Stack running!");
return FALSE; return FALSE;
} }
atexit(amiga_cleanup); if(SocketBaseTags(
return TRUE; SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (ULONG) &errno,
// SBTM_SETVAL(SBTC_HERRNOLONGPTR), (ULONG) &h_errno,
SBTM_SETVAL(SBTC_LOGTAGPTR), (ULONG) "cURL",
TAG_DONE)) {
__request("SocketBaseTags ERROR");
return FALSE;
}
#ifndef __libnix__
atexit(amiga_cleanup);
#endif
return TRUE;
} }
#ifdef __libnix__
ADD2EXIT(amiga_cleanup,-50);
#endif

View File

@@ -32,13 +32,19 @@
#include <proto/exec.h> #include <proto/exec.h>
#include <proto/dos.h> #include <proto/dos.h>
#include <bsdsocket.h> #include <sys/socket.h>
#include "config-amigaos.h" #include "config-amigaos.h"
#define select(args...) WaitSelect( args, NULL) #ifndef select
#define inet_ntoa(x) Inet_NtoA( x ## .s_addr) # define select(args...) WaitSelect( args, NULL)
#define ioctl(a,b,c,d) IoctlSocket( (LONG)a, (ULONG)b, (char*)c) #endif
#ifndef inet_ntoa
# define inet_ntoa(x) Inet_NtoA( x ## .s_addr)
#endif
#ifndef ioctl
# define ioctl(a,b,c,d) IoctlSocket( (LONG)a, (ULONG)b, (char*)c)
#endif
#define _AMIGASF 1 #define _AMIGASF 1
extern void amiga_cleanup(); extern void amiga_cleanup();

View File

@@ -54,6 +54,7 @@
#define HAVE_UTIME_H 1 #define HAVE_UTIME_H 1
#define HAVE_WRITABLE_ARGV 1 #define HAVE_WRITABLE_ARGV 1
#define HAVE_ZLIB_H 1 #define HAVE_ZLIB_H 1
#define HAVE_SYS_IOCTL_H 1
#define USE_OPENSSL 1 #define USE_OPENSSL 1
#define USE_SSLEAY 1 #define USE_SSLEAY 1
@@ -80,7 +81,9 @@
#define TIME_WITH_SYS_TIME 1 #define TIME_WITH_SYS_TIME 1
#define in_addr_t int #define in_addr_t int
#define socklen_t int #ifndef socklen_t
# define socklen_t int
#endif
#ifndef O_RDONLY #ifndef O_RDONLY
# define O_RDONLY 0x0000 # define O_RDONLY 0x0000

View File

@@ -359,13 +359,13 @@ static CURLcode bindlocal(struct connectdata *conn,
} /* end of if h */ } /* end of if h */
else { else {
failf(data,"could't find my own IP address (%s)", myhost); failf(data,"couldn't find my own IP address (%s)", myhost);
return CURLE_HTTP_PORT_FAILED; return CURLE_HTTP_PORT_FAILED;
} }
} /* end of inet_addr */ } /* end of inet_addr */
else { else {
failf(data, "could't find my own IP address (%s)", myhost); failf(data, "couldn't find my own IP address (%s)", myhost);
return CURLE_HTTP_PORT_FAILED; return CURLE_HTTP_PORT_FAILED;
} }

View File

@@ -85,12 +85,17 @@ Example set of cookies:
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define _MPRINTF_REPLACE /* without this on windows OS we get undefined reference to snprintf */
#include <curl/mprintf.h>
#include "urldata.h" #include "urldata.h"
#include "cookie.h" #include "cookie.h"
#include "strequal.h" #include "strequal.h"
#include "strtok.h" #include "strtok.h"
#include "sendf.h" #include "sendf.h"
#include "memory.h" #include "memory.h"
#include "share.h"
#include "strtoofft.h"
/* The last #include file should be: */ /* The last #include file should be: */
#ifdef CURLDEBUG #ifdef CURLDEBUG
@@ -130,6 +135,27 @@ static bool tailmatch(const char *little, const char *bigone)
return (bool)strequal(little, bigone+biglen-littlelen); return (bool)strequal(little, bigone+biglen-littlelen);
} }
/*
* Load cookies from all given cookie files (CURLOPT_COOKIEFILE).
*/
void Curl_cookie_loadfiles(struct SessionHandle *data)
{
struct curl_slist *list = data->change.cookielist;
if(list) {
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
while(list) {
data->cookies = Curl_cookie_init(data,
list->data,
data->cookies,
data->set.cookiesession);
list = list->next;
}
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
curl_slist_free_all(data->change.cookielist); /* clean up list */
data->change.cookielist = NULL; /* don't do this again! */
}
}
/**************************************************************************** /****************************************************************************
* *
* Curl_cookie_add() * Curl_cookie_add()
@@ -317,7 +343,7 @@ Curl_cookie_add(struct SessionHandle *data,
badcookie = TRUE; badcookie = TRUE;
break; break;
} }
co->expires = (long)curl_getdate(what, &now); co->expires = curl_getdate(what, &now);
} }
else if(!co->name) { else if(!co->name) {
co->name = strdup(name); co->name = strdup(name);
@@ -470,7 +496,7 @@ Curl_cookie_add(struct SessionHandle *data,
co->secure = (bool)strequal(ptr, "TRUE"); co->secure = (bool)strequal(ptr, "TRUE");
break; break;
case 4: case 4:
co->expires = atoi(ptr); co->expires = curlx_strtoofft(ptr, NULL, 10);
break; break;
case 5: case 5:
co->name = strdup(ptr); co->name = strdup(ptr);
@@ -816,6 +842,34 @@ void Curl_cookie_cleanup(struct CookieInfo *c)
} }
} }
/* get_netscape_format()
*
* Formats a string for Netscape output file, w/o a newline at the end.
*
* Function returns a char * to a formatted line. Has to be free()d
*/
static char *get_netscape_format(const struct Cookie *co)
{
return aprintf(
"%s%s\t" /* domain */
"%s\t" /* tailmatch */
"%s\t" /* path */
"%s\t" /* secure */
"%" FORMAT_OFF_T "\t" /* expires */
"%s\t" /* name */
"%s", /* value */
/* Make sure all domains are prefixed with a dot if they allow
tailmatching. This is Mozilla-style. */
(co->tailmatch && co->domain && co->domain[0] != '.')? ".":"",
co->domain?co->domain:"unknown",
co->tailmatch?"TRUE":"FALSE",
co->path?co->path:"/",
co->secure?"TRUE":"FALSE",
co->expires,
co->name,
co->value?co->value:"");
}
/* /*
* Curl_cookie_output() * Curl_cookie_output()
* *
@@ -847,6 +901,8 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
} }
if(c) { if(c) {
char *format_ptr;
fputs("# Netscape HTTP Cookie File\n" fputs("# Netscape HTTP Cookie File\n"
"# http://www.netscape.com/newsref/std/cookie_spec.html\n" "# http://www.netscape.com/newsref/std/cookie_spec.html\n"
"# This file was generated by libcurl! Edit at your own risk.\n\n", "# This file was generated by libcurl! Edit at your own risk.\n\n",
@@ -854,26 +910,13 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
co = c->cookies; co = c->cookies;
while(co) { while(co) {
fprintf(out, format_ptr = get_netscape_format(co);
"%s%s\t" /* domain */ if (format_ptr == NULL) {
"%s\t" /* tailmatch */ fprintf(out, "#\n# Fatal libcurl error\n");
"%s\t" /* path */ return 1;
"%s\t" /* secure */ }
"%u\t" /* expires */ fprintf(out, "%s\n", format_ptr);
"%s\t" /* name */ free(format_ptr);
"%s\n", /* value */
/* Make sure all domains are prefixed with a dot if they allow
tailmatching. This is Mozilla-style. */
(co->tailmatch && co->domain && co->domain[0] != '.')? ".":"",
co->domain?co->domain:"unknown",
co->tailmatch?"TRUE":"FALSE",
co->path?co->path:"/",
co->secure?"TRUE":"FALSE",
(unsigned int)co->expires,
co->name,
co->value?co->value:"");
co=co->next; co=co->next;
} }
} }
@@ -884,4 +927,35 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
return 0; return 0;
} }
struct curl_slist *Curl_cookie_list(struct SessionHandle *data)
{
struct curl_slist *list = NULL;
struct curl_slist *beg;
struct Cookie *c;
char *line;
if ((data->cookies == NULL) ||
(data->cookies->numcookies == 0))
return NULL;
c = data->cookies->cookies;
beg = list;
while (c) {
/* fill the list with _all_ the cookies we know */
line = get_netscape_format(c);
if (line == NULL) {
/* get_netscape_format returns null only if we run out of memory */
curl_slist_free_all(beg); /* free some memory */
return NULL;
}
list = curl_slist_append(list, line);
free(line);
c = c->next;
}
return list;
}
#endif /* CURL_DISABLE_HTTP || CURL_DISABLE_COOKIES */ #endif /* CURL_DISABLE_HTTP || CURL_DISABLE_COOKIES */

View File

@@ -38,7 +38,7 @@ struct Cookie {
char *value; /* name = <this> */ char *value; /* name = <this> */
char *path; /* path = <this> */ char *path; /* path = <this> */
char *domain; /* domain = <this> */ char *domain; /* domain = <this> */
long expires; /* expires = <this> */ curl_off_t expires; /* expires = <this> */
char *expirestr; /* the plain text version */ char *expirestr; /* the plain text version */
bool tailmatch; /* weather we do tail-matchning of the domain name */ bool tailmatch; /* weather we do tail-matchning of the domain name */
@@ -92,4 +92,12 @@ void Curl_cookie_freelist(struct Cookie *);
void Curl_cookie_cleanup(struct CookieInfo *); void Curl_cookie_cleanup(struct CookieInfo *);
int Curl_cookie_output(struct CookieInfo *, char *); int Curl_cookie_output(struct CookieInfo *, char *);
#if defined(CURL_DISABLE_HTTP) || defined(CURL_DISABLE_COOKIES)
#define Curl_cookie_list(x) NULL
#define Curl_cookie_loadfiles(x)
#else
struct curl_slist *Curl_cookie_list(struct SessionHandle *data);
void Curl_cookie_loadfiles(struct SessionHandle *data);
#endif
#endif #endif

View File

@@ -308,49 +308,19 @@ CURL *curl_easy_init(void)
* curl_easy_setopt() is the external interface for setting options on an * curl_easy_setopt() is the external interface for setting options on an
* easy handle. * easy handle.
*/ */
typedef int (*func_T)(void);
CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...) CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
{ {
va_list arg; va_list arg;
func_T param_func = (func_T)0;
long param_long = 0;
void *param_obj = NULL;
curl_off_t param_offset = 0;
struct SessionHandle *data = curl; struct SessionHandle *data = curl;
CURLcode ret=CURLE_FAILED_INIT; CURLcode ret;
if(!curl) if(!curl)
return CURLE_BAD_FUNCTION_ARGUMENT; return CURLE_BAD_FUNCTION_ARGUMENT;
va_start(arg, tag); va_start(arg, tag);
/* PORTING NOTE: ret = Curl_setopt(data, tag, arg);
Object pointers can't necessarily be casted to function pointers and
therefore we need to know what type it is and read the correct type
at once. This should also correct problems with different sizes of
the types.
*/
if(tag < CURLOPTTYPE_OBJECTPOINT) {
/* This is a LONG type */
param_long = va_arg(arg, long);
ret = Curl_setopt(data, tag, param_long);
}
else if(tag < CURLOPTTYPE_FUNCTIONPOINT) {
/* This is a object pointer type */
param_obj = va_arg(arg, void *);
ret = Curl_setopt(data, tag, param_obj);
}
else if(tag < CURLOPTTYPE_OFF_T) {
/* This is a function pointer type */
param_func = va_arg(arg, func_T );
ret = Curl_setopt(data, tag, param_func);
}
else {
/* This is a curl_off_t type */
param_offset = va_arg(arg, curl_off_t);
ret = Curl_setopt(data, tag, param_offset);
}
va_end(arg); va_end(arg);
return ret; return ret;

View File

@@ -174,9 +174,13 @@ static bool isBadFtpString(const char *string)
* to us. This function will sit and wait here until the server has * to us. This function will sit and wait here until the server has
* connected. * connected.
* *
* If FTP-SSL is used and SSL is requested for the data connection, this
* function will do that transport layer handshake too.
*
*/ */
static CURLcode AllowServerConnect(struct connectdata *conn) static CURLcode AllowServerConnect(struct connectdata *conn)
{ {
CURLcode result;
int timeout_ms; int timeout_ms;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
curl_socket_t sock = conn->sock[SECONDARYSOCKET]; curl_socket_t sock = conn->sock[SECONDARYSOCKET];
@@ -209,12 +213,12 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
default: default:
/* we have received data here */ /* we have received data here */
{ {
curl_socket_t s; curl_socket_t s = CURL_SOCKET_BAD;
size_t size = sizeof(struct sockaddr_in); socklen_t size = (socklen_t) sizeof(struct sockaddr_in);
struct sockaddr_in add; struct sockaddr_in add;
getsockname(sock, (struct sockaddr *) &add, (socklen_t *)&size); if(0 == getsockname(sock, (struct sockaddr *) &add, &size))
s=accept(sock, (struct sockaddr *) &add, (socklen_t *)&size); s=accept(sock, (struct sockaddr *) &add, &size);
sclose(sock); /* close the first socket */ sclose(sock); /* close the first socket */
@@ -231,6 +235,17 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
break; break;
} }
/* If PASV is used, this is is made elsewhere */
if(conn->ssl[SECONDARYSOCKET].use) {
/* since we only have a plaintext TCP connection here, we must now
do the TLS stuff */
infof(data, "Doing the SSL/TLS handshake on the data stream\n");
/* BLOCKING */
result = Curl_ssl_connect(conn, SECONDARYSOCKET);
if(result)
return result;
}
return CURLE_OK; return CURLE_OK;
} }
@@ -1110,7 +1125,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn,
} }
} }
else { else {
failf(data, "could't find IP address to use"); failf(data, "couldn't find IP address to use");
return CURLE_FTP_PORT_FAILED; return CURLE_FTP_PORT_FAILED;
} }
@@ -1670,8 +1685,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
/* BLOCKING */ /* BLOCKING */
/* We want "seamless" FTP operations through HTTP proxy tunnel */ /* We want "seamless" FTP operations through HTTP proxy tunnel */
result = Curl_ConnectHTTPProxyTunnel(conn, SECONDARYSOCKET, result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, newhost, newport);
newhost, newport);
if(CURLE_OK != result) if(CURLE_OK != result)
return result; return result;
} }
@@ -1826,10 +1840,17 @@ static CURLcode ftp_state_type_resp(struct connectdata *conn,
CURLcode result = CURLE_OK; CURLcode result = CURLE_OK;
struct SessionHandle *data=conn->data; struct SessionHandle *data=conn->data;
if(ftpcode != 200) { if(ftpcode/100 != 2) {
/* "sasserftpd" and "(u)r(x)bot ftpd" both responds with 226 after a
successful 'TYPE I'. While that is not as RFC959 says, it is still a
positive response code and we allow that. */
failf(data, "Couldn't set desired mode"); failf(data, "Couldn't set desired mode");
return CURLE_FTP_COULDNT_SET_BINARY; /* FIX */ return CURLE_FTP_COULDNT_SET_BINARY; /* FIX */
} }
if(ftpcode != 200)
infof(data, "Got a %03d response code instead of the assumed 200\n",
ftpcode);
if(instate == FTP_TYPE) if(instate == FTP_TYPE)
result = ftp_state_post_type(conn); result = ftp_state_post_type(conn);
else if(instate == FTP_LIST_TYPE) else if(instate == FTP_LIST_TYPE)
@@ -2011,16 +2032,6 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn,
return result; return result;
} }
if(conn->ssl[SECONDARYSOCKET].use) {
/* since we only have a plaintext TCP connection here, we must now
do the TLS stuff */
infof(data, "Doing the SSL/TLS handshake on the data stream\n");
/* BLOCKING */
result = Curl_ssl_connect(conn, SECONDARYSOCKET);
if(result)
return result;
}
*(ftp->bytecountp)=0; *(ftp->bytecountp)=0;
/* When we know we're uploading a specified file, we can get the file /* When we know we're uploading a specified file, we can get the file
@@ -2120,15 +2131,6 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn,
return result; return result;
} }
if(conn->ssl[SECONDARYSOCKET].use) {
/* since we only have a plaintext TCP connection here, we must now
do the TLS stuff */
infof(data, "Doing the SSL/TLS handshake on the data stream\n");
result = Curl_ssl_connect(conn, SECONDARYSOCKET);
if(result)
return result;
}
if(size > conn->maxdownload && conn->maxdownload > 0) if(size > conn->maxdownload && conn->maxdownload > 0)
size = conn->size = conn->maxdownload; size = conn->size = conn->maxdownload;
@@ -2738,8 +2740,8 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
if (conn->bits.tunnel_proxy) { if (conn->bits.tunnel_proxy) {
/* BLOCKING */ /* BLOCKING */
/* We want "seamless" FTP operations through HTTP proxy tunnel */ /* We want "seamless" FTP operations through HTTP proxy tunnel */
result = Curl_ConnectHTTPProxyTunnel(conn, FIRSTSOCKET, result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
conn->host.name, conn->remote_port); conn->host.name, conn->remote_port);
if(CURLE_OK != result) if(CURLE_OK != result)
return result; return result;
} }
@@ -3090,6 +3092,18 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
if(!ftp->no_transfer && !conn->bits.no_body) { if(!ftp->no_transfer && !conn->bits.no_body) {
/* a transfer is about to take place */ /* a transfer is about to take place */
if(conn->ssl[SECONDARYSOCKET].use &&
!data->set.ftp_use_port) {
/* PASV is used and we just got the data connection connected, then
it is time to handshake the secure stuff. */
infof(data, "Doing the SSL/TLS handshake on the data stream\n");
/* BLOCKING */
result = Curl_ssl_connect(conn, SECONDARYSOCKET);
if(result)
return result;
}
if(data->set.upload) { if(data->set.upload) {
NBFTPSENDF(conn, "TYPE %c", data->set.ftp_ascii?'A':'I'); NBFTPSENDF(conn, "TYPE %c", data->set.ftp_ascii?'A':'I');
state(conn, FTP_STOR_TYPE); state(conn, FTP_STOR_TYPE);
@@ -3164,7 +3178,7 @@ CURLcode ftp_perform(struct connectdata *conn,
*connected = conn->bits.tcpconnect; *connected = conn->bits.tcpconnect;
if(*dophase_done) if(*dophase_done)
DEBUGF(infof(conn->data, "DO phase is comlete\n")); DEBUGF(infof(conn->data, "DO phase is complete\n"));
return result; return result;
} }
@@ -3821,7 +3835,7 @@ CURLcode Curl_ftp_doing(struct connectdata *conn,
if(*dophase_done) { if(*dophase_done) {
result = ftp_dophase_done(conn, FALSE /* not connected */); result = ftp_dophase_done(conn, FALSE /* not connected */);
DEBUGF(infof(conn->data, "DO phase is comlete\n")); DEBUGF(infof(conn->data, "DO phase is complete\n"));
} }
return result; return result;
} }

View File

@@ -184,6 +184,9 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
case CURLINFO_SSL_ENGINES: case CURLINFO_SSL_ENGINES:
*param_slistp = Curl_ssl_engines_list(data); *param_slistp = Curl_ssl_engines_list(data);
break; break;
case CURLINFO_COOKIELIST:
*param_slistp = Curl_cookie_list(data);
break;
default: default:
return CURLE_BAD_FUNCTION_ARGUMENT; return CURLE_BAD_FUNCTION_ARGUMENT;
} }

View File

@@ -151,13 +151,18 @@ Curl_gtls_connect(struct connectdata *conn,
if(data->set.ssl.CAfile) { if(data->set.ssl.CAfile) {
/* set the trusted CA cert bundle file */ /* set the trusted CA cert bundle file */
gnutls_certificate_set_verify_flags(conn->ssl[sockindex].cred,
GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
rc = gnutls_certificate_set_x509_trust_file(conn->ssl[sockindex].cred, rc = gnutls_certificate_set_x509_trust_file(conn->ssl[sockindex].cred,
data->set.ssl.CAfile, data->set.ssl.CAfile,
GNUTLS_X509_FMT_PEM); GNUTLS_X509_FMT_PEM);
if(rc < 0) { if(rc < 0)
infof(data, "error reading ca cert file %s (%s)\n", infof(data, "error reading ca cert file %s (%s)\n",
data->set.ssl.CAfile, gnutls_strerror(rc)); data->set.ssl.CAfile, gnutls_strerror(rc));
} else
infof(data, "found %d certificates in %s\n",
rc, data->set.ssl.CAfile);
} }
/* Initialize TLS session as a client */ /* Initialize TLS session as a client */

View File

@@ -172,9 +172,8 @@ Curl_addrinfo *Curl_ip2addr(in_addr_t num, char *hostname, int port)
/* /*
* Curl_getaddrinfo() - the ipv4 synchronous version. * Curl_getaddrinfo() - the ipv4 synchronous version.
* *
* The original code to this function was once stolen from the Dancer source * The original code to this function was from the Dancer source code, written
* code, written by Bjorn Reese, it has since been patched and modified * by Bjorn Reese, it has since been patched and modified considerably.
* considerably.
* *
* gethostbyname_r() is the thread-safe version of the gethostbyname() * gethostbyname_r() is the thread-safe version of the gethostbyname()
* function. When we build for plain IPv4, we attempt to use this * function. When we build for plain IPv4, we attempt to use this

View File

@@ -157,11 +157,119 @@ struct thread_data {
FILE *stderr_file; FILE *stderr_file;
HANDLE mutex_waiting; /* marks that we are still waiting for a resolve */ HANDLE mutex_waiting; /* marks that we are still waiting for a resolve */
HANDLE event_resolved; /* marks that the thread obtained the information */ HANDLE event_resolved; /* marks that the thread obtained the information */
HANDLE event_thread_started; /* marks that the thread has initialized and
started */
HANDLE mutex_terminate; /* serializes access to flag_terminate */
HANDLE event_terminate; /* flag for thread to terminate instead of calling
callbacks */
#ifdef CURLRES_IPV6 #ifdef CURLRES_IPV6
struct addrinfo hints; struct addrinfo hints;
#endif #endif
}; };
/* Data for synchronization between resolver thread and its parent */
struct thread_sync_data {
HANDLE mutex_waiting; /* thread_data.mutex_waiting duplicate */
HANDLE mutex_terminate; /* thread_data.mutex_terminate duplicate */
HANDLE event_terminate; /* thread_data.event_terminate duplicate */
char * hostname; /* hostname to resolve, Curl_async.hostname
duplicate */
};
/* Destroy resolver thread synchronization data */
void destroy_thread_sync_data(struct thread_sync_data * tsd)
{
if (tsd->hostname) {
free(tsd->hostname);
tsd->hostname = NULL;
}
if (tsd->event_terminate) {
CloseHandle(tsd->event_terminate);
tsd->event_terminate = NULL;
}
if (tsd->mutex_terminate) {
CloseHandle(tsd->mutex_terminate);
tsd->mutex_terminate = NULL;
}
if (tsd->mutex_waiting) {
CloseHandle(tsd->mutex_waiting);
tsd->mutex_waiting = NULL;
}
}
/* Initialize resolver thread synchronization data */
BOOL init_thread_sync_data(struct thread_data * td,
char * hostname,
struct thread_sync_data * tsd)
{
HANDLE curr_proc = GetCurrentProcess();
memset(tsd, 0, sizeof(tsd));
if (!DuplicateHandle(curr_proc, td->mutex_waiting,
curr_proc, &tsd->mutex_waiting, 0, FALSE,
DUPLICATE_SAME_ACCESS)) {
/* failed to duplicate the mutex, no point in continuing */
destroy_thread_sync_data(tsd);
return FALSE;
}
if (!DuplicateHandle(curr_proc, td->mutex_terminate,
curr_proc, &tsd->mutex_terminate, 0, FALSE,
DUPLICATE_SAME_ACCESS)) {
/* failed to duplicate the mutex, no point in continuing */
destroy_thread_sync_data(tsd);
return FALSE;
}
if (!DuplicateHandle(curr_proc, td->event_terminate,
curr_proc, &tsd->event_terminate, 0, FALSE,
DUPLICATE_SAME_ACCESS)) {
/* failed to duplicate the event, no point in continuing */
destroy_thread_sync_data(tsd);
return FALSE;
}
/* Copying hostname string because original can be destroyed by parent
* thread during gethostbyname execution.
*/
tsd->hostname = strdup(hostname);
if (!tsd->hostname) {
/* Memory allocation failed */
destroy_thread_sync_data(tsd);
return FALSE;
}
return TRUE;
}
/* acquire resolver thread synchronization */
BOOL acquire_thread_sync(struct thread_sync_data * tsd)
{
/* is the thread initiator still waiting for us ? */
if (WaitForSingleObject(tsd->mutex_waiting, 0) == WAIT_TIMEOUT) {
/* yes, it is */
/* Waiting access to event_terminate */
if (WaitForSingleObject(tsd->mutex_terminate, INFINITE) != WAIT_OBJECT_0) {
/* Something went wrong - now just ignoring */
}
else {
if (WaitForSingleObject(tsd->event_terminate, 0) != WAIT_TIMEOUT) {
/* Parent thread signaled us to terminate.
* This means that all data in conn->async is now destroyed
* and we cannot use it.
*/
}
else {
return TRUE;
}
}
}
return FALSE;
}
/* release resolver thread synchronization */
void release_thread_sync(struct thread_sync_data * tsd)
{
ReleaseMutex(tsd->mutex_terminate);
}
#if defined(CURLRES_IPV4) #if defined(CURLRES_IPV4)
/* /*
* gethostbyname_thread() resolves a name, calls the Curl_addrinfo4_callback * gethostbyname_thread() resolves a name, calls the Curl_addrinfo4_callback
@@ -177,17 +285,13 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
struct hostent *he; struct hostent *he;
int rc = 0; int rc = 0;
/* Duplicate the passed mutex handle. /* Duplicate the passed mutex and event handles.
* This allows us to use it even after the container gets destroyed * This allows us to use it even after the container gets destroyed
* due to a resolver timeout. * due to a resolver timeout.
*/ */
HANDLE mutex_waiting = NULL; struct thread_sync_data tsd = {0};
HANDLE curr_proc = GetCurrentProcess(); if (!init_thread_sync_data(td, conn->async.hostname, &tsd)) {
/* thread synchronization data initialization failed */
if (!DuplicateHandle(curr_proc, td->mutex_waiting,
curr_proc, &mutex_waiting, 0, FALSE,
DUPLICATE_SAME_ACCESS)) {
/* failed to duplicate the mutex, no point in continuing */
return -1; return -1;
} }
@@ -200,17 +304,18 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
#endif #endif
WSASetLastError (conn->async.status = NO_DATA); /* pending status */ WSASetLastError (conn->async.status = NO_DATA); /* pending status */
he = gethostbyname (conn->async.hostname);
/* is the thread initiator still waiting for us ? */ /* Signaling that we have initialized all copies of data and handles we
if (WaitForSingleObject(mutex_waiting, 0) == WAIT_TIMEOUT) { need */
/* yes, it is */ SetEvent(td->event_thread_started);
/* Mark that we have obtained the information, and that we are he = gethostbyname (tsd.hostname);
* calling back with it.
*/ /* is parent thread waiting for us and are we able to access conn members? */
if (acquire_thread_sync(&tsd)) {
/* Mark that we have obtained the information, and that we are calling
* back with it. */
SetEvent(td->event_resolved); SetEvent(td->event_resolved);
if (he) { if (he) {
rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he); rc = Curl_addrinfo4_callback(conn, CURL_ASYNC_SUCCESS, he);
} }
@@ -219,10 +324,11 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
} }
TRACE(("Winsock-error %d, addr %s\n", conn->async.status, TRACE(("Winsock-error %d, addr %s\n", conn->async.status,
he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown")); he ? inet_ntoa(*(struct in_addr*)he->h_addr) : "unknown"));
release_thread_sync(&tsd);
} }
/* clean up */ /* clean up */
CloseHandle(mutex_waiting); destroy_thread_sync_data(&tsd);
return (rc); return (rc);
/* An implicit _endthreadex() here */ /* An implicit _endthreadex() here */
@@ -244,18 +350,15 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
struct addrinfo *res; struct addrinfo *res;
char service [NI_MAXSERV]; char service [NI_MAXSERV];
int rc; int rc;
struct addrinfo hints = td->hints;
/* Duplicate the passed mutex handle. /* Duplicate the passed mutex handle.
* This allows us to use it even after the container gets destroyed * This allows us to use it even after the container gets destroyed
* due to a resolver timeout. * due to a resolver timeout.
*/ */
HANDLE mutex_waiting = NULL; struct thread_sync_data tsd = {0};
HANDLE curr_proc = GetCurrentProcess(); if (!init_thread_sync_data(td, conn->async.hostname, &tsd)) {
/* thread synchronization data initialization failed */
if (!DuplicateHandle(curr_proc, td->mutex_waiting,
curr_proc, &mutex_waiting, 0, FALSE,
DUPLICATE_SAME_ACCESS)) {
/* failed to duplicate the mutex, no point in continuing */
return -1; return -1;
} }
@@ -267,15 +370,16 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
WSASetLastError(conn->async.status = NO_DATA); /* pending status */ WSASetLastError(conn->async.status = NO_DATA); /* pending status */
rc = getaddrinfo(conn->async.hostname, service, &td->hints, &res); /* Signaling that we have initialized all copies of data and handles we
need */
SetEvent(td->event_thread_started);
/* is the thread initiator still waiting for us ? */ rc = getaddrinfo(tsd.hostname, service, &hints, &res);
if (WaitForSingleObject(mutex_waiting, 0) == WAIT_TIMEOUT) {
/* yes, it is */
/* Mark that we have obtained the information, and that we are /* is parent thread waiting for us and are we able to access conn members? */
* calling back with it. if (acquire_thread_sync(&tsd)) {
*/ /* Mark that we have obtained the information, and that we are calling
back with it. */
SetEvent(td->event_resolved); SetEvent(td->event_resolved);
if (rc == 0) { if (rc == 0) {
@@ -288,10 +392,11 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
rc = Curl_addrinfo6_callback(conn, (int)WSAGetLastError(), NULL); rc = Curl_addrinfo6_callback(conn, (int)WSAGetLastError(), NULL);
TRACE(("Winsock-error %d, no address\n", conn->async.status)); TRACE(("Winsock-error %d, no address\n", conn->async.status));
} }
release_thread_sync(&tsd);
} }
/* clean up */ /* clean up */
CloseHandle(mutex_waiting); destroy_thread_sync_data(&tsd);
return (rc); return (rc);
/* An implicit _endthreadex() here */ /* An implicit _endthreadex() here */
@@ -299,7 +404,7 @@ static unsigned __stdcall getaddrinfo_thread (void *arg)
#endif #endif
/* /*
* Curl_destroy_thread_data() cleans up async resolver data. * Curl_destroy_thread_data() cleans up async resolver data and thread handle.
* Complementary of ares_destroy. * Complementary of ares_destroy.
*/ */
void Curl_destroy_thread_data (struct Curl_async *async) void Curl_destroy_thread_data (struct Curl_async *async)
@@ -311,6 +416,24 @@ void Curl_destroy_thread_data (struct Curl_async *async)
struct thread_data *td = (struct thread_data*) async->os_specific; struct thread_data *td = (struct thread_data*) async->os_specific;
curl_socket_t sock = td->dummy_sock; curl_socket_t sock = td->dummy_sock;
if (td->mutex_terminate && td->event_terminate) {
/* Signaling resolver thread to terminate */
if (WaitForSingleObject(td->mutex_terminate, INFINITE) == WAIT_OBJECT_0) {
SetEvent(td->event_terminate);
ReleaseMutex(td->mutex_terminate);
}
else {
/* Something went wrong - just ignoring it */
}
}
if (td->mutex_terminate)
CloseHandle(td->mutex_terminate);
if (td->event_terminate)
CloseHandle(td->event_terminate);
if (td->event_thread_started)
CloseHandle(td->event_thread_started);
if (sock != CURL_SOCKET_BAD) if (sock != CURL_SOCKET_BAD)
sclose(sock); sclose(sock);
@@ -321,6 +444,9 @@ void Curl_destroy_thread_data (struct Curl_async *async)
if (td->event_resolved) if (td->event_resolved)
CloseHandle(td->event_resolved); CloseHandle(td->event_resolved);
if (td->thread_hnd)
CloseHandle(td->thread_hnd);
free(async->os_specific); free(async->os_specific);
} }
async->hostname = NULL; async->hostname = NULL;
@@ -338,6 +464,7 @@ static bool init_resolve_thread (struct connectdata *conn,
const Curl_addrinfo *hints) const Curl_addrinfo *hints)
{ {
struct thread_data *td = calloc(sizeof(*td), 1); struct thread_data *td = calloc(sizeof(*td), 1);
HANDLE thread_and_event[2] = {0};
if (!td) { if (!td) {
SetLastError(ENOMEM); SetLastError(ENOMEM);
@@ -378,6 +505,31 @@ static bool init_resolve_thread (struct connectdata *conn,
SetLastError(EAGAIN); SetLastError(EAGAIN);
return FALSE; return FALSE;
} }
/* Create the mutex used to serialize access to event_terminated
* between us and resolver thread.
*/
td->mutex_terminate = CreateMutex(NULL, FALSE, NULL);
if (td->mutex_terminate == NULL) {
Curl_destroy_thread_data(&conn->async);
SetLastError(EAGAIN);
return FALSE;
}
/* Create the event used to signal thread that it should terminate.
*/
td->event_terminate = CreateEvent(NULL, TRUE, FALSE, NULL);
if (td->event_terminate == NULL) {
Curl_destroy_thread_data(&conn->async);
SetLastError(EAGAIN);
return FALSE;
}
/* Create the event used by thread to inform it has initialized its own data.
*/
td->event_thread_started = CreateEvent(NULL, TRUE, FALSE, NULL);
if (td->event_thread_started == NULL) {
Curl_destroy_thread_data(&conn->async);
SetLastError(EAGAIN);
return FALSE;
}
td->stderr_file = stderr; td->stderr_file = stderr;
@@ -403,6 +555,15 @@ static bool init_resolve_thread (struct connectdata *conn,
Curl_destroy_thread_data(&conn->async); Curl_destroy_thread_data(&conn->async);
return FALSE; return FALSE;
} }
/* Waiting until the thread will initialize its data or it will exit due errors.
*/
thread_and_event[0] = td->thread_hnd;
thread_and_event[1] = td->event_thread_started;
if (WaitForMultipleObjects(sizeof(thread_and_event) / sizeof(thread_and_event[0]), thread_and_event, FALSE, INFINITE) == WAIT_FAILED) {
/* The resolver thread has been created,
* most probably it works now - ignoring this "minor" error
*/
}
/* This socket is only to keep Curl_resolv_fdset() and select() happy; /* This socket is only to keep Curl_resolv_fdset() and select() happy;
* should never become signalled for read/write since it's unbound but * should never become signalled for read/write since it's unbound but
* Windows needs atleast 1 socket in select(). * Windows needs atleast 1 socket in select().
@@ -481,8 +642,6 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
TRACE(("elapsed %lu ms\n", GetTickCount()-ticks)); TRACE(("elapsed %lu ms\n", GetTickCount()-ticks));
CloseHandle(td->thread_hnd);
if(entry) if(entry)
*entry = conn->async.dns; *entry = conn->async.dns;

View File

@@ -96,6 +96,7 @@
#include "memory.h" #include "memory.h"
#include "select.h" #include "select.h"
#include "parsedate.h" /* for the week day and month names */ #include "parsedate.h" /* for the week day and month names */
#include "strtoofft.h"
#define _MPRINTF_REPLACE /* use our functions only */ #define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h> #include <curl/mprintf.h>
@@ -1053,10 +1054,9 @@ Curl_compareheader(char *headerline, /* line to check */
} }
/* /*
* ConnectHTTPProxyTunnel() requires that we're connected to a HTTP * Curl_proxyCONNECT() requires that we're connected to a HTTP proxy. This
* proxy. This function will issue the necessary commands to get a seamless * function will issue the necessary commands to get a seamless tunnel through
* tunnel through this proxy. After that, the socket can be used just as a * this proxy. After that, the socket can be used just as a normal socket.
* normal socket.
* *
* This badly needs to be rewritten. CONNECT should be sent and dealt with * This badly needs to be rewritten. CONNECT should be sent and dealt with
* like any ordinary HTTP request, and not specially crafted like this. This * like any ordinary HTTP request, and not specially crafted like this. This
@@ -1064,10 +1064,10 @@ Curl_compareheader(char *headerline, /* line to check */
* much work to do at the moment. * much work to do at the moment.
*/ */
CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, CURLcode Curl_proxyCONNECT(struct connectdata *conn,
int sockindex, int sockindex,
char *hostname, char *hostname,
int remote_port) int remote_port)
{ {
int subversion=0; int subversion=0;
struct SessionHandle *data=conn->data; struct SessionHandle *data=conn->data;
@@ -1076,7 +1076,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
int res; int res;
size_t nread; /* total size read */ size_t nread; /* total size read */
int perline; /* count bytes per line */ int perline; /* count bytes per line */
bool keepon=TRUE; int keepon=TRUE;
ssize_t gotbytes; ssize_t gotbytes;
char *ptr; char *ptr;
long timeout = long timeout =
@@ -1085,6 +1085,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
char *host_port; char *host_port;
curl_socket_t tunnelsocket = conn->sock[sockindex]; curl_socket_t tunnelsocket = conn->sock[sockindex];
send_buffer *req_buffer; send_buffer *req_buffer;
curl_off_t cl=0;
#define SELECT_OK 0 #define SELECT_OK 0
#define SELECT_ERROR 1 #define SELECT_ERROR 1
@@ -1215,6 +1216,18 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
int i; int i;
nread += gotbytes; nread += gotbytes;
if(keepon > TRUE) {
/* This means we are currently ignoring a response-body, so we
simply count down our counter and make sure to break out of the
loop when we're done! */
cl -= gotbytes;
if(cl<=0) {
keepon = FALSE;
break;
}
}
else
for(i = 0; i < gotbytes; ptr++, i++) { for(i = 0; i < gotbytes; ptr++, i++) {
perline++; /* amount of bytes in this line so far */ perline++; /* amount of bytes in this line so far */
if(*ptr=='\n') { if(*ptr=='\n') {
@@ -1242,7 +1255,21 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
if(('\r' == line_start[0]) || if(('\r' == line_start[0]) ||
('\n' == line_start[0])) { ('\n' == line_start[0])) {
/* end of response-headers from the proxy */ /* end of response-headers from the proxy */
keepon=FALSE; if(cl && (407 == k->httpcode) && !data->state.authproblem) {
/* If we get a 407 response code with content length when we
* have no auth problem, we must ignore the whole
* response-body */
keepon = 2;
infof(data, "Ignore %" FORMAT_OFF_T
" bytes of response-body\n", cl);
cl -= (gotbytes - i);/* remove the remaining chunk of what
we already read */
if(cl<=0)
/* if the whole thing was already read, we are done! */
keepon=FALSE;
}
else
keepon = FALSE;
break; /* breaks out of for-loop, not switch() */ break; /* breaks out of for-loop, not switch() */
} }
@@ -1257,6 +1284,10 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
if(result) if(result)
return result; return result;
} }
else if(checkprefix("Content-Length:", line_start)) {
cl = curlx_strtoofft(line_start + strlen("Content-Length:"),
NULL, 10);
}
else if(2 == sscanf(line_start, "HTTP/1.%d %d", else if(2 == sscanf(line_start, "HTTP/1.%d %d",
&subversion, &subversion,
&k->httpcode)) { &k->httpcode)) {
@@ -1323,9 +1354,9 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done)
if(conn->bits.tunnel_proxy) { if(conn->bits.tunnel_proxy) {
/* either SSL over proxy, or explicitly asked for */ /* either SSL over proxy, or explicitly asked for */
result = Curl_ConnectHTTPProxyTunnel(conn, FIRSTSOCKET, result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
conn->host.name, conn->host.name,
conn->remote_port); conn->remote_port);
if(CURLE_OK != result) if(CURLE_OK != result)
return result; return result;
} }

View File

@@ -29,9 +29,9 @@ bool Curl_compareheader(char *headerline, /* line to check */
const char *content); /* content string to find */ const char *content); /* content string to find */
/* ftp can use this as well */ /* ftp can use this as well */
CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, CURLcode Curl_proxyCONNECT(struct connectdata *conn,
int tunnelsocket, int tunnelsocket,
char *hostname, int remote_port); char *hostname, int remote_port);
/* protocol-specific functions set up to be called by the main engine */ /* protocol-specific functions set up to be called by the main engine */
CURLcode Curl_http(struct connectdata *conn, bool *done); CURLcode Curl_http(struct connectdata *conn, bool *done);

View File

@@ -153,10 +153,17 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
if(*datap == '\n') { if(*datap == '\n') {
/* we're now expecting data to come, unless size was zero! */ /* we're now expecting data to come, unless size was zero! */
if(0 == ch->datasize) { if(0 == ch->datasize) {
ch->state = CHUNK_STOP; /* stop reading! */ if (conn->bits.trailerHdrPresent!=TRUE) {
if(1 == length) { /* No Trailer: header found - revert to original Curl processing */
/* This was the final byte, return right now */ ch->state = CHUNK_STOP;
return CHUNKE_STOP; if (1 == length) {
/* This is the final byte, return right now */
return CHUNKE_STOP;
}
}
else {
ch->state = CHUNK_TRAILER; /* attempt to read trailers */
conn->trlPos=0;
} }
} }
else else
@@ -250,6 +257,64 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
return CHUNKE_BAD_CHUNK; return CHUNKE_BAD_CHUNK;
break; break;
case CHUNK_TRAILER:
/* conn->trailer is assumed to be freed in url.c on a
connection basis */
if (conn->trlPos >= conn->trlMax) {
char *ptr;
if(conn->trlMax) {
conn->trlMax *= 2;
ptr = (char*)realloc(conn->trailer,conn->trlMax);
}
else {
conn->trlMax=128;
ptr = (char*)malloc(conn->trlMax);
}
if(!ptr)
return CHUNKE_OUT_OF_MEMORY;
conn->trailer = ptr;
}
conn->trailer[conn->trlPos++]=*datap;
if(*datap == '\r')
ch->state = CHUNK_TRAILER_CR;
else {
datap++;
length--;
}
break;
case CHUNK_TRAILER_CR:
if(*datap == '\r') {
ch->state = CHUNK_TRAILER_POSTCR;
datap++;
length--;
}
else
return CHUNKE_BAD_CHUNK;
break;
case CHUNK_TRAILER_POSTCR:
if (*datap == '\n') {
conn->trailer[conn->trlPos++]='\n';
conn->trailer[conn->trlPos]=0;
if (conn->trlPos==2) {
ch->state = CHUNK_STOP;
return CHUNKE_STOP;
}
else {
Curl_client_write(conn->data, CLIENTWRITE_HEADER,
conn->trailer, conn->trlPos);
}
ch->state = CHUNK_TRAILER;
conn->trlPos=0;
datap++;
length--;
}
else
return CHUNKE_BAD_CHUNK;
break;
case CHUNK_STOP: case CHUNK_STOP:
/* If we arrive here, there is data left in the end of the buffer /* If we arrive here, there is data left in the end of the buffer
even if there's no more chunks to read */ even if there's no more chunks to read */

View File

@@ -52,8 +52,8 @@ typedef enum {
/* POSTCR should get a CR and nothing else, then move to POSTLF */ /* POSTCR should get a CR and nothing else, then move to POSTLF */
CHUNK_POSTCR, CHUNK_POSTCR,
/* POSTLF should get a LF and nothing else, then move back to HEX as /* POSTLF should get a LF and nothing else, then move back to HEX as the
the CRLF combination marks the end of a chunk */ CRLF combination marks the end of a chunk */
CHUNK_POSTLF, CHUNK_POSTLF,
/* This is mainly used to really mark that we're out of the game. /* This is mainly used to really mark that we're out of the game.
@@ -62,7 +62,22 @@ typedef enum {
buffer! */ buffer! */
CHUNK_STOP, CHUNK_STOP,
/* At this point optional trailer headers can be found, unless the next line
is CRLF */
CHUNK_TRAILER,
/* A trailer CR has been found - next state is CHUNK_TRAILER_POSTCR.
Next char must be a LF */
CHUNK_TRAILER_CR,
/* A trailer LF must be found now, otherwise CHUNKE_BAD_CHUNK will be
signalled If this is an empty trailer CHUNKE_STOP will be signalled.
Otherwise the trailer will be broadcasted via Curl_client_write() and the
next state will be CHUNK_TRAILER */
CHUNK_TRAILER_POSTCR,
CHUNK_LAST /* never use */ CHUNK_LAST /* never use */
} ChunkyState; } ChunkyState;
typedef enum { typedef enum {
@@ -74,6 +89,7 @@ typedef enum {
CHUNKE_WRITE_ERROR, CHUNKE_WRITE_ERROR,
CHUNKE_STATE_ERROR, CHUNKE_STATE_ERROR,
CHUNKE_BAD_ENCODING, CHUNKE_BAD_ENCODING,
CHUNKE_OUT_OF_MEMORY,
CHUNKE_LAST CHUNKE_LAST
} CHUNKcode; } CHUNKcode;

View File

@@ -39,7 +39,8 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn, bool proxy, char *header);
CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy); CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy);
void Curl_ntlm_cleanup(struct connectdata *conn); void Curl_ntlm_cleanup(struct connectdata *conn);
#if !defined(USE_SSLEAY) && !defined(USE_WINDOWS_SSPI) #if (!defined(USE_SSLEAY) && !defined(USE_WINDOWS_SSPI)) || \
defined(CURL_DISABLE_HTTP)
#define Curl_ntlm_cleanup(x) #define Curl_ntlm_cleanup(x)
#endif #endif

View File

@@ -34,7 +34,8 @@
#include "if2ip.h" #include "if2ip.h"
#if !defined(WIN32) && !defined(__BEOS__) && !defined(__CYGWIN32__) && \ #if !defined(WIN32) && !defined(__BEOS__) && !defined(__CYGWIN32__) && \
!defined(__riscos__) && !defined(__INTERIX) && !defined(NETWARE) !defined(__riscos__) && !defined(__INTERIX) && !defined(NETWARE) && \
!defined(_AMIGASF)
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>

View File

@@ -1,5 +1,27 @@
#ifndef __INET_NTOA_R_H #ifndef __INET_NTOA_R_H
#define __INET_NTOA_R_H #define __INET_NTOA_R_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://curl.haxx.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
* $Id$
***************************************************************************/
#include "setup.h" #include "setup.h"

View File

@@ -1,3 +1,19 @@
/*
* Copyright (C) 1996-2001 Internet Software Consortium.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
* INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* /*
* Original code by Paul Vixie. "curlified" by Gisle Vanem. * Original code by Paul Vixie. "curlified" by Gisle Vanem.
*/ */

View File

@@ -49,4 +49,5 @@ EXPORTS
curl_multi_strerror @ 41; curl_multi_strerror @ 41;
curl_share_strerror @ 42; curl_share_strerror @ 42;
curl_easy_reset @ 43; curl_easy_reset @ 43;
curl_mvsnprintf @ 44 ;

View File

@@ -23,6 +23,7 @@
curl_msprintf, curl_msprintf,
curl_msnprintf, curl_msnprintf,
curl_mvfprintf, curl_mvfprintf,
curl_mvsnprintf,
curl_strequal, curl_strequal,
curl_strnequal, curl_strnequal,
curl_easy_duphandle, curl_easy_duphandle,

View File

@@ -30,7 +30,7 @@ BEGIN
VALUE "OriginalFilename", "libcurl.dll\0" VALUE "OriginalFilename", "libcurl.dll\0"
VALUE "ProductName", "The cURL library\0" VALUE "ProductName", "The cURL library\0"
VALUE "ProductVersion", LIBCURL_VERSION "\0" VALUE "ProductVersion", LIBCURL_VERSION "\0"
VALUE "LegalCopyright", "Copyright 1996-2004 by Daniel Stenberg. http://curl.haxx.se/docs/copyright.html\0" VALUE "LegalCopyright", "Copyright 1996-2005 by Daniel Stenberg. http://curl.haxx.se/docs/copyright.html\0"
END END
END END

View File

@@ -7,8 +7,8 @@
ATCPSDKI= /GG/netinclude ATCPSDKI= /GG/netinclude
CC = gcc CC = m68k-amigaos-gcc
CFLAGS = -I$(ATCPSDKI) -m68020-60 -noixemul -I. -I../include -W -Wall CFLAGS = -I$(ATCPSDKI) -m68020-60 -O2 -msoft-float -noixemul -g -I. -I../include -W -Wall
OBJS = amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c easy.c \ OBJS = amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c easy.c \
escape.c file.c formdata.c ftp.c getenv.c getinfo.c hash.c hostip.c \ escape.c file.c formdata.c ftp.c getenv.c getinfo.c hash.c hostip.c \
@@ -17,7 +17,7 @@ OBJS = amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c easy.c \
ldap.c llist.c md5.c memdebug.c mprintf.c multi.c netrc.c parsedate.c \ ldap.c llist.c md5.c memdebug.c mprintf.c multi.c netrc.c parsedate.c \
progress.c security.c select.c sendf.c share.c speedcheck.c ssluse.c \ progress.c security.c select.c sendf.c share.c speedcheck.c ssluse.c \
strequal.c strtok.c telnet.c timeval.c transfer.c url.c version.c \ strequal.c strtok.c telnet.c timeval.c transfer.c url.c version.c \
sslgen.c gtls.c sslgen.c gtls.c strerror.c
all: $(OBJS:.c=.o) all: $(OBJS:.c=.o)
ar cru libcurl.a $(OBJS:.c=.o) ar cru libcurl.a $(OBJS:.c=.o)

View File

@@ -201,7 +201,7 @@ void *curl_dorealloc(void *ptr, size_t wantedsize,
mem=(struct memdebug *)(Curl_crealloc)(mem, size); mem=(struct memdebug *)(Curl_crealloc)(mem, size);
if(logfile) if(logfile)
fprintf(logfile, "MEM %s:%d realloc(0x%x, %zd) = %p\n", fprintf(logfile, "MEM %s:%d realloc(%p, %zd) = %p\n",
source, line, ptr, wantedsize, mem?mem->mem:NULL); source, line, ptr, wantedsize, mem?mem->mem:NULL);
if(mem) { if(mem) {

View File

@@ -85,8 +85,16 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source);
#define accept(sock,addr,len)\ #define accept(sock,addr,len)\
curl_accept(sock,addr,len,__LINE__,__FILE__) curl_accept(sock,addr,len,__LINE__,__FILE__)
#if defined(getaddrinfo) && defined(__osf__)
/* OSF/1 and Tru64 have getaddrinfo as a define already, so we cannot define
our macro as for other platforms. Instead, we redefine the new name they
define getaddrinfo to become! */
#define ogetaddrinfo(host,serv,hint,res) \
curl_dogetaddrinfo(host,serv,hint,res,__LINE__,__FILE__)
#else
#define getaddrinfo(host,serv,hint,res) \ #define getaddrinfo(host,serv,hint,res) \
curl_dogetaddrinfo(host,serv,hint,res,__LINE__,__FILE__) curl_dogetaddrinfo(host,serv,hint,res,__LINE__,__FILE__)
#endif
#define getnameinfo(sa,salen,host,hostlen,serv,servlen,flags) \ #define getnameinfo(sa,salen,host,hostlen,serv,servlen,flags) \
curl_dogetnameinfo(sa,salen,host,hostlen,serv,servlen,flags, __LINE__, \ curl_dogetnameinfo(sa,salen,host,hostlen,serv,servlen,flags, __LINE__, \
__FILE__) __FILE__)

View File

@@ -75,6 +75,9 @@
# define BOOL char # define BOOL char
#endif #endif
#ifdef _AMIGASF
# undef FORMAT_INT
#endif
/* Lower-case digits. */ /* Lower-case digits. */
static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";

View File

@@ -42,8 +42,8 @@ RSC=rc.exe
# PROP Intermediate_Dir "Release" # PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BUILDING_LIBCURL" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /Zi /O2 /I "." /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /D "_WINDLL" /FR /FD /c # ADD CPP /nologo /MT /W3 /GX /Zi /O2 /I "." /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BUILDING_LIBCURL" /D "_WINDLL" /FR /FD /c
# SUBTRACT CPP /YX # SUBTRACT CPP /YX
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
@@ -69,8 +69,8 @@ LINK32=link.exe
# PROP Intermediate_Dir "Debug" # PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BUILDING_LIBCURL" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "." /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "." /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BUILDING_LIBCURL" /FR /FD /GZ /c
# SUBTRACT CPP /WX /YX # SUBTRACT CPP /WX /YX
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32

View File

@@ -102,50 +102,51 @@ struct tzinfo {
/* Here's a bunch of frequently used time zone names. These were supported /* Here's a bunch of frequently used time zone names. These were supported
by the old getdate parser. */ by the old getdate parser. */
#define tDAYZONE -60 /* offset for daylight savings time */
static const struct tzinfo tz[]= { static const struct tzinfo tz[]= {
{"GMT", 0}, /* Greenwich Mean */ {"GMT", 0}, /* Greenwich Mean */
{"UTC", 0}, /* Universal (Coordinated) */ {"UTC", 0}, /* Universal (Coordinated) */
{"WET", 0}, /* Western European */ {"WET", 0}, /* Western European */
{"BST", 0}, /* British Summer */ {"BST", 0 tDAYZONE}, /* British Summer */
{"WAT", 60}, /* West Africa */ {"WAT", 60}, /* West Africa */
{"AST", 240}, /* Atlantic Standard */ {"AST", 240}, /* Atlantic Standard */
{"ADT", 240}, /* Atlantic Daylight */ {"ADT", 240 tDAYZONE}, /* Atlantic Daylight */
{"EST", 300}, /* Eastern Standard */ {"EST", 300}, /* Eastern Standard */
{"EDT", 300}, /* Eastern Daylight */ {"EDT", 300 tDAYZONE}, /* Eastern Daylight */
{"CST", 360}, /* Central Standard */ {"CST", 360}, /* Central Standard */
{"CDT", 360}, /* Central Daylight */ {"CDT", 360 tDAYZONE}, /* Central Daylight */
{"MST", 420}, /* Mountain Standard */ {"MST", 420}, /* Mountain Standard */
{"MDT", 420}, /* Mountain Daylight */ {"MDT", 420 tDAYZONE}, /* Mountain Daylight */
{"PST", 480}, /* Pacific Standard */ {"PST", 480}, /* Pacific Standard */
{"PDT", 480}, /* Pacific Daylight */ {"PDT", 480 tDAYZONE}, /* Pacific Daylight */
{"YST", 540}, /* Yukon Standard */ {"YST", 540}, /* Yukon Standard */
{"YDT", 540}, /* Yukon Daylight */ {"YDT", 540 tDAYZONE}, /* Yukon Daylight */
{"HST", 600}, /* Hawaii Standard */ {"HST", 600}, /* Hawaii Standard */
{"HDT", 600}, /* Hawaii Daylight */ {"HDT", 600 tDAYZONE}, /* Hawaii Daylight */
{"CAT", 600}, /* Central Alaska */ {"CAT", 600}, /* Central Alaska */
{"AHST", 600}, /* Alaska-Hawaii Standard */ {"AHST", 600}, /* Alaska-Hawaii Standard */
{"NT", 660}, /* Nome */ {"NT", 660}, /* Nome */
{"IDLW", 720}, /* International Date Line West */ {"IDLW", 720}, /* International Date Line West */
{"CET", -60}, /* Central European */ {"CET", -60}, /* Central European */
{"MET", -60}, /* Middle European */ {"MET", -60}, /* Middle European */
{"MEWT", -60}, /* Middle European Winter */ {"MEWT", -60}, /* Middle European Winter */
{"MEST", -120}, /* Middle European Summer */ {"MEST", -120 tDAYZONE}, /* Middle European Summer */
{"CEST", -120}, /* Central European Summer */ {"CEST", -120 tDAYZONE}, /* Central European Summer */
{"MESZ", -60}, /* Middle European Summer */ {"MESZ", -60 tDAYZONE}, /* Middle European Summer */
{"FWT", -60}, /* French Winter */ {"FWT", -60}, /* French Winter */
{"FST", -60}, /* French Summer */ {"FST", -60 tDAYZONE}, /* French Summer */
{"EET", -120}, /* Eastern Europe, USSR Zone 1 */ {"EET", -120}, /* Eastern Europe, USSR Zone 1 */
{"WAST", -420}, /* West Australian Standard */ {"WAST", -420}, /* West Australian Standard */
{"WADT", -420}, /* West Australian Daylight */ {"WADT", -420 tDAYZONE}, /* West Australian Daylight */
{"CCT", -480}, /* China Coast, USSR Zone 7 */ {"CCT", -480}, /* China Coast, USSR Zone 7 */
{"JST", -540}, /* Japan Standard, USSR Zone 8 */ {"JST", -540}, /* Japan Standard, USSR Zone 8 */
{"EAST", -600}, /* Eastern Australian Standard */ {"EAST", -600}, /* Eastern Australian Standard */
{"EADT", -600}, /* Eastern Australian Daylight */ {"EADT", -600 tDAYZONE}, /* Eastern Australian Daylight */
{"GST", -600}, /* Guam Standard, USSR Zone 9 */ {"GST", -600}, /* Guam Standard, USSR Zone 9 */
{"NZT", -720}, /* New Zealand */ {"NZT", -720}, /* New Zealand */
{"NZST", -720}, /* New Zealand Standard */ {"NZST", -720}, /* New Zealand Standard */
{"NZDT", -720}, /* New Zealand Daylight */ {"NZDT", -720 tDAYZONE}, /* New Zealand Daylight */
{"IDLE", -720}, /* International Date Line East */ {"IDLE", -720}, /* International Date Line East */
}; };
/* returns: /* returns:
@@ -236,9 +237,20 @@ static time_t Curl_parsedate(const char *date)
struct tm tm; struct tm tm;
enum assume dignext = DATE_MDAY; enum assume dignext = DATE_MDAY;
const char *indate = date; /* save the original pointer */ const char *indate = date; /* save the original pointer */
int part = 0; /* max 6 parts */ int part = 0; /* max 6 parts */
#ifdef WIN32
/*
* On Windows, we need an odd work-around for the case when no TZ variable
* is set. If it isn't set and "automatic DST adjustment" is enabled, the
* time functions below will return values one hour off! As reported and
* investigated in bug report #1230118.
*/
const char *env = getenv("TZ");
if(!env)
putenv("TZ=GMT");
#endif
while(*date && (part < 6)) { while(*date && (part < 6)) {
bool found=FALSE; bool found=FALSE;

View File

@@ -473,8 +473,6 @@ int Curl_ssl_recv(struct connectdata *conn, /* connection data */
#endif /* USE_GNUTLS */ #endif /* USE_GNUTLS */
#endif /* USE_SSLEAY */ #endif /* USE_SSLEAY */
if(nread == -1) { if(nread == -1) {
infof(conn->data, "Curl_xxx_rcvs returned -1, block = %s\n",
block?"TRUE":"FALSE");
if(!block) if(!block)
return 0; /* this is a true error, not EWOULDBLOCK */ return 0; /* this is a true error, not EWOULDBLOCK */
else else

View File

@@ -1098,8 +1098,8 @@ static void ssl_tls_trace(int direction, int ssl_ver, int content_type,
msg_type = *(char*)buf; msg_type = *(char*)buf;
msg_name = ssl_msg_type(ssl_ver, msg_type); msg_name = ssl_msg_type(ssl_ver, msg_type);
txt_len = 1 + snprintf(ssl_buf, sizeof(ssl_buf), "SSLv%c, %s%s (%d):\n", txt_len = snprintf(ssl_buf, sizeof(ssl_buf), "SSLv%c, %s%s (%d):\n",
ver, tls_rt_name, msg_name, msg_type); ver, tls_rt_name, msg_name, msg_type);
Curl_debug(data, CURLINFO_TEXT, ssl_buf, txt_len, NULL); Curl_debug(data, CURLINFO_TEXT, ssl_buf, txt_len, NULL);
Curl_debug(data, (direction == 1) ? CURLINFO_SSL_DATA_OUT : Curl_debug(data, (direction == 1) ? CURLINFO_SSL_DATA_OUT :

View File

@@ -22,6 +22,12 @@
#include "setup.h" #include "setup.h"
#ifdef HAVE_STRERROR_R
#if !defined(HAVE_POSIX_STRERROR_R) && !defined(HAVE_GLIBC_STRERROR_R)
#error "you MUST have either POSIX or glibc strerror_r if strerror_r is found"
#endif /* !POSIX && !glibc */
#endif /* HAVE_STRERROR_R */
#include <curl/curl.h> #include <curl/curl.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@@ -63,10 +69,10 @@ curl_easy_strerror(CURLcode error)
return "URL using bad/illegal format or missing URL"; return "URL using bad/illegal format or missing URL";
case CURLE_COULDNT_RESOLVE_PROXY: case CURLE_COULDNT_RESOLVE_PROXY:
return "couldnt resolve proxy name"; return "couldn't resolve proxy name";
case CURLE_COULDNT_RESOLVE_HOST: case CURLE_COULDNT_RESOLVE_HOST:
return "couldnt resolve host name"; return "couldn't resolve host name";
case CURLE_COULDNT_CONNECT: case CURLE_COULDNT_CONNECT:
return "couldn't connect to server"; return "couldn't connect to server";
@@ -486,7 +492,7 @@ get_winsock_error (int err, char *buf, size_t len)
p = "Winsock library is not ready"; p = "Winsock library is not ready";
break; break;
case WSANOTINITIALISED: case WSANOTINITIALISED:
p = "Winsock library not initalised"; p = "Winsock library not initialised";
break; break;
case WSAVERNOTSUPPORTED: case WSAVERNOTSUPPORTED:
p = "Winsock version not supported."; p = "Winsock version not supported.";

View File

@@ -24,6 +24,14 @@
#include "setup.h" #include "setup.h"
#include "strtoofft.h" #include "strtoofft.h"
/*
* NOTE:
*
* In the ISO C standard (IEEE Std 1003.1), there is a strtoimax() function we
* could use in case strtoll() doesn't exist... See
* http://www.opengroup.org/onlinepubs/009695399/functions/strtoimax.html
*/
#ifdef NEED_CURL_STRTOLL #ifdef NEED_CURL_STRTOLL
#include <stdlib.h> #include <stdlib.h>
#include <ctype.h> #include <ctype.h>

View File

@@ -360,7 +360,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
/* str_start is start of line within buf */ /* str_start is start of line within buf */
k->str_start = k->str; k->str_start = k->str;
k->end_ptr = strchr (k->str_start, '\n'); k->end_ptr = memchr(k->str_start, '\n', nread);
if (!k->end_ptr) { if (!k->end_ptr) {
/* Not a complete header line within buffer, append the data to /* Not a complete header line within buffer, append the data to
@@ -428,7 +428,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
} }
/* copy to end of line */ /* copy to end of line */
strncpy (k->hbufp, k->str_start, full_length); memcpy(k->hbufp, k->str_start, full_length);
k->hbufp += full_length; k->hbufp += full_length;
k->hbuflen += full_length; k->hbuflen += full_length;
*k->hbufp = 0; *k->hbufp = 0;
@@ -718,7 +718,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
the header completely if we get a 416 response as then we're the header completely if we get a 416 response as then we're
resuming a document that we don't get, and this header contains resuming a document that we don't get, and this header contains
info about the true size of the document we didn't get now. */ info about the true size of the document we didn't get now. */
if (!k->ignorecl && if (!k->ignorecl && !data->set.ignorecl &&
checkprefix("Content-Length:", k->p)) { checkprefix("Content-Length:", k->p)) {
contentlength = curlx_strtoofft(k->p+15, NULL, 10); contentlength = curlx_strtoofft(k->p+15, NULL, 10);
if (data->set.max_filesize && if (data->set.max_filesize &&
@@ -833,6 +833,20 @@ CURLcode Curl_readwrite(struct connectdata *conn,
/* init our chunky engine */ /* init our chunky engine */
Curl_httpchunk_init(conn); Curl_httpchunk_init(conn);
} }
else if (checkprefix("Trailer:", k->p) ||
checkprefix("Trailers:", k->p)) {
/*
* This test helps Curl_httpchunk_read() to determine to look
* for well formed trailers after the zero chunksize record. In
* this case a CRLF is required after the zero chunksize record
* when no trailers are sent, or after the last trailer record.
*
* It seems both Trailer: and Trailers: occur in the wild.
*/
conn->bits.trailerHdrPresent = TRUE;
}
else if (checkprefix("Content-Encoding:", k->p) && else if (checkprefix("Content-Encoding:", k->p) &&
data->set.encoding) { data->set.encoding) {
/* /*
@@ -1074,6 +1088,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
* the name says read, this function both reads and writes away * the name says read, this function both reads and writes away
* the data. The returned 'nread' holds the number of actual * the data. The returned 'nread' holds the number of actual
* data it wrote to the client. */ * data it wrote to the client. */
CHUNKcode res = CHUNKcode res =
Curl_httpchunk_read(conn, k->str, nread, &nread); Curl_httpchunk_read(conn, k->str, nread, &nread);
@@ -1119,6 +1134,8 @@ CURLcode Curl_readwrite(struct connectdata *conn,
result = Curl_client_write(data, CLIENTWRITE_BODY, result = Curl_client_write(data, CLIENTWRITE_BODY,
data->state.headerbuff, data->state.headerbuff,
k->hbuflen); k->hbuflen);
if(result)
return result;
} }
if(k->badheader < HEADER_ALLBAD) { if(k->badheader < HEADER_ALLBAD) {
/* This switch handles various content encodings. If there's an /* This switch handles various content encodings. If there's an
@@ -1624,25 +1641,9 @@ CURLcode Curl_pretransfer(struct SessionHandle *data)
data->state.authhost.want = data->set.httpauth; data->state.authhost.want = data->set.httpauth;
data->state.authproxy.want = data->set.proxyauth; data->state.authproxy.want = data->set.proxyauth;
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES) /* If there is a list of cookie files to read, do it now! */
/* If there was a list of cookie files to read and we haven't done it before, if(data->change.cookielist)
do it now! */ Curl_cookie_loadfiles(data);
if(data->change.cookielist) {
struct curl_slist *list = data->change.cookielist;
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
while(list) {
data->cookies = Curl_cookie_init(data,
list->data,
data->cookies,
data->set.cookiesession);
list = list->next;
}
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
curl_slist_free_all(data->change.cookielist); /* clean up list */
data->change.cookielist = NULL; /* don't do this again! */
}
#endif /* CURL_DISABLE_HTTP */
/* Allow data->set.use_port to set which port to use. This needs to be /* Allow data->set.use_port to set which port to use. This needs to be
* disabled for example when we follow Location: headers to URLs using * disabled for example when we follow Location: headers to URLs using

256
lib/url.c
View File

@@ -227,16 +227,24 @@ CURLcode Curl_close(struct SessionHandle *data)
Curl_safefree(data->state.headerbuff); Curl_safefree(data->state.headerbuff);
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES) #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
if(data->change.cookielist) /* clean up list if any */
curl_slist_free_all(data->change.cookielist);
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
if(data->set.cookiejar) { if(data->set.cookiejar) {
if(data->change.cookielist)
/* If there is a list of cookie files to read, do it first so that
we have all the told files read before we write the new jar */
Curl_cookie_loadfiles(data);
/* we have a "destination" for all the cookies to get dumped to */ /* we have a "destination" for all the cookies to get dumped to */
if(Curl_cookie_output(data->cookies, data->set.cookiejar)) if(Curl_cookie_output(data->cookies, data->set.cookiejar))
infof(data, "WARNING: failed to save cookies in %s\n", infof(data, "WARNING: failed to save cookies in %s\n",
data->set.cookiejar); data->set.cookiejar);
} }
else {
if(data->change.cookielist)
/* since nothing is written, we can just free the list of cookie file
names */
curl_slist_free_all(data->change.cookielist); /* clean up list */
}
if( !data->share || (data->cookies != data->share->cookies) ) { if( !data->share || (data->cookies != data->share->cookies) ) {
Curl_cookie_cleanup(data->cookies); Curl_cookie_cleanup(data->cookies);
@@ -372,14 +380,12 @@ CURLcode Curl_open(struct SessionHandle **curl)
return CURLE_OK; return CURLE_OK;
} }
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...) CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
va_list param)
{ {
va_list param;
char *argptr; char *argptr;
CURLcode result = CURLE_OK; CURLcode result = CURLE_OK;
va_start(param, option);
switch(option) { switch(option) {
case CURLOPT_DNS_CACHE_TIMEOUT: case CURLOPT_DNS_CACHE_TIMEOUT:
data->set.dns_cache_timeout = va_arg(param, int); data->set.dns_cache_timeout = va_arg(param, int);
@@ -646,8 +652,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
/* Does this option serve a purpose anymore? Yes it does, when /* Does this option serve a purpose anymore? Yes it does, when
CURLOPT_POSTFIELDS isn't used and the POST data is read off the CURLOPT_POSTFIELDS isn't used and the POST data is read off the
callback! */ callback! */
if(va_arg(param, long)) if(va_arg(param, long)) {
data->set.httpreq = HTTPREQ_POST; data->set.httpreq = HTTPREQ_POST;
data->set.opt_no_body = FALSE; /* this is implied */
}
else else
data->set.httpreq = HTTPREQ_GET; data->set.httpreq = HTTPREQ_GET;
break; break;
@@ -682,6 +690,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
*/ */
data->set.httppost = va_arg(param, struct curl_httppost *); data->set.httppost = va_arg(param, struct curl_httppost *);
data->set.httpreq = HTTPREQ_POST_FORM; data->set.httpreq = HTTPREQ_POST_FORM;
data->set.opt_no_body = FALSE; /* this is implied */
break; break;
case CURLOPT_REFERER: case CURLOPT_REFERER:
@@ -775,6 +784,43 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
*/ */
data->set.cookiesession = (bool)va_arg(param, long); data->set.cookiesession = (bool)va_arg(param, long);
break; break;
case CURLOPT_COOKIELIST:
argptr = va_arg(param, char *);
if(argptr == NULL)
break;
if(strequal(argptr, "ALL")) {
if(data->cookies) {
/* clear all cookies */
Curl_cookie_freelist(data->cookies->cookies);
data->cookies->cookies = NULL;
data->cookies->numcookies = 0;
}
break;
}
if(!data->cookies)
/* if cookie engine was not running, activate it */
data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE);
argptr = strdup(argptr);
if(!argptr) {
result = CURLE_OUT_OF_MEMORY;
break;
}
if(checkprefix("Set-Cookie:", argptr))
/* HTTP Header format line */
Curl_cookie_add(data, data->cookies, TRUE, argptr + 11, NULL, NULL);
else
/* Netscape format line */
Curl_cookie_add(data, data->cookies, FALSE, argptr, NULL, NULL);
free(argptr);
break;
#endif /* CURL_DISABLE_COOKIES */ #endif /* CURL_DISABLE_COOKIES */
case CURLOPT_HTTPGET: case CURLOPT_HTTPGET:
@@ -784,6 +830,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
if(va_arg(param, long)) { if(va_arg(param, long)) {
data->set.httpreq = HTTPREQ_GET; data->set.httpreq = HTTPREQ_GET;
data->set.upload = FALSE; /* switch off upload */ data->set.upload = FALSE; /* switch off upload */
data->set.opt_no_body = FALSE; /* this is implied */
} }
break; break;
@@ -1396,6 +1443,10 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
data->set.ftp_account = va_arg(param, char *); data->set.ftp_account = va_arg(param, char *);
break; break;
case CURLOPT_IGNORE_CONTENT_LENGTH:
data->set.ignorecl = va_arg(param, long)?TRUE:FALSE;
break;
default: default:
/* unknown tag and its companion, just ignore: */ /* unknown tag and its companion, just ignore: */
result = CURLE_FAILED_INIT; /* correct this */ result = CURLE_FAILED_INIT; /* correct this */
@@ -1496,6 +1547,7 @@ CURLcode Curl_disconnect(struct connectdata *conn)
Curl_safefree(conn->allocptr.host); Curl_safefree(conn->allocptr.host);
Curl_safefree(conn->allocptr.cookiehost); Curl_safefree(conn->allocptr.cookiehost);
Curl_safefree(conn->ip_addr_str); Curl_safefree(conn->ip_addr_str);
Curl_safefree(conn->trailer);
/* possible left-overs from the async name resolvers */ /* possible left-overs from the async name resolvers */
#if defined(USE_ARES) #if defined(USE_ARES)
@@ -2382,8 +2434,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
strcpy(conn->protostr, "file"); /* store protocol string lowercase */ strcpy(conn->protostr, "file"); /* store protocol string lowercase */
} }
else { else {
/* Set default path */ /* clear path */
strcpy(conn->path, "/"); conn->path[0]=0;
if (2 > sscanf(data->change.url, if (2 > sscanf(data->change.url,
"%15[^\n:]://%[^\n/]%[^\n]", "%15[^\n:]://%[^\n/]%[^\n]",
@@ -2444,15 +2496,32 @@ static CURLcode CreateConnection(struct SessionHandle *data,
tmp = strchr(conn->host.name, '?'); tmp = strchr(conn->host.name, '?');
if(tmp) { if(tmp) {
/* The right part of the ?-letter needs to be moved to prefix /* We must insert a slash before the '?'-letter in the URL. If the URL had
the current path buffer! */ a slash after the '?', that is where the path currently begins and the
size_t len = strlen(tmp); '?string' is still part of the host name.
/* move the existing path plus the zero byte */
memmove(conn->path+len+1, conn->path, strlen(conn->path)+1); We must move the trailing part from the host name and put it first in
the path. And have it all prefixed with a slash.
*/
size_t hostlen = strlen(tmp);
size_t pathlen = strlen(conn->path);
/* move the existing path plus the zero byte forward, to make room for
the host-name part */
memmove(conn->path+hostlen+1, conn->path, pathlen+1);
/* now copy the trailing host part in front of the existing path */
memcpy(conn->path+1, tmp, hostlen);
conn->path[0]='/'; /* prepend the missing slash */ conn->path[0]='/'; /* prepend the missing slash */
memcpy(conn->path+1, tmp, len); /* now copy the prefix part */
*tmp=0; /* now cut off the hostname at the ? */ *tmp=0; /* now cut off the hostname at the ? */
} }
else if(!conn->path[0]) {
/* if there's no path set, use a single slash */
strcpy(conn->path, "/");
}
/* If the URL is malformatted (missing a '/' after hostname before path) we /* If the URL is malformatted (missing a '/' after hostname before path) we
* insert a slash here. The only letter except '/' we accept to start a path * insert a slash here. The only letter except '/' we accept to start a path
@@ -2485,11 +2554,11 @@ static CURLcode CreateConnection(struct SessionHandle *data,
"%" MAX_CURL_PASSWORD_LENGTH_TXT "[^\n]", "%" MAX_CURL_PASSWORD_LENGTH_TXT "[^\n]",
proxyuser, proxypasswd); proxyuser, proxypasswd);
conn->proxyuser = strdup(proxyuser); conn->proxyuser = curl_unescape(proxyuser,0);
if(!conn->proxyuser) if(!conn->proxyuser)
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
conn->proxypasswd = strdup(proxypasswd); conn->proxypasswd = curl_unescape(proxypasswd,0);
if(!conn->proxypasswd) if(!conn->proxypasswd)
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
} }
@@ -2594,65 +2663,13 @@ static CURLcode CreateConnection(struct SessionHandle *data,
} }
if(proxy && *proxy) { if(proxy && *proxy) {
/* we have a proxy here to set */ long bits = conn->protocol & (PROT_HTTPS|PROT_SSL);
char *ptr;
char proxyuser[MAX_CURL_USER_LENGTH];
char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
char *fineptr;
/* skip the possible protocol piece */
ptr=strstr(proxy, "://");
if(ptr)
ptr += 3;
else
ptr = proxy;
fineptr = ptr;
/* check for an @-letter */
ptr = strchr(ptr, '@');
if(ptr && (2 == sscanf(fineptr,
"%" MAX_CURL_USER_LENGTH_TXT"[^:]:"
"%" MAX_CURL_PASSWORD_LENGTH_TXT "[^@]",
proxyuser, proxypasswd))) {
CURLcode res = CURLE_OK;
/* found user and password, rip them out */
Curl_safefree(conn->proxyuser);
conn->proxyuser = strdup(proxyuser);
if(!conn->proxyuser)
res = CURLE_OUT_OF_MEMORY;
else {
Curl_safefree(conn->proxypasswd);
conn->proxypasswd = strdup(proxypasswd);
if(!conn->proxypasswd)
res = CURLE_OUT_OF_MEMORY;
}
if(CURLE_OK == res) {
conn->bits.proxy_user_passwd = TRUE; /* enable it */
ptr = strdup(ptr+1); /* the right side of the @-letter */
if(ptr) {
free(proxy); /* free the former proxy string */
proxy = ptr; /* now use this instead */
}
else
res = CURLE_OUT_OF_MEMORY;
}
if(res) {
free(proxy); /* free the allocated proxy string */
return res;
}
}
data->change.proxy = proxy; data->change.proxy = proxy;
data->change.proxy_alloc=TRUE; /* this needs to be freed later */ data->change.proxy_alloc=TRUE; /* this needs to be freed later */
conn->bits.httpproxy = TRUE; conn->bits.httpproxy = TRUE;
/* force this to become HTTP */
conn->protocol = PROT_HTTP | bits;
} }
} /* if (!nope) - it wasn't specified non-proxy */ } /* if (!nope) - it wasn't specified non-proxy */
} /* NO_PROXY wasn't specified or '*' */ } /* NO_PROXY wasn't specified or '*' */
@@ -2785,15 +2802,10 @@ static CURLcode CreateConnection(struct SessionHandle *data,
!data->set.tunnel_thru_httpproxy) { !data->set.tunnel_thru_httpproxy) {
/* Unless we have asked to tunnel ftp operations through the proxy, we /* Unless we have asked to tunnel ftp operations through the proxy, we
switch and use HTTP operations only */ switch and use HTTP operations only */
if(conn->protocol & PROT_FTPS) {
/* FTPS is a hacked protocol and does not work through your
ordinary http proxy! */
failf(data, "ftps does not work through http proxy!");
return CURLE_UNSUPPORTED_PROTOCOL;
}
#ifndef CURL_DISABLE_HTTP #ifndef CURL_DISABLE_HTTP
conn->curl_do = Curl_http; conn->curl_do = Curl_http;
conn->curl_done = Curl_http_done; conn->curl_done = Curl_http_done;
conn->protocol = PROT_HTTP; /* switch to HTTP */
#else #else
failf(data, "FTP over http proxy requires HTTP support built-in!"); failf(data, "FTP over http proxy requires HTTP support built-in!");
return CURLE_UNSUPPORTED_PROTOCOL; return CURLE_UNSUPPORTED_PROTOCOL;
@@ -2926,25 +2938,93 @@ static CURLcode CreateConnection(struct SessionHandle *data,
/* We use 'proxyptr' to point to the proxy name from now on... */ /* We use 'proxyptr' to point to the proxy name from now on... */
char *proxyptr=proxydup; char *proxyptr=proxydup;
char *portptr;
char *atsign;
if(NULL == proxydup) { if(NULL == proxydup) {
failf(data, "memory shortage"); failf(data, "memory shortage");
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
} }
/* Daniel Dec 10, 1998: /* We do the proxy host string parsing here. We want the host name and the
We do the proxy host string parsing here. We want the host name and the * port name. Accept a protocol:// prefix, even though it should just be
port name. Accept a protocol:// prefix, even though it should just be * ignored.
ignored. */ */
/* 1. skip the protocol part if present */ /* Skip the protocol part if present */
endofprot=strstr(proxyptr, "://"); endofprot=strstr(proxyptr, "://");
if(endofprot) { if(endofprot)
proxyptr = endofprot+3; proxyptr = endofprot+3;
/* Is there a username and password given in this proxy url? */
atsign = strchr(proxyptr, '@');
if(atsign) {
char proxyuser[MAX_CURL_USER_LENGTH];
char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
if(2 == sscanf(proxyptr,
"%" MAX_CURL_USER_LENGTH_TXT"[^:]:"
"%" MAX_CURL_PASSWORD_LENGTH_TXT "[^@]",
proxyuser, proxypasswd)) {
CURLcode res = CURLE_OK;
/* found user and password, rip them out. note that we are
unescaping them, as there is otherwise no way to have a
username or password with reserved characters like ':' in
them. */
Curl_safefree(conn->proxyuser);
conn->proxyuser = curl_unescape(proxyuser,0);
if(!conn->proxyuser)
res = CURLE_OUT_OF_MEMORY;
else {
Curl_safefree(conn->proxypasswd);
conn->proxypasswd = curl_unescape(proxypasswd,0);
if(!conn->proxypasswd)
res = CURLE_OUT_OF_MEMORY;
}
if(CURLE_OK == res) {
conn->bits.proxy_user_passwd = TRUE; /* enable it */
atsign = strdup(atsign+1); /* the right side of the @-letter */
if(atsign) {
free(proxydup); /* free the former proxy string */
proxydup = proxyptr = atsign; /* now use this instead */
}
else
res = CURLE_OUT_OF_MEMORY;
}
if(res) {
free(proxydup); /* free the allocated proxy string */
return res;
}
}
} }
/* allow user to specify proxy.server.com:1080 if desired */ /* start scanning for port number at this point */
prox_portno = strchr (proxyptr, ':'); portptr = proxyptr;
/* detect and extract RFC2732-style IPv6-addresses */
if(*proxyptr == '[') {
char *ptr = ++proxyptr; /* advance beyond the initial bracket */
while(*ptr && (isxdigit((int)*ptr) || (*ptr == ':')))
ptr++;
if(*ptr == ']') {
/* yeps, it ended nicely with a bracket as well */
*ptr = 0;
portptr = ptr+1;
}
/* Note that if this didn't end with a bracket, we still advanced the
* proxyptr first, but I can't see anything wrong with that as no host
* name nor a numeric can legally start with a bracket.
*/
}
/* Get port number off proxy.server.com:1080 */
prox_portno = strchr(portptr, ':');
if (prox_portno) { if (prox_portno) {
*prox_portno = 0x0; /* cut off number from host name */ *prox_portno = 0x0; /* cut off number from host name */
prox_portno ++; prox_portno ++;

View File

@@ -23,12 +23,15 @@
* $Id$ * $Id$
***************************************************************************/ ***************************************************************************/
#include <stdarg.h> /* to make sure we have ap_list */
/* /*
* Prototypes for library-wide functions provided by url.c * Prototypes for library-wide functions provided by url.c
*/ */
CURLcode Curl_open(struct SessionHandle **curl); CURLcode Curl_open(struct SessionHandle **curl);
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...); CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
va_list arg);
CURLcode Curl_close(struct SessionHandle *data); /* opposite of curl_open() */ CURLcode Curl_close(struct SessionHandle *data); /* opposite of curl_open() */
CURLcode Curl_connect(struct SessionHandle *, struct connectdata **, CURLcode Curl_connect(struct SessionHandle *, struct connectdata **,
bool *async, bool *protocol_connect); bool *async, bool *protocol_connect);

View File

@@ -98,12 +98,14 @@
#include "hash.h" #include "hash.h"
#ifdef HAVE_GSSAPI #ifdef HAVE_GSSAPI
#ifdef HAVE_GSSMIT # ifdef HAVE_GSSGNU
#include <gssapi/gssapi.h> # include <gss.h>
#include <gssapi/gssapi_generic.h> # elif defined HAVE_GSSMIT
#else # include <gssapi/gssapi.h>
#include <gssapi.h> # include <gssapi/gssapi_generic.h>
#endif # else
# include <gssapi.h>
# endif
#endif #endif
/* Download buffer size, keep it fairly big for speed reasons */ /* Download buffer size, keep it fairly big for speed reasons */
@@ -421,6 +423,10 @@ struct ConnectBits {
LPRT doesn't work we disable it for the forthcoming LPRT doesn't work we disable it for the forthcoming
requests */ requests */
bool netrc; /* name+password provided by netrc */ bool netrc; /* name+password provided by netrc */
bool trailerHdrPresent; /* Set when Trailer: header found in HTTP response.
Required to determine whether to look for trailers
in case of Transfer-Encoding: chunking */
}; };
struct hostname { struct hostname {
@@ -726,6 +732,12 @@ struct connectdata {
transfer */ transfer */
enum { NORMAL, SOURCE3RD, TARGET3RD } xfertype; enum { NORMAL, SOURCE3RD, TARGET3RD } xfertype;
/* These three are used for chunked-encoding trailer support */
char *trailer; /* allocated buffer to store trailer in */
int trlMax; /* allocated buffer size */
int trlPos; /* index of where to store data */
}; };
/* The end of connectdata. */ /* The end of connectdata. */
@@ -1058,6 +1070,7 @@ struct UserDefined {
bool global_dns_cache; /* subject for future removal */ bool global_dns_cache; /* subject for future removal */
bool tcp_nodelay; /* whether to enable TCP_NODELAY or not */ bool tcp_nodelay; /* whether to enable TCP_NODELAY or not */
bool ignorecl; /* ignore content length */
}; };
/* /*

View File

@@ -13,15 +13,17 @@ NDKBASE = c:/novell
endif endif
# Edit the path below to point to the base of your Zlib sources. # Edit the path below to point to the base of your Zlib sources.
#ZLIB_PATH = ../../zlib-1.2.2 ifndef ZLIB_PATH
ZLIB_PATH = ../../zlib-1.2.3
endif
# Edit the path below to point to the base of your OpenSSL package. # Edit the path below to point to the base of your OpenSSL package.
ifndef OPENSSL_PATH ifndef OPENSSL_PATH
OPENSSL_PATH = ../../openssl-0.9.7g OPENSSL_PATH = ../../openssl-0.9.8
endif endif
ifndef INSTDIR ifndef INSTDIR
INSTDIR = ../curl-$(LIBCURL_VERSION_STR)-bin-nw INSTDIR = ..$(DS)curl-$(LIBCURL_VERSION_STR)-bin-nw
endif endif
# Edit the vars below to change NLM target settings. # Edit the vars below to change NLM target settings.
@@ -32,8 +34,6 @@ DESCR = cURL $(LIBCURL_VERSION_STR) - http://curl.haxx.se
MTSAFE = YES MTSAFE = YES
STACK = 64000 STACK = 64000
SCREEN = $(TARGET) commandline utility SCREEN = $(TARGET) commandline utility
MODULES = libcurl.nlm
IMPORTS = @../lib/libcurl.imp
# Comment the line below if you dont want to load protected automatically. # Comment the line below if you dont want to load protected automatically.
LDRING = 3 LDRING = 3
@@ -75,7 +75,7 @@ CFLAGS = $(OPT) -D$(DB) -DNETWARE -DHAVE_CONFIG_H -nostdinc
ifeq ($(CC),mwccnlm) ifeq ($(CC),mwccnlm)
LD = mwldnlm LD = mwldnlm
LDFLAGS = -nostdlib $(PRELUDE) $(OBJDIR)/*.o -o $(TARGET).nlm -commandfile LDFLAGS = -nostdlib $(PRELUDE) $(LDLIBS) $(OBJS) $(OBJX) -o $(TARGET).nlm -commandfile
CFLAGS += -gccinc -inline off -opt nointrinsics -proc 586 CFLAGS += -gccinc -inline off -opt nointrinsics -proc 586
CFLAGS += -relax_pointers CFLAGS += -relax_pointers
#CFLAGS += -w on #CFLAGS += -w on
@@ -100,8 +100,6 @@ else
endif endif
endif endif
LDLIBS =
NDK_ROOT = $(NDKBASE)/ndk NDK_ROOT = $(NDKBASE)/ndk
SDK_CLIB = $(NDK_ROOT)/nwsdk SDK_CLIB = $(NDK_ROOT)/nwsdk
SDK_LIBC = $(NDK_ROOT)/libc SDK_LIBC = $(NDK_ROOT)/libc
@@ -111,15 +109,26 @@ CURL_LIB = ../lib
INCLUDES = -I$(CURL_INC) -I$(CURL_LIB) INCLUDES = -I$(CURL_INC) -I$(CURL_LIB)
ifdef ZLIB_PATH ifdef LINK_STATIC
LDLIBS = ../lib/libcurl.lib
IMPORTS = GetProcessSwitchCount RunningProcess
else
MODULES = libcurl.nlm
IMPORTS = @../lib/libcurl.imp
endif
ifdef WITH_ZLIB
INCLUDES += -I$(ZLIB_PATH) INCLUDES += -I$(ZLIB_PATH)
IMPORTS += @$(ZLIB_PATH)/nw/zlib.imp ifdef LINK_STATIC
LDLIBS += $(ZLIB_PATH)/nw/libz.lib
else
IMPORTS += @$(ZLIB_PATH)/nw/libz.imp
MODULES += libz.nlm MODULES += libz.nlm
endif endif
endif
ifeq ($(LIBARCH),LIBC) ifeq ($(LIBARCH),LIBC)
INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks INCLUDES += -I$(SDK_LIBC)/include -I$(SDK_LIBC)/include/nks
INCLUDES += -I$(SDK_LIBC)/include/winsock # INCLUDES += -I$(SDK_LIBC)/include/winsock
# INCLUDES += -I$(SDK_LDAP)/libc/inc # INCLUDES += -I$(SDK_LDAP)/libc/inc
CFLAGS += -D_POSIX_SOURCE CFLAGS += -D_POSIX_SOURCE
# CFLAGS += -D__ANSIC__ # CFLAGS += -D__ANSIC__
@@ -142,7 +151,10 @@ endif
ifeq ($(findstring linux,$(OSTYPE)),linux) ifeq ($(findstring linux,$(OSTYPE)),linux)
DL = ' DL = '
DS = /
#-include $(NDKBASE)/nlmconv/ncpfs.inc #-include $(NDKBASE)/nlmconv/ncpfs.inc
else
DS = \\
endif endif
# Makefile.inc provides the CSOURCES and HHEADERS defines # Makefile.inc provides the CSOURCES and HHEADERS defines
@@ -330,11 +342,11 @@ endif
ifdef WITH_ARES ifdef WITH_ARES
@echo $(DL)#define USE_ARES 1$(DL) >> $@ @echo $(DL)#define USE_ARES 1$(DL) >> $@
endif endif
ifdef ZLIB_PATH ifdef WITH_ZLIB
@echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@ @echo $(DL)#define HAVE_ZLIB_H 1$(DL) >> $@
@echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@ @echo $(DL)#define HAVE_LIBZ 1$(DL) >> $@
endif endif
ifdef SSL ifdef WITH_SSL
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@ @echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@ @echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
@echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@ @echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@

View File

@@ -17,14 +17,20 @@
#define HAVE_SYS_TIME_H 1 #define HAVE_SYS_TIME_H 1
#define HAVE_TIME_H 1 #define HAVE_TIME_H 1
#define TIME_WITH_SYS_TIME 1 #define TIME_WITH_SYS_TIME 1
#define HAVE_TERMIOS_H 1
#define HAVE_FTRUNCATE 1 #if 0
# define HAVE_TERMIOS_H 1
# define HAVE_FTRUNCATE 1
#endif
#define HAVE_PWD_H 1 #define HAVE_PWD_H 1
#ifndef F_OK #ifndef F_OK
# define F_OK 0 # define F_OK 0
#endif #endif
#ifndef O_RDONLY
# define O_RDONLY 0x0000 /* open for reading only */
#endif
#ifndef LONG_MAX #ifndef LONG_MAX
# define LONG_MAX 0x7fffffffL /* max value for a long */ # define LONG_MAX 0x7fffffffL /* max value for a long */
#endif #endif

View File

@@ -243,213 +243,12 @@ static int ftruncate64 (int fd, curl_off_t where)
#define ftruncate(fd,where) ftruncate64(fd,where) #define ftruncate(fd,where) ftruncate64(fd,where)
#endif #endif
/*
* This is the main global constructor for the app. Call this before
* _any_ libcurl usage. If this fails, *NO* libcurl functions may be
* used, or havoc may be the result.
*/
static CURLcode main_init(void)
{
return curl_global_init(CURL_GLOBAL_DEFAULT);
}
/*
* This is the main global destructor for the app. Call this after
* _all_ libcurl usage is done.
*/
static void main_free(void)
{
curl_global_cleanup();
}
static int SetHTTPrequest(HttpReq req, HttpReq *store)
{
if((*store == HTTPREQ_UNSPEC) ||
(*store == req)) {
*store = req;
return 0;
}
fprintf(stderr, "You can only select one HTTP request!\n");
return 1;
}
static void helpf(const char *fmt, ...)
{
va_list ap;
if(fmt) {
va_start(ap, fmt);
fputs("curl: ", stderr); /* prefix it */
vfprintf(stderr, fmt, ap);
va_end(ap);
}
fprintf(stderr, "curl: try 'curl --help' "
#ifdef USE_MANUAL
"or 'curl --manual' "
#endif
"for more information\n");
}
/*
* A chain of these nodes contain URL to get and where to put the URL's
* contents.
*/
struct getout {
struct getout *next; /* next one */
char *url; /* the URL we deal with */
char *outfile; /* where to store the output */
char *infile; /* file to upload, if GETOUT_UPLOAD is set */
int flags; /* options */
};
#define GETOUT_OUTFILE (1<<0) /* set when outfile is deemed done */
#define GETOUT_URL (1<<1) /* set when URL is deemed done */
#define GETOUT_USEREMOTE (1<<2) /* use remote file name locally */
#define GETOUT_UPLOAD (1<<3) /* if set, -T has been used */
#define GETOUT_NOUPLOAD (1<<4) /* if set, -T "" has been used */
typedef enum { typedef enum {
TRACE_BIN, /* tcpdump inspired look */ TRACE_BIN, /* tcpdump inspired look */
TRACE_ASCII, /* like *BIN but without the hex output */ TRACE_ASCII, /* like *BIN but without the hex output */
TRACE_PLAIN /* -v/--verbose type */ TRACE_PLAIN /* -v/--verbose type */
} trace; } trace;
static void help(void)
{
int i;
static const char * const helptext[]={
"Usage: curl [options...] <url>",
"Options: (H) means HTTP/HTTPS only, (F) means FTP only",
" -a/--append Append to target file when uploading (F)",
" -A/--user-agent <string> User-Agent to send to server (H)",
" --anyauth Tell curl to choose authentication method (H)",
" -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)",
" --basic Enable HTTP Basic Authentication (H)",
" -B/--use-ascii Use ASCII/text transfer",
" -c/--cookie-jar <file> Write cookies to this file after operation (H)",
" -C/--continue-at <offset> Resumed transfer offset",
" -d/--data <data> HTTP POST data (H)",
" --data-ascii <data> HTTP POST ASCII data (H)",
" --data-binary <data> HTTP POST binary data (H)",
" --negotiate Enable HTTP Negotiate Authentication (H)",
" --digest Enable HTTP Digest Authentication (H)",
" --disable-eprt Prevent curl from using EPRT or LPRT (F)",
" --disable-epsv Prevent curl from using EPSV (F)",
" -D/--dump-header <file> Write the headers to this file",
" --egd-file <file> EGD socket path for random data (SSL)",
" --tcp-nodelay Set the TCP_NODELAY option",
#ifdef USE_ENVIRONMENT
" --environment Write result codes to environment variables (RISC OS)",
#endif
" -e/--referer Referer URL (H)",
" -E/--cert <cert[:passwd]> Client certificate file and password (SSL)",
" --cert-type <type> Certificate file type (DER/PEM/ENG) (SSL)",
" --key <key> Private key file name (SSL)",
" --key-type <type> Private key file type (DER/PEM/ENG) (SSL)",
" --pass <pass> Pass phrase for the private key (SSL)",
" --engine <eng> Crypto engine to use (SSL). \"--engine list\" for list",
" --cacert <file> CA certificate to verify peer against (SSL)",
" --capath <directory> CA directory (made using c_rehash) to verify",
" peer against (SSL)",
" --ciphers <list> SSL ciphers to use (SSL)",
" --compressed Request compressed response (using deflate or gzip)",
" --connect-timeout <seconds> Maximum time allowed for connection",
" --create-dirs Create necessary local directory hierarchy",
" --crlf Convert LF to CRLF in upload",
" -f/--fail Fail silently (no output at all) on errors (H)",
" --ftp-create-dirs Create the remote dirs if not present (F)",
" --ftp-pasv Use PASV instead of PORT (F)",
" --ftp-ssl Enable SSL/TLS for the ftp transfer (F)",
" -F/--form <name=content> Specify HTTP multipart POST data (H)",
" --form-string <name=string> Specify HTTP multipart POST data (H)",
" -g/--globoff Disable URL sequences and ranges using {} and []",
" -G/--get Send the -d data with a HTTP GET (H)",
" -h/--help This help text",
" -H/--header <line> Custom header to pass to server (H)",
" -i/--include Include protocol headers in the output (H/F)",
" -I/--head Show document info only",
" -j/--junk-session-cookies Ignore session cookies read from file (H)",
" --interface <interface> Specify network interface to use",
" --krb4 <level> Enable krb4 with specified security level (F)",
" -k/--insecure Allow curl to connect to SSL sites without certs (H)",
" -K/--config Specify which config file to read",
" -l/--list-only List only names of an FTP directory (F)",
" --limit-rate <rate> Limit transfer speed to this rate",
" -L/--location Follow Location: hints (H)",
" --location-trusted Follow Location: and send authentication even ",
" to other hostnames (H)",
" -m/--max-time <seconds> Maximum time allowed for the transfer",
" --max-redirs <num> Maximum number of redirects allowed (H)",
" --max-filesize <bytes> Maximum file size to download (H/F)",
" -M/--manual Display the full manual",
" -n/--netrc Must read .netrc for user name and password",
" --netrc-optional Use either .netrc or URL; overrides -n",
" --ntlm Enable HTTP NTLM authentication (H)",
" -N/--no-buffer Disable buffering of the output stream",
" -o/--output <file> Write output to <file> instead of stdout",
" -O/--remote-name Write output to a file named as the remote file",
" -p/--proxytunnel Operate through a HTTP proxy tunnel (using CONNECT)",
" --proxy-anyauth Let curl pick proxy authentication method (H)",
" --proxy-basic Enable Basic authentication on the proxy (H)",
" --proxy-digest Enable Digest authentication on the proxy (H)",
" --proxy-ntlm Enable NTLM authentication on the proxy (H)",
" -P/--ftp-port <address> Use PORT with address instead of PASV (F)",
" -q If used as the first parameter disables .curlrc",
" -Q/--quote <cmd> Send command(s) to server before file transfer (F)",
" -r/--range <range> Retrieve a byte range from a HTTP/1.1 or FTP server",
" --random-file <file> File for reading random data from (SSL)",
" -R/--remote-time Set the remote file's time on the local output",
" --retry <num> Retry request <num> times if transient problems occur",
" --retry-delay <seconds> When retrying, wait this many seconds between each",
" --retry-max-time <seconds> Retry only within this period",
" -s/--silent Silent mode. Don't output anything",
" -S/--show-error Show error. With -s, make curl show errors when they occur",
" --socks <host[:port]> Use SOCKS5 proxy on given host + port",
" --stderr <file> Where to redirect stderr. - means stdout",
" -t/--telnet-option <OPT=val> Set telnet option",
" --trace <file> Write a debug trace to the given file",
" --trace-ascii <file> Like --trace but without the hex output",
" --trace-time Add time stamps to trace/verbose output",
" -T/--upload-file <file> Transfer <file> to remote site",
" --url <URL> Spet URL to work with",
" -u/--user <user[:password]> Set server user and password",
" -U/--proxy-user <user[:password]> Set proxy user and password",
" -v/--verbose Make the operation more talkative",
" -V/--version Show version number and quit",
#ifdef __DJGPP__
" --wdebug Turn on Watt-32 debugging under DJGPP",
#endif
" -w/--write-out [format] What to output after completion",
" -x/--proxy <host[:port]> Use HTTP proxy on given port",
" -X/--request <command> Specify request command to use",
" -y/--speed-time Time needed to trig speed-limit abort. Defaults to 30",
" -Y/--speed-limit Stop transfer if below speed-limit for 'speed-time' secs",
" -z/--time-cond <time> Transfer based on a time condition",
" -0/--http1.0 Use HTTP 1.0 (H)",
" -1/--tlsv1 Use TLSv1 (SSL)",
" -2/--sslv2 Use SSLv2 (SSL)",
" -3/--sslv3 Use SSLv3 (SSL)",
" --3p-quote like -Q for the source URL for 3rd party transfer (F)",
" --3p-url source URL to activate 3rd party transfer (F)",
" --3p-user user and password for source 3rd party transfer (F)",
" -4/--ipv4 Resolve name to IPv4 address",
" -6/--ipv6 Resolve name to IPv6 address",
" -#/--progress-bar Display transfer progress as a progress bar",
NULL
};
for(i=0; helptext[i]; i++) {
puts(helptext[i]);
#ifdef __NOVELL_LIBC__
if (i && ((i % 23) == 0))
pressanykey();
#endif
}
}
struct LongShort {
const char *letter;
const char *lname;
bool extraparam;
};
struct Configurable { struct Configurable {
bool remote_time; bool remote_time;
char *random_file; char *random_file;
@@ -557,6 +356,251 @@ struct Configurable {
struct curl_slist *tp_postquote; struct curl_slist *tp_postquote;
struct curl_slist *tp_prequote; struct curl_slist *tp_prequote;
char *ftp_account; /* for ACCT */ char *ftp_account; /* for ACCT */
bool ignorecl; /* --ignore-content-length */
};
#define WARN_PREFIX "Warning: "
#define WARN_TEXTWIDTH (79 - strlen(WARN_PREFIX))
/* produce this text message to the user unless mute was selected */
static void warnf(struct Configurable *config, const char *fmt, ...)
{
if(!(config->conf & CONF_MUTE)) {
va_list ap;
int len;
char *ptr;
char print_buffer[256];
va_start(ap, fmt);
va_start(ap, fmt);
len = vsnprintf(print_buffer, sizeof(print_buffer), fmt, ap);
va_end(ap);
ptr = print_buffer;
while(len > 0) {
fputs(WARN_PREFIX, config->errors);
if(len > (int)WARN_TEXTWIDTH) {
int cut = WARN_TEXTWIDTH-1;
while(!isspace((int)ptr[cut]) && cut) {
cut--;
}
fwrite(ptr, cut + 1, 1, config->errors);
fputs("\n", config->errors);
ptr += cut+1; /* skip the space too */
len -= cut;
}
else {
fputs(ptr, config->errors);
len = 0;
}
}
}
}
/*
* This is the main global constructor for the app. Call this before
* _any_ libcurl usage. If this fails, *NO* libcurl functions may be
* used, or havoc may be the result.
*/
static CURLcode main_init(void)
{
return curl_global_init(CURL_GLOBAL_DEFAULT);
}
/*
* This is the main global destructor for the app. Call this after
* _all_ libcurl usage is done.
*/
static void main_free(void)
{
curl_global_cleanup();
}
static int SetHTTPrequest(struct Configurable *config,
HttpReq req, HttpReq *store)
{
if((*store == HTTPREQ_UNSPEC) ||
(*store == req)) {
*store = req;
return 0;
}
warnf(config, "You can only select one HTTP request!\n");
return 1;
}
static void helpf(const char *fmt, ...)
{
va_list ap;
if(fmt) {
va_start(ap, fmt);
fputs("curl: ", stderr); /* prefix it */
vfprintf(stderr, fmt, ap);
va_end(ap);
}
fprintf(stderr, "curl: try 'curl --help' "
#ifdef USE_MANUAL
"or 'curl --manual' "
#endif
"for more information\n");
}
/*
* A chain of these nodes contain URL to get and where to put the URL's
* contents.
*/
struct getout {
struct getout *next; /* next one */
char *url; /* the URL we deal with */
char *outfile; /* where to store the output */
char *infile; /* file to upload, if GETOUT_UPLOAD is set */
int flags; /* options */
};
#define GETOUT_OUTFILE (1<<0) /* set when outfile is deemed done */
#define GETOUT_URL (1<<1) /* set when URL is deemed done */
#define GETOUT_USEREMOTE (1<<2) /* use remote file name locally */
#define GETOUT_UPLOAD (1<<3) /* if set, -T has been used */
#define GETOUT_NOUPLOAD (1<<4) /* if set, -T "" has been used */
static void help(void)
{
int i;
static const char * const helptext[]={
"Usage: curl [options...] <url>",
"Options: (H) means HTTP/HTTPS only, (F) means FTP only",
" -a/--append Append to target file when uploading (F)",
" -A/--user-agent <string> User-Agent to send to server (H)",
" --anyauth Tell curl to choose authentication method (H)",
" -b/--cookie <name=string/file> Cookie string or file to read cookies from (H)",
" --basic Enable HTTP Basic Authentication (H)",
" -B/--use-ascii Use ASCII/text transfer",
" -c/--cookie-jar <file> Write cookies to this file after operation (H)",
" -C/--continue-at <offset> Resumed transfer offset",
" -d/--data <data> HTTP POST data (H)",
" --data-ascii <data> HTTP POST ASCII data (H)",
" --data-binary <data> HTTP POST binary data (H)",
" --negotiate Enable HTTP Negotiate Authentication (H)",
" --digest Enable HTTP Digest Authentication (H)",
" --disable-eprt Prevent curl from using EPRT or LPRT (F)",
" --disable-epsv Prevent curl from using EPSV (F)",
" -D/--dump-header <file> Write the headers to this file",
" --egd-file <file> EGD socket path for random data (SSL)",
" --tcp-nodelay Set the TCP_NODELAY option",
#ifdef USE_ENVIRONMENT
" --environment Write result codes to environment variables (RISC OS)",
#endif
" -e/--referer Referer URL (H)",
" -E/--cert <cert[:passwd]> Client certificate file and password (SSL)",
" --cert-type <type> Certificate file type (DER/PEM/ENG) (SSL)",
" --key <key> Private key file name (SSL)",
" --key-type <type> Private key file type (DER/PEM/ENG) (SSL)",
" --pass <pass> Pass phrase for the private key (SSL)",
" --engine <eng> Crypto engine to use (SSL). \"--engine list\" for list",
" --cacert <file> CA certificate to verify peer against (SSL)",
" --capath <directory> CA directory (made using c_rehash) to verify",
" peer against (SSL)",
" --ciphers <list> SSL ciphers to use (SSL)",
" --compressed Request compressed response (using deflate or gzip)",
" --connect-timeout <seconds> Maximum time allowed for connection",
" --create-dirs Create necessary local directory hierarchy",
" --crlf Convert LF to CRLF in upload",
" -f/--fail Fail silently (no output at all) on errors (H)",
" --ftp-create-dirs Create the remote dirs if not present (F)",
" --ftp-pasv Use PASV instead of PORT (F)",
" --ftp-ssl Enable SSL/TLS for the ftp transfer (F)",
" -F/--form <name=content> Specify HTTP multipart POST data (H)",
" --form-string <name=string> Specify HTTP multipart POST data (H)",
" -g/--globoff Disable URL sequences and ranges using {} and []",
" -G/--get Send the -d data with a HTTP GET (H)",
" -h/--help This help text",
" -H/--header <line> Custom header to pass to server (H)",
" --ignore-content-length Ignore the HTTP Content-Length header",
" -i/--include Include protocol headers in the output (H/F)",
" -I/--head Show document info only",
" -j/--junk-session-cookies Ignore session cookies read from file (H)",
" --interface <interface> Specify network interface to use",
" --krb4 <level> Enable krb4 with specified security level (F)",
" -k/--insecure Allow curl to connect to SSL sites without certs (H)",
" -K/--config Specify which config file to read",
" -l/--list-only List only names of an FTP directory (F)",
" --limit-rate <rate> Limit transfer speed to this rate",
" -L/--location Follow Location: hints (H)",
" --location-trusted Follow Location: and send authentication even ",
" to other hostnames (H)",
" -m/--max-time <seconds> Maximum time allowed for the transfer",
" --max-redirs <num> Maximum number of redirects allowed (H)",
" --max-filesize <bytes> Maximum file size to download (H/F)",
" -M/--manual Display the full manual",
" -n/--netrc Must read .netrc for user name and password",
" --netrc-optional Use either .netrc or URL; overrides -n",
" --ntlm Enable HTTP NTLM authentication (H)",
" -N/--no-buffer Disable buffering of the output stream",
" -o/--output <file> Write output to <file> instead of stdout",
" -O/--remote-name Write output to a file named as the remote file",
" -p/--proxytunnel Operate through a HTTP proxy tunnel (using CONNECT)",
" --proxy-anyauth Let curl pick proxy authentication method (H)",
" --proxy-basic Enable Basic authentication on the proxy (H)",
" --proxy-digest Enable Digest authentication on the proxy (H)",
" --proxy-ntlm Enable NTLM authentication on the proxy (H)",
" -P/--ftp-port <address> Use PORT with address instead of PASV (F)",
" -q If used as the first parameter disables .curlrc",
" -Q/--quote <cmd> Send command(s) to server before file transfer (F)",
" -r/--range <range> Retrieve a byte range from a HTTP/1.1 or FTP server",
" --random-file <file> File for reading random data from (SSL)",
" -R/--remote-time Set the remote file's time on the local output",
" --retry <num> Retry request <num> times if transient problems occur",
" --retry-delay <seconds> When retrying, wait this many seconds between each",
" --retry-max-time <seconds> Retry only within this period",
" -s/--silent Silent mode. Don't output anything",
" -S/--show-error Show error. With -s, make curl show errors when they occur",
" --socks <host[:port]> Use SOCKS5 proxy on given host + port",
" --stderr <file> Where to redirect stderr. - means stdout",
" -t/--telnet-option <OPT=val> Set telnet option",
" --trace <file> Write a debug trace to the given file",
" --trace-ascii <file> Like --trace but without the hex output",
" --trace-time Add time stamps to trace/verbose output",
" -T/--upload-file <file> Transfer <file> to remote site",
" --url <URL> Spet URL to work with",
" -u/--user <user[:password]> Set server user and password",
" -U/--proxy-user <user[:password]> Set proxy user and password",
" -v/--verbose Make the operation more talkative",
" -V/--version Show version number and quit",
#ifdef __DJGPP__
" --wdebug Turn on Watt-32 debugging under DJGPP",
#endif
" -w/--write-out [format] What to output after completion",
" -x/--proxy <host[:port]> Use HTTP proxy on given port",
" -X/--request <command> Specify request command to use",
" -y/--speed-time Time needed to trig speed-limit abort. Defaults to 30",
" -Y/--speed-limit Stop transfer if below speed-limit for 'speed-time' secs",
" -z/--time-cond <time> Transfer based on a time condition",
" -0/--http1.0 Use HTTP 1.0 (H)",
" -1/--tlsv1 Use TLSv1 (SSL)",
" -2/--sslv2 Use SSLv2 (SSL)",
" -3/--sslv3 Use SSLv3 (SSL)",
" --3p-quote like -Q for the source URL for 3rd party transfer (F)",
" --3p-url source URL to activate 3rd party transfer (F)",
" --3p-user user and password for source 3rd party transfer (F)",
" -4/--ipv4 Resolve name to IPv4 address",
" -6/--ipv6 Resolve name to IPv6 address",
" -#/--progress-bar Display transfer progress as a progress bar",
NULL
};
for(i=0; helptext[i]; i++) {
puts(helptext[i]);
#ifdef __NOVELL_LIBC__
if (i && ((i % 23) == 0))
pressanykey();
#endif
}
}
struct LongShort {
const char *letter;
const char *lname;
bool extraparam;
}; };
/* global variable to hold info about libcurl */ /* global variable to hold info about libcurl */
@@ -814,7 +858,8 @@ static void list_engines (const struct curl_slist *engines)
#define FORM_FILE_SEPARATOR ',' #define FORM_FILE_SEPARATOR ','
#define FORM_TYPE_SEPARATOR ';' #define FORM_TYPE_SEPARATOR ';'
static int formparse(char *input, static int formparse(struct Configurable *config,
char *input,
struct curl_httppost **httppost, struct curl_httppost **httppost,
struct curl_httppost **last_post, struct curl_httppost **last_post,
bool literal_value) bool literal_value)
@@ -890,7 +935,7 @@ static int formparse(char *input,
/* verify that this is a fine type specifier */ /* verify that this is a fine type specifier */
if(2 != sscanf(type, "%127[^/]/%127[^;,\n]", if(2 != sscanf(type, "%127[^/]/%127[^;,\n]",
major, minor)) { major, minor)) {
fprintf(stderr, "Illegally formatted content-type field!\n"); warnf(config, "Illegally formatted content-type field!\n");
free(contents); free(contents);
FreeMultiInfo (multi_start); FreeMultiInfo (multi_start);
return 2; /* illegal content-type syntax! */ return 2; /* illegal content-type syntax! */
@@ -939,7 +984,7 @@ static int formparse(char *input,
if (!AddMultiFiles (contp, type, filename, &multi_start, if (!AddMultiFiles (contp, type, filename, &multi_start,
&multi_current)) { &multi_current)) {
fprintf(stderr, "Error building form post!\n"); warnf(config, "Error building form post!\n");
free(contents); free(contents);
FreeMultiInfo (multi_start); FreeMultiInfo (multi_start);
return 3; return 3;
@@ -976,7 +1021,7 @@ static int formparse(char *input,
if (curl_formadd(httppost, last_post, if (curl_formadd(httppost, last_post,
CURLFORM_COPYNAME, name, CURLFORM_COPYNAME, name,
CURLFORM_ARRAY, forms, CURLFORM_END) != 0) { CURLFORM_ARRAY, forms, CURLFORM_END) != 0) {
fprintf(stderr, "curl_formadd failed!\n"); warnf(config, "curl_formadd failed!\n");
free(forms); free(forms);
free(contents); free(contents);
return 5; return 5;
@@ -1008,8 +1053,8 @@ static int formparse(char *input,
if (curl_formadd(httppost, last_post, if (curl_formadd(httppost, last_post,
CURLFORM_ARRAY, info, CURLFORM_END ) != 0) { CURLFORM_ARRAY, info, CURLFORM_END ) != 0) {
fprintf(stderr, "curl_formadd failed, possibly the file %s is bad!\n", warnf(config, "curl_formadd failed, possibly the file %s is bad!\n",
contp+1); contp+1);
free(contents); free(contents);
return 6; return 6;
} }
@@ -1021,7 +1066,7 @@ static int formparse(char *input,
info[i].option = CURLFORM_END; info[i].option = CURLFORM_END;
if (curl_formadd(httppost, last_post, if (curl_formadd(httppost, last_post,
CURLFORM_ARRAY, info, CURLFORM_END) != 0) { CURLFORM_ARRAY, info, CURLFORM_END) != 0) {
fprintf(stderr, "curl_formadd failed!\n"); warnf(config, "curl_formadd failed!\n");
free(contents); free(contents);
return 7; return 7;
} }
@@ -1030,7 +1075,7 @@ static int formparse(char *input,
} }
else { else {
fprintf(stderr, "Illegally formatted input field!\n"); warnf(config, "Illegally formatted input field!\n");
return 1; return 1;
} }
free(contents); free(contents);
@@ -1267,6 +1312,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
{"$m", "ftp-account", TRUE}, {"$m", "ftp-account", TRUE},
{"$n", "proxy-anyauth", FALSE}, {"$n", "proxy-anyauth", FALSE},
{"$o", "trace-time", FALSE}, {"$o", "trace-time", FALSE},
{"$p", "ignore-content-length", FALSE},
{"0", "http1.0", FALSE}, {"0", "http1.0", FALSE},
{"1", "tlsv1", FALSE}, {"1", "tlsv1", FALSE},
@@ -1387,9 +1433,6 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
} }
*usedarg = FALSE; /* default is that we don't use the arg */ *usedarg = FALSE; /* default is that we don't use the arg */
#if 0
fprintf(stderr, "OPTION: %c %s\n", letter, nextarg?nextarg:"<null>");
#endif
if(hit < 0) { if(hit < 0) {
for(j=0; j< sizeof(aliases)/sizeof(aliases[0]); j++) { for(j=0; j< sizeof(aliases)/sizeof(aliases[0]); j++) {
if(letter == aliases[j].letter[0]) { if(letter == aliases[j].letter[0]) {
@@ -1533,8 +1576,13 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
case 'v': /* --stderr */ case 'v': /* --stderr */
if(strcmp(nextarg, "-")) { if(strcmp(nextarg, "-")) {
config->errors = fopen(nextarg, "wt"); FILE *newfile = fopen(nextarg, "wt");
config->errors_fopened = TRUE; if(!config->errors)
warnf(config, "Failed to open %s!\n", nextarg);
else {
config->errors = newfile;
config->errors_fopened = TRUE;
}
} }
else else
config->errors = stdout; config->errors = stdout;
@@ -1658,6 +1706,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
case 'o': /* --trace-time */ case 'o': /* --trace-time */
config->tracetime ^= TRUE; config->tracetime ^= TRUE;
break; break;
case 'p': /* --ignore-content-length */
config->ignorecl ^= TRUE;
break;
} }
break; break;
case '#': /* --progress-bar */ case '#': /* --progress-bar */
@@ -1742,15 +1793,26 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
if(curlx_strequal("-", nextarg)) if(curlx_strequal("-", nextarg))
file = stdin; file = stdin;
else else {
file = fopen(nextarg, "rb"); file = fopen(nextarg, "rb");
if(!file)
warnf(config, "Couldn't read data from file \"%s\", this makes "
"an empty POST.\n", nextarg);
}
if(subletter == 'b') /* forced binary */ if(subletter == 'b') /* forced binary */
postdata = file2memory(file, &config->postfieldsize); postdata = file2memory(file, &config->postfieldsize);
else else
postdata = file2string(file); postdata = file2string(file);
if(file && (file != stdin)) if(file && (file != stdin))
fclose(file); fclose(file);
if(!postdata) {
/* no data from the file, point to a zero byte string to make this
get sent as a POST anyway */
postdata=strdup("");
}
} }
else { else {
GetStr(&postdata, nextarg); GetStr(&postdata, nextarg);
@@ -1856,12 +1918,13 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
case 'F': case 'F':
/* "form data" simulation, this is a little advanced so lets do our best /* "form data" simulation, this is a little advanced so lets do our best
to sort this out slowly and carefully */ to sort this out slowly and carefully */
if(formparse(nextarg, if(formparse(config,
nextarg,
&config->httppost, &config->httppost,
&config->last_post, &config->last_post,
subletter=='s')) /* 's' means literal string */ subletter=='s')) /* 's' means literal string */
return PARAM_BAD_USE; return PARAM_BAD_USE;
if(SetHTTPrequest(HTTPREQ_POST, &config->httpreq)) if(SetHTTPrequest(config, HTTPREQ_POST, &config->httpreq))
return PARAM_BAD_USE; return PARAM_BAD_USE;
break; break;
@@ -1897,13 +1960,13 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
(config->conf&(CONF_HEADER|CONF_NOBODY)) ) { (config->conf&(CONF_HEADER|CONF_NOBODY)) ) {
/* one of them weren't set, set both */ /* one of them weren't set, set both */
config->conf |= (CONF_HEADER|CONF_NOBODY); config->conf |= (CONF_HEADER|CONF_NOBODY);
if(SetHTTPrequest(HTTPREQ_HEAD, &config->httpreq)) if(SetHTTPrequest(config, HTTPREQ_HEAD, &config->httpreq))
return PARAM_BAD_USE; return PARAM_BAD_USE;
} }
else { else {
/* both were set, clear both */ /* both were set, clear both */
config->conf &= ~(CONF_HEADER|CONF_NOBODY); config->conf &= ~(CONF_HEADER|CONF_NOBODY);
if(SetHTTPrequest(HTTPREQ_GET, &config->httpreq)) if(SetHTTPrequest(config, HTTPREQ_GET, &config->httpreq))
return PARAM_BAD_USE; return PARAM_BAD_USE;
} }
break; break;
@@ -1936,8 +1999,8 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
hugehelp(); hugehelp();
return PARAM_HELP_REQUESTED; return PARAM_HELP_REQUESTED;
#else #else
fprintf(stderr, warnf(config,
"curl: built-in manual was disabled at build-time!\n"); "built-in manual was disabled at build-time!\n");
return PARAM_OPTION_UNKNOWN; return PARAM_OPTION_UNKNOWN;
#endif #endif
case 'n': case 'n':
@@ -2150,6 +2213,8 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
else else
file = fopen(nextarg, "r"); file = fopen(nextarg, "r");
config->writeout = file2string(file); config->writeout = file2string(file);
if(!config->writeout)
warnf(config, "Failed to read %s", file);
if(file && (file != stdin)) if(file && (file != stdin))
fclose(file); fclose(file);
} }
@@ -2205,10 +2270,10 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
if(-1 == stat(nextarg, &statbuf)) { if(-1 == stat(nextarg, &statbuf)) {
/* failed, remove time condition */ /* failed, remove time condition */
config->timecond = CURL_TIMECOND_NONE; config->timecond = CURL_TIMECOND_NONE;
fprintf(stderr, warnf(config,
"Warning: Illegal date format for -z/--timecond and not " "Illegal date format for -z/--timecond (and not "
"a file name.\n" "a file name). Disabling time condition. "
" See curl_getdate(3) for valid date syntax.\n"); "See curl_getdate(3) for valid date syntax.\n");
} }
else { else {
/* pull the time out from the file */ /* pull the time out from the file */
@@ -2421,8 +2486,8 @@ static void parseconfig(const char *filename,
} }
if(PARAM_HELP_REQUESTED != res) { if(PARAM_HELP_REQUESTED != res) {
const char *reason = param2text(res); const char *reason = param2text(res);
fprintf(stderr, "%s:%d: warning: '%s' %s\n", warnf(config, "%s:%d: warning: '%s' %s\n",
filename, lineno, option, reason); filename, lineno, option, reason);
} }
} }
@@ -2485,8 +2550,10 @@ static int my_fwrite(void *buffer, size_t sz, size_t nmemb, void *stream)
if(out && !out->stream) { if(out && !out->stream) {
/* open file for writing */ /* open file for writing */
out->stream=fopen(out->filename, "wb"); out->stream=fopen(out->filename, "wb");
if(!out->stream) if(!out->stream) {
warnf(config, "Failed to create the file %s\n", out->filename);
return -1; /* failure */ return -1; /* failure */
}
} }
if(config->recvpersecond) { if(config->recvpersecond) {
@@ -2817,16 +2884,15 @@ int my_trace(CURL *handle, curl_infotype type,
const char *text; const char *text;
struct timeval tv; struct timeval tv;
struct tm *now; struct tm *now;
char timebuf[15]; char timebuf[20];
(void)handle; /* prevent compiler warning */ (void)handle; /* prevent compiler warning */
tv = curlx_tvnow(); tv = curlx_tvnow();
now = localtime(&tv.tv_sec); /* not multithread safe but we don't care */ now = localtime(&tv.tv_sec); /* not multithread safe but we don't care */
if(config->tracetime) if(config->tracetime)
snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%02d ", snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06d ",
now->tm_hour, now->tm_min, now->tm_sec, now->tm_hour, now->tm_min, now->tm_sec, tv.tv_usec);
tv.tv_usec/10000);
else else
timebuf[0]=0; timebuf[0]=0;
@@ -3234,14 +3300,15 @@ operate(struct Configurable *config, int argc, char *argv[])
httpgetfields = strdup(config->postfields); httpgetfields = strdup(config->postfields);
free(config->postfields); free(config->postfields);
config->postfields = NULL; config->postfields = NULL;
if(SetHTTPrequest((config->conf&CONF_NOBODY?HTTPREQ_HEAD:HTTPREQ_GET), if(SetHTTPrequest(config,
(config->conf&CONF_NOBODY?HTTPREQ_HEAD:HTTPREQ_GET),
&config->httpreq)) { &config->httpreq)) {
free(httpgetfields); free(httpgetfields);
return PARAM_BAD_USE; return PARAM_BAD_USE;
} }
} }
else { else {
if(SetHTTPrequest(HTTPREQ_SIMPLEPOST, &config->httpreq)) if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq))
return PARAM_BAD_USE; return PARAM_BAD_USE;
} }
} }
@@ -3408,7 +3475,7 @@ operate(struct Configurable *config, int argc, char *argv[])
free(storefile); free(storefile);
if(!outfile) { if(!outfile) {
/* bad globbing */ /* bad globbing */
fprintf(stderr, "bad output glob!\n"); warnf(config, "bad output glob!\n");
free(url); free(url);
res = CURLE_FAILED_INIT; res = CURLE_FAILED_INIT;
break; break;
@@ -3836,6 +3903,8 @@ operate(struct Configurable *config, int argc, char *argv[])
curl_easy_setopt(curl, CURLOPT_SOURCE_QUOTE, config->tp_quote); curl_easy_setopt(curl, CURLOPT_SOURCE_QUOTE, config->tp_quote);
curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account); curl_easy_setopt(curl, CURLOPT_FTP_ACCOUNT, config->ftp_account);
curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, config->ignorecl);
retry_numretries = config->req_retry; retry_numretries = config->req_retry;
retrystart = curlx_tvnow(); retrystart = curlx_tvnow();
@@ -3902,19 +3971,18 @@ operate(struct Configurable *config, int argc, char *argv[])
} }
if(retry) { if(retry) {
if(!(config->conf&CONF_MUTE)) { static const char * const m[]={NULL,
static const char * const m[]={NULL, "timeout",
"timeout", "HTTP error",
"HTTP error", "FTP error"
"FTP error" };
}; warnf(config, "Transient problem: %s "
fprintf(stderr, "Transient problem: %s\n" "Will retry in %ld seconds. "
"Will retry in %ld seconds. " "%ld retries left.\n",
"%ld retries left.\n", m[retry],
m[retry], retry_sleep/1000,
retry_sleep/1000, retry_numretries);
retry_numretries);
}
go_sleep(retry_sleep); go_sleep(retry_sleep);
retry_numretries--; retry_numretries--;
if(!config->retry_delay) { if(!config->retry_delay) {
@@ -4128,6 +4196,8 @@ int main(int argc, char *argv[])
struct Configurable config; struct Configurable config;
memset(&config, 0, sizeof(struct Configurable)); memset(&config, 0, sizeof(struct Configurable));
config.errors = stderr; /* default errors to stderr */
checkfds(); checkfds();
res = operate(&config, argc, argv); res = operate(&config, argc, argv);

View File

@@ -7,9 +7,9 @@
ATCPSDKI= /GG/netinclude ATCPSDKI= /GG/netinclude
CC = gcc CC = m68k-amigaos-gcc
CFLAGS = -I$(ATCPSDKI) -m68020-60 -noixemul -I. -I../include -W -Wall CFLAGS = -I$(ATCPSDKI) -m68020-60 -O2 -msoft-float -noixemul -g -I. -I../include -W -Wall
LIBS = ../lib/libcurl.a -lsslnix -lcryptonix -lz LIBS = ../lib/libcurl.a -lssl -lcrypto -lz
MANPAGE = ../docs/curl.1 MANPAGE = ../docs/curl.1
README = ../docs/MANUAL README = ../docs/MANUAL
MKHELP = ../src/mkhelp.pl MKHELP = ../src/mkhelp.pl
@@ -18,7 +18,7 @@ OBJS = getpass.c hugehelp.c main.c urlglob.c writeenv.c writeout.c
all: hugehelp.c $(OBJS:.c=.o) all: hugehelp.c $(OBJS:.c=.o)
$(CC) $(CFLAGS) -s -o cURL $(OBJS:.c=.o) $(LIBS) $(CC) $(CFLAGS) -o cURL $(OBJS:.c=.o) $(LIBS) -Wl,-Map,cURL.map,--cref
hugehelp.c: $(README) $(MANPAGE) mkhelp.pl hugehelp.c: $(README) $(MANPAGE) mkhelp.pl
rm -f hugehelp.c rm -f hugehelp.c

View File

@@ -197,11 +197,17 @@ the protocol dump curl should transmit, if 'nonewline' is set, we will cut
off the trailing newline of this given data before comparing with the one off the trailing newline of this given data before comparing with the one
actually sent by the client actually sent by the client
</protocol> </protocol>
<stdout> <stdout [mode=text]>
This verfies that this data was passed to stdout. This verfies that this data was passed to stdout.
Use the "mode=text" attribute if the output is in text mode on platforms that
have a text/binary difference.
</stdout> </stdout>
<file name="log/filename"> <file name="log/filename" [mode=text]>
the file's contents must be identical to this The file's contents must be identical to this after the test is complete.
Use the "mode=text" attribute if the output is in text mode on platforms that
have a text/binary difference.
</file> </file>
<stripfile> <stripfile>
One perl op per line that operates on the file before being compared. This is One perl op per line that operates on the file before being compared. This is

View File

@@ -32,4 +32,5 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
test231 test232 test228 test229 test233 test234 test235 test236 test520 \ test231 test232 test228 test229 test233 test234 test235 test236 test520 \
test237 test238 test239 test243 test245 test246 test247 test248 test249 \ test237 test238 test239 test243 test245 test246 test247 test248 test249 \
test250 test251 test252 test253 test254 test255 test521 test522 test523 \ test250 test251 test252 test253 test254 test255 test521 test522 test523 \
test256 test257 test258 test259 test256 test257 test258 test259 test260 test261 test262 test263 test264 \
test265 test266 test267 test268 test269

View File

@@ -38,7 +38,7 @@ Accept: */*
Proxy-Connection: Keep-Alive Proxy-Connection: Keep-Alive
</protocol> </protocol>
<file name="log/jar171"> <file name="log/jar171" mode=text>
# Netscape HTTP Cookie File # Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html # http://www.netscape.com/newsref/std/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk. # This file was generated by libcurl! Edit at your own risk.

View File

@@ -1,3 +1,10 @@
<info>
<keywords>
HTTP
HTTP GET
compressed
</keywords>
</info>
# #
# Server-side # Server-side
<reply> <reply>

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