Compare commits

..

492 Commits

Author SHA1 Message Date
Guenter Knauf
827f0a318c Set -fpcc-struct-return only for gcc compiler. 2011-02-17 11:46:41 +01:00
Daniel Stenberg
b66eeb8bf8 RELEASE-NOTES: credits since 7.21.3
I went through all the names mentioned as authors and in commit messages
since 7.21.3, and this list inserted now is sorted on first name.
2011-02-17 10:14:55 +01:00
Daniel Stenberg
c3a6116dc9 nss_load_key: fix unused variable warning 2011-02-16 19:34:04 +01:00
Daniel Stenberg
f19ace8d33 gmtime: remove define
It turns out some systems rely on the gmtime or gmtime_r to be defined
already in the system headers and thus my "precaution" redefining of
them only caused trouble. They are now removed.
2011-02-14 13:42:01 +01:00
Guenter Knauf
c2dff28c41 Added -m32 to CFLAGS to compile with x86_64 gcc. 2011-02-13 14:31:22 +01:00
Guenter Knauf
e36c039a07 Updated OpenSSL version, added links to docu. 2011-02-13 12:13:21 +01:00
Daniel Stenberg
96ea650ec7 RELEASE-NOTES: synced with 3bb1291fbd 2011-02-10 22:33:12 +01:00
Daniel Stenberg
3bb1291fbd --keepalive-time: warn if not supported properly
Since the feature requires support for TCP_KEEPIDLE and TCP_KEEPINTVL to
function as documented, it now warns if that support is missing when the
option is used.
2011-02-10 22:24:15 +01:00
Dan Fandrich
61fc9044c7 Call ERR_peek_error instead of ERR_peek_last_error
The latter isn't available in older OpenSSL versions, and is
less useful since it returns the most recent error instead of
the first one encountered.
2011-02-10 12:29:34 -08:00
Julien Chaffraix
311bd4c7b1 netrc: Enable setting up the filename in unit tests.
Unset the environment variable so that we can specify different
filenames in the unit test.
2011-02-10 07:38:48 -08:00
Julien Chaffraix
39d0d787d2 test1304: Added some unit tests for Curl_parsenetrc.
Moved some definitons into the header file so that we can reuse them.
2011-02-10 07:38:48 -08:00
Quinn Slack
3cffcba3d0 CURLE_TLSAUTH_FAILED: removed
On second thought, I think CURLE_TLSAUTH_FAILED should be eliminated. It
was only being raised when an internal error occurred while allocating
or setting the GnuTLS SRP client credentials struct. For TLS
authentication failures, the general CURLE_SSL_CONNECT_ERROR seems
appropriate; its error string already includes "passwords" as a possible
cause. Having a separate TLS auth error code might also cause people to
think that a TLS auth failure means the wrong username or password was
entered, when it could also be a sign of a man-in-the-middle attack.
2011-02-09 23:34:30 +01:00
Quinn Slack
ae7fe3b7f4 TLS-SRP: new options documented 2011-02-09 23:33:06 +01:00
Daniel Stenberg
b370fcd300 CURLOPT_SOCKOPTFUNCTION: return proper error code
When the callback returns an error, this function must make sure to return
CURLE_ABORTED_BY_CALLBACK properly and not CURLE_OK as before to allow the
callback to properly abort the operation.
2011-02-09 15:36:36 +01:00
Daniel Stenberg
5348e8f276 curl.1: typo in -v description
Reported by: Ian D Allen
Bug: https://bugs.launchpad.net/ubuntu/+source/curl/+bug/714895

Forwarded to us by:

Reported by: Andreas Olsson
Bug: http://curl.haxx.se/bug/view.cgi?id=3175422
2011-02-08 22:39:04 +01:00
Julien Chaffraix
266bcb06d7 netrc: Removed dead code.
The main has not been updated from some time and is out of sync with
the code. The code is now tested by several test cases so no need for
a seperate code path.
2011-02-07 20:15:35 -08:00
Julien Chaffraix
fe165c69de netrc: Tightened up the type checks.
The state should not be anonymous so that we can check if the values
are fine. Added 2 unreachables states to the switch as a result of this
change.
2011-02-07 20:15:35 -08:00
Julien Chaffraix
4e2ac742c9 imap: Fixed typo in a comment. 2011-02-07 20:15:35 -08:00
Daniel Stenberg
0696260122 Curl_gmtime: avoid future mistakes
Document Curl_gmtime() and define away the old functions so that they
won't be used internally again by mistake.
2011-02-07 15:09:24 +01:00
Daniel Stenberg
54d9f060b4 Curl_gmtime: added a portable gmtime
Instead of polluting many places with #ifdefs, we create a single place
for this function, and also check return code properly so that a NULL
pointer returned won't cause problems.
2011-02-07 15:00:48 +01:00
Guenter Knauf
2cacd82661 mk-ca-bundle.vbs: use new cacert url
The official Mozilla page at http://www.mozilla.org/projects/security/certs/
points out a new place as the "proper" place to get Mozilla's CA certs from
so this script is now updated to use that instead.

Reported by: Daniel Mentz
2011-02-03 09:59:00 +01:00
Daniel Stenberg
ec7978c512 mk-ca-bundle.pl: use new cacert url
The official Mozilla page at
http://www.mozilla.org/projects/security/certs/ points out a new place
as the "proper" place to get Mozilla's CA certs from so this script is
now updated to use that instead.

Reported by: Daniel Mentz
2011-02-02 22:22:15 +01:00
Bjoern Sikora
0e9626ba39 ssluse: improved error message on SSL_CTX_new failures
"SSL: couldn't create a context" really isn't that helpful, now it'll
also extract an explanation from OpenSSL and append to the right.
2011-02-02 18:25:57 +01:00
Nicholas Maniscalco
73eb9965cf multi: fix CURLM_STATE_TOOFAST for multi_socket
The code in the toofast state needs to first recalculate the values
before it uses them again since it may have been a while since it last
did it when it reaches this point.
2011-02-02 13:41:22 +01:00
Daniel Stenberg
08a77025c6 unit1300: code style cleanup 2011-02-02 13:35:55 +01:00
Amr Shahin
7a4b5079c6 adding unit tests for Curl_llist_remove 2011-02-02 13:24:04 +01:00
Patrick Monnerat
7a53c77cb5 Include TLSAUTH options in ILE/RPG binding. 2011-01-31 17:07:18 +01:00
Dave Reisner
b89122a2bf file: add support for CURLOPT_TIMECONDITION 2011-01-31 14:49:51 +01:00
Dave Reisner
99dcb11ed8 transfer: add Curl_meets_timecondition()
This will be used by file_do() and Curl_readwrite() as a unified method
of checking to see if a remote document meets the supplied
CURLOPT_TIMEVAL and CURLOPT_TIMECONDITION.

Signed-off-by: Dave Reisner <d@falconindy.com>
2011-01-31 14:29:48 +01:00
Daniel Stenberg
819dfddc58 FAQ: clarified/expanded 6.7 a bit
"6.7 What are my obligations when using libcurl in my commercial apps?"
got the piece about what exactly "in all copies" mean to a user of the
code.

This interpretation is based on what other MIT-like licenses have made
more explicit.
2011-01-29 23:52:40 +01:00
Daniel Stenberg
32a050ec7e COPYING: update the year to 2011
The generic copyright year range now includes 2011
2011-01-29 23:41:15 +01:00
Pierre Joye
76ac6b94ed Windows build: alternative makefile
This is a separate makefile for MSVC builds. It is deliberately put in
another dir than src/ and lib/ to allow a different build experience
than the previous - at least during a period. Eventually we should
unify.
2011-01-28 22:24:39 +01:00
Daniel Stenberg
28c830efd8 test: add test 580 to the dist 2011-01-28 00:24:47 +01:00
Dan Fandrich
7ba5e88053 Some minor edits including updates to function names 2011-01-27 14:37:16 -08:00
Daniel Stenberg
ef19e30985 ares: memory leak fix
The double name resolve trick used with c-ares could leave allocated
memory in 'temp_ai' if the operation was aborted in the middle.
2011-01-27 14:41:07 +01:00
Daniel Stenberg
2d356ba168 ares_query_completed_cb: don't touch invalid data
When this callback is called due to the destruction of the ares handle,
the connection pointer passed in as an argument may no longer pointing
to valid data and this function doesn't need to do anything with it
anyway so we make sure it doesn't.

Bug: http://curl.haxx.se/mail/lib-2011-01/0333.html
Reported by: Vsevolod Novikov
2011-01-27 14:41:07 +01:00
Kamil Dudka
dc0a7161f8 nss: avoid memory leaks and failure of NSS shutdown
... in case more than one CA is loaded.

Bug: https://bugzilla.redhat.com/670802
2011-01-27 11:14:18 +01:00
Dan Fandrich
77cbfe2274 Mention that sftp quote commands can be quoted 2011-01-26 17:02:33 -08:00
Daniel Stenberg
20690e412d tests: more multiple headers checks 2011-01-25 18:09:54 +01:00
Daniel Stenberg
dbcaa00657 HTTP: memory leak on multiple Location:
The HTTP parser allocated memory on each received Location: header
without properly freeing old data. Starting now, the code only considers
the first Location: header and will blissfully ignore subsequent ones.

Bug: http://curl.haxx.se/bug/view.cgi?id=3165129
Reported by: Martin Lemke
2011-01-25 12:06:50 +01:00
Daniel Stenberg
4b837a7e15 FAQ: clarify 5.13 how to stop a transfer 2011-01-24 22:18:43 +01:00
Guenter Knauf
73b518f269 Fixed C++ style comment not allowed in ISO C90. 2011-01-22 09:52:09 +01:00
Dan Fandrich
3427bece89 Mention axTLS in some more documentation 2011-01-21 14:27:10 -08:00
Daniel Stenberg
e79c1e39e9 runtests.pl: make -s not show skipped tests 2011-01-20 23:17:22 +01:00
Amr Shahin
77f0fcae0e unittest: add 3 tests to test1300
Testing Curl_llist_insert_next
2011-01-20 23:16:30 +01:00
Darshan Mody
03be2c99ba Fixed compile using OpenSSL versions < 0.9.4a 2011-01-20 12:11:22 -08:00
Daniel Stenberg
b77a3b9a35 main: make the tlsauth options always present
... to not make the connection between the tool and the libcurl used
tighter than necessary, the tlsauth options are now always present but
if the used libcurl doesn't have TLSAUTH support it will return failure.

Also, replaced strncmp() with strequal to get case insensitive matching.
2011-01-19 23:14:55 +01:00
Daniel Stenberg
c0a2ee65a4 symbols-in-versions: add the new TLSAUTH-SRP symbols 2011-01-19 22:45:02 +01:00
Daniel Stenberg
4ba3d8bd00 configure: TLS-SRP wasn't added as a feature
Test case 1014 failed since TLS-SRP was correctly set to the features
variable so curl-config --features didn't output it.
2011-01-19 21:27:06 +01:00
Daniel Stenberg
511031c8d8 dist: add new certs to tarball 2011-01-19 21:02:54 +01:00
Quinn Slack
59cf93ccdb TLS-SRP: support added when using GnuTLS 2011-01-19 20:35:02 +01:00
Daniel Stenberg
4f13340ab8 CURLOPT_SSL_VERIFYPEER: more clarifications
The default value is 1.

curl _uses_ a default CA bundle, it doesn't install one.

Drop the references to 7.10 as that is now >8 years old!
2011-01-19 13:19:44 +01:00
Daniel Stenberg
b0940753c6 TheArtOfHttpScripting: extended
Extended the intial HTTP protcol part and added a mention of --trace and
--trace-ascii.

Replaced most URLs in the text to use example.com instead of all the
made up strange names.

Shortened a bunch of lines.
2011-01-19 13:08:03 +01:00
Daniel Stenberg
b35622f387 curl_easy_setopt.3: clarify VERIFYHOST/PEER
Extended the descriptions somewhat and made the options get listed next
to each other.
2011-01-19 12:54:17 +01:00
Daniel Stenberg
ce24fdaa2c RELEASE-NOTES: mention contributors 2011-01-18 23:41:57 +01:00
Daniel Stenberg
02c99899a2 RELEASE-NOTES: synced with 7fcbdd68b9 2011-01-18 23:40:48 +01:00
Guenter Knauf
7fcbdd68b9 Fixed configure define for Win32.
Submitted by Vincent Torri.
2011-01-18 15:04:53 +01:00
Kamil Dudka
fc77790bcd nss: fix a bug in handling of CURLOPT_CAPATH
... and update the curl.1 and curl_easy_setopt.3 man pages such that
they do not suggest to use an OpenSSL utility if curl is not built
against OpenSSL.

Bug: https://bugzilla.redhat.com/669702
2011-01-18 14:30:49 +01:00
Guenter Knauf
ef46fcdd90 Avoid redefines. 2011-01-17 01:27:57 +01:00
Daniel Stenberg
0243aa9eb0 curl.1: fix spelling
Bug: http://curl.haxx.se/bug/view.cgi?id=3157232
Reported by: John Bradshaw
2011-01-15 22:46:03 +01:00
Guenter Knauf
8fa7b8cb9b Added casts to silent gcc warnings. 2011-01-14 12:39:54 +01:00
Yang Tse
fd6b4b3e9b build: BCC - makefile.b32 tweak
Get rid of stdout redirection to NUL and move stderr redirection
into RM and RMDIR macros.
2011-01-13 15:54:14 +01:00
Yang Tse
1da65c3d4d build: BCC - makefile.b32 tweak
Check for BCCDIR environment var done now as other checks.
2011-01-13 15:33:34 +01:00
Guenter Knauf
d541085407 Use env var for PSDK instead of hardcoded path. 2011-01-13 05:55:09 +01:00
Guenter Knauf
c73e5e839d Enabled SSPI support by default. 2011-01-13 02:55:26 +01:00
Guenter Knauf
db2e425346 Use MAKE macro with BCC targets. 2011-01-13 02:48:11 +01:00
Yang Tse
6aa5206042 docs - update BCC INSTALL section 2011-01-12 23:28:19 +01:00
Yang Tse
61623b74e3 build: BCC - require Borlands's MAKE for Makefile.b32 processing. 2011-01-12 20:53:28 +01:00
Yang Tse
5f7d34811a build: BCC - recover lost functionality from commit 3d81320426
Borland's $(MAKEDIR) expands to the path where make.exe is located,
use this feature to define BCCDIR when user has not defined BCCDIR.
2011-01-12 18:07:04 +01:00
Yang Tse
42f5e8a0f1 build: use external preprocessor cpp32 when building with Borland C 2011-01-12 02:35:14 +01:00
Yang Tse
c5d9cd5c1b build: allow usage of Borland 5.5.1 external preprocessor cpp32 2011-01-12 02:33:39 +01:00
Guenter Knauf
b5cc77bd25 Disable LDAP support since BCC headers are insufficient. 2011-01-11 18:32:38 +01:00
Guenter Knauf
3d81320426 Instead of exiting with error lets set BCCDIR self. 2011-01-11 18:22:42 +01:00
Guenter Knauf
308db9d780 Some Borland C++ makefile tweaks. 2011-01-11 17:51:14 +01:00
Guenter Knauf
03ea06b8e3 Borland C++ doesnt have struct sockaddr_storage. 2011-01-11 17:40:13 +01:00
Daniel Stenberg
08a65b10fb connect: use UDP correctly
The idea that the protocol and socktype is part of name resolving in the
libc functions is nuts. We keep the name resolver functions assume
TCP/STREAM and we make sure that when we want to connect to a UDP
service we use the correct UDP/DGRAM set instead. This bug was because
the ->protocol field was not always set correctly.

This bug was only affecting ipv6-disabled non-cares non-threaded builds.

Bug: http://curl.haxx.se/bug/view.cgi?id=3154436
Reported by: "dperham"
2011-01-11 00:14:36 +01:00
Quinn Slack
1238edaeaf SSL: fix memory leak
In OOM situation. Follow-up fix to commit a9cd4f4ed4.
2011-01-10 13:53:57 +01:00
Daniel Stenberg
a9cd4f4ed4 gtls: fix memory leak
Bug: http://curl.haxx.se/mail/lib-2011-01/0079.html
Reported by: Quinn Slack
2011-01-08 19:14:28 +01:00
Marcel Roelofs
1d28efb9d1 HTTP: HTTP Negotiate authentication using SSPI
Only under Windows
2011-01-07 23:48:40 +01:00
Daniel Stenberg
9ba42a023d cmake: removed two files
CMake/CheckTypeSize.c.in and CMake/CheckTypeSize.cmake were removed in
the previous cmake commit
2011-01-06 23:41:45 +01:00
Dan Fandrich
ebb9c7ae04 Made unit_setup() return an error code to abort the test early
This makes it possible to skip the call to unit_stop() in such
cases.  Also use Curl_safefree() in unit test 1302 so it will
pass the memory torture test.
2011-01-05 23:53:24 -08:00
Daniel Stenberg
53014175e8 SSH: speedcheck clobbered existing error
The just added speedcheck must not ruin the error code if already set
due to a problem.
2011-01-06 00:19:17 +01:00
Brad King
651c0bcdf2 CMake: Use upstream CheckTypeSize module
The CheckTypeSize module that comes with CMake 2.6.2 and above does
everything we need and also supports cross-compiling.  Avoid duplicating
an older version of it here.  This also fixes a cross-compiling error
because the old line

  include ("${CMAKE_MODULE_PATH}/CheckTypeSize.cmake")

failed because CMAKE_MODULE_PATH is a search path and not a directory.

Signed-off-by: Brad King <brad.king@kitware.com>
2011-01-06 00:06:29 +01:00
Daniel Stenberg
d45ed0ecf5 SSH: acknowledge speedcheck
Check for speedcheck limits during the state machine traversals
2011-01-05 14:09:53 +01:00
Daniel Stenberg
e21b103c3e tests: <info> tag corrections 2011-01-04 23:13:10 +01:00
Daniel Stenberg
0029b2f042 unittest: 1303 tests Curl_timeleft
I came up with 33 different ways to call it and verify that it returns the
correct return code.
2011-01-04 23:13:10 +01:00
Daniel Stenberg
7c5d888ea6 curlcheck.h: add fail()
fail is a new function/macro that a test case can use to indicate a test
failure for cases when the standard macros are not sufficient.
2011-01-04 23:13:10 +01:00
Daniel Stenberg
adb49ad8bb Curl_timeleft: s/conn/data in first argument
As the function doesn't really use the connectdata struct but only the
SessionHanadle struct I modified what argument it wants.
2011-01-04 23:13:10 +01:00
Dan Fandrich
a2c8966d50 Fixed path to allow out-of-tree builds 2011-01-04 12:59:44 -08:00
Kamil Dudka
d8f6d1c334 nss: avoid CURLE_OUT_OF_MEMORY given a file name without any slash
Bug: https://bugzilla.redhat.com/623663
2011-01-04 17:20:43 +01:00
Daniel Stenberg
1e52ea92eb ignore: all executable unit test cases 2011-01-04 16:51:41 +01:00
Daniel Stenberg
28888a0b41 tests: add 1302 to the package 2011-01-04 16:50:59 +01:00
Daniel Stenberg
1022e754f4 unittest: test base64 encode/decode 2011-01-04 16:42:31 +01:00
Daniel Stenberg
703573c72b curlcheck.h: avoid using NULL pointers 2011-01-04 16:41:42 +01:00
Daniel Stenberg
7af54ef9a5 curlcheck.h: add verify_memory
This check verifies that a pointer contains the correct data.
2011-01-04 16:31:54 +01:00
Daniel Stenberg
1602ed6ba1 curlcheck.h: add newlines in error messages 2011-01-04 16:14:23 +01:00
Daniel Stenberg
9e46318a03 unittest: verify curl_strequal 2011-01-04 16:13:58 +01:00
Daniel Stenberg
c0c89cd44e get_cert_chain: support larger data sets
512 bytes turned out too short for some data, so now we allocate a
larger buffer instead

Bug: http://curl.haxx.se/mail/archive-2011-01/0002.html
2011-01-04 10:20:28 +01:00
Daniel Stenberg
6cf35852ad RELEASE-NOTES: synced with 83e9fb21aa 2011-01-04 00:07:30 +01:00
Daniel Stenberg
83e9fb21aa curlcheck.h: add fail_if() fix code
The UNITTEST_START and UNITTEST_STOP defines needed to do a new brace
level so that test cases can declare variables fine and still remain
fine C89 code.
2011-01-03 23:47:34 +01:00
Daniel Stenberg
5c42b2ceae unittests: basic docs 2011-01-03 23:47:13 +01:00
Daniel Stenberg
82aa386732 ignore: unit test files 2011-01-03 22:52:50 +01:00
Daniel Stenberg
c43ad0f972 unittests: a dedicated feature in tests
The test runner script now knows if unittests can run and the unit test
setup file says it is one. I also made runtests.pl deal with no
<command> tag set, so that the description file can get even simpler.
2011-01-03 22:42:46 +01:00
Daniel Stenberg
53640a3ce0 unittesting: build a separate static lib
When configure --enable-debug has been used, all files in lib/ are now
built twice and a separate static library crafted for unit-testing will
be linked. The unit tests in the tests/unit subdir will use that
library.
2011-01-03 22:16:16 +01:00
Daniel Stenberg
35e1d6538a unittest: framework for unit-testing
This is the first approach at doing fairly clean and easy to write and
debug unit tests.
2011-01-03 19:38:10 +01:00
Daniel Stenberg
45cea71968 SSH: avoid PATH_MAX with alloc
We cannot assume that PATH_MAX will be enough for the remote path name
so allocating room for it is the only sensible approach.
2011-01-03 13:36:45 +01:00
Daniel Stenberg
569202c9a4 TODO: get rid of PATH_MAX 2011-01-03 09:40:40 +01:00
Daniel Stenberg
2b3fbc8cdb Curl_nss_connect: avoid PATH_MAX
Since some systems don't have PATH_MAX and it isn't that clever to
assume a fixed maximum path length, the code now allocates buffer space
instead of using stack.

Reported by: Samuel Thibault
Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=608521
2011-01-02 23:43:03 +01:00
Daniel Stenberg
1ad5764feb SFTP: make pwd output result to header callback
Sending "pwd" as a QUOTE command only sent the reply to the
DEBUGFUNCTION. Now it also sends an FTP-like header to the header
callback to allow similar operations as with FTP, and apps can re-use
the same parser.
2011-01-01 15:35:53 +01:00
Daniel Stenberg
ae29142198 pubkey_show: allocate buffer to fit any-size result
The loop condition was wrong so keys larger than 340 bits would overflow
the local stack-based buffer.
2011-01-01 15:33:57 +01:00
Daniel Stenberg
cd045e24a0 CURLINFO_FTP_ENTRY_PATH: sftp support 2010-12-30 23:49:03 +01:00
Luke Amery
0dc8479b89 ssh: honour the CURLINFO_FTP_ENTRY_PATH curl_getinfo option 2010-12-30 23:42:44 +01:00
Pierre Joye
420eac5542 IDN: use win32 API if told to
The functionality is provided in a new source file: lib/idn_win32.c
2010-12-28 20:01:03 +01:00
Yang Tse
15aeb94f3f test harness: take in account that Windows does not support LD_PRELOAD
configure.ac: Test harness libhostname library will not be built for Windows.

runtests.pl: LD_PRELOAD mechanism will not be used to load libhostname
library on operating systems which lack LD_PRELOAD support.
2010-12-28 16:52:20 +01:00
Daniel Stenberg
b6a3e2be8e c-ares: fix cancelled resolves
When built IPv6-enabled, we could do Curl_done() with one of the two
resolves having returned already, so when ares_cancel() is called the
resolve callback ends up doing funny things (sometimes resulting in a
segfault) since it would try to actually store the previous resolve even
though we're shutting down the resolve.

This bug was introduced in commit 8ab137b2bc so it hasn't been
included in any public release.

Bug: http://curl.haxx.se/bug/view.cgi?id=3145445
Reported by: Pedro Larroy
2010-12-27 10:01:44 +01:00
Brad Hards
9f64bbd6d8 Typo / spelling fixes. 2010-12-25 23:07:16 +01:00
Brad Hards
879914def3 Use angle address, as for the rest of the example.
Also spelling fix for RECIPIENT #define.
2010-12-25 23:06:53 +01:00
Brad Hards
6076549304 Add angle brackets to addresses in easy SMTP examples, as for smtp-multi example. 2010-12-25 23:06:29 +01:00
Daniel Stenberg
49465fffdb cookies: tricked dotcounter fixed
Providing multiple dots in a series in the domain field (domain=..com) could
trick the cookie engine to wrongly accept the cookie believing it to be
fine. Since the tailmatching would then match all .com sites, the cookie would
then be sent to all of them.

The code now requires at least one letter between each dot for them to be
counted. Edited test case 61 to verify this.
2010-12-23 22:52:32 +01:00
Daniel Stenberg
5825aa149d multi: connect fail => use next IP address
When using the multi interface and connecting to a host name that
resolves to multiple IP addresses, there was no logic that made it
continue to the next IP if connecting to the first address times
out. This is now corrected.
2010-12-23 22:21:24 +01:00
Daniel Stenberg
7dc9393d3b smtp-multi: put recipient within <brackets>
Even if libcurl might to do it for us, it is more correct.
2010-12-23 22:21:24 +01:00
Daniel Stenberg
2dded8fedb ossl_seed: no more RAND_screen
RAND_screen() is slow, not thread-safe and not needed anymore since OpenSSL
uses the thread-safe win32 CryptoAPI nowadays.
2010-12-23 14:36:07 +01:00
Daniel Stenberg
be16b227b7 multi: inhibit some verbose outputs
The info about pipe status and expire cleared are clearly debug-related
and not anything mere mortals will or should care about so they are now
ifdef'ed DEBUGBUILD
2010-12-22 15:29:21 +01:00
Daniel Stenberg
e6d99f4ba7 SMTP tests: updated MAIL FROM use
They were all wrong previously since none used the <brackets> they
should for MAIL FROM. Now libcurl adds them itself if the app doesn't so
they end up wrong less easy.
2010-12-22 14:53:13 +01:00
Daniel Stenberg
16c4314a21 CURLOPT_MAIL_FROM: document the bracket situation 2010-12-22 14:44:10 +01:00
Brad Hards
375aa41ba1 SMTP: add brackets for MAIL FROM
Similar to what is done already for RCPT TO, the code now checks for and
adds angle brackets (<>) around the email address that is provided for
CURLOPT_MAIL_RCPT unless the app has done so itself.
2010-12-22 14:41:53 +01:00
Guenter Knauf
5f829456c1 Added support for axTLS to NetWare build. 2010-12-22 04:45:41 +01:00
Guenter Knauf
a834e00454 Fixed include: memory.h -> curl_memory.h. 2010-12-22 03:34:13 +01:00
Brad Hards
0e944fb24e smtp-tls: add a missing newline
Without this you won't get the next (Subject) line.
2010-12-22 02:20:18 +01:00
Brad Hards
f37d681166 Typo fixes. 2010-12-21 22:39:56 +01:00
Patrick Monnerat
30bd7427ea New curl/curl.h definitions added to ILE/RPG binding. 2010-12-21 14:23:37 +01:00
Yang Tse
71ab0ceaa0 build: sort configuration hunks in lib/Makefile.vc6
sorted to reflect same internal order as the one shown
in the usage message.
2010-12-21 00:14:55 +01:00
Daniel Stenberg
9acac91960 getparameter: add error check
if add2list() returns an error, bail out!
2010-12-20 22:22:02 +01:00
Daniel Stenberg
af54fbbcb5 loadhostpairs: return errorcode
Make sure that Curl_cache_addr() errors are propagated to callers of
loadhostpairs().

(this loadhostpairs function caused a scan-build warning due to the
'dns' variable getting assigned but never used)
2010-12-20 22:22:02 +01:00
Yang Tse
1e739e781e distrib: add new file to EXTRA_DIST 2010-12-20 21:58:13 +01:00
Yang Tse
8d569c7bb0 build: refactoring of msvc makefiles to allow overriding of library filenames.
Default libcurl's file names are kept equal to those used since Y2K.
2010-12-20 21:53:44 +01:00
Daniel Stenberg
7f3b87d878 ftp_parselist: fix compiler warning
Doing curlx_strtoofft() on the size just to figure out the end of it
causes a compiler warning since the result wasn't used, but is also a
bit of a waste.
2010-12-19 00:15:12 +01:00
Pasha Kuznetsov
6b5dc72575 Curl_do: avoid using stale conn pointer
Since the original `conn' pointer was used after the `connectdata' it
points to has been closed/cleaned up by Curl_reconnect_request it caused
a crash. We must make sure to use the newly created connection instead!

URL: http://curl.haxx.se/mail/lib-2010-12/0202.html
2010-12-18 22:35:37 +01:00
Tommie Gannert
8ab137b2bc ares: ask for both IPv4 and IPv6 addresses
Make the c-ares resolver code ask for both IPv4 and IPv6 addresses when
IPv6 is enabled.

This is a workaround for the missing ares_getaddrinfo() and is a lot
easier to implement.

Note that as long as c-ares returns IPv4 addresses when IPv6 addresses
were requested but missing, this will cause a host's IPv4 addresses to
occur twice in the DNS cache.

URL: http://curl.haxx.se/mail/lib-2010-12/0041.html
2010-12-18 22:33:27 +01:00
Daniel Stenberg
bcfb9ea34c examples: socket type cleanup 2010-12-18 17:13:24 +01:00
Brad Hards
f0aad0089e Trival comment fix. 2010-12-18 17:08:23 +01:00
Brad Hards
d2395f962d smtp-tls: add Message-ID: header 2010-12-18 17:07:57 +01:00
Daniel Stenberg
476b1a079b gitignore: ignore the new example execs 2010-12-17 23:35:04 +01:00
Daniel Stenberg
9583b4af90 examples: fix compiler warnings 2010-12-17 23:34:26 +01:00
Daniel Stenberg
8219bc9e19 examples: build all examples easier 2010-12-17 23:34:06 +01:00
Brad Hards
57523e3578 smtp-tls: new example
This example shows how to send SMTP with TLS
2010-12-17 22:55:58 +01:00
Brad Hards
37a22d4749 Docs: add simple SMTP example
Add a simple SMTP example program, patterned after some of the existing
examples, and the curl application.

This version addresses issues raised by David Woodhouse on comments in
the simplesmtp.c example.
2010-12-17 22:51:54 +01:00
Paul Howarth
1df74d886d tftpd: avoid buffer overflow report from glibc 2010-12-17 19:08:43 +01:00
Daniel Stenberg
76c54bd129 example: fix compiler warnings in fopen.c 2010-12-17 00:09:48 +01:00
Brad Hards
8f50a404f9 chkspeed: bad strtol() call for -M option
Bug: http://curl.haxx.se/mail/lib-2010-12/0192.html
2010-12-17 00:09:48 +01:00
Yang Tse
f6ebae65d6 axTLS integration: silence runtests.pl perl warning 2010-12-16 17:33:53 +01:00
Daniel Stenberg
a0a70dc21d axTLS: mention it among the other SSL libs 2010-12-15 16:08:45 +01:00
Daniel Stenberg
5e37689a1a 7.21.4: version bump 2010-12-15 16:05:17 +01:00
Daniel Stenberg
c75a9fef59 axtls_connect: allow connect without peer verification
The SSL_SERVER_VERIFY_LATER bit in the ssl_ctx_new() call allows the
code to verify the peer certificate explicitly after the handshake and
then the "data->set.ssl.verifypeer" option works.
2010-12-15 16:05:17 +01:00
Daniel Stenberg
9035709e25 axTLS: allow "default" SSL version as well
When no explicit version is selected we should try to use whatever is
best for us, and in the axTLS case that means TLSv1.
2010-12-15 16:05:17 +01:00
Daniel Stenberg
b88ead62e7 axtls.c: cleanup
Removed trailing whitespace
Removed several compiler warnings
Removed odd backslashes at some line endings
2010-12-15 16:05:17 +01:00
Daniel Stenberg
b998b04c02 urldate: undef hideous memory defines
The public axTLS header (at least as of 1.2.7) redefines the memory
functions. We #undef those again immediately after the public header to
limit the damage. This should be fixed in axTLS.
2010-12-15 16:05:17 +01:00
Daniel Stenberg
68b2a9818b configure: make --with-axtls set prefix
In tradition with other options, have this point to the directory prefix
and not the lib directory. Otherwise we can't set the include path
reliably.
2010-12-15 16:05:17 +01:00
Eric Hu
a7cf30f808 Minor fixes to pass tests 301 and 306 with a patched axTLS. 2010-12-15 16:05:17 +01:00
Eric Hu
be312336f6 Initial axTLS integration. Connections can be made and some tests pass.
Failed HTTPS tests: 301, 306, 311, 312, 313, 560
311, 312 need more detailed error reporting from axTLS.
313 relates to CRL, which hasn't been implemented yet.
2010-12-15 16:05:17 +01:00
Eric Hu
6761cf49f2 Simple update to configure script to notify user of --with-axtls switch. 2010-12-15 16:05:17 +01:00
Eric Hu
108d7693a4 Preparing for axTLS. Actual SSL API functions are only stubbed.
Added axTLS to autotool files and glue code to misc other files.
axtls.h maps SSL API functions, but may change.
axtls.c is just a stub file and will definitely change.
2010-12-15 16:05:17 +01:00
Daniel Stenberg
00a5bd41be THANKS: added contributors from 7.21.3 2010-12-15 15:50:40 +01:00
Daniel Stenberg
6d7d0eba6d RELEASE-NOTES: synced with a865bd9fba 2010-12-15 15:06:12 +01:00
Daniel Stenberg
a865bd9fba IsPipeliningPossible: only for HTTP
The function that checks if pipelining is possible now requires the HTTP
bit to be set so that it doesn't mistakenly tries to do it for other
protocols.

Bug: http://curl.haxx.se/mail/lib-2010-12/0152.html
Reported by: Dmitri Shubin
2010-12-13 13:44:50 +01:00
Daniel Stenberg
0fd439ebac multi_runsingle: don't timeout completed handles
The generic timeout code must not check easy handles that are already
completed. Going to completed (again) within there risked decreasing the
number of alive handles again and thus it could go negative.

This regression bug was added in 7.21.2 in commit ca10e28f06
2010-12-13 12:51:48 +01:00
Daniel Stenberg
012f9b7f04 symbols-in-versions: CURLOPT_KEYPASSWD fixed
It was added in 7.17.0 and is not deprecated
2010-12-09 13:07:00 +01:00
Daniel Stenberg
573a2900cd RELEASE-NOTES: synced with c28443c551 2010-12-09 11:23:33 +01:00
Dan Fandrich
c28443c551 Mention that using other libraries can affect app licensing 2010-12-08 10:16:25 -08:00
Yang Tse
0b5901bec6 easy: fix compiler warning: end-of-loop code not reached 2010-12-07 03:27:59 +01:00
Daniel Stenberg
5965d4554d disconnect: pass on the dead_connection argument
Cleanup fix after Kamil's commit 5c7c9a768d
2010-12-06 15:33:38 +01:00
Yang Tse
34127c7adc sws: fix compier warning: external definition with no prior declaration 2010-12-06 14:51:44 +01:00
Heinrich Ko
315e5277dc ossl_connect_common: detect connection re-use
ossl_connect_common() now checks whether or not 'struct
connectdata->state' is equal 'ssl_connection_complete' and if so, will
return CURLE_OK with 'done' set to 'TRUE'. This check prevents
ossl_connect_common() from creating a new ssl connection on an existing
ssl session which causes openssl to fail when it tries to parse an
encrypted TLS packet since the cipher data was effectively thrown away
when the new ssl connection was created.

Bug: http://curl.haxx.se/mail/lib-2010-11/0169.html
2010-12-06 14:41:18 +01:00
Kamil Dudka
5c7c9a768d url: provide dead_connection flag in Curl_handler::disconnect
It helps to prevent a hangup with some FTP servers in case idle session
timeout has exceeded.  But it may be useful also for other protocols
that send any quit message on disconnect.  Currently used by FTP, POP3,
IMAP and SMTP.
2010-12-06 14:35:42 +01:00
Yang Tse
bf1c102b80 ssh: fix a download resume point calculation 2010-12-06 14:29:16 +01:00
Daniel Stenberg
2271b60b71 Curl_wait_for_resolv: correct timeout
When looping in this function and checking for the timeout being
expired, it was not updating the reference time when calculating the
timediff since previous round which made it think each subsequent loop
to have taken longer than it actually did.

I also modified the function to use the generic Curl_timeleft() function
instead of the custom logic.

Bug: http://curl.haxx.se/bug/view.cgi?id=3112579
2010-12-05 23:39:41 +01:00
Daniel Stenberg
c2bfe60086 Curl_send/recv_plain: return errno on failure
When send() and recv() fail, we now store the errno value to allow the
app to access it.

Bug: http://curl.haxx.se/bug/view.cgi?id=3128121
Reported by: Yuri
2010-12-05 23:04:11 +01:00
Guenter Knauf
63598059cd Updated OpenSSL version. 2010-12-05 10:59:58 +01:00
Yang Tse
c1901f7ed0 fix compiler warning: conversion may lose significant bits 2010-12-04 05:53:07 +01:00
Yang Tse
9c4ff4874e fix compiler warning: assignment within conditional expression 2010-12-03 16:53:11 +01:00
Yang Tse
46a0062dff fix getinfo CURLINFO_LOCAL* for reused connections (take 2) follow-up
- Show address string from proper buffer in case of connection failure.

- Try next address when inet_ntop() fails.
2010-12-03 14:30:00 +01:00
Daniel Stenberg
d97fa56fd4 version-check: added brief documentation
and the traditional source header
2010-12-03 14:10:04 +01:00
Yang Tse
d534cd0027 build: provide SIZEOF_SIZE_T DOS definition 2010-12-03 04:15:39 +01:00
Yang Tse
afd6e738f7 build: lib/config.dos renamed to lib/config-dos.h 2010-12-03 04:13:33 +01:00
Yang Tse
de670efeab build: provide SIZEOF_SIZE_T VMS definition 2010-12-03 03:40:16 +01:00
Yang Tse
421d918da3 build: move config-vms.h from subdir 'packages/vms' into 'lib' 2010-12-03 02:36:22 +01:00
Yang Tse
99a07a1fdf build: provide SIZEOF_SIZE_T definition for non-configure builds 2010-12-02 21:41:23 +01:00
Yang Tse
81c16c2e30 build: provide SIZEOF_SIZE_T netware definition 2010-12-02 20:53:42 +01:00
Yang Tse
dd5d3518e4 configure: undo using autobuilds to temporarily verify strict aliasing warnings. 2010-12-02 19:09:15 +01:00
Yang Tse
07f60235b0 fix compiler warning: rounding, sign extension, or loss of accuracy may result 2010-12-02 18:46:13 +01:00
Yang Tse
5580fb2b9c fix compiler warning: statement is not reachable 2010-12-02 16:35:02 +01:00
Yang Tse
7e3f0bffe5 fix compiler warning: conversion may lose significant bits 2010-12-01 23:33:43 +01:00
Yang Tse
5d47bf3776 connect: fix compiler warning: unused variable 2010-12-01 17:30:52 +01:00
Yang Tse
11cddb68e0 fix getinfo CURLINFO_LOCAL* for reused connections (take 2) 2010-11-30 22:14:37 +01:00
Yang Tse
1b2b93e074 fix getinfo CURLINFO_LOCAL* for reused connections follow-up
Reinstate IPV6 build variable that got removed.
2010-11-30 13:42:02 +01:00
Yang Tse
c328214a2d fix getinfo CURLINFO_LOCAL* for reused connections
Failed to commit this file changes along with the others.
2010-11-30 13:31:25 +01:00
Yang Tse
f6f5d7874f fix getinfo CURLINFO_LOCAL* for reused connections 2010-11-30 06:20:54 +01:00
Yang Tse
5db0a412ff atoi: remove atoi usage 2010-11-28 23:11:14 +01:00
Yang Tse
cbe67a1b71 multi: fix compiler warning: conversion may lose significant bits follow-up 2010-11-28 20:49:40 +01:00
Yang Tse
23245ca83a ftp: fix 'bool' data type implementation dependant usage 2010-11-26 20:19:45 +01:00
Yang Tse
3590874999 multi: fix compiler warning: conversion may lose significant bits 2010-11-26 19:57:27 +01:00
Yang Tse
e39ab6f203 multi: fix compiler warning: enumerated type mixed with another type 2010-11-26 19:34:10 +01:00
Yang Tse
c9081a8280 hostip: edit comment 2010-11-26 18:18:26 +01:00
Yang Tse
5088e3709d xattr: fix compiler warning: enumerated type mixed with another type 2010-11-26 17:35:48 +01:00
Yang Tse
c2ba8ca81f s/isspace/ISSPACE 2010-11-26 13:59:01 +01:00
Yang Tse
ef24ecde68 symbol-scan: use configure script knowledge about how to run the C preprocessor 2010-11-25 21:05:20 +01:00
Yang Tse
e8bc33d0a3 ignore file generated by configure 2010-11-25 13:34:47 +01:00
Yang Tse
5087f89ac8 curl_multi_info_read: fix compiler warning: conversion may lose significant bits 2010-11-25 02:58:59 +01:00
Yang Tse
b3d39275f5 inet_pton: fix compiler warning
warning C4146: unary minus operator applied to unsigned type, result still unsigned
2010-11-25 02:20:14 +01:00
Yang Tse
1d75d30816 Curl_getaddrinfo_ex: sanitize function results follow-up. 2010-11-24 04:36:57 +01:00
Yang Tse
6fe18add71 Curl_getaddrinfo_ex: sanitize function results.
Ensure that spurious results from system's getaddrinfo() ares not propagated
by Curl_getaddrinfo_ex() into the library.

Also ensure that the ai_addrlen member of Curl_getaddrinfo_ex()'s output linked
list of Curl_addrinfo structures has appropriate family-specific address size.
2010-11-23 21:38:20 +01:00
Kamil Dudka
d212fe43af openldap: use remote port in URL passed to ldap_init_fd()
... not the proxy port.  It makes no difference unless a proxy is used.
2010-11-22 23:59:59 +01:00
Yang Tse
13d537e404 gtls: define and use gtls_EAGAIN, gtls_EINTR and gtls_EIO.
Winsock builds clobber some errno.h defines in setup_once.
2010-11-20 05:02:02 +01:00
Dan Fandrich
46041ee918 Added a couple examples that were missing from the tar ball 2010-11-19 17:17:38 -08:00
Dan Fandrich
1bb05ac16f Check for errors while preprocessing curl.h in test 1119
This showed a problem when running the test out-of-tree, so
an include path is now being added to pick up the generated
curlbuild.h file.
2010-11-19 15:54:21 -08:00
Dan Fandrich
091c52fef7 Use the 3-argument open for compatibility with older perls 2010-11-19 15:27:28 -08:00
Matthias Bolte
a83870ef9d Detect socket errors in GnuTLS on Windows
On Windows, translate WSAGetLastError() to errno values as GNU
TLS does it internally, too. This is necessary because send() and
recv() on Windows don't set errno when they fail but GNU TLS
expects a proper errno value.

Bug: http://curl.haxx.se/bug/view.cgi?id=3110991
2010-11-19 13:34:07 -08:00
Yang Tse
a768e39b2d test servers: fix strict aliasing compiler warnings 2010-11-19 19:20:38 +01:00
Yang Tse
1c4fa240be configure: use autobuilds to temporarily verify strict aliasing warnings.
Temporarily, When cross-compiling with gcc 3.0 or later, enable strict aliasing
rules and warnings. Given that cross-compiled targets autobuilds do not run the
2010-11-18 17:12:15 +01:00
Julien Chaffraix
5046dd02b9 configure: Prevent link errors with --librtmp.
If --librtmp was specified but pkg-config could not find the librtmp
file, we would have undefined symbols when linking curl.

We prevent this error by disabling this case as suggested on the mailing
list.
2010-11-17 21:16:45 -08:00
Daniel Stenberg
4d6c0bdf74 RELEASE-NOTES: synced with cbf4961bf3 2010-11-15 00:07:55 +01:00
Daniel Stenberg
cbf4961bf3 gnutls->handshake: improved timeout handling
When no timeout is set, we call the socket_ready function with a timeout
value of 0 during handshake, which makes it loop too much/fast in this
function. It also made this function return CURLE_OPERATION_TIMEDOUT
wrongly on a slow handshake.

However, the particular bug report that highlighted this problem is not
solved by this fix, as this fix only makes the more proper error get
reported instead.

Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594150
Reported by: Johannes Ernst
2010-11-14 12:42:29 +01:00
Julien Chaffraix
add5766dd4 urldata: Capitalize enum protect_level values.
This makes it easier to spot the enum values from the variables.
Removed some unneeded DEBUGASSERT added in the previous commit.
2010-11-13 14:42:34 -08:00
Julien Chaffraix
8d59d69449 security: tighten enum protection_level usage.
While changing Curl_sec_read_msg to accept an enum protection_level
instead of an int, I went ahead and fixed the usage of the associated
fields.

Some code was assuming that prot_clear == 0. Fixed those to use the
proper value. Added assertions prior to any code that would set the
protection level.
2010-11-13 14:12:43 -08:00
Yang Tse
465865c3cb configure: fix autoconf 2.68 warning: no AC_LANG_SOURCE call detected in body 2010-11-13 04:15:48 +01:00
Daniel Stenberg
c539b83138 curl.1: "a file", not an 2010-11-12 23:56:09 +01:00
Daniel Stenberg
0a2edfc348 version-check.pl: display version number for symbols
This script is the start of a helper tool that scans a source code and
outputs the most recent libcurl version it finds symbols for. Meaning
that if there's no conditions in the code, that's the earliest libcurl
version the scanned code requires.

It is not added to the Makefile.am yet as it is still a bit crude, but
I'm committing it to keep it and allow us to work on it.
2010-11-12 23:29:29 +01:00
Adam Light
64520e43d4 Makefile.vc6: fixed the xattr.c compile 2010-11-12 23:29:29 +01:00
Julien Chaffraix
c79f816c32 krb5: Use GSS_ERROR to check for error.
This is the advised way of checking for errors in the GSS-API RFC.
Also added some '\n' to the error message so that they are not mixed
with other outputs.
2010-11-12 08:24:32 -08:00
Julien Chaffraix
c8a7df108f security: Pass the right parameter to init.
init is expecting app_data. Passing it the struct connecdata would make
us crash later.
2010-11-12 08:24:32 -08:00
Daniel Stenberg
8636742256 HTTP Auth: Add CURLAUTH_ONLY
This is a meta symbol. OR this value together with a single specific
auth value to force libcurl to probe for un-restricted auth and if not,
only that single auth algorithm is acceptable.

For example you can use CURLAUTH_DIGEST|CURLAUTH_ONLY to make libcurl
first probe for what method to use, but yet only consider Digest to be
acceptable.

Using _only_ CURLAUTH_DIGEST without the CURLAUTH_ONLY field, will make
libcurl explicitly use Digest right away and not do any probing.
2010-11-11 16:44:50 +01:00
Daniel Stenberg
a1f32ffee5 ip_version: moved to connection struct
The IP version choice was previously only in the UserDefined struct
within the SessionHandle, but since we sometimes alter that option
during a request we need to have it on a per-connection basis.

I also moved more "init conn" code into the allocate_conn() function
which is designed for that purpose more or less.
2010-11-11 15:16:21 +01:00
Yang Tse
fec5f03e22 buildconf: MAC OS X requires libtool version 1.5.26 or newer
MAC OS X requires libtool version 1.5.26 or newer, otherwise
configure will mishandle *.dSYM directories when it runs.
2010-11-11 12:35:12 +01:00
Yang Tse
2b2ac9068e configure: remove temporary autobuilds exercising of xattr function tests 2010-11-11 12:11:19 +01:00
Yang Tse
890425ecd7 configure: use autobuilds to temporarily exercise xattr function tests 2010-11-10 19:05:18 +01:00
Yang Tse
1df1032444 xattr: portability fix 2010-11-10 18:39:44 +01:00
Yang Tse
b1e4dce671 curl-functions: provide xattr function tests that also check number of arguments 2010-11-10 18:26:21 +01:00
Daniel Stenberg
0b20de0194 test1120: verify FTP response 421
curl mustn't try to use the control connection after the 421 is received
2010-11-10 15:36:42 +01:00
Daniel Stenberg
d596a523b9 ftpserver.pl: spellfix comment 2010-11-10 15:36:28 +01:00
Rutger Hofman
592df29f9c TFTP: resend the correct data
I found a bug in tftp_tx() in tftp.c. If a data resend is done after
reception of an ACK/OACK, the call to sendto is wrong.
2010-11-10 15:08:18 +01:00
Stefan Tomanek
f1db21218b write extended attributes by using fsetxattr
Instead of reopening the downloaded file, fsetxattr uses the (already
open) file descriptor to attach extended attributes. This makes the
procedure more robust against errors caused by moved or deleted files.
2010-11-10 10:43:05 +01:00
Dan Fandrich
892cacef43 Check for getinfo errors before setting attributes 2010-11-09 18:51:36 -08:00
Kamil Dudka
12b2412c52 ftp: treat server's response 421 as CURLE_OPERATION_TIMEDOUT
Bug: https://bugzilla.redhat.com/650255
Reported by: Simon H.
2010-11-09 18:13:20 +01:00
Daniel Stenberg
7d8343934b symbols-in-version: add CURL_SOCKET_BAD
I also documented the filtering logic in the symbol-scan.pl function to
clarify why not all CURL_* symbols are included.
2010-11-09 14:20:23 +01:00
Yang Tse
7cebf22d57 serial number bump 2010-11-09 01:40:25 +01:00
Kamil Dudka
c6b97a8278 ftp: close connection as soon as ABOR has been sent
... and do not send ABOR unless really necessary.

Bug: https://bugzilla.redhat.com/649347
Reported by: Simon H.
2010-11-08 20:50:52 +01:00
Daniel Stenberg
f96a2641fc RELEASE-NOTES: synced with fc6c4c10f9
I also recounted and updated the command line and libcurl options.
2010-11-08 11:20:39 +01:00
Daniel Stenberg
fc6c4c10f9 help: indent the --xattr option like the others 2010-11-08 11:20:17 +01:00
Daniel Stenberg
152578fb33 curl.1: --resolve documented 2010-11-08 10:56:03 +01:00
Daniel Stenberg
0a41318f1d CURLOPT_RESOLVE: documented 2010-11-08 09:53:35 +01:00
Daniel Stenberg
4bde456f73 CURLOPT_USE_SSL: move from FTP options to connection options 2010-11-08 09:46:48 +01:00
Daniel Stenberg
689ee8345c xattr-check: correct the comment as well 2010-11-08 09:35:47 +01:00
Daniel Stenberg
5d4355f19b xattr: use const char * for const strings 2010-11-08 09:10:33 +01:00
Daniel Stenberg
710ecb6946 setxattr: fix the checks
My copy and paste job was a little too much copy and I missed to adjust
it properly to sys/xattr.h all over and this is a fix to cure that.
2010-11-08 09:08:26 +01:00
Daniel Stenberg
1b24b89cca CURLOPT_RESOLVE: added
CURLOPT_RESOLVE is a new option that sends along a curl_slist with
name:port:address sets that will populate the DNS cache with entries so
that request can be "fooled" to use another host than what otherwise
would've been used. Previously we've encouraged the use of Host: for
that when dealing with HTTP, but this new feature has the added bonus
that it allows the name from the URL to be used for TLS SNI and server
certificate name checks as well.

This is a first change. Surely more will follow to make it decent.
2010-11-08 08:56:21 +01:00
Yang Tse
dc3e7df1c9 fix compiler warning 2010-11-08 04:03:11 +01:00
Dan Fandrich
1171bc5c8a Added os-specific.c and xattr.c to the Symbian build files 2010-11-07 00:13:46 -07:00
Yang Tse
3adb68c605 xattr: fix VisualStudio builds 2010-11-07 04:05:52 +01:00
Yang Tse
34498c13be fix snapshot generation 2010-11-07 03:39:31 +01:00
Daniel Stenberg
517d3eb0a4 --libcurl: simplify output
Removed the code that was needed for libcurl before 7.19.0 which now is
more than two years old.

Simplified the top comment and corrected the URL.
2010-11-05 22:26:54 +01:00
Alfred Gebert
6a07e704ca LDAP: detect non-binary attributes properly
If the query result has a binary attribute, the binary attribute is
base64 encoded. But all following non binary attributes are also base64
encoded which is wrong.

This is a test (LDAP server is public).

curl
ldap://x500.bund.de:389/o=Bund,c=DE?userCertificate,certificateSerialNumber?sub
?cn=*Woehleke*
2010-11-05 15:53:41 +01:00
Daniel Stenberg
95719fbea6 xattr: add configure check and #ifdefs
setxattr is a glibc call to set extended attributes, so configure now
checks for it and the code is adapted to only build when the
functionality is present.
2010-11-05 14:07:38 +01:00
Stefan Tomanek
fbf51696ef save metadata to extended file attributes
It is often convinient to track back the source of a once downloaded
file; this patch makes curl store the source URL and other metadata
alongside the retrieved file by using the extended attributes (if
supported by the file system and enabled by --xattr).
2010-11-05 13:59:10 +01:00
Daniel Stenberg
1786950759 test: remove test 580
Test 580 is removed again for two reasons:

1) Some compilers aren't satisfied by just a data variable called 'test'
when first.o wants a function called 'test'. The Solaris compiler says
"ld: warning: symbol `test' has differing types:" while the AIX compiler
downright rejects it.

2) Test case 1119 that was added after this test is way more complete
and cover everything test 580 does and more without introducing the same
problems.
2010-11-05 11:26:26 +01:00
Daniel Stenberg
87374a47c9 Revert: use Host: name for SNI and cert name checks
This reverts commit b0fd03f5b8,
4b2fbe1e97, afecd1aa13, 68cde058f6
2010-11-05 10:25:58 +01:00
Daniel Stenberg
368f5a8547 TODO-RELEASE: "TLS SNI use Host:" is done
262 - Manual setting of TLS Server Name Indication - use Host:
2010-11-04 23:09:08 +01:00
Daniel Stenberg
68a485b00a RELEASE-NOTES: synced with 7b823badbc 2010-11-04 22:55:45 +01:00
Daniel Stenberg
7b823badbc curl.1: added a few missing exit codes 2010-11-04 19:39:15 +01:00
Daniel Stenberg
b0fd03f5b8 certcheck: use the custom Host: name for checks
If you use a custom Host: name in a request to a SSL server, libcurl
will now use that given name when it verifies the server certificate to
be correct rather than using the host name used in the actual URL.
2010-11-04 15:18:35 +01:00
Daniel Stenberg
4b2fbe1e97 SNI: simplify the custom host name use
The redirect check is already done at the position where the customhost
field is assigned so there's no point in doing that a second time.
2010-11-04 15:16:27 +01:00
Daniel Stenberg
afecd1aa13 host: get the custom Host: name more genericly
When given a custom host name in a Host: header, we can use it for
several different purposes other than just cookies, so we rename it and
use it for SSL SNI etc.
2010-11-04 14:58:15 +01:00
Hongli Lai (Phusion)
68cde058f6 SNI: set name to custom Host header
OpenSSL SNI host name should be set to the custom Host header, if the
user provided one.
2010-11-04 14:10:56 +01:00
Daniel Stenberg
809a748124 fopen.c: re-indented, fixed previous mistake
I've made the code intended using curl-style now to look more like other
examples.

My previous "fix" was a bit too invasive but is now fixed again.
2010-11-04 11:43:50 +01:00
Daniel Stenberg
542318b113 multi use: call multi_perform even on select() timeouts 2010-11-04 11:37:23 +01:00
Daniel Stenberg
909e711e74 example: add smtp-multi.c
An example application source code sending SMTP mail with the multi
interface. It is based on the code Alona Rossen provided, which in turn
is based on existing example/test code, and I converted it even more
into a decent example with a fair multi API use, put the info required
to edit at the top and I added some comments.
2010-11-04 10:32:38 +01:00
Daniel Stenberg
d95b67f409 CURLOPT_NOSIGNAL: add blurb about SIGPIPE 2010-11-04 09:49:02 +01:00
Dan Fandrich
96945c98d5 Allow building test 580 out of tree 2010-11-03 19:03:02 -07:00
Daniel Stenberg
1db61aca3b dist: add symbol-scan.pl to the tarball 2010-11-03 11:25:06 +01:00
Daniel Stenberg
bbb6eb3aaa test1119: verify symbols-in-versions 2010-11-03 11:23:54 +01:00
Daniel Stenberg
a4765b0551 runtests: allow tests written as perl scripts
If a command is set type="perl", it can now specify a perl program that will
be run instead of an ordinary curl or built tool.

A perl test automatically disables memory and valgrind debugging.
2010-11-03 11:22:46 +01:00
Daniel Stenberg
29de7dd288 symbol-scan: verifies symbols-in-versions
This new script scans for all enums and #defines used by the curl/curl.h
and curl/multi.h headers. Then it reads all symbols mentioned in
symbols-in-vesions and make sure that there's no entries missing in
there. It then proceeds to verify that the entries that
symbols-in-vesions mentions but aren't found in the sources are truly
documented as removed.

This script is used in the new test case 1119
2010-11-03 11:20:19 +01:00
Daniel Stenberg
52e3c60c86 symbols-in-versions: added 119 missing symbols
I've developed a script I call symbol-scan.pl that scans the curl.h and
multi.h header files and compare the symbols it finds in there with the
symbols symbols-in-versions documents and outputs a report on the
differences.  Using this I've dug through the history to fill up
symbols-in-versions with all the symbols my script found mismatches for.

I will commit symbol-scan.pl separatly and think of a way to put it to
use in the build/tests so that we from now on will get this in-sync
check automatically.
2010-11-03 10:07:16 +01:00
Dan Fandrich
282b41c69b Added mk580.pl to the tar ball 2010-11-02 23:17:36 -07:00
Daniel Stenberg
13e9571dd0 symbols-in-versions: added missing symbols 2010-11-02 23:35:12 +01:00
Daniel Stenberg
36420330de ignore: lib580.c is generated by mk580.pl 2010-11-02 23:34:37 +01:00
Daniel Stenberg
cc87913294 test: added test 580 - verifies symbols-in-versions
The new perl script mk580.pl generates a C table in a fresh source file
named lib580.c and if that compiles fine we know that the file
docs/libcurl/symbols-in-versions at least doesn't include any symbols
that are misspelled.

An additional feature would be to somehow scan curl/curl.h and compare
with symbols-in-versions to see if there are symbols missing.
2010-11-02 22:27:33 +01:00
Daniel Stenberg
ca9f9cb875 spellfix: CURLOPT_TFTP_BLKSIZE it is 2010-11-02 22:01:01 +01:00
Kamil Dudka
0c8e5f7e6a ftp: prevent server from hanging on closed data connection
Some FTP servers (e.g. Pure-ftpd) end up hanging if we close the data
connection before transferring all the requested data.  If we send ABOR
in that case, it prevents the server from hanging.

Bug: https://bugzilla.redhat.com/643656
Reported by: Pasi Karkkainen, Patrick Monnerat
2010-10-29 12:01:19 +02:00
Dan Fandrich
59db31902c Removed a leftover mention of FTP in an error message 2010-10-28 15:47:57 -07:00
Dan Fandrich
c36b00a166 Removed the native Makefile.riscos files
These haven't worked in at least 8 years due to missing source
files, and most active RiscOS developers these days apparently
cross-compile anyway.

Signed-off-by: James Bursa <james@zamez.org>
2010-10-21 14:33:35 -07:00
Dan Fandrich
59f07ddf28 Lightened the stack in wc_statemach to permit deeper recursion
Also, added a few hints to help compilers to perform tail call
recursion optimization.
2010-10-20 18:27:56 -07:00
Daniel Stenberg
e214cd4a73 SSH: use libssh2_session_handshake()
In libssh2 1.2.8, libssh2_session_handshake() replaces
libssh2_session_startup() to fix the previous portability problem with
the socket type that was too small for win64 and thus easily could cause
crashes and more.
2010-10-20 23:31:34 +02:00
Daniel Stenberg
5997f54a71 SSH: avoid using the libssh2_ prefix
It is a bad idea to use the public prefix used by another library and
now we realize that libssh2 introduces a symbol in the upcoming version
1.2.8 that conflicts with our static function named libssh2_free.
2010-10-20 23:29:37 +02:00
Daniel Stenberg
e8c442952d formdata: provide error message
When failing to build form post due to an error, the code now does a
proper failf(). Previously libcurl would report an error like "failed
creating formpost data" when a file wasn't possible to open which was
not easy for users to figure out.

I also lower cased a function name to be named more curl-style and
removed some unnecessary code.
2010-10-20 14:57:43 +02:00
Daniel Stenberg
98d9dc7840 URL-parsing: consider ? a divider
The URL parser got a little stricter as it now considers a ? to be a
host name divider so that the slightly sloppier URLs work too. The
problem that made me do this change was the reported problem with an URL
like: www.example.com?email=name@example.com This form of URL is not
really a legal URL (due to the missing slash after the host name) but is
widely accepted by all major browsers and libcurl also already accepted
it, it was just the '@' letter that triggered the problem now.

The side-effect of this change is that now libcurl no longer accepts the
?  letter as part of user-name or password when given in the URL, which
it used to accept (and is tested in test 191). That letter is however
mentioned in RFC3986 to be required to be percent encoded since it is
used as a divider.

Bug: http://curl.haxx.se/bug/view.cgi?id=3090268
2010-10-19 20:20:06 +02:00
Daniel Stenberg
6164d40fce curl_easy_setopt.3: spellfix 2010-10-19 17:50:10 +02:00
Daniel Stenberg
65ca4b547b curl_easy_setopt.3: CURLOPT_USE_SSL is not just for FTP
It is for FTP, SMTP, POP3, IMAP at least.
2010-10-19 17:48:51 +02:00
Daniel Stenberg
d09a905751 krb4.h: removed unused prototypes 2010-10-18 16:20:13 +02:00
Daniel Stenberg
0152dbbe23 krb4: make a few functions static 2010-10-18 10:00:37 +02:00
Daniel Stenberg
2261ddf9db TODO-RELEASE: cleanup for 7.21.3 works
"SFTP resume with 4GB file does not work" is now removed as I'm sure
this is really a libssh2 bug and not a libcurl bug.

7.21.2 is released already
2010-10-17 18:56:30 +02:00
Daniel Stenberg
295496fa34 RELEASE-NOTES: sync with 09a2d93a0f 2010-10-17 18:55:36 +02:00
Daniel Stenberg
09a2d93a0f http_chunks: remove debug output
Accidentally left in there during my previous debugging of this
2010-10-17 18:50:38 +02:00
Daniel Stenberg
b0ccd24a72 Curl_setopt: disallow CURLOPT_USE_SSL without SSL support
In order to avoid for example the pingpong protocols to issue STARTTLS
(or equivalent) even though there's no SSL support built-in.

Reported by: Sune Ahlgren
Bug: http://curl.haxx.se/mail/archive-2010-10/0045.html
2010-10-14 22:33:20 +02:00
Daniel Stenberg
11e131c9f9 options: check for features for some options
Some options, such as the automatic decompression and some SSL related
ones now will bail out if the underlying libcurl doesn't have support
for the particular feature needed.
2010-10-14 22:18:55 +02:00
Dan Fandrich
4b0c411ce6 Fixed the IPv6 host address in test1203
Reported by: Christian Weisgerber
Bug: http://curl.haxx.se/bug/view.cgi?id=3087479
2010-10-14 12:45:01 -07:00
Daniel Stenberg
0f2e35b305 curl_easy_setopt.3: clarify CURLOPT_CRLF
The option takes a parameter that should be 1 or 0 to enable or disable
the feature.

URL: http://curl.haxx.se/bug/view.cgi?id=3086428
2010-10-14 14:09:00 +02:00
Guenter Knauf
0cb3d7913c Some more small Watcom makefile fixes. 2010-10-14 01:22:40 +02:00
Guenter Knauf
7e46061cac Added --noconfigure switch to testcurl.pl. 2010-10-14 00:57:36 +02:00
Guenter Knauf
7b79c8bf96 Modified Watcom makefiles to work on Linux too. 2010-10-13 17:29:47 +02:00
Guenter Knauf
04ae23afff Added MingW32 rtmp target; changed Watcom targets.
Modified Watcom targets to avoid backslashs so that they can
work on Linux too.
2010-10-13 16:38:24 +02:00
Daniel Stenberg
987168d6b9 gitignore: ignore Makefile.vc10.dist made by maketgz 2010-10-13 00:26:19 +02:00
Daniel Stenberg
ea07fde40b curlver.h: start over at 7.21.3 2010-10-13 00:21:39 +02:00
Daniel Stenberg
e3df610ada RELEASE-NOTES: start over towards 7.21.3 2010-10-13 00:21:00 +02:00
Daniel Stenberg
72d9c96ad5 THANKS: added contributors from 7.21.2 2010-10-13 00:20:37 +02:00
Daniel Stenberg
d371458348 RELEASE-NOTES: synced with ecd624b8e7 2010-10-12 23:30:35 +02:00
Julien Chaffraix
ecd624b8e7 CMake: Build fix.
Do not match the trailing '\n' in the regular expression as this would
make us dump a ) parenthesis on a new line.

This fixes the following error:

would get transformed into:

)

Bug: http://curl.haxx.se/mail/lib-2010-10/0065.html
Reported by: Dimitre Dimitrov
2010-10-12 23:25:51 +02:00
Daniel Stenberg
81f151c912 header_callback: strip off file path separated with backslashes
If the filename contains a backslash, only use filename portion. The
idea is that even systems that don't handle backslashes as path
separators probably want that path removed for convenience.

This flaw is considered a security problem, see the curl security
vulnerability http://curl.haxx.se/docs/adv_20101013.html
2010-10-12 22:56:21 +02:00
Dan Fandrich
b804906414 Get the curl source files for Amiga from Makefile.inc
This is similar to how it's done in the lib directory.
The Amiga build appears to have been broken for a year because
of a missing homedir.c
2010-10-12 12:13:32 -07:00
Dan Fandrich
2869b6ea2b Added section on server-supplied names to security considerations 2010-10-12 11:22:18 -07:00
Guenter Knauf
2d3c7b7e01 Fixed Watcom makefile. 2010-10-12 15:31:41 +02:00
Guenter Knauf
edf9566c3b Added build bits for librtmp / libssh2 to Watcom makefiles. 2010-10-12 06:55:01 +02:00
Guenter Knauf
331531f70e Added build bits for librtmp to NetWare makefiles. 2010-10-12 04:31:56 +02:00
Daniel Stenberg
51b8d30dc4 SFTP: more ignoring negative file sizes
As the change in 5f0ae7a062 added a precaution against negative
file sizes that for some reason managed to get returned, this change now
introduces the same check at the second place in the code where the file
size from the libssh2 stat call is used.

This check might not be suitable for a 32 bit curl_off_t, but libssh2.h
assumes long long to work and to be 64 bit so I believe such a small
curl_off_t will be very unlikely to occur in the wild.
2010-10-12 00:01:40 +02:00
Daniel Stenberg
450c994a49 SMTP: debug output for no known auth mechanisms supported
... and some minor source code whitespace edits
2010-10-11 21:31:12 +02:00
Daniel Stenberg
6a43ffa0d5 test: urlglob error messages have no extra newline anymore 2010-10-11 14:32:37 +02:00
Guenter Knauf
6a90aa3f3d Added build bits for librtmp to MingW32 makefiles. 2010-10-11 00:39:24 +02:00
Daniel Stenberg
1998de9993 RELEASE-NOTES: synced with 61f4cdb73a 2010-10-08 23:20:26 +02:00
Daniel Stenberg
61f4cdb73a globbing: fix crash on unballanced open brace
Having an open brace without a closing brace caused a segfault.

Having a closing brace too many caused a silent error to occur, which
caused curl to bail out and return an error code but no error message
was shown. It does now!

All error message outputs no longer wrongly get _two_ newlines written
after the error message.

Reported by: Vlad Ureche
Bug: http://curl.haxx.se/bug/view.cgi?id=3083942
2010-10-08 23:12:34 +02:00
Dan Locks
cda02fb78b libcurl.m4: AC_PATH_PROG fixes
The invocation of autoconf's AC_PATH_PROG( ) is not quite right for
finding curl-config. This fix corrects the negative case (where
curl-config is not found).
2010-10-07 18:05:36 +02:00
Daniel Stenberg
a5f96b49d1 FAQ: added "How do I submit my patch?" 2010-10-06 20:03:13 +02:00
Daniel Stenberg
18e7b52e8e examples: use example.com in example URLs 2010-10-05 15:00:19 +02:00
Daniel Stenberg
6d272e53a2 TODO-RELEASE: libidn problem not repeatable
"261 - configure and libidn" is removed from the list since Julien
Chaffraix tried to repeat it but failed and the reporter did not return
to provide further details.

Reported by: Lyndon Hill
Bug: http://curl.haxx.se/mail/lib-2010-07/0029.html
2010-10-04 11:53:33 +02:00
Daniel Stenberg
9bce615f46 libcurl.m4: mention argument is PREFIX
The macro provides a --with-libcurl option that expects a PREFIX to be
specified and not actually a "directory" in which libcurl will be found.
This now spells that out more clearly.

Reported by: Dan Locks
Bug: http://curl.haxx.se/bug/view.cgi?id=3079891
2010-10-04 11:50:43 +02:00
Guenter Knauf
81e107010e Some NetWare makefile tweaks.
Renamed SDK_* to NDK_*; made NDK_* defines overwriteable from
environment; removed now obsolete YACC macro;
moved some curl_config.h defines to IPv6 section since they
are only needed when IPv6 is enabled - this makes libcurl compile
with older NDKs too which were not IPv6-aware.
2010-10-03 23:02:41 +02:00
Daniel Stenberg
70e8814e44 TODO-RELEASE: 416 error fixed
"3076808 Requests fail silently following a 416 error" done
2010-10-02 22:38:10 +02:00
Julien Chaffraix
fc137ee272 krb5-gssapi: Removed a memory leak in krb5_auth.
We forgot to release the buffer passed to gss_init_sec_context.

The previous logic was difficult to read as we were reusing the same
variable (gssbuf) for both input buffer and output buffer. Splitted the
logic in 2 variables to better underline who needs to be released.
Also made the code break at 80 lines.
2010-10-02 10:00:42 -07:00
Julien Chaffraix
79cd7ef9ab krb5-gssapi: Made the function always return a value.
kr5_auth missed a final 'return' statement. This is not an error in
gcc but can lead to potential bugs.
2010-10-02 10:00:42 -07:00
Julien Chaffraix
4b69f641a6 krb5-gssapi: Delete the GSS-API context.
This fixes a memory leak related to the GSS-API code.

Added a krb5_init and krb5_end functions. Also removed a work-around
the lack of proper initialization of the GSS-API context.
2010-10-02 10:00:42 -07:00
Daniel Stenberg
2ae6c47d5d HTTP: remove special case for 416
It was pointed out that the special case libcurl did for 416 was
incorrect and wrong. 416 is not really different to other errors so the
response body must be handled like for other errors/http responses.

Reported by: Chris Smowton
Bug: http://curl.haxx.se/bug/view.cgi?id=3076808
2010-10-02 00:22:48 +02:00
Dan Fandrich
15622e69a9 sws: Added writedelay HTTP server command
This delays between write operations, hopefully making it easier
to spot problems where libcurl doesn't flush the socket properly
before waiting for the next response.
2010-10-02 00:21:59 +02:00
Daniel Stenberg
8500586251 TODO-RELEASE: no bug in ftp_nextconnect
The issue named "266 - Bug in ftp_nextconnect?" was deemed to not be a
bug and instead resulted in clarified docs.
2010-10-01 22:47:45 +02:00
Daniel Stenberg
3aef3ed8f6 curl_easy_setopt.3: CURLOPT_DIRLISTONLY implies dir list
Make it explicit that setting CURLOPT_DIRLISTONLY to 1 will make libcurl
to list the directory.
2010-10-01 19:52:53 +02:00
Daniel Stenberg
488f9545a2 RELEASE-NOTES: synced up to 588402585b 2010-10-01 00:03:17 +02:00
Daniel Stenberg
588402585b TODO-RELEASE: move new features to next release 2010-09-30 23:58:01 +02:00
Daniel Stenberg
750c9179ca README.ares: we know require c-ares 1.6.0 2010-09-30 23:14:58 +02:00
Daniel Stenberg
5f0ae7a062 SFTP: avoid downloading negative sizes!
It is still not clarified exactly why this happens, but libssh2
sometimes report a negative file size for the remote SFTP file and that
deeply confuses libcurl (or crashes it) so this precaution is added to
avoid badness.

Reported by: Ernest Beinrohr
Bug: http://curl.haxx.se/bug/view.cgi?id=3076430
2010-09-30 23:08:37 +02:00
Daniel Stenberg
8fa519dce4 TODO-RELEASE: drop curl_easy_setoptv
I haven't read any really convincing arguments for adding it
2010-09-30 23:07:20 +02:00
Dirk Manske
5fb4279ec7 multi & hiper examples: updates and cleanups
all multi and hiper examples:

* don't loop curl_multi_perform calls, that was <7.20.0 style, currently
  the exported multi functions will not return CURLM_CALL_MULTI_PERFORM

all hiper examples:
* renamed check_run_count to check_multi_info
* don't  compare current running handle count with previous value, this
  was the wrong way to check for finished requests, simply call
  curl_multi_info_read
* it's also safe to call curl_multi_remove_handle inside the
  curl_multi_info_read loop.

ghiper.c:
* replaced curl_multi_socket (that function is marked as obsolete) calls
  with curl_multi_socket_action calls (as in hiperfifo.c and
  evhiperfifo.c)

ghiper.c and evhiperfifo.c:
* be smart as hiperfifo.c, don't do uncessary curl_multi_* calls in
  new_conn and main
2010-09-30 22:20:52 +02:00
Daniel Stenberg
67c83eb9eb TODO-RELEASE: one fixed, one postponed, one added
As we're already in feature freeze, I pushed the feature onwards.
2010-09-29 23:19:31 +02:00
Dan Fandrich
9e1083488f Renamed test1204 to test1117 to move it into the normal range 2010-09-29 13:02:37 -07:00
Patrick Monnerat
dfaaa99ded Add gopher protocol definition to ILE/RPG binding.
OS400 compile script in test dir updated for chkhostname.
2010-09-29 16:56:57 +02:00
Julien Chaffraix
87badbef84 krb5-gssapi: Remove several memory leaks.
Remove a leak seen on Kerberos/MIT (gss_OID is copied internally and
we were leaking it). Now we just pass NULL as advised in RFC2744.

|tmp| was never set back to buf->data.

Cleaned up Curl_sec_end to take into account failure in Curl_sec_login
(where conn->mech would be NULL but not conn->app_data or
conn->in_buffer->data).
2010-09-28 22:05:24 -07:00
Julien Chaffraix
e3811ed7c3 security.c: Remove Curl_sec_fflush_fd.
The current implementation would make us send wrong data on a closed
socket. We don't buffer our data so the method can be safely removed.
2010-09-28 22:05:24 -07:00
Julien Chaffraix
dacc44ddc2 security.c: We should always register the socket handler.
Following a change in the way socket handler are registered, the custom
recv and send method were conditionaly registered.
We need to register them everytime to handle the ftp security
extensions.

Re-added the clear text handling in sec_recv.
2010-09-28 22:05:24 -07:00
Julien Chaffraix
fc9f369829 security.c: Fix Curl_sec_login after rewrite.
Curl_sec_login was returning the opposite result that the code in ftp.c
was expecting. Simplified the return code (using a CURLcode) so to see
more clearly what is going on.
2010-09-28 22:05:24 -07:00
Julien Chaffraix
bfbc4c7e00 security.c: Readd the '\n' to the infof() calls.
They are not automatically added and make the output of the verbose
mode a lot more readable.
2010-09-28 22:05:24 -07:00
Julien Chaffraix
05b72a6af2 security.c: Fix typo (PSBZ -> PBSZ) 2010-09-28 22:05:24 -07:00
Julien Chaffraix
1e2056fecb security.c: Fix ftp_send_command.
My use of va_args was completely wrong. Fixed the usage so that
we send the right commands!
2010-09-28 22:05:24 -07:00
Daniel Stenberg
5df13c3173 curl_easy_escape: don't escape "unreserved" characters
According to RFC3986 section 2.3 the letters -, ., _ and ~ should not be
percent-encoded.

Reported by: Miguel Diaz
Bug: http://curl.haxx.se/mail/lib-2010-09/0227.html
2010-09-28 23:49:32 +02:00
Daniel Stenberg
ed4eecc05e multi: don't expire timeouts at disonnect or done
The functions Curl_disconnect() and Curl_done() are both used within the
scope of a single request so they cannot be allowed to use
Curl_expire(... 0) to kill all timeouts as there are some timeouts that
are set before a request that are supposed to remain until the request
is done.

The timeouts are now instead cleared at curl_easy_cleanup() and when the
multi state machine changes a handle to the complete state.
2010-09-28 23:49:32 +02:00
Dan Fandrich
7e1a45e224 Changed the TPF make file to get source files from Makefile.inc
Patch was fixed and validated by David McCreedy.
2010-09-27 17:47:20 -07:00
Dan Fandrich
e329586489 Added test case 1204 to test HTTP range failure
This is an attempt to reproduce bug #3076808
2010-09-27 16:44:12 -07:00
Dirk Manske
397e61128f multi_runsingle: set timeout error messages
With the latest changes to fix the timeout handling with multi interface
we lost the timeout error messages. This patch brings them back.
2010-09-27 21:12:49 +02:00
Daniel Stenberg
578e833d3b TODO-RELEASE: updated list of issues to work on 2010-09-27 18:25:33 +02:00
Daniel Stenberg
4d58f97f60 parsedate: allow time specified without seconds
The date format in RFC822 allows that the seconds part of HH:MM:SS is
left out, but this function didn't allow it. This change also includes a
modified test case that makes sure that this now works.

Reported by: Matt Ford
Bug: http://curl.haxx.se/bug/view.cgi?id=3076529
2010-09-27 16:54:02 +02:00
Daniel Stenberg
33c3bb057b TFTP: re-indented the source code
Just made sure that the good old curl indentation style is used all over
this file.
2010-09-26 23:38:00 +02:00
Tim Newsome
6bf2014745 TFTP: Work around tftpd-hpa upload bug
tftpd-hpa has a bug where it will send an incorrect ack when the block
counter wraps and tftp options have been sent. Work around that by
accepting an ack for 65535 when we're expecting one for 0.
2010-09-26 23:30:56 +02:00
Daniel Stenberg
a10f5b34ff Revert "security.c: buffer_read various fixes."
This reverts commit fbb38de415.
2010-09-24 00:20:02 +02:00
Daniel Stenberg
b1df37c60e security.c: removed superfluous parentheses
And also removed the FIXME where memory was zeroed just before freed,
and some other minor whitespace changes.
2010-09-22 23:41:28 +02:00
Julien Chaffraix
31d59fb2cc security.c: Update the #include statements after the rewrite. 2010-09-22 23:34:36 +02:00
Julien Chaffraix
562d40e671 security.c: sec_write tweaks
- |fd| is now a curl_socket_t and |len| a size_t to avoid conversions.
- Added 2 FIXMEs about the 2 unsigned -> signed conversions.
- Included 2 minor changes to Curl_sec_end.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
612832e4c0 security.c: _sec_send tweaks
- Renamed the method to sec_send now that we
  renamed sec_send to do_sec_send.
- Some more variable renaming.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
3c69a08e3b security.c: sec_read tweaks
- Renamed the function to sec_recv.
- Renamed the parameters and variable to match the rest of the code.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
5ea9e78bd7 security.c: Curl_sec_fflush_fd tweaks
- Use an early return as it makes the code more readable.
- Added a FIXME about a conversion.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
69d7c48072 security.c: sec_send tweaks
- Renamed it to do_sec_send as it is the function doing the actual
  transfer.
- Do not return any values as no one was checking it and it never
  reported a failure (added a FIXME about checking for errors).
- Renamed the variables to make their use more specific.
- Removed some casts (int -> curl_socket_t, ...)
- Avoid doing the htnl <-> nthl twice by caching the 2 results.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
7d4f8c2809 security.c: Curl_sec_read_msg tweaks
- Renamed the variables name to better match their intend.
- Unified the |decoded_len| checks.
- Added some FIXMEs to flag some improvement that did not go in this
  change.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
d23c59ecfc security.c: Curl_sec_set_protection_level tweaking
- Removed sec_prot_internal as it is now inlined in the function (this removed
  a redundant check).
- Changed the prototype to return an error code.
- Updated the method to use the new ftp_send_command function.
- Added a level_to_char helper method to avoid relying on the compiler's
  bound checks. This default to the maximum security we have in case of a
  wrong input.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
1d95a48fe9 security.c: factored the logic from Curl_sec_login into a dedicated method that better reflect its intent.
Introduced a helper method ftp_send_command that synchronously send
an FTP query.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
512a82d395 security.c: Remove out_buffer as it was never written into. 2010-09-22 23:34:36 +02:00
Julien Chaffraix
fbb38de415 security.c: buffer_read various fixes.
Tighten the type of the |data| parameter to avoid a cast. Also made
it const as we should not modify it.

Added a DEBUGASSERT on the size to be written while changing it.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
0006cdddee security.c: Made block_write return a CURLcode.
While doing so, renamed it to socket_write to better match its
function.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
b684ccd8b1 security.c: Made block_read and sec_get_data return CURLcode.
To do so, made block_read call Curl_read_plain instead of read.

While changing them renamed block_read to socket_read and sec_get_data
to read_data to better match their function.

Also fixed a potential memory leak in block_read.
2010-09-22 23:34:36 +02:00
Julien Chaffraix
3f64d05d34 Security.c: Fix headers guard to match the rest of the code. 2010-09-22 23:34:35 +02:00
Julien Chaffraix
e4128f90ba configure: Fix the LDAPS disable message
... for example when LDAP is not compiled.

Fixed the logic to match the rest of the options' message that is we
update the default message only if the option is not disabled after the
different checks.

Reported by: Guenter Knauf
2010-09-22 23:14:55 +02:00
Daniel Stenberg
e991a3536d RELEASE-NOTES: sync with 8665d4e5 and c-ares >= 1.6.0 note 2010-09-21 22:29:21 +02:00
Daniel Stenberg
8665d4e593 parse_remote_port: ignore colons without port number
Obviously, browsers ignore a colon without a following port number. Both
Firefox and Chrome just removes the colon for such URLs. This change
does not remove the colon for URLs sent over a HTTP proxy, so we should
consider doing that change as well.

Reported by: github user 'kreshano'
2010-09-21 19:51:30 +02:00
Daniel Stenberg
0e36bb71f2 RELEASE-NOTES: in sync with 19f45eaa79 2010-09-21 16:53:30 +02:00
Daniel Stenberg
19f45eaa79 duphandle: use ares_dup()
curl_easy_duphandle() was not properly duping the ares channel. The
ares_dup() function was introduced in c-ares 1.6.0 so by starting to use
this function we also raise the bar and require c-ares >= 1.6.0
(released Dec 9, 2008) for such builds.

Reported by: Ning Dong
Bug: http://curl.haxx.se/mail/lib-2010-08/0318.html
2010-09-21 16:41:14 +02:00
Hendrik Visage
70a025f3df MacOSX-Framework: updates for Snowleopard
1) PPC64 appears to be an 10.5 only supported architecture, so I
forced 10.5 for 64bit if there is a need for PPC64, else 64bit only
does x86_64

2) proper "make clean" after every ./configure. fixes a bug where
subsequent runs the 32bit do not get compiled

3) Added a version numbering curl-$VERSION} rather than the "stock standard" A
2010-09-21 00:07:45 +02:00
Daniel Stenberg
95e230c591 RELEASE-NOTES: synced with 5fcc4332d6
Removed the duplicate entry of Kamil in the credits.
2010-09-21 00:02:10 +02:00
Daniel Stenberg
5fcc4332d6 configure: don't enable RTMP if the lib detect fails
librtmp is often statically linked and using sub dependencies like
OpenSSL, so we need to make sure we can actually link with it properly
before enabling it. Otherwise we easily end up trying to link with a
RTMP lib that fails.
2010-09-20 23:56:51 +02:00
Daniel Stenberg
7d84113e1d TODO: added 8.4 non-gcrypt under GnuTLS
We must not assume gcrypt just because of GnuTLS
2010-09-20 23:19:51 +02:00
Daniel Stenberg
f3df524b62 configure: check for gcrypt if using GnuTLS
1 - libcurl assumes that there are gcrypt functions available when
GnuTLS is.

2 - GnuTLS can be built to use libnettle instead as crypto library,
which breaks assumption (1)

This change makes configure make sure that if GnuTLS is requested and
detected, it also makes sure that gcrypt is present or it errors
out. This is mostly a way to make the user more aware of this flaw, the
correct fix would be to detect which crypto layer that is in use and
adapt our code to use that instead of blindly assuming gcrypt.

Reported by: Michal Gorny
Bug: http://curl.haxx.se/bug/view.cgi?id=3071038
2010-09-20 23:19:07 +02:00
Daniel Stenberg
c47148f142 RELEASE-NOTES: sync from d2a7fd2fe6 to HEAD 2010-09-18 23:16:07 +02:00
Daniel Stenberg
8a00c94b0f FTP: fix bad check of Curl_timeleft() return code
When it returns 0 it means no timeout. Only a negative value means that
we're out of time.
2010-09-18 23:08:32 +02:00
Daniel Stenberg
9de4b26643 LDAP: moved variable declaration to avoid compiler warn
If built without HTTP or proxy support it would cause a compiler warning
due to the unused variable. I moved the declaration of it into the only
scope it is used.
2010-09-18 22:50:04 +02:00
Tor Arntsen
3208757c1a LDAP: Use FALSE instead of bool_false when setting bits.close
bool_false is the internal name used in the setup_once.h definition
we fall back to for non-C99 non-stdbool systems, it's not the actual
name to use in assignments (we use bool_false, bool_true there to
avoid global namespace problems, see comment in setup_once.h).
The correct C99 value to use is 'false', but let's use FALSE as
used elsewhere when assigning to bits.close. FALSE is set equal
to 'false' in setup_once.h when possible.

This fixes a build problem on C99 targets.
2010-09-18 14:27:08 +02:00
Tor Arntsen
fae19aed8d LDAP: Add missing declaration for 'result' 2010-09-18 14:23:34 +02:00
Mauro Iorio
c59dba338e LDAP: Support for tunnelling queries through HTTP proxy
As of curl-7.21.1 tunnelling ldap queries through HTTP Proxies is not
supported. Actually if --proxytunnel command-line option (or equivalent
CURLOPT_HTTPPROXYTUNNEL) is used for ldap queries like
ldap://ldap.my.server.com/... You are unable to successfully execute the
query. In facts ldap_*_bind is executed directly against the ldap server
and proxy is totally ignored. This is true for both openLDAP and
Microsoft LDAP API.

Step to reproduce the error:
Just launch "curl --proxytunnel --proxy 192.168.1.1:8080
ldap://ldap.my.server.com/dc=... "

This fix adds an invocation to Curl_proxyCONNECT against the provided
proxy address and on successful "CONNECT" it tunnels ldap query to the
final ldap server through the HTTP proxy. As far as I know Microsoft
LDAP APIs don't permit tunnelling in any way so the patch provided is
for OpenLDAP only.  The patch has been developed against OpenLDAP 2.4.23
and has been tested with Microsoft ISA Server 2006 and works properly
with basic, digest and NTLM authentication.
2010-09-18 00:03:23 +02:00
Daniel Stenberg
a76f852ca4 timeout: use the correct start value as offset
Rodric provide an awesome recipe that proved libcurl didn't timeout at
the requested time - it instead often timed out at [connect time] +
[timeout time] instead of the documented and intended [timeout time]
only. This bug was due to the code using the wrong base offset when
comparing against "now". I could also take the oppurtinity to simplify
the code by properly using of the generic help function for this:
Curl_timeleft.

Reported by: Rodric Glaser
Bug: http://curl.haxx.se/bug/view.cgi?id=3061535
2010-09-17 23:02:33 +02:00
Daniel Stenberg
3880dd3741 Curl_timeleft: avoid returning "no timeout" by mistake
As this function uses return code 0 to mean that there is no timeout, it
needs to check that it doesn't return a time left value that is exactly
zero. It could lead to libcurl doing an extra 1000 ms select() call and
thus not timing out as accurately as it should.

I fell over this bug when working on the bug 3061535 but this fix does
not correct that problem alone, although this is a problem that needs to
be fixed.

Reported by: Rodric Glaser
Bug: http://curl.haxx.se/bug/view.cgi?id=3061535
2010-09-17 22:58:08 +02:00
Daniel Stenberg
d8041a7ea5 whitespace: unified source
if ( => if(
while ( => while(

and some other changes in the similar spirit, trying to make the
whole file use the same style
2010-09-16 23:32:24 +02:00
Daniel Stenberg
abde4c9d84 remote-header-name: don't output filename when NULL 2010-09-16 23:27:03 +02:00
James Bursa
6d88d58dd5 TheArtOfHttpScripting: use long options 2010-09-15 16:43:48 +02:00
James Bursa
fbefd816e4 getinmemory: make the example easier to follow
1. Remove the comment warning that it's "not been verified to work". It
   works with no problems in my testing.

2. Remove 2 unnecessary includes.

3. Remove the myrealloc(). Initialize chunk.memory with malloc() instead
   of NULL. The comments for these two parts contradicted each other.

4. Handle out of memory from realloc() instead of continuing.

5. Print a brief status message at the end.
2010-09-14 22:52:04 +02:00
Daniel Stenberg
296b246b9c multi: don't do extra expire calls for the connection
The timeout is set for the connect phase already at the start of the
request so we should not add a new one, and we MUST not set expire to 0
as that will remove any other potentially existing timeouts.
2010-09-14 22:40:05 +02:00
Peter Pentchev
5393f08df8 Fix a bashism: test a = b is more portable than ==. 2010-09-12 23:11:47 +02:00
Daniel Stenberg
b5da54e6c9 glob_word: remove a check that is always false 2010-09-12 16:37:55 +02:00
Daniel Stenberg
22085f7d6e inflate_stream: remove redundant check that is always true 2010-09-12 16:34:16 +02:00
Daniel Stenberg
2c1b4e74e4 digest: make it clear the condition is always true 2010-09-12 16:29:05 +02:00
Daniel Stenberg
aca67e2775 ssluse: removed redundant check that is always true 2010-09-12 16:29:04 +02:00
Dan Fandrich
8e2f16e66f Link curl and the test apps with -lrt explicitly when necessary
When curl calls a function from that library then it needs to
explicitly link to the library instead of piggybacking on
libcurl's own dependency.  Without this, GNU ld with the
--no-add-needed flag fails when linking (which Fedora now does
by default).

Reported by: Quanah Gibson-Mount
Bug: http://curl.haxx.se/mail/lib-2010-09/0085.html
2010-09-11 17:08:23 -07:00
Dan Fandrich
a7f6747019 Mention the Debian Popularity Contest 2010-09-09 12:38:15 -07:00
Tor Arntsen
c3c4626fab test565: Don't hardcode IP:PORT
Use %HOSTIP:%HTTPPORT instead of 127.0.0.1:8990 so that
verification works if the baseport change option is used
when executing runtests.pl.
2010-09-09 12:42:28 +02:00
Daniel Stenberg
9808480860 curl.1: updated protocols and polished language 2010-09-09 00:04:55 +02:00
Daniel Stenberg
6ce76e6996 FAQ: CURL_STATICLIB for visual studio users
Clarified as it isn't used with a -D option for them.

Reported by: Artfunkel
Bug: http://curl.haxx.se/bug/view.cgi?id=3060381
2010-09-08 23:23:19 +02:00
Daniel Stenberg
64f12a3b9f FAQ: updated and added host with custom IP question
Added "3.19 How do I get HTTP from a host using a specific IP address?"
and updated some stuff about certs etc.
2010-09-07 19:06:10 +02:00
Daniel Stenberg
18a758d907 chunky parser: only rewind if needed
The code reading chunked encoding attempts to rewind the code if it had
read more data than the chunky parser consumes. The rewinding can fail
and it will then cause an error. This change now makes the rewinding
only happen if pipelining is in use - as that's the only time it really
needs to be done.

Bug: http://curl.haxx.se/mail/lib-2010-08/0297.html
Reported by: Ron Parker
2010-09-07 18:29:03 +02:00
Kamil Dudka
7aea2d522d rtsp: avoid SIGSEGV on malformed header 2010-09-06 16:03:37 +02:00
Kamil Dudka
f3e3f5f1b2 rtsp: avoid SIGSEGV on malformed header 2010-09-06 15:31:01 +02:00
Daniel Stenberg
62ef465262 warning: fix conversion to 'int' from 'size_t' 2010-09-06 00:18:58 +02:00
Daniel Stenberg
c6fa1952a1 portabilty: use proper variable type to hold sockets
Curl_getconnectinfo() is changed to return a proper curl_socket_t for
the last socket so that it'll work more portably (and cause less
compiler warnings).
2010-09-06 00:02:54 +02:00
Guenter Knauf
d47bd396ce Trial to fix another compiler warning with braces. 2010-09-03 20:35:34 +02:00
Dan Fandrich
6882ae8dee Use checkprefix() to compare protocol-specific strings
Otherwise, there could be problems running in certain locales.
2010-09-02 21:12:14 -07:00
Guenter Knauf
a00297158e Moved S_ISREG define to setup as suggested by Dan. 2010-09-02 04:37:13 +02:00
Guenter Knauf
413cbdce3c Use own typedef as workaround for broken sspi.h header (f.e. Watcom). 2010-09-02 00:38:16 +02:00
Guenter Knauf
864d5add0d Added some hacks in order to build with VC from git.
Adam Light posted this patch to the list which enables builds from
git with VC versions other than vc6; also he added a vc10 target.
2010-09-02 00:22:41 +02:00
Guenter Knauf
3238ef5b69 Added S_ISREG define for Win32. 2010-09-02 00:07:05 +02:00
Daniel Stenberg
ca10e28f06 multi: fixes for timing out handles
Add a timeout check for handles in the state machine so that they will
timeout in all states disregarding what actions that may or may not
happen.

Fixed a bug in socket_action introduced recently when looping over timed
out handles: it wouldn't assign the 'data' variable and thus it wouldn't
properly take care of handles.

In the update_timer function, the code now checks if the timeout has
been removed and then it tells the application. Previously it would
always let the remaining timeout(s) just linger to expire later on.
2010-09-01 16:52:23 +02:00
Daniel Stenberg
5e92015711 threaded resolver: no more expire 0 calls
Curl_expire() set to 0 expires ALL timeouts so it should only be called
if we truly and really want to remove all timeouts for the handle.
2010-09-01 16:47:42 +02:00
Daniel Stenberg
ce00c2ef5d resolve_server: simplify code
Make use of the helper function Curl_timeleft() instead of duplicating
code.
2010-09-01 16:04:39 +02:00
Daniel Stenberg
0db9140747 multi: make sure the next timeout is used when one expires
Each easy handle has a list of timeouts, so as soon as the main timeout
for a handle expires, we must make sure to get the next entry from the
list and re-add the handle to the splay tree.

This was attempted previously but was done poorly in my commit
232ad6549a.
2010-08-31 00:10:44 +02:00
Dan Fandrich
55c266de6d Added proxy keyword to allow skipping test in proxyless configs 2010-08-30 15:07:21 -07:00
Daniel Stenberg
3af696f7c4 multi: set timeouts when transfer begins
When a new transfer is about to start we now set the proper timeouts to
expire for the multi interface if they are set for the handle. This is a
follow-up bugfix to make sure that easy handles timeout properly when
the times expire and the multi interface is used. This also improves
curl_multi_timeout().
2010-08-29 00:16:34 +02:00
Daniel Stenberg
09cee1633b CURLOPT_DIRLISTONLY: don't use with CURLOPT_WILDCARDMATCH 2010-08-28 23:07:21 +02:00
Daniel Stenberg
8d121b6f8f FAQ: update list of supported protocols 2010-08-28 22:51:22 +02:00
Fabian Keil
892d6930e7 In the m4 detection line, factor out the 2>dev/null 2010-08-28 22:51:22 +02:00
Fabian Keil
200e9b5dd1 If m4 doesn't support --version, try if gm4 does. 2010-08-28 22:51:22 +02:00
Fabian Keil
b0873cb657 If the m4 version isn't recognized at all, just say so
'm4 version  found. You need a GNU m4 installed!' is a bit confusing.
2010-08-28 22:51:22 +02:00
Daniel Stenberg
19d2bf4ee4 HISTORY: mention the gopher story 2010-08-28 22:51:22 +02:00
Dan Fandrich
ae467115bb Tweaked some test data files
Fixed some issues that caused xmllint failures, added features
and keywords, fixed some quotes and removed some <strip> sections
that unnecessarily limited test checking.
2010-08-25 16:43:26 -07:00
Dan Fandrich
f43ecac175 Added new source files to Symbian and TPF makefiles 2010-08-25 11:48:57 -07:00
Daniel Stenberg
d2a7fd2fe6 RELEASE-NOTES: sync from b980c9a02 to HEAD 2010-08-25 17:17:12 +02:00
Daniel Stenberg
29439acfeb Makefile: add gopher.c file to build
As the VC and RISCOS makefiles don't use the .inc file
2010-08-25 15:56:35 +02:00
Daniel Stenberg
a049528e94 runtests: fix uninitialized variable warning 2010-08-25 15:10:40 +02:00
Daniel Stenberg
2fbbddbe85 gopher tests: revert parts of gopher in the pingpong server
Introduced in the initial gopher commits, there was added logic to do
GOPHER test serving in the pingpong server but as it resembles HTTP much
more than FTP or SMTP, the gopher testing has been moved over to instead
use the sws (HTTP) server. This change simply removes unused code.
2010-08-25 14:22:43 +02:00
Daniel Stenberg
ecb3fe63d7 gopher tests: use sws and adjusted to more standard style 2010-08-25 14:21:25 +02:00
Daniel Stenberg
6ed72fd7fa sws: added basic gopher support 2010-08-25 14:21:25 +02:00
Daniel Stenberg
40e1623649 gopher: enable the header callback/verbosity 2010-08-25 14:21:25 +02:00
Daniel Stenberg
53151db167 gopher: fix test case line endings
Patches over email very easily lose CRLF line endings in files otherwise
LF-only so I had to put them back where needed.
2010-08-25 14:21:25 +02:00
Daniel Stenberg
cb64c987a0 gopher: fix memory leak and busyloop
The fix for the busyloop really only is a temporary work-around.  It
causes a BLOCKING behavior which is a NO-NO. This function should rather
be split up in a do and a doing piece where the pieces that aren't
possible to send now will be sent in the doing function repeatedly until
the entire request is sent.
2010-08-25 14:21:25 +02:00
Cameron Kaiser
67d1616018 Gopher using Curl_write; test suite (4 tests) 2010-08-25 14:21:25 +02:00
Cameron Kaiser
65629f2915 Remove url.c test 2010-08-25 14:19:58 +02:00
Cameron Kaiser
795107453d Forgot gopher.h in Makefile.inc 2010-08-25 14:19:58 +02:00
Cameron Kaiser
201637d468 Gopher protocol support (initial release) 2010-08-25 14:19:58 +02:00
Daniel Stenberg
6b6a3bcb61 http: handle trailer headers in all chunked responses
HTTP allows that a server sends trailing headers after all the chunks
have been sent WITHOUT signalling their presence in the first response
headers. The "Trailer:" header is only a SHOULD there and as we need to
handle the situation even without that header I made libcurl ignore
Trailer: completely.

Test case 1116 was added to verify this and to make sure we handle more
than one trailer header properly.

Reported by: Patrick McManus
Bug: http://curl.haxx.se/bug/view.cgi?id=3052450
2010-08-25 13:42:14 +02:00
Daniel Stenberg
0cbdcd07a8 TODO: we now support RTMP 2010-08-25 09:20:08 +02:00
Daniel Stenberg
d106189a47 TODO: done "NTLM with other crypto functions"
Since NTLM was made to work with the NSS API as well, the primary SSL
alternatives will be built with NTLM support in libcurl.
2010-08-25 09:18:46 +02:00
Daniel Stenberg
ddb810ab70 TODO: fixed "Make curl_multi_info_read faster"
It is really fast now
2010-08-25 09:17:09 +02:00
Dan Fandrich
77ba147e76 Fixed a NULL pointer dereference in form posting
It was introduced in commit eeb2cb05 along with the -F type=
change. Also fixed a typo in the name of the magic filename=
parameter. Tweaked tests 39 and 173 to better test this path.
2010-08-24 16:45:31 -07:00
Ben Greear
bed311eda2 multi: Fix compile warning on 64-bit systems 2010-08-24 18:30:26 +02:00
Dan Fandrich
9a0b6e42af Mention PolarSSL in tutorial & add some URLs to INSTALL 2010-08-23 15:07:14 -07:00
Daniel Stenberg
cfdc4aca45 RESUME_FROM: clarify what ftp uploads do
The numerical value passed to CURLOPT_RESUME_FROM for FTP uploads is
interpreted and used as position where to resume the _reading_ of the
local file and it will "blindly" append that data on the remote
file. This was certainly not clear in the docs previously.

Reported by: catalin
Bug: http://curl.haxx.se/bug/view.cgi?id=3048174
2010-08-23 00:36:11 +02:00
Dirk Manske
ab6681c2c8 Curl_is_connected: use correct errno
The correctly extracted errno contents were mistakenly overwritten by a newer
value that wasn't the correct error value.

Bug: http://curl.haxx.se/mail/lib-2010-08/0242.html
2010-08-21 00:29:35 +02:00
Daniel Stenberg
eeb2cb05a1 cmdline: make -F type= accept ;charset=
The -F option allows some custom parameters within the given string, and
those strings are separated with semicolons. You can for example specify
"name=daniel;type=text/plain" to set content-type for the
field. However, the use of semicolons like that made it not work fine if
you specified one within the content-type, like for:
"name=daniel;type=text/plain;charset=UTF-8"
... as the second one would be seen as a separator and "charset" is no
parameter curl knows anything about so it was just silently discarded.

The new logic now checks if the semicolon and following keyword looks
like a parameter it knows about and if it isn't it is assumed to be
meant to be used within the content-type string itself.

I modified test case 186 to verify that this works as intended.

Reported by: Larry Stone
Bug: http://curl.haxx.se/bug/view.cgi?id=3048988
2010-08-21 00:21:24 +02:00
Guenter Knauf
daa96f9928 Added mk-ca-bundle.vbs script.
The script works exactly same as the Perl one except for one thing:
when the text descriptions generated with openssl are included then
the md5 fingerprints are missing; seems openssl has either a bug or
a feature which prints the md5 fingerprint output to stdout instead
of writing them to specified file; this script could here do the same
as what the Perl scripr does (redirect stdout into file) but this
makes the script take up double the time because it needs to launch
cmd.exe 140 times (fo each openssl call). So I think for now we just
ommit the md5 fingerprints, and see if openssl will be fixed.
2010-08-20 03:02:49 +02:00
Guenter Knauf
f37affab8c Trial to fix win32 autobuilds.
It seems that its time to look at some better ideas for the win32
non-configure builds; probably a prebuild target which copies
config-win32.h to curl_config.h and appends also then feature
defines like USE_ARES.
2010-08-20 02:33:29 +02:00
Dan Fandrich
dc4adc484f Use the S_ISREG macro to determine what is a regular file 2010-08-19 11:49:01 -07:00
Kamil Dudka
d0dea8f869 AC_INIT: avoid a warning with autoconf 2.66
It was complaining about the '=>' operator, introduced in e3fc0d5.
2010-08-19 16:43:40 +02:00
Dan Fandrich
ab81f6c7c4 Fixed a memory leak during OOM in the multi timeout code 2010-08-18 23:08:18 -07:00
Dan Fandrich
ebbe694e78 Removed a C99ism & made an array const 2010-08-18 22:16:46 -07:00
Julien Chaffraix
70baf46d8d test: added test 579 to verify progress callback for chunked post
The 66 bytes checked are those 38 bytes with the chunked encoding
headers added: 8+8+10+35+5 = 66

The three-letter words become 8 bytes on the wire because they are sent
like: "3\r\none\r\n"

... and there's the trailing 5 bytes write after the four lines since
the final chunk is sent (which is "0\r\n\r\n").
2010-08-19 00:27:04 +02:00
Daniel Stenberg
280d2cff2e multi: avoid sending multiple complete messages
I fell over this bug report that mentioned that libcurl could wrongly
send more than one complete messages at the end of a transfer. Reading
the code confirmed this, so I've added a new multi state to make it not
happen. The mentioned bug report was made by Brad Jorsch but is (oddly
enough) filed in Debian's bug tracker for the "wmweather+" tool.

Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=593390
2010-08-18 19:59:46 +02:00
Daniel Stenberg
ac20f52ed3 FAQ: update the list of supported protocols 2010-08-18 19:43:06 +02:00
Daniel Stenberg
59842d4d5f FAQ: added blurb about ECCN
"1.13 curl's ECCN number" is a new section mostly made up from
Alessandro Vesely's very informative ML post on the subject:
http://curl.haxx.se/mail/lib-2008-03/0251.html
2010-08-18 16:56:17 +02:00
Guenter Knauf
2b6208a6de It is sufficient to pipe stderr to NUL to get rid of the nasty messages. 2010-08-18 16:08:20 +02:00
Guenter Knauf
2f0532a072 Added SSPI build to Watcom makefile. 2010-08-18 15:17:05 +02:00
Julien Chaffraix
6b490ed33c progress: callback for POSTs less than MAX_INITIAL_POST_SIZE
Add a call to Curl_pgrsSetUploadSize in this case valided by a test
case.

Reported by: Никита Дорохин.
Bug: http://curl.haxx.se/mail/lib-2010-04/0173.html
2010-08-16 22:56:43 +02:00
Dan Fandrich
4d703ee100 Make the LD_PRELOAD path absolute in the tests that use it
In some situations, libtool will change directories and perform
a link step before executing the libtest test app. Since
LD_PRELOAD is in effect for this entire process, the path to the
binary must be absolute so it will be valid no matter in which
directory the app is running.
2010-08-16 13:36:51 -07:00
Daniel Stenberg
13b8fc46a3 negotiation: Wrong proxy authorization
There's an error in http_negotiation.c where a mistake is using only
userpwd even for proxy requests. Ludek provided a patch, but I decided
to write the fix slightly different using his patch as inspiration.

Reported by: Ludek Finstrle
Bug: http://curl.haxx.se/bug/view.cgi?id=3046066
2010-08-16 22:26:52 +02:00
Dan Fandrich
9f4a174698 Clear stdout and stderr files on each test run
This allows a test to be run several times in the same test
session even when the -k option is given.
2010-08-16 12:09:18 -07:00
Guenter Knauf
8f6189600f Syncroniszed vclean target; fixed some comments. 2010-08-15 16:56:03 +02:00
Daniel Stenberg
41572648db THANKS: added contributors from 7.21.1 2010-08-15 13:59:44 +02:00
Daniel Stenberg
b980c9a027 multi: two fixes done 2010-08-15 13:56:00 +02:00
Daniel Stenberg
9124bfba45 multi: use timeouts properly for MAX_RECV/SEND_SPEED
When detecting that the send or recv speed, the multi interface changes
state to TOOFAST and previously there was no timeout set that would
force a recheck but it would rely on the application to somehow call
libcurl anyway. This now sets a timeout for a suitable future time to
check again if the average transfer speed is then below the threshold
again.
2010-08-15 13:16:39 +02:00
Daniel Stenberg
232ad6549a multi: support timeouts
Curl_expire() is now expanded to hold a list of timeouts for each easy
handle. Only the closest in time will be the one used as the primary
timeout for the handle and will be used for the splay tree (which sorts
and lists all handles within the multi handle).

When the main timeout has triggered/expired, the next timeout in time
that is kept in the list will be moved to the main timeout position and
used as the key to splay with. This way, all timeouts that are set with
Curl_expire() internally will end up as a proper timeout. Previously any
Curl_expire() that set a _later_ timeout than what was already set was
just silently ignored and thus missed.

Setting Curl_expire() with timeout 0 (zero) will cancel all previously
added timeouts.

Corrects known bug #62.
2010-08-15 13:16:39 +02:00
Daniel Stenberg
03da3ba1c0 Curl_llist_insert_next: allow insertion first in the list
When we specify the "insert after" entry as NULL, this function now
inserts the new entry first in the list.
2010-08-15 13:16:39 +02:00
Daniel Stenberg
4d53dc5d80 multi: make curl_multi_info_read perform O(1)
Instead of looping over all attached easy handles, this now keeps a list
of messages in the multi handle. It allows curl_multi_info_read() to
perform O(1) no matter how many easy handles that are handled. This is
of importance since this function may be polled very frequently by apps
using the multi interface.
2010-08-15 13:16:39 +02:00
Kamil Dudka
5907777153 curl -T: ignore file size of special files
original bug report at https://bugzilla.redhat.com/622520
2010-08-15 11:26:13 +02:00
Dan Fandrich
72da720b4a Reset environment variables before starting servers
Otherwise, variables from tests could affect the servers
themselves.
2010-08-13 22:14:26 -07:00
Kamil Dudka
a6e088e855 typecheck-gcc: work around gcc upstream bug #32061
original bug report at https://bugzilla.redhat.com/617757
2010-08-12 23:56:49 +02:00
Daniel Stenberg
4342a2087a release cycle loop: start over toward 7.21.2 2010-08-11 23:57:44 +02:00
319 changed files with 13424 additions and 4907 deletions

View File

@@ -1,44 +0,0 @@
#cmakedefine CHECK_TYPE_SIZE_TYPE @CHECK_TYPE_SIZE_TYPE@
#ifdef CHECK_TYPE_SIZE_TYPE
@CHECK_TYPE_SIZE_PREINCLUDE@
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif /* HAVE_SYS_TYPES_H */
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef _WIN32
# include <winsock2.h>
# include <ws2tcpip.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif /* HAVE_STDINT_H */
#ifdef HAVE_STDDEF_H
# include <stddef.h>
#endif /* HAVE_STDDEF_H */
@CHECK_TYPE_SIZE_PREMAIN@
#ifdef __CLASSIC_C__
int main(){
int ac;
char*av[];
#else
int main(int ac, char*av[]){
#endif
if(ac > 1000){return *av[0];}
return sizeof(CHECK_TYPE_SIZE_TYPE);
}
#else /* CHECK_TYPE_SIZE_TYPE */
# error "CHECK_TYPE_SIZE_TYPE has to specify the type"
#endif /* CHECK_TYPE_SIZE_TYPE */

View File

@@ -1,57 +0,0 @@
# - Check sizeof a type
# CHECK_TYPE_SIZE(TYPE VARIABLE)
# Check if the type exists and determine size of type. if the type
# exists, the size will be stored to the variable.
#
# VARIABLE - variable to store size if the type exists.
# HAVE_${VARIABLE} - does the variable exists or not
macro(CHECK_TYPE_SIZE TYPE VARIABLE)
set(CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS 1)
if(NOT DEFINED ${VARIABLE})
if("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
set(CHECK_TYPE_SIZE_TYPE "${TYPE}")
set(MACRO_CHECK_TYPE_SIZE_FLAGS
"${CMAKE_REQUIRED_FLAGS}")
foreach(def HAVE_SYS_TYPES_H
HAVE_STDINT_H HAVE_STDDEF_H HAVE_SYS_SOCKET_H)
if("${def}")
set(MACRO_CHECK_TYPE_SIZE_FLAGS
"${MACRO_CHECK_TYPE_SIZE_FLAGS} -D${def}")
endif("${def}")
endforeach(def)
set(CHECK_TYPE_SIZE_PREMAIN)
foreach(def ${CMAKE_EXTRA_INCLUDE_FILES})
set(CHECK_TYPE_SIZE_PREMAIN "${CHECK_TYPE_SIZE_PREMAIN}#include \"${def}\"\n")
endforeach(def)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/CMake/CheckTypeSize.c.in"
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c"
IMMEDIATE @ONLY)
file(READ
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c"
CHECK_TYPE_SIZE_FILE_CONTENT)
message(STATUS "Check size of ${TYPE}")
if(CMAKE_REQUIRED_LIBRARIES)
set(CHECK_TYPE_SIZE_ADD_LIBRARIES
"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
endif(CMAKE_REQUIRED_LIBRARIES)
try_run(${VARIABLE} HAVE_${VARIABLE}
${CMAKE_BINARY_DIR}
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckTypeSize.c"
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_TYPE_SIZE_FLAGS}
"${CHECK_TYPE_SIZE_ADD_LIBRARIES}"
OUTPUT_VARIABLE OUTPUT)
if(HAVE_${VARIABLE})
message(STATUS "Check size of ${TYPE} - done")
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determining size of ${TYPE} passed with the following output:\n${OUTPUT}\n\n")
else(HAVE_${VARIABLE})
message(STATUS "Check size of ${TYPE} - failed")
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining size of ${TYPE} failed with the following output:\n${OUTPUT}\nCheckTypeSize.c:\n${CHECK_TYPE_SIZE_FILE_CONTENT}\n\n")
endif(HAVE_${VARIABLE})
endif("HAVE_${VARIABLE}" MATCHES "^HAVE_${VARIABLE}$")
endif(NOT DEFINED ${VARIABLE})
set(CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS )
endmacro(CHECK_TYPE_SIZE)

View File

@@ -183,13 +183,7 @@ include (CheckIncludeFile)
include (CheckIncludeFiles) include (CheckIncludeFiles)
include (CheckLibraryExists) include (CheckLibraryExists)
include (CheckSymbolExists) include (CheckSymbolExists)
# if crosscompiling is on, the CHECK_TYPE_SIZE macro coming with cmake uses include (CheckTypeSize)
# TRY_COMPILE instead of TRY_RUN which makes crosscompiling easier, Alex
if(CMAKE_CROSSCOMPILING)
include ("${CMAKE_MODULE_PATH}/CheckTypeSize.cmake")
else(CMAKE_CROSSCOMPILING)
include (CheckTypeSize)
endif(CMAKE_CROSSCOMPILING)
# On windows preload settings # On windows preload settings
if(WIN32) if(WIN32)
@@ -781,7 +775,13 @@ endif(CMAKE_COMPILER_IS_GNUCC AND APPLE)
if(HAVE_SOCKLEN_T) if(HAVE_SOCKLEN_T)
set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t") set(CURL_TYPEOF_CURL_SOCKLEN_T "socklen_t")
if(WIN32)
set(CMAKE_EXTRA_INCLUDE_FILES "winsock2.h;ws2tcpip.h")
elseif(HAVE_SYS_SOCKET_H)
set(CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h")
endif()
check_type_size("socklen_t" CURL_SIZEOF_CURL_SOCKLEN_T) check_type_size("socklen_t" CURL_SIZEOF_CURL_SOCKLEN_T)
set(CMAKE_EXTRA_INCLUDE_FILES)
if(NOT HAVE_CURL_SIZEOF_CURL_SOCKLEN_T) if(NOT HAVE_CURL_SIZEOF_CURL_SOCKLEN_T)
message(FATAL_ERROR message(FATAL_ERROR
"Check for sizeof socklen_t failed, see CMakeFiles/CMakerror.log") "Check for sizeof socklen_t failed, see CMakeFiles/CMakerror.log")
@@ -831,7 +831,7 @@ function(TRANSFORM_MAKEFILE_INC INPUT_FILE OUTPUT_FILE)
string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) string(REPLACE "$(top_builddir)" "\${CURL_BINARY_DIR}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
string(REGEX REPLACE "\\\\\n" "<22>!<21>" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) string(REGEX REPLACE "\\\\\n" "<22>!<21>" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*\n)" "SET(\\1 \\2)\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
string(REPLACE "<22>!<21>" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) string(REPLACE "<22>!<21>" "\n" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT})
string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${} string(REGEX REPLACE "\\$\\(([a-zA-Z_][a-zA-Z0-9_]*)\\)" "\${\\1}" MAKEFILE_INC_TEXT ${MAKEFILE_INC_TEXT}) # Replace $() with ${}

View File

@@ -1,6 +1,6 @@
COPYRIGHT AND PERMISSION NOTICE COPYRIGHT AND PERMISSION NOTICE
Copyright (c) 1996 - 2010, Daniel Stenberg, <daniel@haxx.se>. Copyright (c) 1996 - 2011, Daniel Stenberg, <daniel@haxx.se>.
All rights reserved. All rights reserved.

View File

@@ -1,26 +1,76 @@
#!/bin/bash #!/bin/bash
# This script performs all of the steps needed to build a # This script performs all of the steps needed to build a
# universal binary libcurl.framework for Mac OS X 10.4 or greater. # universal binary libcurl.framework for Mac OS X 10.4 or greater.
#
# Hendrik Visage:
# Generalizations added since Snowleopard (10.6) do not include
# the 10.4u SDK.
#
# Also note:
# 10.5 is the *ONLY* SDK that support PPC64 :( -- 10.6 do not have ppc64 support
#If you need to have PPC64 support then change below to 1
PPC64_NEEDED=0
# For me the default is to develop for the platform I am on, and if you
#desire compatibility with older versions then change USE_OLD to 1 :)
USE_OLD=0
VERSION=`/usr/bin/sed -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' include/curl/curlver.h` VERSION=`/usr/bin/sed -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' include/curl/curlver.h`
FRAMEWORK_VERSION=Versions/Release-$VERSION
SDK32='/Developer/SDKs/MacOSX10.4u.sdk' #I also wanted to "copy over" the system, and thus the reason I added the
# version to Versions/Release-7.20.1 etc.
# now a simple rsync -vaP libcurl.framework /Library/Frameworks will install it
# and setup the right paths to this version, leaving the system version
# "intact", so you can "fix" it later with the links to Versions/A/...
MINVER32='-mmacosx-version-min=10.4'
ARCHES32='-arch ppc -arch i386' OLD_SDK=`ls /Developer/SDKs|head -1`
NEW_SDK=`ls -r /Developer/SDKs|head -1`
SDK64='/Developer/SDKs/MacOSX10.5.sdk' if test "0"$USE_OLD -gt 0
then
SDK32=$OLD_SDK
else
SDK32=$NEW_SDK
fi
MINVER64='-mmacosx-version-min=10.5' MACVER=`echo $SDK32|sed -e s/[a-zA-Z]//g -e s/.\$//`
ARCHES64='-arch ppc64 -arch x86_64' SDK32_DIR='/Developer/SDKs/'$SDK32
MINVER32='-mmacosx-version-min='$MACVER
ARCHES32='-arch i386 -arch ppc'
if test -d $SDK32; then
if test $PPC64_NEEDED -gt 0
then
SDK64=10.5
ARCHES64='-arch x86_64 -arch ppc64'
SDK64=`ls /Developer/SDKs|grep 10.5|head -1`
else
ARCHES64='-arch x86_64'
#We "know" that 10.4 and earlier do not support 64bit
OLD_SDK64=`ls /Developer/SDKs|egrep -v "10.[0-4]"|head -1`
NEW_SDK64=`ls -r /Developer/SDKs|egrep -v "10.[0-4]"|head -1`
if test $USE_OLD -gt 0
then
SDK64=$OLD_SDK64
else
SDK64=$NEW_SDK64
fi
fi
SDK64_DIR='/Developer/SDKs/'$SDK64
MACVER64=`echo $SDK64|sed -e s/[a-zA-Z]//g -e s/.\$//`
MINVER64='-mmacosx-version-min='$MACVER64
if test ! -z $SDK32; then
echo "----Configuring libcurl for 32 bit universal framework..." echo "----Configuring libcurl for 32 bit universal framework..."
make clean
./configure --disable-dependency-tracking --disable-static --with-gssapi \ ./configure --disable-dependency-tracking --disable-static --with-gssapi \
CFLAGS="-Os -isysroot $SDK32 $ARCHES32 $MINVER32" \ CFLAGS="-Os -isysroot $SDK32_DIR $ARCHES32 $MINVER32" \
LDFLAGS="-Wl,-syslibroot,$SDK32 $ARCHES32 $MINVER32 -Wl,-headerpad_max_install_names" \ LDFLAGS="-Wl,-syslibroot,$SDK32_DIR $ARCHES32 $MINVER32 -Wl,-headerpad_max_install_names" \
CC=$CC CC=$CC
echo "----Building 32 bit libcurl..." echo "----Building 32 bit libcurl..."
@@ -28,40 +78,43 @@ if test -d $SDK32; then
echo "----Creating 32 bit framework..." echo "----Creating 32 bit framework..."
rm -r libcurl.framework rm -r libcurl.framework
mkdir -p libcurl.framework/Versions/A/Resources mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Resources
cp lib/.libs/libcurl.dylib libcurl.framework/Versions/A/libcurl cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl
install_name_tool -id @executable_path/../Frameworks/libcurl.framework/Versions/A/libcurl libcurl.framework/Versions/A/libcurl install_name_tool -id @executable_path/../Frameworks/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl
/usr/bin/sed -e "s/7\.12\.3/$VERSION/" lib/libcurl.plist >libcurl.framework/Versions/A/Resources/Info.plist /usr/bin/sed -e "s/7\.12\.3/$VERSION/" lib/libcurl.plist >libcurl.framework/${FRAMEWORK_VERSION}/Resources/Info.plist
mkdir -p libcurl.framework/Versions/A/Headers/curl mkdir -p libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl
cp include/curl/*.h libcurl.framework/Versions/A/Headers/curl cp include/curl/*.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl
pushd libcurl.framework pushd libcurl.framework
ln -fs Versions/A/libcurl libcurl ln -fs ${FRAMEWORK_VERSION}/libcurl libcurl
ln -fs Versions/A/Resources Resources ln -fs ${FRAMEWORK_VERSION}/Resources Resources
ln -fs Versions/A/Headers Headers ln -fs ${FRAMEWORK_VERSION}/Headers Headers
cd Versions cd Versions
ln -fs A Current ln -fs ${FRAMEWORK_VERSION} Current
if test -d $SDK64; then echo TEsting for SDK64
if test -d $SDK64_DIR; then
echo entering...
popd popd
make clean make clean
echo "----Configuring libcurl for 64 bit universal framework..." echo "----Configuring libcurl for 64 bit universal framework..."
./configure --disable-dependency-tracking --disable-static --with-gssapi \ ./configure --disable-dependency-tracking --disable-static --with-gssapi \
CFLAGS="-Os -isysroot $SDK64 $ARCHES64 $MINVER64" \ CFLAGS="-Os -isysroot $SDK64_DIR $ARCHES64 $MINVER64" \
LDFLAGS="-Wl,-syslibroot,$SDK64 $ARCHES64 $MINVER64 -Wl,-headerpad_max_install_names" \ LDFLAGS="-Wl,-syslibroot,$SDK64_DIR $ARCHES64 $MINVER64 -Wl,-headerpad_max_install_names" \
CC=$CC CC=$CC
echo "----Building 64 bit libcurl..." echo "----Building 64 bit libcurl..."
make make
echo "----Appending 64 bit framework to 32 bit framework..." echo "----Appending 64 bit framework to 32 bit framework..."
cp lib/.libs/libcurl.dylib libcurl.framework/Versions/A/libcurl64 cp lib/.libs/libcurl.dylib libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
install_name_tool -id @executable_path/../Frameworks/libcurl.framework/Versions/A/libcurl libcurl.framework/Versions/A/libcurl64 install_name_tool -id @executable_path/../Frameworks/libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
cp libcurl.framework/Versions/A/libcurl libcurl.framework/Versions/A/libcurl32 cp libcurl.framework/${FRAMEWORK_VERSION}/libcurl libcurl.framework/${FRAMEWORK_VERSION}/libcurl32
lipo libcurl.framework/Versions/A/libcurl32 libcurl.framework/Versions/A/libcurl64 -create -output libcurl.framework/Versions/A/libcurl pwd
rm libcurl.framework/Versions/A/libcurl32 libcurl.framework/Versions/A/libcurl64 lipo libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64 -create -output libcurl.framework/${FRAMEWORK_VERSION}/libcurl
cp libcurl.framework/Versions/A/Headers/curl/curlbuild.h libcurl.framework/Versions/A/Headers/curl/curlbuild32.h rm libcurl.framework/${FRAMEWORK_VERSION}/libcurl32 libcurl.framework/${FRAMEWORK_VERSION}/libcurl64
cp include/curl/curlbuild.h libcurl.framework/Versions/A/Headers/curl/curlbuild64.h cp libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild32.h
cat >libcurl.framework/Versions/A/Headers/curl/curlbuild.h <<EOF cp include/curl/curlbuild.h libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild64.h
cat >libcurl.framework/${FRAMEWORK_VERSION}/Headers/curl/curlbuild.h <<EOF
#ifdef __LP64__ #ifdef __LP64__
#include "curl/curlbuild64.h" #include "curl/curlbuild64.h"
#else #else
@@ -70,9 +123,10 @@ if test -d $SDK32; then
EOF EOF
fi fi
lipo -info libcurl.framework/Versions/A/libcurl pwd
lipo -info libcurl.framework/${FRAMEWORK_VERSION}/libcurl
echo "libcurl.framework is built and can now be included in other projects." echo "libcurl.framework is built and can now be included in other projects."
echo "Copy libcurl.framework to your bundle's Contents/Frameworks folder, ~/Library/Frameworks or /Library/Frameworks." echo "Copy libcurl.framework to your bundle's Contents/Frameworks folder, ~/Library/Frameworks or /Library/Frameworks."
else else
echo "Building libcurl.framework requires Mac OS X 10.4 or later with the MacOSX10.4u SDK installed." echo "Building libcurl.framework requires Mac OS X 10.4 or later with the MacOSX10.4/5/6 SDK installed."
fi fi

View File

@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
@@ -24,15 +24,19 @@ AUTOMAKE_OPTIONS = foreign
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
CMAKE_DIST = CMakeLists.txt CMake/CheckTypeSize.c.in CMake/CheckTypeSize.cmake \ CMAKE_DIST = CMakeLists.txt CMake/CMakeConfigurableFile.in \
CMake/CMakeConfigurableFile.in CMake/CurlCheckCSourceCompiles.cmake \ CMake/CurlCheckCSourceCompiles.cmake CMake/CurlCheckCSourceRuns.cmake \
CMake/CurlCheckCSourceRuns.cmake CMake/CurlTests.c CMake/FindOpenSSL.cmake \ CMake/CurlTests.c CMake/FindOpenSSL.cmake CMake/FindZLIB.cmake \
CMake/FindZLIB.cmake CMake/OtherTests.cmake CMake/Platforms/WindowsCache.cmake \ CMake/OtherTests.cmake CMake/Platforms/WindowsCache.cmake \
CMake/Utilities.cmake include/curl/curlbuild.h.cmake CMake/Utilities.cmake include/curl/curlbuild.h.cmake
WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
winbuild/MakefileBuild.vc winbuild/Makefile.vc
EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \ EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
curl-style.el sample.emacs RELEASE-NOTES buildconf \ curl-style.el sample.emacs RELEASE-NOTES buildconf \
libcurl.pc.in vc6curl.dsw MacOSX-Framework Android.mk $(CMAKE_DIST) libcurl.pc.in vc6curl.dsw MacOSX-Framework Android.mk $(CMAKE_DIST) \
Makefile.msvc.names $(WINBUILD_DIST)
bin_SCRIPTS = curl-config bin_SCRIPTS = curl-config

View File

@@ -32,45 +32,39 @@ ssl:
borland: borland:
cd lib cd lib
make -f Makefile.b32 $(MAKE) -f Makefile.b32
cd ..\src cd ..\src
make -f Makefile.b32 $(MAKE) -f Makefile.b32
borland-ssl: borland-ssl:
cd lib cd lib
make -f Makefile.b32 WITH_SSL=1 $(MAKE) -f Makefile.b32 WITH_SSL=1
cd ..\src cd ..\src
make -f Makefile.b32 WITH_SSL=1 $(MAKE) -f Makefile.b32 WITH_SSL=1
borland-ssl-zlib: borland-ssl-zlib:
cd lib cd lib
make -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1 $(MAKE) -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1
cd ..\src cd ..\src
make -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1 $(MAKE) -f Makefile.b32 WITH_SSL=1 WITH_ZLIB=1
borland-clean: borland-clean:
cd lib cd lib
make -f Makefile.b32 clean $(MAKE) -f Makefile.b32 clean
cd ..\src cd ..\src
make -f Makefile.b32 clean $(MAKE) -f Makefile.b32 clean
watcom: .SYMBOLIC watcom: .SYMBOLIC
cd lib cd lib && $(MAKE) -u -f Makefile.Watcom
wmake -u -f Makefile.Watcom cd src && $(MAKE) -u -f Makefile.Watcom
cd ..\src
wmake -u -f Makefile.Watcom
watcom-clean: .SYMBOLIC watcom-clean: .SYMBOLIC
cd lib cd lib && $(MAKE) -u -f Makefile.Watcom clean
wmake -u -f Makefile.Watcom clean cd src && $(MAKE) -u -f Makefile.Watcom clean
cd ..\src
wmake -u -f Makefile.Watcom clean
watcom-vclean: .SYMBOLIC watcom-vclean: .SYMBOLIC
cd lib cd lib && $(MAKE) -u -f Makefile.Watcom vclean
wmake -u -f Makefile.Watcom vclean cd src && $(MAKE) -u -f Makefile.Watcom vclean
cd ..\src
wmake -u -f Makefile.Watcom vclean
mingw32: mingw32:
$(MAKE) -C lib -f Makefile.m32 $(MAKE) -C lib -f Makefile.m32
@@ -92,17 +86,21 @@ mingw32-ssh2-ssl-sspi-zlib:
$(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1 $(MAKE) -C lib -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1
$(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1 $(MAKE) -C src -f Makefile.m32 SSH2=1 SSL=1 SSPI=1 ZLIB=1
mingw32-rtmp-ssh2-ssl-sspi-zlib:
$(MAKE) -C lib -f Makefile.m32 RTMP=1 SSH2=1 SSL=1 SSPI=1 ZLIB=1
$(MAKE) -C src -f Makefile.m32 RTMP=1 SSH2=1 SSL=1 SSPI=1 ZLIB=1
mingw32-clean: mingw32-clean:
$(MAKE) -C lib -f Makefile.m32 clean $(MAKE) -C lib -f Makefile.m32 clean
$(MAKE) -C src -f Makefile.m32 clean $(MAKE) -C src -f Makefile.m32 clean
vc-clean: vc-clean: $(VC)
cd lib cd lib
nmake -f Makefile.$(VC) clean nmake -f Makefile.$(VC) clean
cd ..\src cd ..\src
nmake -f Makefile.$(VC) clean nmake -f Makefile.$(VC) clean
vc-all: vc-all: $(VC)
cd lib cd lib
nmake -f Makefile.$(VC) cfg=release nmake -f Makefile.$(VC) cfg=release
nmake -f Makefile.$(VC) cfg=release-ssl nmake -f Makefile.$(VC) cfg=release-ssl
@@ -127,85 +125,85 @@ vc-all:
nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll nmake -f Makefile.$(VC) cfg=debug-dll-zlib-dll
nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll nmake -f Makefile.$(VC) cfg=debug-dll-ssl-dll-zlib-dll
vc: vc: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release nmake /f Makefile.$(VC) cfg=release
cd ..\src cd ..\src
nmake /f Makefile.$(VC) nmake /f Makefile.$(VC)
vc-x64: vc-x64: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release nmake /f Makefile.$(VC) MACHINE=x64 cfg=release
cd ..\src cd ..\src
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release nmake /f Makefile.$(VC) MACHINE=x64 cfg=release
vc-zlib: vc-zlib: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-zlib nmake /f Makefile.$(VC) cfg=release-zlib
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-zlib nmake /f Makefile.$(VC) cfg=release-zlib
vc-ssl: vc-ssl: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-ssl nmake /f Makefile.$(VC) cfg=release-ssl
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-ssl nmake /f Makefile.$(VC) cfg=release-ssl
vc-ssl-zlib: vc-ssl-zlib: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-ssl-zlib nmake /f Makefile.$(VC) cfg=release-ssl-zlib
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-ssl-zlib nmake /f Makefile.$(VC) cfg=release-ssl-zlib
vc-x64-ssl-zlib: vc-x64-ssl-zlib: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib
cd ..\src cd ..\src
nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib nmake /f Makefile.$(VC) MACHINE=x64 cfg=release-ssl-zlib
vc-ssl-dll: vc-ssl-dll: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-ssl-dll nmake /f Makefile.$(VC) cfg=release-ssl-dll
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-ssl-dll nmake /f Makefile.$(VC) cfg=release-ssl-dll
vc-dll-ssl-dll: vc-dll-ssl-dll: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll
vc-dll: vc-dll: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-dll nmake /f Makefile.$(VC) cfg=release-dll
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-dll nmake /f Makefile.$(VC) cfg=release-dll
vc-dll-zlib-dll: vc-dll-zlib-dll: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll nmake /f Makefile.$(VC) cfg=release-dll-zlib-dll
vc-dll-ssl-dll-zlib-dll: vc-dll-ssl-dll-zlib-dll: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll nmake /f Makefile.$(VC) cfg=release-dll-ssl-dll-zlib-dll
vc-ssl-dll-zlib-dll: vc-ssl-dll-zlib-dll: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll nmake /f Makefile.$(VC) cfg=release-ssl-dll-zlib-dll
vc-zlib-dll: vc-zlib-dll: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release-zlib-dll nmake /f Makefile.$(VC) cfg=release-zlib-dll
cd ..\src cd ..\src
nmake /f Makefile.$(VC) cfg=release-zlib-dll nmake /f Makefile.$(VC) cfg=release-zlib-dll
vc-sspi: vc-sspi: $(VC)
cd lib cd lib
nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1 nmake /f Makefile.$(VC) cfg=release WINDOWS_SSPI=1
cd ..\src cd ..\src
@@ -267,6 +265,8 @@ linux: all
linux-ssl: ssl linux-ssl: ssl
# We don't need to do anything for vc6.
vc6:
vc8: lib/Makefile.vc8 src/Makefile.vc8 vc8: lib/Makefile.vc8 src/Makefile.vc8
@@ -289,6 +289,17 @@ src/Makefile.vc9: src/Makefile.vc6
@echo "generate $@" @echo "generate $@"
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc9/g" -e "s/VC6/VC9/g" src/Makefile.vc6 > src/Makefile.vc9 @sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc9/g" -e "s/VC6/VC9/g" src/Makefile.vc6 > src/Makefile.vc9
# VC10 makefiles are for use with VS2010
vc10: lib/Makefile.vc10 src/Makefile.vc10
lib/Makefile.vc10: lib/Makefile.vc6
@echo "generate $@"
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc10/g" -e "s/VC6/VC10/g" lib/Makefile.vc6 > lib/Makefile.vc10
src/Makefile.vc10: src/Makefile.vc6
@echo "generate $@"
@sed -e "s#/GX /DWIN32 /YX#/EHsc /DWIN32#" -e "s#/GZ#/RTC1#" -e "s/ws2_32.lib/ws2_32.lib/g" -e "s/vc6/vc10/g" -e "s/VC6/VC10/g" src/Makefile.vc6 > src/Makefile.vc10
ca-bundle: lib/mk-ca-bundle.pl ca-bundle: lib/mk-ca-bundle.pl
@echo "generate a fresh ca-bundle.crt" @echo "generate a fresh ca-bundle.crt"
@perl $< -b -l -u lib/ca-bundle.crt @perl $< -b -l -u lib/ca-bundle.crt

81
Makefile.msvc.names Normal file
View File

@@ -0,0 +1,81 @@
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
# / __| | | | |_) | |
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
# Copyright (C) 1999 - 2010, 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.
#
#***************************************************************************
#
# This file is included from MSVC makefiles located in lib and src,
# providing libcurl common file names required by these makefiles.
#
# ------------------
# libcurl base name
# ------------------
!IF !DEFINED(LIB_NAME) || "$(LIB_NAME)" == ""
LIB_NAME = libcurl
!ENDIF
# -------------------------------------------------
# libcurl static and dynamic libraries common base
# file names for release and debug configurations
# -------------------------------------------------
!IF !DEFINED(LIB_NAME_STA_REL) || "$(LIB_NAME_STA_REL)" == ""
LIB_NAME_STA_REL = $(LIB_NAME)
!ENDIF
!IF !DEFINED(LIB_NAME_STA_DBG) || "$(LIB_NAME_STA_DBG)" == ""
LIB_NAME_STA_DBG = $(LIB_NAME_STA_REL)d
!ENDIF
!IF !DEFINED(LIB_NAME_DYN_REL) || "$(LIB_NAME_DYN_REL)" == ""
LIB_NAME_DYN_REL = $(LIB_NAME)
!ENDIF
!IF !DEFINED(LIB_NAME_DYN_DBG) || "$(LIB_NAME_DYN_DBG)" == ""
LIB_NAME_DYN_DBG = $(LIB_NAME_DYN_REL)d
!ENDIF
# --------------------------------------------
# Base names for libcurl DLL import libraries
# --------------------------------------------
!IF !DEFINED(LIB_NAME_IMP_REL) || "$(LIB_NAME_IMP_REL)" == ""
LIB_NAME_IMP_REL = $(LIB_NAME_DYN_REL)_imp
!ENDIF
!IF !DEFINED(LIB_NAME_IMP_DBG) || "$(LIB_NAME_IMP_DBG)" == ""
LIB_NAME_IMP_DBG = $(LIB_NAME_DYN_DBG)_imp
!ENDIF
# --------------------------------------
# File names with extension and no path
# --------------------------------------
LIBCURL_STA_LIB_REL = $(LIB_NAME_STA_REL).lib
LIBCURL_STA_LIB_DBG = $(LIB_NAME_STA_DBG).lib
LIBCURL_DYN_LIB_REL = $(LIB_NAME_DYN_REL).dll
LIBCURL_DYN_LIB_DBG = $(LIB_NAME_DYN_DBG).dll
LIBCURL_IMP_LIB_REL = $(LIB_NAME_IMP_REL).lib
LIBCURL_IMP_LIB_DBG = $(LIB_NAME_IMP_DBG).lib
LIBCURL_DYN_LIB_PDB = $(LIB_NAME_IMP_DBG).pdb
# End of Makefile.msvc.names

View File

@@ -1,58 +1,54 @@
Curl and libcurl 7.21.1 Curl and libcurl 7.21.4
Public curl releases: 117 Public curl releases: 120
Command line options: 138 Command line options: 143
curl_easy_setopt() options: 180 curl_easy_setopt() options: 185
Public functions in libcurl: 58 Public functions in libcurl: 58
Known libcurl bindings: 39 Known libcurl bindings: 39
Contributors: 808 Contributors: 834
This release includes the following changes: This release includes the following changes:
o maketgz: produce CHANGES automatically o CURLINFO_FTP_ENTRY_PATH now supports SFTP
o added support for NTLM authentication when compiled with NSS o introduced new framework for unit-testing
o build: Enable configure --enable-werror o IDN: use win32 API if told to
o curl-config: --built-shared returns shared info o ares: ask for both IPv4 and IPv6 addresses
o HTTP: do Negotiate authentication using SSPI on windows
o Windows build: alternative makefile
o TLS-SRP: support added when using GnuTLS
This release includes the following bugfixes: This release includes the following bugfixes:
o configure: spell --disable-threaded-resolver correctly o SMTP: add brackets for MAIL FROM
o multi: call the progress callback in all states o ossl_seed: no more RAND_screen (on Windows)
o multi: unmark handle as used when no longer head of pipeline o multi: connect fail => use next IP address
o sendrecv: treat all negative values from send/recv as errors o use the timeout when using multiple IP addresses similar to how
o ftp-wildcard: avoid tight loop when used without any pattern the easy interface does it
o multi_socket: re-use of same socket without notifying app o cookies: tricked dotcounter fixed
o ftp wildcard: FTP LIST parser FIX o pubkey_show: allocate buffer to fit any-size result
o urlglobbing backslash escaping bug o Curl_nss_connect: avoid PATH_MAX
o build: add enable IPV6 option for the VC makefiles o Curl_do: avoid using stale conn pointer
o multi: CURLINFO_LASTSOCKET doesn't work after remove_handle o tftpd test server: avoid buffer overflow report from glibc
o --libcurl: use *_LARGE options with typecasted constants o nss: avoid CURLE_OUT_OF_MEMORY given a file name without any slash
o --libcurl: hide setopt() calls setting default options o nss: fix a bug in handling of CURLOPT_CAPATH
o curl: avoid setting libcurl options to its default o CMake: Use upstream CheckTypeSize module
o --libcurl: list the tricky options instead of using [REMARK] o OpenSSL get_cert_chain: support larger data sets
o http: don't enable chunked during authentication negotiations o SCP/SFTP transfers: acknowledge speedcheck
o upload: warn users trying to upload from stdin with anyauth o GnuTLS builds: fix memory leak
o configure: allow environments variable to override internals o connect problem: use UDP correctly
o threaded resolver: fix timeout issue o Borland C++ makefile tweaks
o multi: fix condition that remove timers before trigger o OpenSSL: improved error message on SSL_CTX_new failures
o examples: add curl_multi_timeout o HTTP: memory leak on multiple Location:
o --retry: access violation with URL part sets continued o ares_query_completed_cb: don't touch invalid data
o ssh: Fix compile error on 64-bit systems. o ares: memory leak fix
o remote-header-name: chop filename at next semicolon o mk-ca-bundle: use new cacert url
o ftp: response timeout bug in "quote" sending o Curl_gmtime: added a portable gmtime and check for NULL
o CUSTOMREQUEST: shouldn't be disabled when HTTP is disabled o curl.1: typo in -v description
o Watcom makefiles overhaul. o CURLOPT_SOCKOPTFUNCTION: return proper error code
o NTLM tests: boost coverage by forcing the hostname o --keepalive-time: warn if not supported properly
o multi: fix FTPS connecting the data connection with OpenSSL o file: add support for CURLOPT_TIMECONDITION
o retry: consider retrying even if -f is used o nss: avoid memory leaks and failure of NSS shutdown
o fix SOCKS problem when using multi interface o multi: fix CURLM_STATE_TOOFAST for multi_socket
o typecheck-gcc: add checks for recently added options
o SCP: send large files properly with new enough libssh2
o multi_socket: set timeout for 100-continue
o ";type=" URL suffix over HTTP proxy
o acknowledge progress callback error returns during connect
o Watcom makefile fixes
o runtests: clear old setenv remainders before test
This release includes the following known bugs: This release includes the following known bugs:
@@ -61,11 +57,11 @@ This release includes the following known bugs:
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:
Dan Fandrich, Kamil Dudka, Krister Johansen, Pavel Raiskup, Jon Sargeant, Amr Shahin, Andreas Olsson, Bjoern Sikora, Brad Hards, Brad King,
Pierre Joye, Tor Arntsen, Constantine Sapuntzakis, Sidney San Martin, Dan Fandrich, Daniel Mentz, Darshan Mody, Dave Reisner, Eric Hu,
Jeff Pohlmeyer, Jan Van Boghout, Ben Greear, Guenter Knauf, Adam Light, Guenter Knauf, Ian D Allen, John Bradshaw, Julien Chaffraix, Kamil Dudka,
Georg Lippitsch, Mike Power, Robin Cornelius, Mikael Johansson, Luke Amery, Marcel Roelofs, Martin Lemke, Nicholas Maniscalco,
Yang Tse, Ben Darnell Pasha Kuznetsov, Patrick Monnerat, Paul Howarth, Pedro Larroy, Pierre Joye,
Quinn Slack, Samuel Thibault, Tommie Gannert, Vsevolod Novikov, Yang Tse
Thanks! (and sorry if I forgot to mention someone) Thanks! (and sorry if I forgot to mention someone)

View File

@@ -1,4 +1,10 @@
To be addressed in 7.XX.X To be addressed in 7.21.3
========================= =========================
261 - 263 - Support binding DNS to local interface/IP
265 - 1. FTP cmd channel and data channel validation
267 - 2. Cert chain for data channel
271 -

View File

@@ -2145,6 +2145,7 @@ AC_DEFUN([CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC], [
else else
LIBS="$curl_cv_gclk_LIBS $curl_cv_save_LIBS" LIBS="$curl_cv_gclk_LIBS $curl_cv_save_LIBS"
fi fi
CURL_LIBS="$CURL_LIBS $curl_cv_gclk_LIBS"
AC_MSG_RESULT([$curl_cv_gclk_LIBS]) AC_MSG_RESULT([$curl_cv_gclk_LIBS])
ac_cv_func_clock_gettime="yes" ac_cv_func_clock_gettime="yes"
;; ;;
@@ -3180,7 +3181,7 @@ AC_DEFUN([CURL_CHECK_WIN32_LARGEFILE], [
;; ;;
win32_small_files) win32_small_files)
AC_MSG_RESULT([yes (large file disabled)]) AC_MSG_RESULT([yes (large file disabled)])
AC_DEFINE_UNQUOTED(USE_WIN32_LARGE_FILES, 1, AC_DEFINE_UNQUOTED(USE_WIN32_SMALL_FILES, 1,
[Define to 1 if you are building a Windows target without large file support.]) [Define to 1 if you are building a Windows target without large file support.])
;; ;;
*) *)
@@ -3245,3 +3246,44 @@ AC_DEFUN([CURL_CHECK_PKGCONFIG], [
fi fi
fi fi
]) ])
dnl CURL_GENERATE_CONFIGUREHELP_PM
dnl -------------------------------------------------
dnl Generate test harness configurehelp.pm module, defining and
dnl initializing some perl variables with values which are known
dnl when the configure script runs. For portability reasons, test
dnl harness needs information on how to run the C preprocessor.
AC_DEFUN([CURL_GENERATE_CONFIGUREHELP_PM], [
AC_REQUIRE([AC_PROG_CPP])dnl
tmp_cpp=`eval echo "$ac_cpp" 2>/dev/null`
if test -z "$tmp_cpp"; then
tmp_cpp='cpp'
fi
cat >./tests/configurehelp.pm <<_EOF
[@%:@] This is a generated file. Do not edit.
package configurehelp;
use strict;
use warnings;
use Exporter;
use vars qw(
@ISA
@EXPORT_OK
\$Cpreprocessor
);
@ISA = qw(Exporter);
@EXPORT_OK = qw(
\$Cpreprocessor
);
\$Cpreprocessor = '$tmp_cpp';
1;
_EOF
])

View File

@@ -248,13 +248,17 @@ fi
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# m4 check # m4 check
# #
m4=`${M4:-m4} --version 2>/dev/null|head -n 1`; m4=`(${M4:-m4} --version || ${M4:-gm4} --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
echo "buildconf: GNU m4 version $m4_version (ok)" echo "buildconf: GNU m4 version $m4_version (ok)"
else else
echo "buildconf: m4 version $m4 found. You need a GNU m4 installed!" if test -z "$m4"; then
echo "buildconf: m4 version not recognized. You need a GNU m4 installed!"
else
echo "buildconf: m4 version $m4 found. You need a GNU m4 installed!"
fi
exit 1 exit 1
fi fi
@@ -289,6 +293,7 @@ for fname in .deps \
config.status \ config.status \
config.sub \ config.sub \
configure \ configure \
configurehelp.pm \
curl-config \ curl-config \
curlbuild.h \ curlbuild.h \
depcomp \ depcomp \
@@ -360,6 +365,12 @@ if test ! -f ./config.guess; then
else else
buildhost=`./config.guess 2>/dev/null|head -n 1` buildhost=`./config.guess 2>/dev/null|head -n 1`
case $buildhost in case $buildhost in
*-*-darwin*)
need_lt_major=1
need_lt_minor=5
need_lt_patch=26
need_lt_check="yes"
;;
*-*-hpux*) *-*-hpux*)
need_lt_major=1 need_lt_major=1
need_lt_minor=5 need_lt_minor=5

View File

@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
@@ -24,7 +24,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57) AC_PREREQ(2.57)
dnl We don't know the version number "statically" so we use a dash here dnl We don't know the version number "statically" so we use a dash here
AC_INIT([curl], [-], [a suitable curl mailing list => http://curl.haxx.se/mail/]) AC_INIT([curl], [-], [a suitable curl mailing list: http://curl.haxx.se/mail/])
CURL_OVERRIDE_AUTOCONF CURL_OVERRIDE_AUTOCONF
@@ -53,7 +53,7 @@ CONFIGURE_OPTIONS="\"$ac_configure_args\""
AC_SUBST(CONFIGURE_OPTIONS) AC_SUBST(CONFIGURE_OPTIONS)
CURL_CFLAG_EXTRAS="" CURL_CFLAG_EXTRAS=""
if test X"$want_werror" == Xyes; then if test X"$want_werror" = Xyes; then
CURL_CFLAG_EXTRAS="-Werror" CURL_CFLAG_EXTRAS="-Werror"
fi fi
AC_SUBST(CURL_CFLAG_EXTRAS) AC_SUBST(CURL_CFLAG_EXTRAS)
@@ -140,12 +140,13 @@ AC_SUBST(PKGADD_VENDOR)
dnl dnl
dnl initialize all the info variables dnl initialize all the info variables
curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl} )" curl_ssl_msg="no (--with-{ssl,gnutls,nss,polarssl,axtls} )"
curl_ssh_msg="no (--with-libssh2)" curl_ssh_msg="no (--with-libssh2)"
curl_zlib_msg="no (--with-zlib)" curl_zlib_msg="no (--with-zlib)"
curl_krb4_msg="no (--with-krb4*)" curl_krb4_msg="no (--with-krb4*)"
curl_gss_msg="no (--with-gssapi)" curl_gss_msg="no (--with-gssapi)"
curl_spnego_msg="no (--with-spnego)" curl_spnego_msg="no (--with-spnego)"
curl_tls_srp_msg="no (--enable-tls-srp)"
curl_res_msg="default (--enable-ares / --enable-threaded-resolver)" curl_res_msg="default (--enable-ares / --enable-threaded-resolver)"
curl_ipv6_msg="no (--enable-ipv6)" curl_ipv6_msg="no (--enable-ipv6)"
curl_idn_msg="no (--with-libidn)" curl_idn_msg="no (--with-libidn)"
@@ -156,6 +157,7 @@ curl_verbose_msg="enabled (--disable-verbose)"
curl_ldaps_msg="no (--enable-ldaps)" curl_ldaps_msg="no (--enable-ldaps)"
curl_rtsp_msg="no (--enable-rtsp)" curl_rtsp_msg="no (--enable-rtsp)"
curl_rtmp_msg="no (--with-librtmp)" curl_rtmp_msg="no (--with-librtmp)"
init_ssl_msg=${curl_ssl_msg}
dnl dnl
dnl Save anything in $LIBS for later dnl Save anything in $LIBS for later
@@ -416,7 +418,6 @@ AC_HELP_STRING([--disable-ldaps],[Disable LDAPS support]),
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_LDAP_SSL, 1, [Use LDAPS implementation]) AC_DEFINE(HAVE_LDAP_SSL, 1, [Use LDAPS implementation])
AC_SUBST(HAVE_LDAP_SSL, [1]) AC_SUBST(HAVE_LDAP_SSL, [1])
curl_ldaps_msg="enabled"
fi fi
;; ;;
esac ],[ esac ],[
@@ -428,7 +429,6 @@ AC_HELP_STRING([--disable-ldaps],[Disable LDAPS support]),
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_LDAP_SSL, 1, [Use LDAPS implementation]) AC_DEFINE(HAVE_LDAP_SSL, 1, [Use LDAPS implementation])
AC_SUBST(HAVE_LDAP_SSL, [1]) AC_SUBST(HAVE_LDAP_SSL, [1])
curl_ldaps_msg="enabled"
fi ] fi ]
) )
@@ -570,6 +570,22 @@ AC_HELP_STRING([--disable-smtp],[Disable SMTP support]),
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
) )
AC_MSG_CHECKING([whether to support gopher])
AC_ARG_ENABLE(gopher,
AC_HELP_STRING([--enable-gopher],[Enable Gopher support])
AC_HELP_STRING([--disable-gopher],[Disable Gopher support]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_GOPHER, 1, [to disable Gopher])
AC_SUBST(CURL_DISABLE_GOPHER, [1])
;;
*) AC_MSG_RESULT(yes)
;;
esac ],
AC_MSG_RESULT(yes)
)
dnl ********************************************************************** dnl **********************************************************************
dnl Check for built-in manual dnl Check for built-in manual
@@ -876,6 +892,10 @@ if test x$CURL_DISABLE_LDAP != x1 ; then
fi fi
fi fi
if test x$CURL_DISABLE_LDAPS != x1 ; then
curl_ldaps_msg="enabled"
fi
dnl ********************************************************************** dnl **********************************************************************
dnl Checks for IPv6 dnl Checks for IPv6
dnl ********************************************************************** dnl **********************************************************************
@@ -937,16 +957,19 @@ dnl Check if the operating system allows programs to write to their own argv[]
dnl ********************************************************************** dnl **********************************************************************
AC_MSG_CHECKING([if argv can be written to]) AC_MSG_CHECKING([if argv can be written to])
AC_CACHE_VAL(curl_cv_writable_argv, [ AC_RUN_IFELSE([
AC_RUN_IFELSE([[ AC_LANG_SOURCE([[
int main(int argc, char ** argv) { int main(int argc, char ** argv) {
argv[0][0] = ' '; argv[0][0] = ' ';
return (argv[0][0] == ' ')?0:1; return (argv[0][0] == ' ')?0:1;
} }
]], ]])
curl_cv_writable_argv=yes, ],[
curl_cv_writable_argv=no, curl_cv_writable_argv=yes
curl_cv_writable_argv=cross) ],[
curl_cv_writable_argv=no
],[
curl_cv_writable_argv=cross
]) ])
case $curl_cv_writable_argv in case $curl_cv_writable_argv in
yes) yes)
@@ -1718,6 +1741,31 @@ if test "$OPENSSL_ENABLED" != "1"; then
fi dnl OPENSSL != 1 fi dnl OPENSSL != 1
dnl ---
dnl If GnuTLS is enabled, we MUST verify that it uses libgcrypt since
dnl curl code relies on that but recent GnuTLS versions can in fact build
dnl with different crypto libraries which curl right now cannot handle
dnl ---
if test "$GNUTLS_ENABLED" = "1"; then
AC_CHECK_LIB(gcrypt,
gcry_control, ,
[
AC_MSG_ERROR([need GnuTLS built with gcrypt to function with GnuTLS])
])
fi
dnl ---
dnl We require GnuTLS with SRP support.
dnl ---
if test "$GNUTLS_ENABLED" = "1"; then
AC_CHECK_LIB(gnutls, gnutls_srp_verifier,
[
AC_DEFINE(HAVE_GNUTLS_SRP, 1, [if you have the function gnutls_srp_verifier])
AC_SUBST(HAVE_GNUTLS_SRP, [1])
])
fi
dnl ---------------------------------------------------- dnl ----------------------------------------------------
dnl check for PolarSSL dnl check for PolarSSL
dnl ---------------------------------------------------- dnl ----------------------------------------------------
@@ -1898,9 +1946,64 @@ if test "$OPENSSL_ENABLED" != "1" -a "$GNUTLS_ENABLED" != "1"; then
fi dnl OPENSSL != 1 -a GNUTLS_ENABLED != 1 fi dnl OPENSSL != 1 -a GNUTLS_ENABLED != 1
if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED" = "x"; then OPT_AXTLS=off
AC_ARG_WITH(axtls,dnl
AC_HELP_STRING([--with-axtls=PATH],[Where to look for axTLS, PATH points to the axTLS installation prefix (default: /usr/local). Ignored if another SSL engine is selected.])
AC_HELP_STRING([--without-axtls], [disable axTLS]),
OPT_AXTLS=$withval)
if test "$curl_ssl_msg" = "$init_ssl_msg"; then
if test X"$OPT_AXTLS" != Xno; then
dnl backup the pre-axtls variables
CLEANLDFLAGS="$LDFLAGS"
CLEANCPPFLAGS="$CPPFLAGS"
CLEANLIBS="$LIBS"
case "$OPT_AXTLS" in
yes)
dnl --with-axtls (without path) used
PREFIX_AXTLS=/usr/local
LIB_AXTLS="$PREFIX_AXTLS/lib"
LDFLAGS="$LDFLAGS -L$LIB_AXTLS"
CPPFLAGS="$CPPFLAGS -I$PREFIX_AXTLS/include"
;;
off)
dnl no --with-axtls option given, just check default places
PREFIX_AXTLS=
;;
*)
dnl check the given --with-axtls spot
PREFIX_AXTLS=$OPT_AXTLS
LIB_AXTLS="$PREFIX_AXTLS/lib"
LDFLAGS="$LDFLAGS -L$LIB_AXTLS"
CPPFLAGS="$CPPFLAGS -I$PREFIX_AXTLS/include"
;;
esac
AC_CHECK_LIB(axtls, ssl_version,[
LIBS="-laxtls $LIBS"
AC_DEFINE(USE_AXTLS, 1, [if axTLS is enabled])
AC_SUBST(USE_AXTLS, [1])
AXTLS_ENABLED=1
USE_AXTLS="yes"
curl_ssl_msg="enabled (axTLS)"
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$LIB_AXTLS"
export LD_LIBRARY_PATH
AC_MSG_NOTICE([Added $LIB_AXTLS to LD_LIBRARY_PATH])
],[
LDFLAGS="$CLEANLDFLAGS"
CPPFLAGS="$CLEANCPPFLAGS"
LIBS="$CLEANLIBS"
])
fi
fi
if test "x$OPENSSL_ENABLED$GNUTLS_ENABLED$NSS_ENABLED$POLARSSL_ENABLED$AXTLS_ENABLED" = "x"; then
AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.]) AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.])
AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-polarssl or --with-nss to address this.]) AC_MSG_WARN([Use --with-ssl, --with-gnutls, --with-polarssl, --with-nss or --with-axtls to address this.])
else else
# SSL is enabled, genericly # SSL is enabled, genericly
AC_SUBST(SSL_ENABLED) AC_SUBST(SSL_ENABLED)
@@ -1987,8 +2090,9 @@ if test X"$OPT_LIBSSH2" != Xno; then
dnl libssh2_version is a post 1.0 addition dnl libssh2_version is a post 1.0 addition
dnl libssh2_init and libssh2_exit were added in 1.2.5 dnl libssh2_init and libssh2_exit were added in 1.2.5
dnl libssh2_scp_send64 was added in 1.2.6 dnl libssh2_scp_send64 was added in 1.2.6
dnl libssh2_session_handshake was added in 1.2.8
AC_CHECK_FUNCS( libssh2_version libssh2_init libssh2_exit \ AC_CHECK_FUNCS( libssh2_version libssh2_init libssh2_exit \
libssh2_scp_send64 ) libssh2_scp_send64 libssh2_session_handshake)
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DIR_SSH2" LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DIR_SSH2"
export LD_LIBRARY_PATH export LD_LIBRARY_PATH
@@ -2030,11 +2134,16 @@ if test X"$OPT_LIBRTMP" != Xno; then
CPP_RTMP=`$PKGCONFIG --cflags-only-I librtmp` CPP_RTMP=`$PKGCONFIG --cflags-only-I librtmp`
version=`$PKGCONFIG --modversion librtmp` version=`$PKGCONFIG --modversion librtmp`
DIR_RTMP=`echo $LD_RTMP | $SED -e 's/-L//'` DIR_RTMP=`echo $LD_RTMP | $SED -e 's/-L//'`
else
dnl To avoid link errors, we do not allow --librtmp without
dnl a pkgconfig file
AC_MSG_ERROR([--librtmp was specified but could not find librtmp pkgconfig file.])
fi fi
;; ;;
off) off)
dnl no --with-librtmp option given, just check default places dnl no --with-librtmp option given, just check default places
LIB_RTMP="-lrtmp"
;; ;;
*) *)
dnl use the given --with-librtmp spot dnl use the given --with-librtmp spot
@@ -2053,13 +2162,19 @@ if test X"$OPT_LIBRTMP" != Xno; then
CPPFLAGS="$CPPFLAGS $CPP_RTMP" CPPFLAGS="$CPPFLAGS $CPP_RTMP"
LIBS="$LIBS $LIB_RTMP" LIBS="$LIBS $LIB_RTMP"
AC_CHECK_LIB(rtmp, RTMP_Init) AC_CHECK_LIB(rtmp, RTMP_Init,
[
AC_CHECK_HEADERS(librtmp/rtmp.h, AC_CHECK_HEADERS(librtmp/rtmp.h,
curl_rtmp_msg="enabled (librtmp)" curl_rtmp_msg="enabled (librtmp)"
LIBRTMP_ENABLED=1 LIBRTMP_ENABLED=1
AC_DEFINE(USE_LIBRTMP, 1, [if librtmp is in use]) AC_DEFINE(USE_LIBRTMP, 1, [if librtmp is in use])
AC_SUBST(USE_LIBRTMP, [1]) AC_SUBST(USE_LIBRTMP, [1])
)
],
dnl not found, revert back to clean variables
LDFLAGS=$CLEANLDFLAGS
CPPFLAGS=$CLEANCPPFLAGS
LIBS=$CLEANLIBS
) )
if test X"$OPT_LIBRTMP" != Xoff && if test X"$OPT_LIBRTMP" != Xoff &&
@@ -2067,12 +2182,6 @@ if test X"$OPT_LIBRTMP" != Xno; then
AC_MSG_ERROR([librtmp libs and/or directories were not found where specified!]) AC_MSG_ERROR([librtmp libs and/or directories were not found where specified!])
fi fi
if test "$LIBRTMP_ENABLED" != "1"; then
dnl no librtmp, revert back to clean variables
LDFLAGS=$CLEANLDFLAGS
CPPFLAGS=$CLEANCPPFLAGS
LIBS=$CLEANLIBS
fi
fi fi
dnl ********************************************************************** dnl **********************************************************************
@@ -2244,11 +2353,17 @@ AC_CHECK_TYPE(long long,
if test "xyes" = "x$longlong"; then if test "xyes" = "x$longlong"; then
AC_MSG_CHECKING([if numberLL works]) AC_MSG_CHECKING([if numberLL works])
AC_COMPILE_IFELSE([long long val = 1000LL;], AC_COMPILE_IFELSE([
[AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL])] AC_LANG_PROGRAM([[
AC_MSG_RESULT(yes), ]],[[
AC_MSG_RESULT(no) long long val = 1000LL;
) ]])
],[
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL])
],[
AC_MSG_RESULT([no])
])
fi fi
@@ -2295,6 +2410,7 @@ CURL_CHECK_FUNC_FCNTL
CURL_CHECK_FUNC_FDOPEN CURL_CHECK_FUNC_FDOPEN
CURL_CHECK_FUNC_FREEADDRINFO CURL_CHECK_FUNC_FREEADDRINFO
CURL_CHECK_FUNC_FREEIFADDRS CURL_CHECK_FUNC_FREEIFADDRS
CURL_CHECK_FUNC_FSETXATTR
CURL_CHECK_FUNC_FTRUNCATE CURL_CHECK_FUNC_FTRUNCATE
CURL_CHECK_FUNC_GETADDRINFO CURL_CHECK_FUNC_GETADDRINFO
CURL_CHECK_FUNC_GETHOSTBYADDR CURL_CHECK_FUNC_GETHOSTBYADDR
@@ -2335,10 +2451,6 @@ CURL_CHECK_FUNC_STRTOK_R
CURL_CHECK_FUNC_STRTOLL CURL_CHECK_FUNC_STRTOLL
CURL_CHECK_FUNC_WRITEV CURL_CHECK_FUNC_WRITEV
dnl Checks for library functions.
dnl AC_PROG_GCC_TRADITIONAL
dnl AC_FUNC_VPRINTF
case $host in case $host in
*msdosdjgpp) *msdosdjgpp)
ac_cv_func_pipe=no ac_cv_func_pipe=no
@@ -2461,7 +2573,8 @@ AM_CONDITIONAL(USE_MANUAL, test x"$USE_MANUAL" = x1)
CURL_CHECK_LIB_ARES CURL_CHECK_LIB_ARES
AM_CONDITIONAL(USE_EMBEDDED_ARES, test x$embedded_ares = xyes) AM_CONDITIONAL(USE_EMBEDDED_ARES, test x$embedded_ares = xyes)
if test "x$enable_shared" = "xyes"; then if test "x$ac_cv_native_windows" != "xyes" &&
test "x$enable_shared" = "xyes"; then
build_libhostname=yes build_libhostname=yes
else else
build_libhostname=no build_libhostname=no
@@ -2553,6 +2666,33 @@ AC_HELP_STRING([--disable-crypto-auth],[Disable cryptographic authentication]),
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
) )
dnl ************************************************************
dnl disable TLS-SRP authentication
dnl
AC_MSG_CHECKING([whether to enable TLS-SRP authentication])
AC_ARG_ENABLE(tls-srp,
AC_HELP_STRING([--enable-tls-srp],[Enable TLS-SRP authentication])
AC_HELP_STRING([--disable-tls-srp],[Disable TLS-SRP authentication]),
[ case "$enableval" in
no)
AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_TLS_SRP, 1, [to disable TLS-SRP authentication])
want_tls_srp=no
;;
*) AC_MSG_RESULT(yes)
want_tls_srp=yes
;;
esac ],
AC_MSG_RESULT(yes)
want_tls_srp=yes
)
if test "$want_tls_srp" = "yes" && test "x$HAVE_GNUTLS_SRP" = "x1"; then
AC_DEFINE(USE_TLS_SRP, 1, [Use TLS-SRP authentication])
USE_TLS_SRP=1
curl_tls_srp_msg="enabled"
fi
dnl ************************************************************ dnl ************************************************************
dnl disable cookies support dnl disable cookies support
dnl dnl
@@ -2701,6 +2841,9 @@ if test "x$USE_SSLEAY" = "x1" -o "x$USE_WINDOWS_SSPI" = "x1" \
-o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1"; then -o "x$GNUTLS_ENABLED" = "x1" -o "x$NSS_ENABLED" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM" SUPPORT_FEATURES="$SUPPORT_FEATURES NTLM"
fi fi
if test "x$USE_TLS_SRP" = "x1"; then
SUPPORT_FEATURES="$SUPPORT_FEATURES TLS-SRP"
fi
AC_SUBST(SUPPORT_FEATURES) AC_SUBST(SUPPORT_FEATURES)
@@ -2738,6 +2881,9 @@ fi
if test "x$CURL_DISABLE_TFTP" != "x1"; then if test "x$CURL_DISABLE_TFTP" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS TFTP" SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS TFTP"
fi fi
if test "x$CURL_DISABLE_GOPHER" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS GOPHER"
fi
if test "x$CURL_DISABLE_POP3" != "x1"; then if test "x$CURL_DISABLE_POP3" != "x1"; then
SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS POP3" SUPPORT_PROTOCOLS="$SUPPORT_PROTOCOLS POP3"
if test "x$SSL_ENABLED" = "x1"; then if test "x$SSL_ENABLED" = "x1"; then
@@ -2807,6 +2953,7 @@ AC_CONFIG_FILES([Makefile \
tests/data/Makefile \ tests/data/Makefile \
tests/server/Makefile \ tests/server/Makefile \
tests/libtest/Makefile \ tests/libtest/Makefile \
tests/unit/Makefile \
packages/Makefile \ packages/Makefile \
packages/Win32/Makefile \ packages/Win32/Makefile \
packages/Win32/cygwin/Makefile \ packages/Win32/cygwin/Makefile \
@@ -2826,6 +2973,8 @@ AC_CONFIG_FILES([Makefile \
]) ])
AC_OUTPUT AC_OUTPUT
CURL_GENERATE_CONFIGUREHELP_PM
AC_MSG_NOTICE([Configured to build curl/libcurl: AC_MSG_NOTICE([Configured to build curl/libcurl:
curl version: ${VERSION} curl version: ${VERSION}
@@ -2838,6 +2987,7 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
krb4 support: ${curl_krb4_msg} krb4 support: ${curl_krb4_msg}
GSSAPI support: ${curl_gss_msg} GSSAPI support: ${curl_gss_msg}
SPNEGO support: ${curl_spnego_msg} SPNEGO support: ${curl_spnego_msg}
TLS-SRP support: ${curl_tls_srp_msg}
resolver: ${curl_res_msg} resolver: ${curl_res_msg}
ipv6 support: ${curl_ipv6_msg} ipv6 support: ${curl_ipv6_msg}
IDN support: ${curl_idn_msg} IDN support: ${curl_idn_msg}

View File

@@ -189,7 +189,7 @@
3.2 How To Make a Patch with git 3.2 How To Make a Patch with git
You need to first checkout the respository: You need to first checkout the repository:
git clone git://github.com/bagder/curl.git git clone git://github.com/bagder/curl.git

137
docs/FAQ
View File

@@ -1,4 +1,4 @@
Updated: June 30, 2010 (http://curl.haxx.se/docs/faq.html) Updated: January 29, 2011 (http://curl.haxx.se/docs/faq.html)
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@@ -20,6 +20,8 @@ FAQ
1.10 How many are using curl? 1.10 How many are using curl?
1.11 Why don't you update ca-bundle.crt 1.11 Why don't you update ca-bundle.crt
1.12 I have a problem who can I chat with? 1.12 I have a problem who can I chat with?
1.13 curl's ECCN number?
1.14 How do I submit my patch?
2. Install Related Problems 2. Install Related Problems
2.1 configure doesn't find OpenSSL even when it is installed 2.1 configure doesn't find OpenSSL even when it is installed
@@ -48,6 +50,7 @@ FAQ
3.16 What certificates do I need when I use SSL? 3.16 What certificates do I need when I use SSL?
3.17 How do I list the root dir of an FTP server? 3.17 How do I list the root dir of an FTP server?
3.18 Can I use curl to send a POST/PUT and not wait for a response? 3.18 Can I use curl to send a POST/PUT and not wait for a response?
3.19 How do I get HTTP from a host using a specific IP address?
4. Running Problems 4. Running Problems
4.1 Problems connecting to SSL servers. 4.1 Problems connecting to SSL servers.
@@ -123,8 +126,10 @@ FAQ
libcurl libcurl
A free and easy-to-use client-side URL transfer library, supporting FTP, A free and easy-to-use client-side URL transfer library, supporting DICT,
FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE, LDAP and LDAPS. FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3,
POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP.
libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading, libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading,
kerberos, HTTP form based upload, proxies, cookies, user+password kerberos, HTTP form based upload, proxies, cookies, user+password
authentication, file transfer resume, http proxy tunneling and more! authentication, file transfer resume, http proxy tunneling and more!
@@ -142,9 +147,8 @@ FAQ
A command line tool for getting or sending files using URL syntax. A command line tool for getting or sending files using URL syntax.
Since curl uses libcurl, it supports a range of common Internet protocols, Since curl uses libcurl, curl supports the same wide range of common
currently including HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, LDAPS, Internet protocols that libcurl does.
DICT, TELNET and FILE.
We pronounce curl and cURL with an initial k sound: [kurl]. We pronounce curl and cURL with an initial k sound: [kurl].
@@ -308,9 +312,9 @@ FAQ
as used by numerous applications that include libcurl binaries in their as used by numerous applications that include libcurl binaries in their
distribution packages (like Adobe Acrobat Reader and Google Earth). distribution packages (like Adobe Acrobat Reader and Google Earth).
More than 90 known named companies use curl in commercial environments and More than a hundred known named companies use curl in commercial
products. More than 100 known named open source projects depend on environments and products and more than a hundred known named open source
(lib)curl. projects depend on (lib)curl.
In a poll on the curl web site mid-2005, more than 50% of the 300+ answers In a poll on the curl web site mid-2005, more than 50% of the 300+ answers
estimated a user base of one million users or more. estimated a user base of one million users or more.
@@ -320,6 +324,12 @@ FAQ
based web servers. A guess is that a fair amount of these Linux based web servers. A guess is that a fair amount of these Linux
installations have curl installed. installations have curl installed.
The Debian project maintains statistics on packages installed by people
who have voluntarily run their package counting application. In mid-2010,
libcurl3 was installed on over 55000 such systems (62% of reporting systems)
and was one of the 320 most popular installed packages (out of about 107000
possible packages).
All this taken together, there is no doubt that there are millions of All this taken together, there is no doubt that there are millions of
(lib)curl users. (lib)curl users.
@@ -328,6 +338,7 @@ FAQ
http://curl.haxx.se/libcurl/using/apps.html http://curl.haxx.se/libcurl/using/apps.html
http://counter.li.org/estimates.php http://counter.li.org/estimates.php
http://news.netcraft.com/archives/2005/03/14/fedora_makes_rapid_progress.html http://news.netcraft.com/archives/2005/03/14/fedora_makes_rapid_progress.html
http://qa.debian.org/popcon.php?package=curl
1.11 Why don't you update ca-bundle.crt 1.11 Why don't you update ca-bundle.crt
@@ -358,6 +369,41 @@ FAQ
IRC network irc.freenode.net. If you're polite and nice, chances are big IRC network irc.freenode.net. If you're polite and nice, chances are big
that you can get -- or provide -- help instantly. that you can get -- or provide -- help instantly.
1.13 curl's ECCN number?
The US government restricts exports of software that contains or uses
cryptography. When doing so, the Export Control Classification Number (ECCN)
is used to identify the level of export control etc.
ASF gives a good explanation at http://www.apache.org/dev/crypto.html
We believe curl's number might be ECCN 5D002, another possibility is
5D992. It seems necessary to write them, asking to confirm.
Comprehensible explanations of the meaning of such numbers and how to
obtain them (resp.) are here
http://www.bis.doc.gov/licensing/exportingbasics.htm
http://www.bis.doc.gov/licensing/do_i_needaneccn.html
An incomprehensible description of the two numbers above is here
http://www.access.gpo.gov/bis/ear/pdf/ccl5-pt2.pdf
1.14 How do I submit my patch?
When you have made a patch or a change of whatever sort, and want to submit
that to the project, there are a few different ways we prefer:
o send a patch to the curl-library mailing list. We're many subscribers
there and there are lots of people who can review patches, comment on them
and "receive" them properly.
o if your patch changes or fixes a bug, you can also opt to submit a bug
report in the bug tracker and attach your patch there. There are less
people involved there.
Lots of more details are found in the CONTRIBUTE and INTERNALS docs.
2. Install Related Problems 2. Install Related Problems
@@ -400,10 +446,10 @@ FAQ
2.2 Does curl work/build with other SSL libraries? 2.2 Does curl work/build with other SSL libraries?
Curl has been written to use OpenSSL, GnuTLS, yassl, NSS or PolarSSL, Curl has been written to use OpenSSL, GnuTLS, yassl, NSS, PolarSSL, axTLS or
although there should not be many problems using a different library. If qssl, although there should not be many problems using a different
anyone does "port" curl to use a different SSL library, we are of course library. If anyone does "port" curl to use a different SSL library, we are
very interested in getting the patch! of course very interested in getting the patch!
2.3 Where can I find a copy of LIBEAY32.DLL? 2.3 Where can I find a copy of LIBEAY32.DLL?
@@ -615,6 +661,9 @@ FAQ
provide this in order to prove that you actually are who you claim to be. provide this in order to prove that you actually are who you claim to be.
If the server doesn't require this, you don't need a client certificate. If the server doesn't require this, you don't need a client certificate.
A client certificate is always used together with a private key, and the
private key has a pass phrase that protects it.
- Server certificate. The server you communicate with has a server - Server certificate. The server you communicate with has a server
certificate. You can and should verify this certificate to make sure that certificate. You can and should verify this certificate to make sure that
you are truly talking to the real server and not a server impersonating you are truly talking to the real server and not a server impersonating
@@ -622,8 +671,9 @@ FAQ
- Certificate Authority certificate ("CA cert"). You often have several CA - Certificate Authority certificate ("CA cert"). You often have several CA
certs in a CA cert bundle that can be used to verify a server certificate certs in a CA cert bundle that can be used to verify a server certificate
that was signed by one of the authorities in the bundle. curl comes with a that was signed by one of the authorities in the bundle. curl does not
default CA cert bundle. You can override the default. come with a CA cert bundle but most curl installs provide one. You can
also override the default.
The server certificate verification process is made by using a Certificate The server certificate verification process is made by using a Certificate
Authority certificate ("CA cert") that was used to sign the server Authority certificate ("CA cert") that was used to sign the server
@@ -654,6 +704,17 @@ FAQ
But you could easily write your own program using libcurl to do such stunts. But you could easily write your own program using libcurl to do such stunts.
3.19 How do I get HTTP from a host using a specific IP address?
For example, you may be trying out a web site installation that isn't yet in
the DNS. Or you have a site using multiple IP addresses for a given host
name and you want to address a specific one out of the set.
Set a custom Host: header that identifies the server name you want to reach
but use the target IP address in the URL:
curl --header "Host: www.example.com" http://127.0.0.1/
4. Running Problems 4. Running Problems
@@ -802,10 +863,8 @@ FAQ
4.9 Curl can't authenticate to the server that requires NTLM? 4.9 Curl can't authenticate to the server that requires NTLM?
This is supported in curl 7.10.6 or later. No earlier curl version knows NTLM support requires OpenSSL, GnuTLS, NSS or Microsoft Windows libraries at
of this magic. Later versions require the OpenSSL, GnuTLS or Microsoft build-time to provide this functionality.
Windows libraries to provide this functionality. Using the NSS library
will not provide NTLM authentication functionality in curl.
NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You
should not use such ones. should not use such ones.
@@ -1070,11 +1129,14 @@ FAQ
When building an application that uses the static libcurl library, you must When building an application that uses the static libcurl library, you must
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
dynamic import symbols. If you get linker error like "unknown symbol dynamic import symbols. If you're using Visual Studio, you need to instead
__imp__curl_easy_init ..." you have linked against the wrong (static) add CURL_STATICLIB in the "Preprocessor Definitions" section.
library. If you want to use the libcurl.dll and import lib, you don't need
any extra CFLAGS, but use one of the import libraries below. These are the If you get linker error like "unknown symbol __imp__curl_easy_init ..." you
libraries produced by the various lib/Makefile.* files: have linked against the wrong (static) library. If you want to use the
libcurl.dll and import lib, you don't need any extra CFLAGS, but use one of
the import libraries below. These are the libraries produced by the various
lib/Makefile.* files:
Target: static lib. import lib for libcurl*.dll. Target: static lib. import lib for libcurl*.dll.
----------------------------------------------------------- -----------------------------------------------------------
@@ -1162,16 +1224,18 @@ FAQ
5.13 How do I stop an ongoing transfer? 5.13 How do I stop an ongoing transfer?
There are several ways, but none of them are instant. There is no function With the easy interface you make sure to return the correct error code from
you can call from another thread or similar that will stop it immediately. one of the callbacks, but none of them are instant. There is no function you
can call from another thread or similar that will stop it immediately.
Instead you need to make sure that one of the callbacks you use return an Instead you need to make sure that one of the callbacks you use return an
appropriate value that will stop the transfer. appropriate value that will stop the transfer.
Suitable callbacks that you can do this with include the progress callback, Suitable callbacks that you can do this with include the progress callback,
the read callback and the write callback. the read callback and the write callback.
If you're using the multi interface, you also stop a transfer by removing If you're using the multi interface, you can also stop a transfer by
the particular easy handle from the multi stack. removing the particular easy handle from the multi stack. At any moment you
think the transfer is done.
5.14 Using C++ non-static functions for callbacks? 5.14 Using C++ non-static functions for callbacks?
@@ -1222,7 +1286,10 @@ FAQ
this section was much enhanced by Bjorn Reese.) this section was much enhanced by Bjorn Reese.)
We are not lawyers and this is not legal advice. You should probably consult We are not lawyers and this is not legal advice. You should probably consult
one if you want true and accurate legal insights without our prejudice. one if you want true and accurate legal insights without our prejudice. Note
especially that this section concerns the libcurl license only; compiling in
features of libcurl that depend on other libraries (e.g. OpenSSL) may affect
the licensing obligations of your application.
6.1 I have a GPL program, can I use the libcurl library? 6.1 I have a GPL program, can I use the libcurl library?
@@ -1280,12 +1347,16 @@ FAQ
You do not have to reveal or make public any changes to the libcurl source You do not have to reveal or make public any changes to the libcurl source
code. code.
You do not have to reveal or make public that you are using libcurl within You do not have to broadcast to the world that you are using libcurl within
your app. your app.
As can be seen here: http://curl.haxx.se/docs/companies.html and All we ask is that you disclose "the copyright notice and this permission
elsewhere, more and more companies are discovering the power notice" somewhere. Most probably like in the documentation or in the section
of libcurl and take advantage of it even in commercial environments. where other third party dependencies already are mentioned and acknowledged.
As can be seen here: http://curl.haxx.se/docs/companies.html and elsewhere,
more and more companies are discovering the power of libcurl and take
advantage of it even in commercial environments.
7. PHP/CURL Issues 7. PHP/CURL Issues

View File

@@ -125,7 +125,7 @@ FILE
FOOTNOTES FOOTNOTES
========= =========
*1 = requires OpenSSL, GnuTLS, NSS, yassl or PolarSSL *1 = requires OpenSSL, GnuTLS, NSS, yassl, axTLS or PolarSSL
*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

View File

@@ -161,6 +161,12 @@ December 2005:
security vulnerability: libcurl URL Buffer Overflow security vulnerability: libcurl URL Buffer Overflow
January 2006:
We dropped support for Gopher. We found bugs in the implementation that
turned out having been introduced years ago, so with the conclusion that
nobody had found out in all this time we removed it instead of fixing it.
March 2006: March 2006:
security vulnerability: libcurl TFTP Packet Buffer Overflow security vulnerability: libcurl TFTP Packet Buffer Overflow
@@ -235,3 +241,4 @@ August 2010:
Known libcurl bindings: 39 Known libcurl bindings: 39
Contributors: 808 Contributors: 808
Gopher support added (re-added actually)

View File

@@ -142,6 +142,9 @@ UNIX
To build with PolarSSL support instead of OpenSSL for SSL/TLS, note that To build with PolarSSL support instead of OpenSSL for SSL/TLS, note that
you need to use both --without-ssl and --with-polarssl. you need to use both --without-ssl and --with-polarssl.
To build with axTLS support instead of OpenSSL for TLS, note that you
need to use both --without-ssl and --with-axtls.
To get GSSAPI support, build with --with-gssapi and have the MIT or To get GSSAPI support, build with --with-gssapi and have the MIT or
Heimdal Kerberos 5 packages installed. Heimdal Kerberos 5 packages installed.
@@ -208,9 +211,9 @@ Win32
adjust as necessary. It is also possible to override these paths with adjust as necessary. It is also possible to override these paths with
environment variables, for example: environment variables, for example:
set ZLIB_PATH=c:\zlib-1.2.3 set ZLIB_PATH=c:\zlib-1.2.5
set OPENSSL_PATH=c:\openssl-0.9.8k set OPENSSL_PATH=c:\openssl-0.9.8r
set LIBSSH2_PATH=c:\libssh2-1.1 set LIBSSH2_PATH=c:\libssh2-1.2.7
ATTENTION: if you want to build with libssh2 support you have to use latest ATTENTION: if you want to build with libssh2 support you have to use latest
version 0.17 - previous versions will NOT work with 7.17.0 and later! version 0.17 - previous versions will NOT work with 7.17.0 and later!
@@ -229,7 +232,7 @@ Win32
If you want to enable LDAPS support then set LDAPS=1. If you want to enable LDAPS support then set LDAPS=1.
- optional MingW32-built OpenlDAP SDK available from: - optional MingW32-built OpenLDAP SDK available from:
http://www.gknw.net/mirror/openldap/ http://www.gknw.net/mirror/openldap/
- optional recent Novell CLDAP SDK available from: - optional recent Novell CLDAP SDK available from:
http://developer.novell.com/ndk/cldap.htm http://developer.novell.com/ndk/cldap.htm
@@ -311,7 +314,7 @@ Win32
documentation on how to compile zlib. Define the ZLIB_PATH environment documentation on how to compile zlib. Define the ZLIB_PATH environment
variable to the location of zlib.h and zlib.lib, for example: variable to the location of zlib.h and zlib.lib, for example:
set ZLIB_PATH=c:\zlib-1.2.3 set ZLIB_PATH=c:\zlib-1.2.5
Then run 'nmake vc-zlib' in curl's root directory. Then run 'nmake vc-zlib' in curl's root directory.
@@ -325,7 +328,7 @@ Win32
Before running nmake define the OPENSSL_PATH environment variable with Before running nmake define the OPENSSL_PATH environment variable with
the root/base directory of OpenSSL, for example: the root/base directory of OpenSSL, for example:
set OPENSSL_PATH=c:\openssl-0.9.8k set OPENSSL_PATH=c:\openssl-0.9.8q
Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root
directory. 'nmake vc-ssl' will create a libcurl static and dynamic directory. 'nmake vc-ssl' will create a libcurl static and dynamic
@@ -374,30 +377,49 @@ Win32
Borland C++ compiler Borland C++ compiler
--------------------- ---------------------
compile openssl Ensure that your build environment is properly set up to use the compiler
and associated tools. PATH environment variable must include the path to
bin subdirectory of your compiler installation, eg: c:\Borland\BCC55\bin
Make sure you include the paths to curl/include and openssl/inc32 in It is advisable to set environment variable BCCDIR to the base path of
your bcc32.cnf file the compiler installation.
eg : -I"c:\Bcc55\include;c:\path_curl\include;c:\path_openssl\inc32" set BCCDIR=c:\Borland\BCC55
Check to make sure that all of the sources listed in lib/Makefile.b32 In order to build a plain vanilla version of curl and libcurl run the
are present in the /path_to_curl/lib directory. (Check the src following command from curl's root directory:
directory for missing ones.)
Make sure the environment variable "BCCDIR" is set to the install make borland
location for the compiler eg : c:\Borland\BCC55
command line: To build curl and libcurl with zlib and OpenSSL support set environment
make -f /path_to_curl/lib/Makefile-ssl.b32 variables ZLIB_PATH and OPENSSL_PATH to the base subdirectories of the
already built zlib and OpenSSL libraries and from curl's root directory
run command:
compile simplessl.c with appropriate links make borland-ssl-zlib
libcurl library will be built in 'lib' subdirectory while curl tool
is built in 'src' subdirectory. In order to use libcurl library it is
advisable to modify compiler's configuration file bcc32.cfg located
in c:\Borland\BCC55\bin to reflect the location of libraries include
paths for example the '-I' line could result in something like:
-I"c:\Borland\BCC55\include;c:\curl\include;c:\openssl\inc32"
bcc3.cfg '-L' line could also be modified to reflect the location of
of libcurl library resulting for example:
-L"c:\Borland\BCC55\lib;c:\curl\lib;c:\openssl\out32"
In order to build sample program 'simple.c' from the docs\examples
subdirectory run following command from mentioned subdirectory:
bcc32 simple.c libcurl.lib cw32mt.lib
In order to build sample program simplessl.c an SSL enabled libcurl
is required, as well as the OpenSSL libeay32.lib and ssleay32.lib
libraries.
c:\curl\docs\examples\> bcc32 -L c:\path_to_curl\lib\libcurl.lib
-L c:\borland\bcc55\lib\psdk\ws2_32.lib
-L c:\openssl\out32\libeay32.lib
-L c:\openssl\out32\ssleay32.lib
simplessl.c
OTHER MSVC IDEs OTHER MSVC IDEs
--------------- ---------------
@@ -638,7 +660,7 @@ NetWare
Builds automatically created 8 times a day from current git are here: Builds automatically created 8 times a day from current git are here:
http://www.gknw.net/mirror/curl/autobuilds/ http://www.gknw.net/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/dev/builds.html
eCos eCos
@@ -980,10 +1002,21 @@ PORTS
Useful URLs Useful URLs
=========== ===========
OpenSSL http://www.openssl.org axTLS http://axtls.sourceforge.net/
MingW http://www.mingw.org c-ares http://c-ares.haxx.se/
OpenLDAP http://www.openldap.org GNU GSS http://www.gnu.org/software/gss/
Zlib http://www.gzip.org/zlib/ GnuTLS http://www.gnu.org/software/gnutls/
libssh2 http://www.libssh2.org Heimdal http://www.pdc.kth.se/heimdal/
libidn http://www.gnu.org/software/libidn/
libssh2 http://www.libssh2.org/
MIT Kerberos http://web.mit.edu/kerberos/www/dist/
NSS http://www.mozilla.org/projects/security/pki/nss/
OpenLDAP http://www.openldap.org/
OpenSSL http://www.openssl.org/
PolarSSL http://polarssl.org/
yassl http://www.yassl.com/
Zlib http://www.zlib.net/
MingW http://www.mingw.org/
MinGW-w64 http://mingw-w64.sourceforge.net/
OpenWatcom http://www.openwatcom.org/

View File

@@ -15,7 +15,7 @@ INTERNALS
GIT GIT
=== ===
All changes to the sources are committed to the git repository as soon as All changes to the sources are committed to the git repository as soon as
they're somewhat verified to work. Changes shall be commited as independently they're somewhat verified to work. Changes shall be committed as independently
as possible so that individual changes can be easier spotted and tracked as possible so that individual changes can be easier spotted and tracked
afterwards. afterwards.
@@ -37,13 +37,14 @@ Portability
GnuTLS 1.2 GnuTLS 1.2
zlib 1.1.4 zlib 1.1.4
libssh2 0.16 libssh2 0.16
c-ares 1.5.0 c-ares 1.6.0
libidn 0.4.1 libidn 0.4.1
*yassl 1.4.0 (http://curl.haxx.se/mail/lib-2008-02/0093.html) *yassl 1.4.0 (http://curl.haxx.se/mail/lib-2008-02/0093.html)
openldap 2.0 openldap 2.0
MIT krb5 lib 1.2.4 MIT krb5 lib 1.2.4
qsossl V5R2M0 qsossl V5R2M0
NSS 3.11.x NSS 3.11.x
axTLS 1.2.7
Heimdal ? Heimdal ?
* = only partly functional, but that's due to bugs in the third party lib, not * = only partly functional, but that's due to bugs in the third party lib, not
@@ -90,7 +91,7 @@ Windows vs Unix
do it etc there might be reasons for applications to alter that behaviour. do it etc there might be reasons for applications to alter that behaviour.
3. The file descriptors for network communication and file operations are 3. The file descriptors for network communication and file operations are
not easily interchangable as in unix. not easily interchangeable as in unix.
We avoid this by not trying any funny tricks on file descriptors. We avoid this by not trying any funny tricks on file descriptors.
@@ -182,7 +183,7 @@ Library
Some time during the DO function, the Curl_setup_transfer() function must Some time during the DO function, the Curl_setup_transfer() function must
be called with some basic info about the upcoming transfer: what socket(s) be called with some basic info about the upcoming transfer: what socket(s)
to read/write and the expected file tranfer sizes (if known). to read/write and the expected file transfer sizes (if known).
o Transfer() o Transfer()
@@ -224,15 +225,15 @@ Library
A quick roundup on internal function sequences (many of these call A quick roundup on internal function sequences (many of these call
protocol-specific function-pointers): protocol-specific function-pointers):
curl_connect - connects to a remote site and does initial connect fluff Curl_connect - connects to a remote site and does initial connect fluff
This also checks for an existing connection to the requested site and uses This also checks for an existing connection to the requested site and uses
that one if it is possible. that one if it is possible.
curl_do - starts a transfer Curl_do - starts a transfer
curl_transfer() - transfers data Curl_handler::do_it() - transfers data
curl_done - ends a transfer Curl_done - ends a transfer
curl_disconnect - disconnects from a remote site. This is called when the Curl_disconnect - disconnects from a remote site. This is called when the
disconnect is really requested, which doesn't necessarily have to be disconnect is really requested, which doesn't necessarily have to be
exactly after curl_done in case we want to keep the connection open for exactly after curl_done in case we want to keep the connection open for
a while. a while.
@@ -249,13 +250,13 @@ Library
HTTPS uses in almost every means the same procedure as HTTP, with only two HTTPS uses in almost every means the same procedure as HTTP, with only two
exceptions: the connect procedure is different and the function used to read exceptions: the connect procedure is different and the function used to read
or write from the socket is different, although the latter fact is hidden in or write from the socket is different, although the latter fact is hidden in
the source by the use of curl_read() for reading and curl_write() for writing the source by the use of Curl_read() for reading and Curl_write() for writing
data to the remote server. data to the remote server.
http_chunks.c contains functions that understands HTTP 1.1 chunked transfer http_chunks.c contains functions that understands HTTP 1.1 chunked transfer
encoding. encoding.
An interesting detail with the HTTP(S) request, is the add_buffer() series of An interesting detail with the HTTP(S) request, is the Curl_add_buffer() series of
functions we use. They append data to one single buffer, and when the functions we use. They append data to one single buffer, and when the
building is done the entire request is sent off in one single write. This is building is done the entire request is sent off in one single write. This is
done this way to overcome problems with flawed firewalls and lame servers. done this way to overcome problems with flawed firewalls and lame servers.
@@ -291,7 +292,7 @@ Library
URL encoding and decoding, called escaping and unescaping in the source code, URL encoding and decoding, called escaping and unescaping in the source code,
is found in lib/escape.c. is found in lib/escape.c.
While transfering data in Transfer() a few functions might get used. While transferring data in Transfer() a few functions might get used.
curl_getdate() in lib/parsedate.c is for HTTP date comparisons (and more). curl_getdate() in lib/parsedate.c is for HTTP date comparisons (and more).
lib/getenv.c offers curl_getenv() which is for reading environment variables lib/getenv.c offers curl_getenv() which is for reading environment variables
@@ -303,7 +304,7 @@ Library
lib/netrc.c holds the .netrc parser lib/netrc.c holds the .netrc parser
lib/timeval.c features replacement functions for systems that don't have lib/timeval.c features replacement functions for systems that don't have
gettimeofday() and a few support functions for timeval convertions. gettimeofday() and a few support functions for timeval conversions.
A function named curl_version() that returns the full curl version string is A function named curl_version() that returns the full curl version string is
found in lib/version.c. found in lib/version.c.
@@ -356,8 +357,10 @@ multi interface/non-blocking
The FTP and the SFTP/SCP protocols are thus perfect examples of how we adapt The FTP and the SFTP/SCP protocols are thus perfect examples of how we adapt
and adjust the code to allow non-blocking operations even on multi-stage and adjust the code to allow non-blocking operations even on multi-stage
protocols. The DICT, LDAP and TELNET are crappy examples and they are subject protocols. They are built around state machines that return when they could
for rewrite in the future to better fit the libcurl protocol family. block waiting for data. The DICT, LDAP and TELNET protocols are crappy
examples and they are subject for rewrite in the future to better fit the
libcurl protocol family.
SSL libraries SSL libraries
============= =============
@@ -379,7 +382,9 @@ Library Symbols
All symbols used internally in libcurl must use a 'Curl_' prefix if they're All symbols used internally in libcurl must use a 'Curl_' prefix if they're
used in more than a single file. Single-file symbols must be made static. used in more than a single file. Single-file symbols must be made static.
Public ("exported") symbols must use a 'curl_' prefix. (There are exceptions, Public ("exported") symbols must use a 'curl_' prefix. (There are exceptions,
but they are to be changed to follow this pattern in future versions.) but they are to be changed to follow this pattern in future versions.) Public
API functions are marked with CURL_EXTERN in the public header files so that
all others can be hidden on platforms where this is possible.
Return Codes and Informationals Return Codes and Informationals
=============================== ===============================
@@ -462,15 +467,15 @@ Test Suite
subdirectory directly off the root in the curl archive tree, and it contains subdirectory directly off the root in the curl archive tree, and it contains
a bunch of scripts and a lot of test case data. a bunch of scripts and a lot of test case data.
The main test script is runtests.pl that will invoke the two servers The main test script is runtests.pl that will invoke test servers like
httpserver.pl and ftpserver.pl before all the test cases are performed. The httpserver.pl and ftpserver.pl before all the test cases are performed. The
test suite currently only runs on unix-like platforms. test suite currently only runs on unix-like platforms.
You'll find a complete description of the test case data files in the You'll find a description of the test suite in the tests/README file, and the
tests/README file. test case data files in the tests/FILEFORMAT file.
The test suite automatically detects if curl was built with the memory The test suite automatically detects if curl was built with the memory
debugging enabled, and if it was it will detect memory leaks too. debugging enabled, and if it was it will detect memory leaks, too.
Building Releases Building Releases
================= =================

View File

@@ -54,11 +54,6 @@ may have been fixed since this was written!
handle with curl_easy_cleanup() and create a new. Some more details: handle with curl_easy_cleanup() and create a new. Some more details:
http://curl.haxx.se/mail/lib-2009-04/0300.html http://curl.haxx.se/mail/lib-2009-04/0300.html
62. CURLOPT_TIMEOUT does not work properly with the regular multi and
multi_socket interfaces. The work-around for apps is to simply remove the
easy handle once the time is up. See also:
http://curl.haxx.se/bug/view.cgi?id=2501457
61. If an upload using Expect: 100-continue receives an HTTP 417 response, 61. If an upload using Expect: 100-continue receives an HTTP 417 response,
it ought to be automatically resent without the Expect:. A workaround is it ought to be automatically resent without the Expect:. A workaround is
for the client application to redo the transfer after disabling Expect:. for the client application to redo the transfer after disabling Expect:.

View File

@@ -55,6 +55,10 @@ NSS http://www.mozilla.org/projects/security/pki/nss/
grant you different permissions and impose different obligations. You grant you different permissions and impose different obligations. You
should select the license that best meets your needs. should select the license that best meets your needs.
axTLS http://axtls.sourceforge.net/
(May be used for SSL/TLS support) Uses a Modified BSD-style license.
c-ares http://daniel.haxx.se/projects/c-ares/license.html c-ares http://daniel.haxx.se/projects/c-ares/license.html
(Used for asynchronous name resolves) Uses an MIT license that is very (Used for asynchronous name resolves) Uses an MIT license that is very

View File

@@ -6,6 +6,7 @@
Aaron Oneal Aaron Oneal
Adam D. Moss Adam D. Moss
Adam Light
Adam Piggott Adam Piggott
Adrian Schuur Adrian Schuur
Akos Pasztory Akos Pasztory
@@ -29,6 +30,7 @@ Alexey Borzov
Alexey Pesternikov Alexey Pesternikov
Alexey Simak Alexey Simak
Alexis Carvalho Alexis Carvalho
Alfred Gebert
Allen Pulsifer Allen Pulsifer
Amol Pattekar Amol Pattekar
Anatoli Tubman Anatoli Tubman
@@ -72,6 +74,7 @@ Axel Tillequin
Balint Szilakszi Balint Szilakszi
Bart Whiteley Bart Whiteley
Bas Mevissen Bas Mevissen
Ben Darnell
Ben Greear Ben Greear
Ben Madsen Ben Madsen
Ben Van Hof Ben Van Hof
@@ -100,6 +103,7 @@ Brock Noland
Bruce Mitchener Bruce Mitchener
Bryan Henderson Bryan Henderson
Bryan Kemp Bryan Kemp
Cameron Kaiser
Camille Moncelier Camille Moncelier
Caolan McNamara Caolan McNamara
Carsten Lange Carsten Lange
@@ -145,6 +149,7 @@ Damien Adant
Dan Becker Dan Becker
Dan C Dan C
Dan Fandrich Dan Fandrich
Dan Locks
Dan Nelson Dan Nelson
Dan Petitt Dan Petitt
Dan Torop Dan Torop
@@ -190,10 +195,12 @@ Detlef Schmier
Didier Brisebourg Didier Brisebourg
Diego Casorran Diego Casorran
Dima Barsky Dima Barsky
Dimitre Dimitrov
Dimitris Sarris Dimitris Sarris
Dinar Dinar
Dirk Eddelbuettel Dirk Eddelbuettel
Dirk Manske Dirk Manske
Dmitri Shubin
Dmitriy Sergeyev Dmitriy Sergeyev
Dmitry Bartsevich Dmitry Bartsevich
Dmitry Kurochkin Dmitry Kurochkin
@@ -302,9 +309,12 @@ Hardeep Singh
Harshal Pradhan Harshal Pradhan
Hauke Duden Hauke Duden
Heikki Korpela Heikki Korpela
Heinrich Ko
Hendrik Visage
Henrik Storner Henrik Storner
Hidemoto Nakada Hidemoto Nakada
Hoi-Ho Chan Hoi-Ho Chan
Hongli Lai
Howard Chu Howard Chu
Hzhijun Hzhijun
Ian Ford Ian Ford
@@ -339,6 +349,7 @@ Jamie Lokier
Jamie Newton Jamie Newton
Jamie Wilkinson Jamie Wilkinson
Jan Kunder Jan Kunder
Jan Van Boghout
Jared Lundell Jared Lundell
Jari Sundell Jari Sundell
Jason McDonald Jason McDonald
@@ -389,6 +400,7 @@ John-Mark Bell
Johnny Luong Johnny Luong
Jon Grubbs Jon Grubbs
Jon Nelson Jon Nelson
Jon Sargeant
Jon Travis Jon Travis
Jon Turner Jon Turner
Jonas Forsman Jonas Forsman
@@ -514,7 +526,9 @@ Matt Witherspoon
Matt Wixson Matt Wixson
Matthew Blain Matthew Blain
Matthew Clarke Matthew Clarke
Matthias Bolte
Maurice Barnum Maurice Barnum
Mauro Iorio
Max Katsev Max Katsev
Maxim Ivanov Maxim Ivanov
Maxim Perenesenko Maxim Perenesenko
@@ -532,14 +546,17 @@ Michael Smith
Michael Stillwell Michael Stillwell
Michael Wallner Michael Wallner
Michal Bonino Michal Bonino
Michal Gorny
Michal Marek Michal Marek
Michele Bini Michele Bini
Mihai Ionescu Mihai Ionescu
Mikael Johansson
Mikael Sennerholm Mikael Sennerholm
Mike Bytnar Mike Bytnar
Mike Crowe Mike Crowe
Mike Dobbs Mike Dobbs
Mike Hommey Mike Hommey
Mike Power
Mike Protts Mike Protts
Mike Revi Mike Revi
Miklos Nemeth Miklos Nemeth
@@ -566,6 +583,7 @@ Nikita Schmidt
Nikitinskit Dmitriy Nikitinskit Dmitriy
Niklas Angebrand Niklas Angebrand
Nikolai Kondrashov Nikolai Kondrashov
Ning Dong
Nir Soffer Nir Soffer
Nis Jorgensen Nis Jorgensen
Nodak Sodak Nodak Sodak
@@ -621,10 +639,12 @@ Philippe Raoult
Philippe Vaucher Philippe Vaucher
Pierre Pierre
Pierre Brico Pierre Brico
Pierre Joye
Pooyan McSporran Pooyan McSporran
Pramod Sharma Pramod Sharma
Puneet Pawaia Puneet Pawaia
Quagmire Quagmire
Quanah Gibson-Mount
Rafa Muyo Rafa Muyo
Rafael Sagula Rafael Sagula
Rainer Canavan Rainer Canavan
@@ -665,6 +685,7 @@ Robert Foreman
Robert Iakobashvili Robert Iakobashvili
Robert Olson Robert Olson
Robert Weaver Robert Weaver
Robin Cornelius
Robin Johnson Robin Johnson
Robin Kay Robin Kay
Robson Braga Araujo Robson Braga Araujo
@@ -679,6 +700,7 @@ Rosimildo da Silva
Roy Shan Roy Shan
Rune Kleveland Rune Kleveland
Ruslan Gazizov Ruslan Gazizov
Rutger Hofman
Ryan Chan Ryan Chan
Ryan Nelson Ryan Nelson
S. Moonesamy S. Moonesamy
@@ -705,6 +727,7 @@ Shard
Shawn Poulson Shawn Poulson
Shmulik Regev Shmulik Regev
Siddhartha Prakash Jain Siddhartha Prakash Jain
Sidney San Martin
Siegfried Gyuricsko Siegfried Gyuricsko
Simon Dick Simon Dick
Simon Josefsson Simon Josefsson
@@ -718,6 +741,7 @@ Stan van de Burgt
Stefan Esser Stefan Esser
Stefan Krause Stefan Krause
Stefan Teleman Stefan Teleman
Stefan Tomanek
Stefan Ulrich Stefan Ulrich
Stephan Bergmann Stephan Bergmann
Stephen Collyer Stephen Collyer
@@ -752,6 +776,7 @@ Tim Baker
Tim Bartley Tim Bartley
Tim Chen Tim Chen
Tim Costello Tim Costello
Tim Newsome
Tim Sneddon Tim Sneddon
Tobias Rundstr<74>m Tobias Rundstr<74>m
Toby Peterson Toby Peterson
@@ -790,6 +815,7 @@ Vincent Le Normand
Vincent Penquerc'h Vincent Penquerc'h
Vincent Sanders Vincent Sanders
Vlad Grachov Vlad Grachov
Vlad Ureche
Vladimir Lazarenko Vladimir Lazarenko
Vojtech Janota Vojtech Janota
Vojtech Minarik Vojtech Minarik

View File

@@ -16,13 +16,13 @@
1.2 More data sharing 1.2 More data sharing
1.3 struct lifreq 1.3 struct lifreq
1.4 signal-based resolver timeouts 1.4 signal-based resolver timeouts
1.5 get rid of PATH_MAX
2. libcurl - multi interface 2. libcurl - multi interface
2.1 More non-blocking 2.1 More non-blocking
2.2 Remove easy interface internally 2.2 Remove easy interface internally
2.3 Avoid having to remove/readd handles 2.3 Avoid having to remove/readd handles
2.4 Fix HTTP Pipelining for PUT 2.4 Fix HTTP Pipelining for PUT
2.5 Make curl_multi_info_read faster
3. Documentation 3. Documentation
3.1 More and better 3.1 More and better
@@ -56,18 +56,17 @@
7.7 Support other SSL libraries 7.7 Support other SSL libraries
7.8 Support SRP on the TLS layer 7.8 Support SRP on the TLS layer
7.9 improve configure --with-ssl 7.9 improve configure --with-ssl
7.10 Make NTLM work with other crypto functions
8. GnuTLS 8. GnuTLS
8.1 SSL engine stuff 8.1 SSL engine stuff
8.2 SRP 8.2 SRP
8.3 check connection 8.3 check connection
8.4 non-gcrypt
9. Other protocols 9. Other protocols
10. New protocols 10. New protocols
10.1 RSYNC 10.1 RSYNC
10.2 RTMP
11. Client 11. Client
11.1 sync 11.1 sync
@@ -136,6 +135,15 @@
Also, alarm() provides timeout resolution only to the nearest second. alarm Also, alarm() provides timeout resolution only to the nearest second. alarm
ought to be replaced by setitimer on systems that support it. ought to be replaced by setitimer on systems that support it.
1.5 get rid of PATH_MAX
Having code use and rely on PATH_MAX is not nice:
http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
we need libssh2 to properly tell us when we pass in a too small buffer and
its current API (as of libssh2 1.2.7) doesn't.
2. libcurl - multi interface 2. libcurl - multi interface
2.1 More non-blocking 2.1 More non-blocking
@@ -185,11 +193,6 @@
serial requests and currently libcurl only supports that for HEAD and GET serial requests and currently libcurl only supports that for HEAD and GET
requests but it should also be possible for PUT. requests but it should also be possible for PUT.
2.5 Make curl_multi_info_read faster
When checking if there's info to return, this function scans over ALL added
easy handles every time. That makes this function unnecessary heavy and slow.
3. Documentation 3. Documentation
3.1 More and better 3.1 More and better
@@ -342,14 +345,6 @@ to provide the data to send.
make the configure --with-ssl option first check for OpenSSL, then GnuTLS, make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
then NSS... then NSS...
7.10 Make NTLM work with other crypto functions
Get NTLM working using the functions provided by NSS etc. 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++. NTLM currenly only works when libcurl is built with OpenSSL or GnuTLS
support.
8. GnuTLS 8. GnuTLS
8.1 SSL engine stuff 8.1 SSL engine stuff
@@ -366,6 +361,17 @@ to provide the data to send.
Add a way to check if the connection seems to be alive, to correspond to the Add a way to check if the connection seems to be alive, to correspond to the
SSL_peak() way we use with OpenSSL. SSL_peak() way we use with OpenSSL.
8.4 non-gcrypt
libcurl assumes that there are gcrypt functions available when
GnuTLS is.
GnuTLS can be built to use libnettle instead as crypto library,
which breaks the previously mentioned assumption
The correct fix would be to detect which crypto layer that is in use and
adapt our code to use that instead of blindly assuming gcrypt.
9. Other protocols 9. Other protocols
10. New protocols 10. New protocols
@@ -375,12 +381,6 @@ to provide the data to send.
There's no RFC for protocol nor URI/URL format. An implementation should There's no RFC for protocol nor URI/URL format. An implementation should
most probably use an existing rsync library, such as librsync. most probably use an existing rsync library, such as librsync.
10.2 RTMP
There exists a patch that claims to introduce this protocol:
http://osdir.com/ml/gnu.gnash.devel2/2006-11/msg00278.html, further details
in the feature-request: http://curl.haxx.se/bug/feature.cgi?id=1843469
11. Client 11. Client
11.1 sync 11.1 sync

View File

@@ -1,5 +1,5 @@
Online: http://curl.haxx.se/docs/httpscripting.html Online: http://curl.haxx.se/docs/httpscripting.html
Date: May 28, 2008 Date: Jan 19, 2011
The Art Of Scripting HTTP Requests Using Curl The Art Of Scripting HTTP Requests Using Curl
============================================= =============================================
@@ -38,10 +38,26 @@ Date: May 28, 2008
request a particular action, and then the server replies a few text lines request a particular action, and then the server replies a few text lines
before the actual requested content is sent to the client. before the actual requested content is sent to the client.
Using curl's option -v will display what kind of commands curl sends to the The client, curl, sends a HTTP request. The request contains a method (like
server, as well as a few other informational texts. -v is the single most GET, POST, HEAD etc), a number of request headers and sometimes a request
useful option when it comes to debug or even understand the curl<->server body. The HTTP server responds with a status line (indicating if things went
interaction. well), response headers and most often also a response body. The "body" part
is the plain data you requested, like the actual HTML or the image etc.
1.1 See the Protocol
Using curl's option --verbose (-v as a short option) will display what kind
of commands curl sends to the server, as well as a few other informational
texts.
--verbose is the single most useful option when it comes to debug or even
understand the curl<->server interaction.
Sometimes even --verbose is not enough. Then --trace and --trace-ascii offer
even more details as they show EVERYTHING curl sends and receives. Use it
like this:
curl --trace-ascii debugdump.txt http://www.example.com/
2. URL 2. URL
@@ -61,10 +77,10 @@ Date: May 28, 2008
you get a web page returned in your terminal window. The entire HTML document you get a web page returned in your terminal window. The entire HTML document
that that URL holds. that that URL holds.
All HTTP replies contain a set of headers that are normally hidden, use All HTTP replies contain a set of response headers that are normally hidden,
curl's -i option to display them as well as the rest of the document. You can use curl's --include (-i) option to display them as well as the rest of the
also ask the remote server for ONLY the headers by using the -I option (which document. You can also ask the remote server for ONLY the headers by using
will make curl issue a HEAD request). the --head (-I) option (which will make curl issue a HEAD request).
4. Forms 4. Forms
@@ -103,7 +119,7 @@ Date: May 28, 2008
To make curl do the GET form post for you, just enter the expected created To make curl do the GET form post for you, just enter the expected created
URL: URL:
curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK" curl "http://www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
4.2 POST 4.2 POST
@@ -127,7 +143,8 @@ Date: May 28, 2008
And to use curl to post this form with the same data filled in as before, we And to use curl to post this form with the same data filled in as before, we
could do it like: could do it like:
curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi curl --data "birthyear=1905&press=%20OK%20" \
http://www.example.com/when.cgi
This kind of POST will use the Content-Type This kind of POST will use the Content-Type
application/x-www-form-urlencoded and is the most widely used POST kind. application/x-www-form-urlencoded and is the most widely used POST kind.
@@ -139,7 +156,7 @@ Date: May 28, 2008
Recent curl versions can in fact url-encode POST data for you, like this: Recent curl versions can in fact url-encode POST data for you, like this:
curl --data-urlencode "name=I am Daniel" www.example.com curl --data-urlencode "name=I am Daniel" http://www.example.com
4.3 File Upload POST 4.3 File Upload POST
@@ -160,7 +177,7 @@ Date: May 28, 2008
To post to a form like this with curl, you enter a command line like: To post to a form like this with curl, you enter a command line like:
curl -F upload=@localfilename -F press=OK [URL] curl --form upload=@localfilename --form press=OK [URL]
4.4 Hidden Fields 4.4 Hidden Fields
@@ -181,7 +198,7 @@ Date: May 28, 2008
To post this with curl, you won't have to think about if the fields are To post this with curl, you won't have to think about if the fields are
hidden or not. To curl they're all the same: hidden or not. To curl they're all the same:
curl -d "birthyear=1905&press=OK&person=daniel" [URL] curl --data "birthyear=1905&press=OK&person=daniel" [URL]
4.5 Figure Out What A POST Looks Like 4.5 Figure Out What A POST Looks Like
@@ -204,7 +221,7 @@ Date: May 28, 2008
Put a file to a HTTP server with curl: Put a file to a HTTP server with curl:
curl -T uploadfile www.uploadhttp.com/receive.cgi curl --upload-file uploadfile http://www.example.com/receive.cgi
6. HTTP Authentication 6. HTTP Authentication
@@ -217,7 +234,7 @@ Date: May 28, 2008
To tell curl to use a user and password for authentication: To tell curl to use a user and password for authentication:
curl -u name:password www.secrets.com curl --user name:password http://www.example.com
The site might require a different authentication method (check the headers The site might require a different authentication method (check the headers
returned by the server), and then --ntlm, --digest, --negotiate or even returned by the server), and then --ntlm, --digest, --negotiate or even
@@ -228,7 +245,7 @@ Date: May 28, 2008
may require its own user and password to allow the client to get through to may require its own user and password to allow the client to get through to
the Internet. To specify those with curl, run something like: the Internet. To specify those with curl, run something like:
curl -U proxyuser:proxypassword curl.haxx.se curl --proxy-user proxyuser:proxypassword curl.haxx.se
If your proxy requires the authentication to be done using the NTLM method, If your proxy requires the authentication to be done using the NTLM method,
use --proxy-ntlm, if it requires Digest use --proxy-digest. use --proxy-ntlm, if it requires Digest use --proxy-digest.
@@ -257,7 +274,7 @@ Date: May 28, 2008
Use curl to set the referer field with: Use curl to set the referer field with:
curl -e http://curl.haxx.se daniel.haxx.se curl --referer http://www.example.come http://www.example.com
8. User Agent 8. User Agent
@@ -273,13 +290,13 @@ Date: May 28, 2008
is time to set the User Agent field to fool the server into thinking you're is time to set the User Agent field to fool the server into thinking you're
one of those browsers. one of those browsers.
To make curl look like Internet Explorer on a Windows 2000 box: To make curl look like Internet Explorer 5 on a Windows 2000 box:
curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL] curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" [URL]
Or why not look like you're using Netscape 4.73 on a Linux (PIII) box: Or why not look like you're using Netscape 4.73 on an old Linux box:
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL] curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
9. Redirects 9. Redirects
@@ -294,11 +311,12 @@ Date: May 28, 2008
To tell curl to follow a Location: To tell curl to follow a Location:
curl -L www.sitethatredirects.com curl --location http://www.example.com
If you use curl to POST to a site that immediately redirects you to another If you use curl to POST to a site that immediately redirects you to another
page, you can safely use -L and -d/-F together. Curl will only use POST in page, you can safely use --location (-L) and --data/--form together. Curl will
the first request, and then revert to GET in the following operations. only use POST in the first request, and then revert to GET in the following
operations.
10. Cookies 10. Cookies
@@ -320,16 +338,16 @@ Date: May 28, 2008
The simplest way to send a few cookies to the server when getting a page with The simplest way to send a few cookies to the server when getting a page with
curl is to add them on the command line like: curl is to add them on the command line like:
curl -b "name=Daniel" www.cookiesite.com curl --cookie "name=Daniel" http://www.example.com
Cookies are sent as common HTTP headers. This is practical as it allows curl Cookies are sent as common HTTP headers. This is practical as it allows curl
to record cookies simply by recording headers. Record cookies with curl by to record cookies simply by recording headers. Record cookies with curl by
using the -D option like: using the --dump-header (-D) option like:
curl -D headers_and_cookies www.cookiesite.com curl --dump-header headers_and_cookies http://www.example.com
(Take note that the -c option described below is a better way to store (Take note that the --cookie-jar option described below is a better way to
cookies.) store cookies.)
Curl has a full blown cookie parsing engine built-in that comes to use if you Curl has a full blown cookie parsing engine built-in that comes to use if you
want to reconnect to a server and use cookies that were stored from a want to reconnect to a server and use cookies that were stored from a
@@ -337,24 +355,25 @@ Date: May 28, 2008
believing you had a previous connection). To use previously stored cookies, believing you had a previous connection). To use previously stored cookies,
you run curl like: you run curl like:
curl -b stored_cookies_in_file www.cookiesite.com curl --cookie stored_cookies_in_file http://www.example.com
Curl's "cookie engine" gets enabled when you use the -b option. If you only Curl's "cookie engine" gets enabled when you use the --cookie option. If you
want curl to understand received cookies, use -b with a file that doesn't only want curl to understand received cookies, use --cookie with a file that
exist. Example, if you want to let curl understand cookies from a page and doesn't exist. Example, if you want to let curl understand cookies from a
follow a location (and thus possibly send back cookies it received), you can page and follow a location (and thus possibly send back cookies it received),
invoke it like: you can invoke it like:
curl -b nada -L www.cookiesite.com curl --cookie nada --location http://www.example.com
Curl has the ability to read and write cookie files that use the same file Curl has the ability to read and write cookie files that use the same file
format that Netscape and Mozilla do. It is a convenient way to share cookies format that Netscape and Mozilla do. It is a convenient way to share cookies
between browsers and automatic scripts. The -b switch automatically detects between browsers and automatic scripts. The --cookie (-b) switch
if a given file is such a cookie file and parses it, and by using the automatically detects if a given file is such a cookie file and parses it,
-c/--cookie-jar option you'll make curl write a new cookie file at the end of and by using the --cookie-jar (-c) option you'll make curl write a new cookie
an operation: file at the end of an operation:
curl -b cookies.txt -c newcookies.txt www.cookiesite.com curl --cookie cookies.txt --cookie-jar newcookies.txt \
http://www.example.com
11. HTTPS 11. HTTPS
@@ -370,7 +389,7 @@ Date: May 28, 2008
Curl supports encrypted fetches thanks to the freely available OpenSSL Curl supports encrypted fetches thanks to the freely available OpenSSL
libraries. To get a page from a HTTPS server, simply run curl like: libraries. To get a page from a HTTPS server, simply run curl like:
curl https://that.secure.server.com curl https://secure.example.com
11.1 Certificates 11.1 Certificates
@@ -381,13 +400,13 @@ Date: May 28, 2008
can be specified on the command line or if not, entered interactively when can be specified on the command line or if not, entered interactively when
curl queries for it. Use a certificate with curl on a HTTPS server like: curl queries for it. Use a certificate with curl on a HTTPS server like:
curl -E mycert.pem https://that.secure.server.com curl --cert mycert.pem https://secure.example.com
curl also tries to verify that the server is who it claims to be, by curl also tries to verify that the server is who it claims to be, by
verifying the server's certificate against a locally stored CA cert verifying the server's certificate against a locally stored CA cert
bundle. Failing the verification will cause curl to deny the connection. You bundle. Failing the verification will cause curl to deny the connection. You
must then use -k in case you want to tell curl to ignore that the server must then use --insecure (-k) in case you want to tell curl to ignore that
can't be verified. the server can't be verified.
More about server certificate verification and ca cert bundles can be read More about server certificate verification and ca cert bundles can be read
in the SSLCERTS document, available online here: in the SSLCERTS document, available online here:
@@ -402,17 +421,18 @@ Date: May 28, 2008
For example, you can change the POST request to a PROPFIND and send the data For example, you can change the POST request to a PROPFIND and send the data
as "Content-Type: text/xml" (instead of the default Content-Type) like this: as "Content-Type: text/xml" (instead of the default Content-Type) like this:
curl -d "<xml>" -H "Content-Type: text/xml" -X PROPFIND url.com curl --data "<xml>" --header "Content-Type: text/xml" \
--request PROPFIND url.com
You can delete a default header by providing one without content. Like you You can delete a default header by providing one without content. Like you
can ruin the request by chopping off the Host: header: can ruin the request by chopping off the Host: header:
curl -H "Host:" http://mysite.com curl --header "Host:" http://www.example.com
You can add headers the same way. Your server may want a "Destination:" You can add headers the same way. Your server may want a "Destination:"
header, and you can add it: header, and you can add it:
curl -H "Destination: http://moo.com/nowhere" http://url.com curl --header "Destination: http://nowhere" http://example.com
13. Web Login 13. Web Login
@@ -443,7 +463,6 @@ Date: May 28, 2008
to do a proper login POST. Remember that the contents need to be URL encoded to do a proper login POST. Remember that the contents need to be URL encoded
when sent in a normal POST. when sent in a normal POST.
14. Debug 14. Debug
Many times when you run curl on a site, you'll notice that the site doesn't Many times when you run curl on a site, you'll notice that the site doesn't
@@ -456,8 +475,8 @@ Date: May 28, 2008
* Use the --trace-ascii option to store fully detailed logs of the requests * Use the --trace-ascii option to store fully detailed logs of the requests
for easier analyzing and better understanding for easier analyzing and better understanding
* Make sure you check for and use cookies when needed (both reading with -b * Make sure you check for and use cookies when needed (both reading with
and writing with -c) --cookie and writing with --cookie-jar)
* Set user-agent to one like a recent popular browser does * Set user-agent to one like a recent popular browser does
@@ -479,12 +498,10 @@ Date: May 28, 2008
RFC 2616 is a must to read if you want in-depth understanding of the HTTP RFC 2616 is a must to read if you want in-depth understanding of the HTTP
protocol. protocol.
RFC 2396 explains the URL syntax. RFC 3986 explains the URL syntax.
RFC 2109 defines how cookies are supposed to work. RFC 2109 defines how cookies are supposed to work.
RFC 1867 defines the HTTP post upload format. RFC 1867 defines the HTTP post upload format.
http://www.openssl.org is the home of the OpenSSL project
http://curl.haxx.se is the home of the cURL project http://curl.haxx.se is the home of the cURL project

View File

@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___ .\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____| .\" * \___|\___/|_| \_\_____|
.\" * .\" *
.\" * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. .\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * .\" *
.\" * This software is licensed as described in the file COPYING, which .\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms .\" * you should have received as part of this distribution. The terms
@@ -20,7 +20,7 @@
.\" * .\" *
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH curl 1 "28 November 2009" "Curl 7.20.0" "Curl Manual" .TH curl 1 "28 November 2009" "Curl 7.21.4" "Curl Manual"
.SH NAME .SH NAME
curl \- transfer a URL curl \- transfer a URL
.SH SYNOPSIS .SH SYNOPSIS
@@ -29,8 +29,9 @@ curl \- transfer a URL
.SH DESCRIPTION .SH DESCRIPTION
.B curl .B curl
is a tool to transfer data from or to a server, using one of the supported is a tool to transfer data from or to a server, using one of the supported
protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP,
FILE). The command is designed to work without user interaction. LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP). The
command is designed to work without user interaction.
curl offers a busload of useful tricks like proxy support, user curl offers a busload of useful tricks like proxy support, user
authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer
@@ -55,16 +56,16 @@ or you can get sequences of alphanumeric series by using [] as in:
ftp://ftp.numericals.com/file[001-100].txt (with leading zeros) ftp://ftp.numericals.com/file[001-100].txt (with leading zeros)
ftp://ftp.letters.com/file[a-z].txt ftp://ftp.letters.com/file[a-z].txt
No nesting of the sequences is supported at the moment, but you can use Nested sequences are not supported, but you can use several ones next to each
several ones next to each other: other:
http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html
You can specify any amount of URLs on the command line. They will be fetched You can specify any amount of URLs on the command line. They will be fetched
in a sequential manner in the specified order. in a sequential manner in the specified order.
Since curl 7.15.1 you can also specify a step counter for the ranges, so that You can specify a step counter for the ranges to get every Nth number or
you can get every Nth number or letter: letter:
http://www.numericals.com/file[1-100:10].txt http://www.numericals.com/file[1-100:10].txt
http://www.letters.com/file[a-z:2].txt http://www.letters.com/file[a-z:2].txt
@@ -87,8 +88,8 @@ invokes.
curl normally displays a progress meter during operations, indicating the amount curl normally displays a progress meter during operations, indicating the amount
of transferred data, transfer speeds and estimated time left, etc. of transferred data, transfer speeds and estimated time left, etc.
However, since curl displays this data to the terminal by default, if you invoke curl displays this data to the terminal by default, so if you invoke curl to
curl to do an operation and it is about to write data to the terminal, it do an operation and it is about to write data to the terminal, it
\fIdisables\fP the progress meter as otherwise it would mess up the output \fIdisables\fP the progress meter as otherwise it would mess up the output
mixing progress meter and response data. mixing progress meter and response data.
@@ -300,8 +301,8 @@ away. EPRT and LPRT are extensions to the original FTP protocol, and may not wor
on all servers, but they enable more functionality in a better way than the on all servers, but they enable more functionality in a better way than the
traditional PORT command. traditional PORT command.
Since curl 7.19.0, \fB--eprt\fP can be used to explicitly enable EPRT again \fB--eprt\fP can be used to explicitly enable EPRT again and \fB--no-eprt\fP
and \fB--no-eprt\fP is an alias for \fB--disable-eprt\fP. is an alias for \fB--disable-eprt\fP.
Disabling EPRT only changes the active behavior. If you want to switch to Disabling EPRT only changes the active behavior. If you want to switch to
passive mode you need to not use \fI-P/--ftp-port\fP or force it with passive mode you need to not use \fI-P/--ftp-port\fP or force it with
@@ -311,8 +312,8 @@ passive mode you need to not use \fI-P/--ftp-port\fP or force it with
transfers. Curl will normally always first attempt to use EPSV before PASV, transfers. Curl will normally always first attempt to use EPSV before PASV,
but with this option, it will not try using EPSV. but with this option, it will not try using EPSV.
Since curl 7.19.0, \fB--epsv\fP can be used to explicitly enable EPRT again \fB--epsv\fP can be used to explicitly enable EPRT again and \fB--no-epsv\fP
and \fB--no-epsv\fP is an alias for \fB--disable-epsv\fP. is an alias for \fB--disable-epsv\fP.
Disabling EPSV only changes the passive behavior. If you want to switch to Disabling EPSV only changes the passive behavior. If you want to switch to
active mode you need to use \fI-P/--ftp-port\fP. active mode you need to use \fI-P/--ftp-port\fP.
@@ -357,11 +358,12 @@ this option assumes a \&"certificate" file that is the private key and the
private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify private certificate concatenated! See \fI--cert\fP and \fI--key\fP to specify
them independently. them independently.
If curl is built against the NSS SSL library then this option tells If curl is built against the NSS SSL library then this option can tell
curl the nickname of the certificate to use within the NSS database defined curl the nickname of the certificate to use within the NSS database defined
by the environment variable SSL_DIR (or by default /etc/pki/nssdb). If the by the environment variable SSL_DIR (or by default /etc/pki/nssdb). If the
NSS PEM PKCS#11 module (libnsspem.so) is available then PEM files may be NSS PEM PKCS#11 module (libnsspem.so) is available then PEM files may be
loaded. loaded. If you want to use a file from the current directory, please precede
it with "./" prefix, in order to avoid confusion with a nickname.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "--cert-type <type>" .IP "--cert-type <type>"
@@ -392,11 +394,11 @@ may be loaded.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "--capath <CA certificate directory>" .IP "--capath <CA certificate directory>"
(SSL) Tells curl to use the specified certificate directory to verify the (SSL) Tells curl to use the specified certificate directory to verify the
peer. The certificates must be in PEM format, and the directory must have been peer. The certificates must be in PEM format, and if curl is built against
processed using the c_rehash utility supplied with openssl. Using OpenSSL, the directory must have been processed using the c_rehash utility
\fI--capath\fP can allow curl to make SSL-connections much more efficiently supplied with OpenSSL. Using \fI--capath\fP can allow OpenSSL-powered curl to
than using \fI--cacert\fP if the \fI--cacert\fP file contains many CA make SSL-connections much more efficiently than using \fI--cacert\fP if the
certificates. \fI--cacert\fP file contains many CA certificates.
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 "-f/--fail" .IP "-f/--fail"
@@ -426,7 +428,7 @@ server. The method argument should be one of the following alternatives:
.RS .RS
.IP multicwd .IP multicwd
curl does a single CWD operation for each path part in the given URL. For deep curl does a single CWD operation for each path part in the given URL. For deep
hierarchies this means very many commands. This is how RFC1738 says it should hierarchies this means very many commands. This is how RFC 1738 says it should
be done. This is the default but the slowest behavior. be done. This is the default but the slowest behavior.
.IP nocwd .IP nocwd
curl does no CWD at all. curl will do SIZE, RETR, STOR etc and give a full curl does no CWD at all. curl will do SIZE, RETR, STOR etc and give a full
@@ -438,7 +440,7 @@ compliant than 'nocwd' but without the full penalty of 'multicwd'.
.RE .RE
(Added in 7.15.1) (Added in 7.15.1)
.IP "--ftp-pasv" .IP "--ftp-pasv"
(FTP) Use passive mode for the data conection. Passive is the internal default (FTP) Use passive mode for the data connection. Passive is the internal default
behavior, but using this option can be used to override a previous behavior, but using this option can be used to override a previous
\fI-P/-ftp-port\fP option. (Added in 7.11.0) \fI-P/-ftp-port\fP option. (Added in 7.11.0)
@@ -500,7 +502,7 @@ waits for a reply from the server.
.IP "-F/--form <name=content>" .IP "-F/--form <name=content>"
(HTTP) This lets curl emulate a filled-in form in which a user has pressed the (HTTP) This lets curl emulate a filled-in form in which a user has pressed the
submit button. This causes curl to POST data using the Content-Type submit button. This causes curl to POST data using the Content-Type
multipart/form-data according to RFC2388. This enables uploading of binary multipart/form-data according to RFC 2388. This enables uploading of binary
files etc. To force the 'content' part to be a file, prefix the file name files etc. To force the 'content' part to be a file, prefix the file name
with an @ sign. To just get the content part from a file, prefix the file name with an @ sign. To just get the content part from a file, prefix the file name
with the symbol <. The difference between @ and < is then that @ makes a file with the symbol <. The difference between @ and < is then that @ makes a file
@@ -513,8 +515,8 @@ input:
\fBcurl\fP -F password=@/etc/passwd www.mypasswords.com \fBcurl\fP -F password=@/etc/passwd www.mypasswords.com
To read the file's content from stdin instead of a file, use - where the file To read content from stdin instead of a file, use - as the filename. This goes
name should've been. This goes for both @ and < constructs. for both @ and < constructs.
You can also tell curl what Content-Type to use by using 'type=', in a manner You can also tell curl what Content-Type to use by using 'type=', in a manner
similar to: similar to:
@@ -525,8 +527,8 @@ or
\fBcurl\fP -F "name=daniel;type=text/foo" url.com \fBcurl\fP -F "name=daniel;type=text/foo" url.com
You can also explicitly change the name field of an file upload part by You can also explicitly change the name field of a file upload part by setting
setting filename=, like this: filename=, like this:
\fBcurl\fP -F "file=@localfile;filename=nameinpost" url.com \fBcurl\fP -F "file=@localfile;filename=nameinpost" url.com
@@ -1050,11 +1052,12 @@ just before the transfer command(s), prefix the command with a '+' (this
is only supported for FTP). You may specify any number of commands. If is only supported for FTP). You may specify any number of commands. If
the server returns failure for one of the commands, the entire operation the server returns failure for one of the commands, the entire operation
will be aborted. You must send syntactically correct FTP commands as will be aborted. You must send syntactically correct FTP commands as
RFC959 defines to FTP servers, or one of the commands listed below to RFC 959 defines to FTP servers, or one of the commands listed below to
SFTP servers. This option can be used multiple times. SFTP servers. This option can be used multiple times.
SFTP is a binary protocol. Unlike for FTP, libcurl interprets SFTP quote SFTP is a binary protocol. Unlike for FTP, libcurl interprets SFTP quote
commands before sending them to the server. Following is the list of commands itself before sending them to the server. File names may be quoted
shell-style to embed spaces or special characters. Following is the list of
all supported SFTP quote commands: all supported SFTP quote commands:
.RS .RS
.IP "chgrp group file" .IP "chgrp group file"
@@ -1141,6 +1144,18 @@ encodings and instead makes them passed on unaltered, raw. (Added in 7.16.2)
When used, this will make libcurl attempt to figure out the timestamp of the When used, this will make libcurl attempt to figure out the timestamp of the
remote file, and if that is available make the local file get that same remote file, and if that is available make the local file get that same
timestamp. timestamp.
.IP "--resolve <host:port:address>"
Provide a custom address for a specific host and port pair. Using this, you
can make the curl requests(s) use a specified address and prevent the
otherwise normally resolved address to be used. Consider it a sort of
/etc/hosts alternative provided on the command line. The port number should be
the number used for the specific protocol the host will be used for. It means
you need several entries if you want to provide address for the same host but
different ports.
This option can be used many times to add many host names to resolve.
(Added in 7.21.3)
.IP "--retry <num>" .IP "--retry <num>"
If a transient error is returned when curl tries to perform a transfer, it If a transient error is returned when curl tries to perform a transfer, it
will retry this number of times before giving up. Setting the number to 0 will retry this number of times before giving up. Setting the number to 0
@@ -1221,14 +1236,12 @@ This option (as well as \fI--socks4\fP) does not work with IPV6, FTPS or LDAP.
The default service name for a socks server is rcmd/server-fqdn. This option The default service name for a socks server is rcmd/server-fqdn. This option
allows you to change it. allows you to change it.
Examples: Examples: --socks5 proxy-name \fI--socks5-gssapi-service\fP sockd would use
--socks5 proxy-name \fI--socks5-gssapi-service\fP sockd would use sockd/proxy-name --socks5 proxy-name \fI--socks5-gssapi-service\fP
sockd/proxy-name sockd/real-name would use sockd/real-name for cases where the proxy-name does
--socks5 proxy-name \fI--socks5-gssapi-service\fP sockd/real-name would use not match the principal name. (Added in 7.19.4).
sockd/real-name for cases where the proxy-name does not match the princpal name.
(Added in 7.19.4).
.IP "--socks5-gssapi-nec" .IP "--socks5-gssapi-nec"
As part of the gssapi negotiation a protection mode is negotiated. The rfc1961 As part of the gssapi negotiation a protection mode is negotiated. RFC 1961
says in section 4.3/4.4 it should be protected, but the NEC reference says in section 4.3/4.4 it should be protected, but the NEC reference
implementation does not. The option \fI--socks5-gssapi-nec\fP allows the implementation does not. The option \fI--socks5-gssapi-nec\fP allows the
unprotected exchange of the protection mode negotiation. (Added in 7.19.4). unprotected exchange of the protection mode negotiation. (Added in 7.19.4).
@@ -1251,12 +1264,25 @@ XDISPLOC=<X display> Sets the X display location.
NEW_ENV=<var,val> Sets an environment variable. NEW_ENV=<var,val> Sets an environment variable.
.IP "--tftp-blksize <value>" .IP "--tftp-blksize <value>"
(TFTP) Set TFTP BLKSIZE option (must be >512). This is the block size that (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block size that
curl will try to use when tranferring data to or from a TFTP server. By curl will try to use when transferring data to or from a TFTP server. By
default 512 bytes will be used. default 512 bytes will be used.
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.
(Added in 7.20.0) (Added in 7.20.0)
.IP "--tlsauthtype <authtype>"
Set TLS authentication type. Currently, the only supported option is "SRP",
for TLS-SRP (RFC 5054). If \fI--tlsuser\fP and \fI--tlspassword\fP are
specified but \fI--tlsauthtype\fP is not, then this option defaults to "SRP".
(Added in 7.21.4)
.IP "--tlsuser <user>"
Set username for use with the TLS authentication method specified with
\fI--tlsauthtype\fP. Requires that \fI--tlspassword\fP also be set. (Added in
7.21.4)
.IP "--tlspassword <password>"
Set password for use with the TLS authentication method specified with
\fI--tlsauthtype\fP. Requires that \fI--tlsuser\fP also be set. (Added in
7.21.4)
.IP "-T/--upload-file <file>" .IP "-T/--upload-file <file>"
This transfers the specified local file to the remote URL. If there is no file This transfers the specified local file to the remote URL. If there is no file
part in the specified URL, Curl will append the local file name. NOTE that you part in the specified URL, Curl will append the local file name. NOTE that you
@@ -1344,7 +1370,7 @@ If you think this option still doesn't give you enough details, consider using
This option overrides previous uses of \fI--trace-ascii\fP or \fI--trace\fP. This option overrides previous uses of \fI--trace-ascii\fP or \fI--trace\fP.
Use \fI-S/--silent\fP to make curl quiet. Use \fI-s/--silent\fP to make curl quiet.
.IP "-V/--version" .IP "-V/--version"
Displays information about curl and the libcurl version it uses. Displays information about curl and the libcurl version it uses.
@@ -1383,6 +1409,8 @@ This curl supports IDN - international domain names.
.IP "SSPI" .IP "SSPI"
SSPI is supported. If you use NTLM and set a blank user name, curl will 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.
.IP "TLS-SRP"
SRP (Secure Remote Password) authentication is supported for TLS.
.RE .RE
.IP "-w/--write-out <format>" .IP "-w/--write-out <format>"
Defines what to display on stdout after a completed and successful Defines what to display on stdout after a completed and successful
@@ -1539,9 +1567,9 @@ not set.
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 "-z/--time-cond <date expression>" .IP "-z/--time-cond <date expression>"
(HTTP/FTP) Request a file that has been modified later than the given time and (HTTP/FTP/FILE) Request a file that has been modified later than the given time
date, or one that has been modified before that time. The date expression can and date, or one that has been modified before that time. The date expression
be all sorts of date strings or if it doesn't match any internal ones, it can be all sorts of date strings or if it doesn't match any internal ones, it
tries to get the time from a given file name instead! See the tries to get the time from a given file name instead! See the
\fIcurl_getdate(3)\fP man pages for date expression details. \fIcurl_getdate(3)\fP man pages for date expression details.
@@ -1689,7 +1717,7 @@ Unknown TELNET option specified.
.IP 49 .IP 49
Malformed telnet option. Malformed telnet option.
.IP 51 .IP 51
The peer's SSL certificate or SSH MD5 fingerprint was not ok. The peer's SSL certificate or SSH MD5 fingerprint was not OK.
.IP 52 .IP 52
The server didn't reply anything, which here is considered an error. The server didn't reply anything, which here is considered an error.
.IP 53 .IP 53
@@ -1750,6 +1778,16 @@ Failed to shut down the SSL connection.
Could not load CRL file, missing or wrong format (added in 7.19.0). Could not load CRL file, missing or wrong format (added in 7.19.0).
.IP 83 .IP 83
Issuer check failed (added in 7.19.0). Issuer check failed (added in 7.19.0).
.IP 84
The FTP PRET command failed
.IP 85
RTSP: mismatch of CSeq numbers
.IP 86
RTSP: mismatch of Session Identifiers
.IP 87
unable to parse FTP file list
.IP 88
FTP chunk callback reported error
.IP XX .IP XX
More error codes will appear here in future releases. The existing ones More error codes will appear here in future releases. The existing ones
are meant to never change. are meant to never change.

View File

@@ -29,4 +29,7 @@ sendrecv
sepheaders sepheaders
simple simple
simplepost simplepost
simplesmtp
simplessl simplessl
smtp-multi
smtp-tls

View File

@@ -119,7 +119,7 @@ int main(void)
} }
while (U) { while (U) {
while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(cm, &U)); curl_multi_perform(cm, &U);
if (U) { if (U) {
FD_ZERO(&R); FD_ZERO(&R);

View File

@@ -34,4 +34,4 @@ LDADD = $(LIBDIR)/libcurl.la
# Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines # Makefile.inc provides the check_PROGRAMS and COMPLICATED_EXAMPLES defines
include Makefile.inc include Makefile.inc
all: $(check_PROGRAMS)

View File

@@ -3,10 +3,12 @@ check_PROGRAMS = 10-at-a-time anyauthput cookie_interface debug fileupload \
fopen ftpget ftpgetresp ftpupload getinfo getinmemory http-post httpput \ fopen ftpget ftpgetresp ftpupload getinfo getinmemory http-post httpput \
https multi-app multi-debugcallback multi-double multi-post multi-single \ https multi-app multi-debugcallback multi-double multi-post multi-single \
persistant post-callback postit2 sepheaders simple simplepost simplessl \ persistant post-callback postit2 sepheaders simple simplepost simplessl \
sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard sendrecv httpcustomheader certinfo chkspeed ftpgetinfo ftp-wildcard \
smtp-multi simplesmtp smtp-tls
# These examples require external dependencies that may not be commonly # These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here. # available on POSIX systems, so don't bother attempting to compile them here.
COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cc cacertinmem.c \ COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cc cacertinmem.c \
ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \ ftpuploadresume.c ghiper.c hiperfifo.c htmltidy.c multithread.c \
opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c opensslthreadlock.c sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
smooth-gtk-thread.c version-check.pl

View File

@@ -111,7 +111,7 @@ int main(void)
rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr); rv=curl_easy_setopt(ch,CURLOPT_WRITEHEADER, stderr);
rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM"); rv=curl_easy_setopt(ch,CURLOPT_SSLCERTTYPE,"PEM");
rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1L); rv=curl_easy_setopt(ch,CURLOPT_SSL_VERIFYPEER,1L);
rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.cacert.org/"); rv=curl_easy_setopt(ch, CURLOPT_URL, "https://www.example.com/");
/* first try: retrieve page without cacerts' certificate -> will fail /* first try: retrieve page without cacerts' certificate -> will fail
*/ */

View File

@@ -9,9 +9,12 @@
static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream) static size_t wrfu(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
(void)stream;
(void)ptr;
return size * nmemb; return size * nmemb;
} }
int main(int argc, char **argv)
int main(void)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
@@ -20,7 +23,7 @@ int main(int argc, char **argv)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://www.networking4all.com/"); curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, wrfu);

View File

@@ -71,7 +71,7 @@ int main(int argc, char *argv[])
} else if (strncasecmp(*argv, "-T", 2) == 0) { } else if (strncasecmp(*argv, "-T", 2) == 0) {
prttime = 1; prttime = 1;
} else if (strncasecmp(*argv, "-M=", 3) == 0) { } else if (strncasecmp(*argv, "-M=", 3) == 0) {
int m = atoi(*argv + 3); long m = strtol((*argv)+3, NULL, 10);
switch(m) { switch(m) {
case 1: url = URL_1M; case 1: url = URL_1M;
break; break;

View File

@@ -53,7 +53,7 @@ main(void)
if (curl) { if (curl) {
char nline[256]; char nline[256];
curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com/"); /* google.com sets "PREF" cookie */ curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */ curl_easy_setopt(curl, CURLOPT_COOKIEFILE, ""); /* just to start the cookie engine */
res = curl_easy_perform(curl); res = curl_easy_perform(curl);

View File

@@ -28,12 +28,12 @@ void dump(const char *text,
/* without the hex output, we can fit more on screen */ /* without the hex output, we can fit more on screen */
width = 0x40; width = 0x40;
fprintf(stream, "%s, %010.10ld bytes (0x%08.8lx)\n", fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
text, (long)size, (long)size); text, (long)size, (long)size);
for(i=0; i<size; i+= width) { for(i=0; i<size; i+= width) {
fprintf(stream, "%04.4lx: ", (long)i); fprintf(stream, "%4.4lx: ", (long)i);
if(!nohex) { if(!nohex) {
/* hex not disabled, show it */ /* hex not disabled, show it */
@@ -118,7 +118,7 @@ int main(void)
/* the DEBUGFUNCTION has no effect until we enable VERBOSE */ /* the DEBUGFUNCTION has no effect until we enable VERBOSE */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
/* always cleanup */ /* always cleanup */

View File

@@ -68,7 +68,6 @@ typedef struct _GlobalInfo
struct ev_io fifo_event; struct ev_io fifo_event;
struct ev_timer timer_event; struct ev_timer timer_event;
CURLM *multi; CURLM *multi;
int prev_running;
int still_running; int still_running;
FILE* input; FILE* input;
} GlobalInfo; } GlobalInfo;
@@ -122,7 +121,6 @@ static void mcode_or_die(const char *where, CURLMcode code)
switch ( code ) switch ( code )
{ {
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
case CURLM_OK: s="CURLM_OK"; break;
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break; case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break; case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
@@ -144,54 +142,33 @@ static void mcode_or_die(const char *where, CURLMcode code)
/* Check for completed transfers, and remove their easy handles */ /* Check for completed transfers, and remove their easy handles */
static void check_run_count(GlobalInfo *g) static void check_multi_info(GlobalInfo *g)
{ {
DPRINT("%s prev %i still %i\n", __PRETTY_FUNCTION__, char *eff_url;
g->prev_running, g->still_running); CURLMsg *msg;
if ( g->prev_running > g->still_running ) int msgs_left;
{ ConnInfo *conn;
char *eff_url=NULL; CURL *easy;
CURLMsg *msg; CURLcode res;
int msgs_left;
ConnInfo *conn=NULL;
CURL*easy;
CURLcode res;
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running); fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
/* while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
I am still uncertain whether it is safe to remove an easy if (msg->msg == CURLMSG_DONE) {
handle from inside the curl_multi_info_read loop, so here I easy = msg->easy_handle;
will search for completed transfers in the inner "while" res = msg->data.result;
loop, and then remove them in the outer "do-while" loop... curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
*/ curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
do fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
{ curl_multi_remove_handle(g->multi, easy);
easy=NULL; free(conn->url);
while ( (msg = curl_multi_info_read(g->multi, &msgs_left)) ) curl_easy_cleanup(easy);
{ free(conn);
if ( msg->msg == CURLMSG_DONE ) }
{
easy=msg->easy_handle;
res=msg->data.result;
}
if ( easy )
{
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
curl_multi_remove_handle(g->multi, easy);
free(conn->url);
curl_easy_cleanup(easy);
free(conn);
}
}
} while ( easy );
} }
g->prev_running = g->still_running;
} }
/* Called by libevent when we get action on a multi socket */ /* Called by libevent when we get action on a multi socket */
static void event_cb(EV_P_ struct ev_io *w, int revents) static void event_cb(EV_P_ struct ev_io *w, int revents)
{ {
@@ -201,12 +178,9 @@ static void event_cb(EV_P_ struct ev_io *w, int revents)
int action = (revents&EV_READ?CURL_POLL_IN:0)| int action = (revents&EV_READ?CURL_POLL_IN:0)|
(revents&EV_WRITE?CURL_POLL_OUT:0); (revents&EV_WRITE?CURL_POLL_OUT:0);
do rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running);
{ mcode_or_die("event_cb: curl_multi_socket_action", rc);
rc = curl_multi_socket_action(g->multi, w->fd, action, &g->still_running); check_multi_info(g);
} while ( rc == CURLM_CALL_MULTI_PERFORM );
mcode_or_die("event_cb: curl_multi_socket", rc);
check_run_count(g);
if ( g->still_running <= 0 ) if ( g->still_running <= 0 )
{ {
fprintf(MSG_OUT, "last transfer done, kill timeout\n"); fprintf(MSG_OUT, "last transfer done, kill timeout\n");
@@ -222,12 +196,9 @@ static void timer_cb(EV_P_ struct ev_timer *w, int revents)
GlobalInfo *g = (GlobalInfo *)w->data; GlobalInfo *g = (GlobalInfo *)w->data;
CURLMcode rc; CURLMcode rc;
do rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, &g->still_running);
{ mcode_or_die("timer_cb: curl_multi_socket_action", rc);
rc = curl_multi_socket_action(g->multi, CURL_SOCKET_TIMEOUT, 0, &g->still_running); check_multi_info(g);
} while ( rc == CURLM_CALL_MULTI_PERFORM );
mcode_or_die("timer_cb: curl_multi_socket", rc);
check_run_count(g);
} }
/* Clean up the SockInfo structure */ /* Clean up the SockInfo structure */
@@ -364,11 +335,11 @@ static void new_conn(char *url, GlobalInfo *g )
fprintf(MSG_OUT, fprintf(MSG_OUT,
"Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url); "Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
rc =curl_multi_add_handle(g->multi, conn->easy); rc = curl_multi_add_handle(g->multi, conn->easy);
mcode_or_die("new_conn: curl_multi_add_handle", rc); mcode_or_die("new_conn: curl_multi_add_handle", rc);
mcode_or_die("new_conn: curl_multi_socket_all", rc); /* note that the add_handle() will set a time-out to trigger very soon so
check_run_count(g); that the necessary socket_action() call will be called by this app */
} }
/* This gets called whenever data is received from the fifo */ /* This gets called whenever data is received from the fifo */
@@ -396,7 +367,7 @@ static int init_fifo (GlobalInfo *g)
{ {
struct stat st; struct stat st;
static const char *fifo = "hiper.fifo"; static const char *fifo = "hiper.fifo";
int sockfd; curl_socket_t sockfd;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if ( lstat (fifo, &st) == 0 ) if ( lstat (fifo, &st) == 0 )
@@ -448,10 +419,9 @@ int main(int argc, char **argv)
curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g); curl_multi_setopt(g.multi, CURLMOPT_SOCKETDATA, &g);
curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb); curl_multi_setopt(g.multi, CURLMOPT_TIMERFUNCTION, multi_timer_cb);
curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g); curl_multi_setopt(g.multi, CURLMOPT_TIMERDATA, &g);
do
{ /* we don't call any curl_multi_socket*() function yet as we have no handles
rc = curl_multi_socket_all(g.multi, &g.still_running); added! */
} while ( CURLM_CALL_MULTI_PERFORM == rc );
ev_loop(g.loop, 0); ev_loop(g.loop, 0);
curl_multi_cleanup(g.multi); curl_multi_cleanup(g.multi);

View File

@@ -53,20 +53,24 @@
#include <curl/curl.h> #include <curl/curl.h>
enum fcurl_type_e { CFTYPE_NONE=0, CFTYPE_FILE=1, CFTYPE_CURL=2 }; enum fcurl_type_e {
CFTYPE_NONE=0,
CFTYPE_FILE=1,
CFTYPE_CURL=2
};
struct fcurl_data struct fcurl_data
{ {
enum fcurl_type_e type; /* type of handle */ enum fcurl_type_e type; /* type of handle */
union { union {
CURL *curl; CURL *curl;
FILE *file; FILE *file;
} handle; /* handle */ } handle; /* handle */
char *buffer; /* buffer to store cached data*/ char *buffer; /* buffer to store cached data*/
int buffer_len; /* currently allocated buffers length */ size_t buffer_len; /* currently allocated buffers length */
int buffer_pos; /* end of data in buffer*/ size_t buffer_pos; /* end of data in buffer*/
int still_running; /* Is background url fetch still in progress */ int still_running; /* Is background url fetch still in progress */
}; };
typedef struct fcurl_data URL_FILE; typedef struct fcurl_data URL_FILE;
@@ -76,504 +80,448 @@ URL_FILE *url_fopen(const char *url,const char *operation);
int url_fclose(URL_FILE *file); int url_fclose(URL_FILE *file);
int url_feof(URL_FILE *file); int url_feof(URL_FILE *file);
size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file); size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file);
char * url_fgets(char *ptr, int size, URL_FILE *file); char * url_fgets(char *ptr, size_t size, URL_FILE *file);
void url_rewind(URL_FILE *file); void url_rewind(URL_FILE *file);
/* we use a global one for convenience */ /* we use a global one for convenience */
CURLM *multi_handle; CURLM *multi_handle;
/* curl calls this routine to get more data */ /* curl calls this routine to get more data */
static size_t static size_t write_callback(char *buffer,
write_callback(char *buffer, size_t size,
size_t size, size_t nitems,
size_t nitems, void *userp)
void *userp)
{ {
char *newbuff; char *newbuff;
int rembuff; size_t rembuff;
URL_FILE *url = (URL_FILE *)userp; URL_FILE *url = (URL_FILE *)userp;
size *= nitems; size *= nitems;
rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */ rembuff=url->buffer_len - url->buffer_pos; /* remaining space in buffer */
if(size > rembuff) if(size > rembuff) {
{ /* not enough space in buffer */
/* not enough space in buffer */ newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff));
newbuff=realloc(url->buffer,url->buffer_len + (size - rembuff)); if(newbuff==NULL) {
if(newbuff==NULL) fprintf(stderr,"callback buffer grow failed\n");
{ size=rembuff;
fprintf(stderr,"callback buffer grow failed\n");
size=rembuff;
}
else
{
/* realloc suceeded increase buffer size*/
url->buffer_len+=size - rembuff;
url->buffer=newbuff;
/*printf("Callback buffer grown to %d bytes\n",url->buffer_len);*/
}
} }
else {
/* realloc suceeded increase buffer size*/
url->buffer_len+=size - rembuff;
url->buffer=newbuff;
}
}
memcpy(&url->buffer[url->buffer_pos], buffer, size); memcpy(&url->buffer[url->buffer_pos], buffer, size);
url->buffer_pos += size; url->buffer_pos += size;
/*fprintf(stderr, "callback %d size bytes\n", size);*/ return size;
return size;
} }
/* use to attempt to fill the read buffer up to requested number of bytes */ /* use to attempt to fill the read buffer up to requested number of bytes */
static int static int fill_buffer(URL_FILE *file, size_t want)
fill_buffer(URL_FILE *file,int want,int waittime)
{ {
fd_set fdread; fd_set fdread;
fd_set fdwrite; fd_set fdwrite;
fd_set fdexcep; fd_set fdexcep;
struct timeval timeout; struct timeval timeout;
int rc; int rc;
/* only attempt to fill buffer if transactions still running and buffer /* only attempt to fill buffer if transactions still running and buffer
* doesnt exceed required size already * doesnt exceed required size already
*/ */
if((!file->still_running) || (file->buffer_pos > want)) if((!file->still_running) || (file->buffer_pos > want))
return 0; return 0;
/* attempt to fill buffer */ /* attempt to fill buffer */
do do {
{ int maxfd = -1;
int maxfd = -1; long curl_timeo = -1;
long curl_timeo = -1;
FD_ZERO(&fdread); FD_ZERO(&fdread);
FD_ZERO(&fdwrite); FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep); FD_ZERO(&fdexcep);
/* set a suitable timeout to fail on */ /* set a suitable timeout to fail on */
timeout.tv_sec = 60; /* 1 minute */ timeout.tv_sec = 60; /* 1 minute */
timeout.tv_usec = 0; timeout.tv_usec = 0;
curl_multi_timeout(multi_handle, &curl_timeo); curl_multi_timeout(multi_handle, &curl_timeo);
if(curl_timeo >= 0) { if(curl_timeo >= 0) {
timeout.tv_sec = curl_timeo / 1000; timeout.tv_sec = curl_timeo / 1000;
if(timeout.tv_sec > 1) if(timeout.tv_sec > 1)
timeout.tv_sec = 1; timeout.tv_sec = 1;
else else
timeout.tv_usec = (curl_timeo % 1000) * 1000; timeout.tv_usec = (curl_timeo % 1000) * 1000;
} }
/* get file descriptors from the transfers */ /* get file descriptors from the transfers */
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
/* In a real-world program you OF COURSE check the return code of the /* In a real-world program you OF COURSE check the return code of the
function calls. On success, the value of maxfd is guaranteed to be function calls. On success, the value of maxfd is guaranteed to be
greater or equal than -1. We call select(maxfd + 1, ...), specially greater or equal than -1. We call select(maxfd + 1, ...), specially
in case of (maxfd == -1), we call select(0, ...), which is basically in case of (maxfd == -1), we call select(0, ...), which is basically
equal to sleep. */ equal to sleep. */
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
switch(rc) { switch(rc) {
case -1: case -1:
/* select error */ /* select error */
break; break;
case 0: case 0:
break; default:
/* timeout or readable/writable sockets */
default: curl_multi_perform(multi_handle, &file->still_running);
/* timeout or readable/writable sockets */ break;
/* note we *could* be more efficient and not wait for }
* CURLM_CALL_MULTI_PERFORM to clear here and check it on re-entry } while(file->still_running && (file->buffer_pos < want));
* but that gets messy */ return 1;
while(curl_multi_perform(multi_handle, &file->still_running) ==
CURLM_CALL_MULTI_PERFORM);
break;
}
} while(file->still_running && (file->buffer_pos < want));
return 1;
} }
/* use to remove want bytes from the front of a files buffer */ /* use to remove want bytes from the front of a files buffer */
static int static int use_buffer(URL_FILE *file,int want)
use_buffer(URL_FILE *file,int want)
{ {
/* sort out buffer */ /* sort out buffer */
if((file->buffer_pos - want) <=0) if((file->buffer_pos - want) <=0) {
{ /* ditch buffer - write will recreate */
/* ditch buffer - write will recreate */
if(file->buffer)
free(file->buffer);
file->buffer=NULL;
file->buffer_pos=0;
file->buffer_len=0;
}
else
{
/* move rest down make it available for later */
memmove(file->buffer,
&file->buffer[want],
(file->buffer_pos - want));
file->buffer_pos -= want;
}
return 0;
}
URL_FILE *
url_fopen(const char *url,const char *operation)
{
/* this code could check for URLs or types in the 'url' and
basicly use the real fopen() for standard files */
URL_FILE *file;
(void)operation;
file = malloc(sizeof(URL_FILE));
if(!file)
return NULL;
memset(file, 0, sizeof(URL_FILE));
if((file->handle.file=fopen(url,operation)))
{
file->type = CFTYPE_FILE; /* marked as URL */
}
else
{
file->type = CFTYPE_CURL; /* marked as URL */
file->handle.curl = curl_easy_init();
curl_easy_setopt(file->handle.curl, CURLOPT_URL, url);
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file);
curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0L);
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback);
if(!multi_handle)
multi_handle = curl_multi_init();
curl_multi_add_handle(multi_handle, file->handle.curl);
/* lets start the fetch */
while(curl_multi_perform(multi_handle, &file->still_running) ==
CURLM_CALL_MULTI_PERFORM );
if((file->buffer_pos == 0) && (!file->still_running))
{
/* if still_running is 0 now, we should return NULL */
/* make sure the easy handle is not in the multi handle anymore */
curl_multi_remove_handle(multi_handle, file->handle.curl);
/* cleanup */
curl_easy_cleanup(file->handle.curl);
free(file);
file = NULL;
}
}
return file;
}
int
url_fclose(URL_FILE *file)
{
int ret=0;/* default is good return */
switch(file->type)
{
case CFTYPE_FILE:
ret=fclose(file->handle.file); /* passthrough */
break;
case CFTYPE_CURL:
/* make sure the easy handle is not in the multi handle anymore */
curl_multi_remove_handle(multi_handle, file->handle.curl);
/* cleanup */
curl_easy_cleanup(file->handle.curl);
break;
default: /* unknown or supported type - oh dear */
ret=EOF;
errno=EBADF;
break;
}
if(file->buffer) if(file->buffer)
free(file->buffer);/* free any allocated buffer space */ free(file->buffer);
free(file); file->buffer=NULL;
file->buffer_pos=0;
file->buffer_len=0;
}
else {
/* move rest down make it available for later */
memmove(file->buffer,
&file->buffer[want],
(file->buffer_pos - want));
return ret; file->buffer_pos -= want;
}
return 0;
} }
int URL_FILE *url_fopen(const char *url,const char *operation)
url_feof(URL_FILE *file)
{ {
int ret=0; /* this code could check for URLs or types in the 'url' and
basicly use the real fopen() for standard files */
switch(file->type) URL_FILE *file;
{ (void)operation;
case CFTYPE_FILE:
ret=feof(file->handle.file);
break;
case CFTYPE_CURL: file = malloc(sizeof(URL_FILE));
if((file->buffer_pos == 0) && (!file->still_running)) if(!file)
ret = 1; return NULL;
break;
default: /* unknown or supported type - oh dear */ memset(file, 0, sizeof(URL_FILE));
ret=-1;
errno=EBADF; if((file->handle.file=fopen(url,operation)))
break; file->type = CFTYPE_FILE; /* marked as URL */
else {
file->type = CFTYPE_CURL; /* marked as URL */
file->handle.curl = curl_easy_init();
curl_easy_setopt(file->handle.curl, CURLOPT_URL, url);
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEDATA, file);
curl_easy_setopt(file->handle.curl, CURLOPT_VERBOSE, 0L);
curl_easy_setopt(file->handle.curl, CURLOPT_WRITEFUNCTION, write_callback);
if(!multi_handle)
multi_handle = curl_multi_init();
curl_multi_add_handle(multi_handle, file->handle.curl);
/* lets start the fetch */
curl_multi_perform(multi_handle, &file->still_running);
if((file->buffer_pos == 0) && (!file->still_running)) {
/* if still_running is 0 now, we should return NULL */
/* make sure the easy handle is not in the multi handle anymore */
curl_multi_remove_handle(multi_handle, file->handle.curl);
/* cleanup */
curl_easy_cleanup(file->handle.curl);
free(file);
file = NULL;
} }
return ret; }
return file;
} }
size_t int url_fclose(URL_FILE *file)
url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
{ {
size_t want; int ret=0;/* default is good return */
switch(file->type) switch(file->type) {
{ case CFTYPE_FILE:
case CFTYPE_FILE: ret=fclose(file->handle.file); /* passthrough */
want=fread(ptr,size,nmemb,file->handle.file); break;
break;
case CFTYPE_CURL: case CFTYPE_CURL:
want = nmemb * size; /* make sure the easy handle is not in the multi handle anymore */
curl_multi_remove_handle(multi_handle, file->handle.curl);
fill_buffer(file,want,1); /* cleanup */
curl_easy_cleanup(file->handle.curl);
break;
/* check if theres data in the buffer - if not fill_buffer() default: /* unknown or supported type - oh dear */
* either errored or EOF */ ret=EOF;
if(!file->buffer_pos) errno=EBADF;
return 0; break;
}
/* ensure only available data is considered */ if(file->buffer)
if(file->buffer_pos < want) free(file->buffer);/* free any allocated buffer space */
want = file->buffer_pos;
/* xfer data to caller */ free(file);
memcpy(ptr, file->buffer, want);
use_buffer(file,want); return ret;
want = want / size; /* number of items - nb correct op - checked
* with glibc code*/
/*printf("(fread) return %d bytes %d left\n", want,file->buffer_pos);*/
break;
default: /* unknown or supported type - oh dear */
want=0;
errno=EBADF;
break;
}
return want;
} }
char * int url_feof(URL_FILE *file)
url_fgets(char *ptr, int size, URL_FILE *file)
{ {
int want = size - 1;/* always need to leave room for zero termination */ int ret=0;
int loop;
switch(file->type) switch(file->type) {
{ case CFTYPE_FILE:
case CFTYPE_FILE: ret=feof(file->handle.file);
ptr = fgets(ptr,size,file->handle.file); break;
break;
case CFTYPE_CURL:
case CFTYPE_CURL: if((file->buffer_pos == 0) && (!file->still_running))
fill_buffer(file,want,1); ret = 1;
break;
/* check if theres data in the buffer - if not fill either errored or
* EOF */ default: /* unknown or supported type - oh dear */
if(!file->buffer_pos) ret=-1;
return NULL; errno=EBADF;
break;
/* ensure only available data is considered */ }
if(file->buffer_pos < want) return ret;
want = file->buffer_pos; }
/*buffer contains data */ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
/* look for newline or eof */ {
for(loop=0;loop < want;loop++) size_t want;
{
if(file->buffer[loop] == '\n') switch(file->type) {
{ case CFTYPE_FILE:
want=loop+1;/* include newline */ want=fread(ptr,size,nmemb,file->handle.file);
break; break;
}
} case CFTYPE_CURL:
want = nmemb * size;
/* xfer data to caller */
memcpy(ptr, file->buffer, want); fill_buffer(file,want);
ptr[want]=0;/* allways null terminate */
/* check if theres data in the buffer - if not fill_buffer()
use_buffer(file,want); * either errored or EOF */
if(!file->buffer_pos)
/*printf("(fgets) return %d bytes %d left\n", want,file->buffer_pos);*/ return 0;
break;
/* ensure only available data is considered */
default: /* unknown or supported type - oh dear */ if(file->buffer_pos < want)
ptr=NULL; want = file->buffer_pos;
errno=EBADF;
/* xfer data to caller */
memcpy(ptr, file->buffer, want);
use_buffer(file,want);
want = want / size; /* number of items */
break;
default: /* unknown or supported type - oh dear */
want=0;
errno=EBADF;
break;
}
return want;
}
char *url_fgets(char *ptr, size_t size, URL_FILE *file)
{
size_t want = size - 1;/* always need to leave room for zero termination */
size_t loop;
switch(file->type) {
case CFTYPE_FILE:
ptr = fgets(ptr,size,file->handle.file);
break;
case CFTYPE_CURL:
fill_buffer(file,want);
/* check if theres data in the buffer - if not fill either errored or
* EOF */
if(!file->buffer_pos)
return NULL;
/* ensure only available data is considered */
if(file->buffer_pos < want)
want = file->buffer_pos;
/*buffer contains data */
/* look for newline or eof */
for(loop=0;loop < want;loop++) {
if(file->buffer[loop] == '\n') {
want=loop+1;/* include newline */
break; break;
}
} }
return ptr;/*success */ /* xfer data to caller */
memcpy(ptr, file->buffer, want);
ptr[want]=0;/* allways null terminate */
use_buffer(file,want);
break;
default: /* unknown or supported type - oh dear */
ptr=NULL;
errno=EBADF;
break;
}
return ptr;/*success */
} }
void void url_rewind(URL_FILE *file)
url_rewind(URL_FILE *file)
{ {
switch(file->type) switch(file->type) {
{ case CFTYPE_FILE:
case CFTYPE_FILE: rewind(file->handle.file); /* passthrough */
rewind(file->handle.file); /* passthrough */ break;
break;
case CFTYPE_CURL: case CFTYPE_CURL:
/* halt transaction */ /* halt transaction */
curl_multi_remove_handle(multi_handle, file->handle.curl); curl_multi_remove_handle(multi_handle, file->handle.curl);
/* restart */ /* restart */
curl_multi_add_handle(multi_handle, file->handle.curl); curl_multi_add_handle(multi_handle, file->handle.curl);
/* ditch buffer - write will recreate - resets stream pos*/ /* ditch buffer - write will recreate - resets stream pos*/
if(file->buffer) if(file->buffer)
free(file->buffer); free(file->buffer);
file->buffer=NULL; file->buffer=NULL;
file->buffer_pos=0; file->buffer_pos=0;
file->buffer_len=0; file->buffer_len=0;
break; break;
default: /* unknown or supported type - oh dear */
break;
}
default: /* unknown or supported type - oh dear */
break;
}
} }
/* Small main program to retrive from a url using fgets and fread saving the /* Small main program to retrive from a url using fgets and fread saving the
* output to two test files (note the fgets method will corrupt binary files if * output to two test files (note the fgets method will corrupt binary files if
* they contain 0 chars */ * they contain 0 chars */
int int main(int argc, char *argv[])
main(int argc, char *argv[])
{ {
URL_FILE *handle; URL_FILE *handle;
FILE *outf; FILE *outf;
int nread; int nread;
char buffer[256]; char buffer[256];
const char *url; const char *url;
if(argc < 2) if(argc < 2)
{ url="http://192.168.7.3/testfile";/* default to testurl */
url="http://192.168.7.3/testfile";/* default to testurl */ else
} url=argv[1];/* use passed url */
else
{
url=argv[1];/* use passed url */
}
/* copy from url line by line with fgets */ /* copy from url line by line with fgets */
outf=fopen("fgets.test","w+"); outf=fopen("fgets.test","w+");
if(!outf) if(!outf) {
{ perror("couldn't open fgets output file\n");
perror("couldn't open fgets output file\n"); return 1;
return 1; }
}
handle = url_fopen(url, "r");
if(!handle)
{
printf("couldn't url_fopen() %s\n", url);
fclose(outf);
return 2;
}
while(!url_feof(handle))
{
url_fgets(buffer,sizeof(buffer),handle);
fwrite(buffer,1,strlen(buffer),outf);
}
url_fclose(handle);
handle = url_fopen(url, "r");
if(!handle) {
printf("couldn't url_fopen() %s\n", url);
fclose(outf); fclose(outf);
return 2;
}
while(!url_feof(handle)) {
url_fgets(buffer,sizeof(buffer),handle);
fwrite(buffer,1,strlen(buffer),outf);
}
url_fclose(handle);
fclose(outf);
/* Copy from url with fread */ /* Copy from url with fread */
outf=fopen("fread.test","w+"); outf=fopen("fread.test","w+");
if(!outf) if(!outf) {
{ perror("couldn't open fread output file\n");
perror("couldn't open fread output file\n"); return 1;
return 1; }
}
handle = url_fopen("testfile", "r");
if(!handle) {
printf("couldn't url_fopen() testfile\n");
fclose(outf);
return 2;
}
do {
nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer,1,nread,outf);
} while(nread);
url_fclose(handle);
handle = url_fopen("testfile", "r");
if(!handle) {
printf("couldn't url_fopen() testfile\n");
fclose(outf); fclose(outf);
return 2;
}
do {
nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer,1,nread,outf);
} while(nread);
url_fclose(handle);
fclose(outf);
/* Test rewind */ /* Test rewind */
outf=fopen("rewind.test","w+"); outf=fopen("rewind.test","w+");
if(!outf) if(!outf) {
{ perror("couldn't open fread output file\n");
perror("couldn't open fread output file\n"); return 1;
return 1; }
}
handle = url_fopen("testfile", "r");
if(!handle) {
printf("couldn't url_fopen() testfile\n");
fclose(outf);
return 2;
}
nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer,1,nread,outf);
url_rewind(handle);
buffer[0]='\n';
fwrite(buffer,1,1,outf);
nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer,1,nread,outf);
url_fclose(handle);
handle = url_fopen("testfile", "r");
if(!handle) {
printf("couldn't url_fopen() testfile\n");
fclose(outf); fclose(outf);
return 2;
}
nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer,1,nread,outf);
url_rewind(handle);
buffer[0]='\n';
fwrite(buffer,1,1,outf);
nread = url_fread(buffer, 1,sizeof(buffer), handle);
fwrite(buffer,1,nread,outf);
return 0;/* all done */ url_fclose(handle);
fclose(outf);
return 0;/* all done */
} }

View File

@@ -67,8 +67,7 @@ int main(int argc, char **argv)
if(argc == 2) if(argc == 2)
curl_easy_setopt(handle, CURLOPT_URL, argv[1]); curl_easy_setopt(handle, CURLOPT_URL, argv[1]);
else else
curl_easy_setopt(handle, CURLOPT_URL, curl_easy_setopt(handle, CURLOPT_URL, "ftp://example.com/test/*");
"ftp://curltest.howto.cz:123456@curltest.howto.cz/test/*");
/* and start transfer! */ /* and start transfer! */
rc = curl_easy_perform(handle); rc = curl_easy_perform(handle);

View File

@@ -52,12 +52,10 @@ int main(void)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
/* /*
* Get curl 7.9.2 from sunet.se's FTP site. curl 7.9.2 is most likely not * You better replace the URL with one that works!
* present there by the time you read this, so you'd better replace the
* URL with one that works!
*/ */
curl_easy_setopt(curl, CURLOPT_URL, curl_easy_setopt(curl, CURLOPT_URL,
"ftp://ftp.sunet.se/pub/www/utilities/curl/curl-7.9.2.tar.gz"); "ftp://ftp.example.com/pub/www/utilities/curl/curl-7.9.2.tar.gz");
/* Define our callback to get called when there's data to be written */ /* Define our callback to get called when there's data to be written */
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
/* Set a pointer to our struct to pass to the callback */ /* Set a pointer to our struct to pass to the callback */

View File

@@ -21,6 +21,8 @@
static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data) static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
{ {
(void)ptr;
(void)data;
/* we are not interested in the headers itself, /* we are not interested in the headers itself,
so we only return the size we would have saved ... */ so we only return the size we would have saved ... */
return (size_t)(size * nmemb); return (size_t)(size * nmemb);
@@ -28,8 +30,7 @@ static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
int main(void) int main(void)
{ {
/* Check for binutils 2.19.1 from ftp.gnu.org's FTP site. */ char ftpurl[] = "ftp://ftp.example.com/gnu/binutils/binutils-2.19.1.tar.bz2";
char ftpurl[] = "ftp://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2";
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
const time_t filetime; const time_t filetime;
@@ -59,7 +60,7 @@ int main(void)
if((CURLE_OK == res) && filetime) if((CURLE_OK == res) && filetime)
printf("filetime %s: %s", filename, ctime(&filetime)); printf("filetime %s: %s", filename, ctime(&filetime));
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize); res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &filesize);
if((CURLE_OK == res) && filesize) if((CURLE_OK == res) && (filesize>0))
printf("filesize %s: %0.0f bytes\n", filename, filesize); printf("filesize %s: %0.0f bytes\n", filename, filesize);
} else { } else {
/* we failed */ /* we failed */

View File

@@ -27,7 +27,7 @@ write_response(void *ptr, size_t size, size_t nmemb, void *data)
return fwrite(ptr, size, nmemb, writehere); return fwrite(ptr, size, nmemb, writehere);
} }
int main(int argc, char **argv) int main(void)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
@@ -43,7 +43,7 @@ int main(int argc, char **argv)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
/* Get a file listing from sunet */ /* Get a file listing from sunet */
curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.sunet.se/"); curl_easy_setopt(curl, CURLOPT_URL, "ftp://ftp.example.com/");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile); curl_easy_setopt(curl, CURLOPT_WRITEDATA, ftpfile);
/* If you intend to use this on windows with a libcurl DLL, you must use /* If you intend to use this on windows with a libcurl DLL, you must use
CURLOPT_WRITEFUNCTION as well */ CURLOPT_WRITEFUNCTION as well */

View File

@@ -30,7 +30,7 @@
#define LOCAL_FILE "/tmp/uploadthis.txt" #define LOCAL_FILE "/tmp/uploadthis.txt"
#define UPLOAD_FILE_AS "while-uploading.txt" #define UPLOAD_FILE_AS "while-uploading.txt"
#define REMOTE_URL "ftp://localhost/" UPLOAD_FILE_AS #define REMOTE_URL "ftp://example.com/" UPLOAD_FILE_AS
#define RENAME_FILE_TO "renamed-and-fine.txt" #define RENAME_FILE_TO "renamed-and-fine.txt"
/* NOTE: if you want this example to work on Windows with libcurl as a /* NOTE: if you want this example to work on Windows with libcurl as a
@@ -48,7 +48,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
return retcode; return retcode;
} }
int main(int argc, char **argv) int main(void)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;

View File

@@ -32,7 +32,8 @@ int __cdecl _snscanf(const char * input, size_t length, const char * format, ...
/* parse headers for Content-Length */ /* parse headers for Content-Length */
size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) { size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
int r; int r;
long len = 0; long len = 0;
@@ -46,7 +47,8 @@ size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream)
} }
/* discard downloaded data */ /* discard downloaded data */
size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream) { size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
return size * nmemb; return size * nmemb;
} }
@@ -143,13 +145,14 @@ int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
} }
} }
int main(int c, char **argv) { int main(int c, char **argv)
{
CURL *curlhandle = NULL; CURL *curlhandle = NULL;
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);
curlhandle = curl_easy_init(); curlhandle = curl_easy_init();
upload(curlhandle, "ftp://user:pass@host/path/file", "C:\\file", 0, 3); upload(curlhandle, "ftp://user:pass@example.com/path/file", "C:\\file", 0, 3);
curl_easy_cleanup(curlhandle); curl_easy_cleanup(curlhandle);
curl_global_cleanup(); curl_global_cleanup();

View File

@@ -19,7 +19,7 @@ int main(void)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
/* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTURL */ /* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTURL */
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");
/* http://curl.haxx.se/libcurl/c/curl_easy_perform.html */ /* http://curl.haxx.se/libcurl/c/curl_easy_perform.html */
res = curl_easy_perform(curl); res = curl_easy_perform(curl);

View File

@@ -8,8 +8,6 @@
* *
* Example source code to show how the callback function can be used to * Example source code to show how the callback function can be used to
* download data into a chunk of memory instead of storing it in a file. * download data into a chunk of memory instead of storing it in a file.
*
* This exact source code has not been verified to work.
*/ */
#include <stdio.h> #include <stdio.h>
@@ -17,25 +15,12 @@
#include <string.h> #include <string.h>
#include <curl/curl.h> #include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
struct MemoryStruct { struct MemoryStruct {
char *memory; char *memory;
size_t size; size_t size;
}; };
static void *myrealloc(void *ptr, size_t size);
static void *myrealloc(void *ptr, size_t size)
{
/* There might be a realloc() out there that doesn't like reallocing
NULL pointers, so we take care of it here */
if(ptr)
return realloc(ptr, size);
else
return malloc(size);
}
static size_t static size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
@@ -43,22 +28,28 @@ WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
size_t realsize = size * nmemb; size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)data; struct MemoryStruct *mem = (struct MemoryStruct *)data;
mem->memory = myrealloc(mem->memory, mem->size + realsize + 1); mem->memory = realloc(mem->memory, mem->size + realsize + 1);
if (mem->memory) { if (mem->memory == NULL) {
memcpy(&(mem->memory[mem->size]), ptr, realsize); /* out of memory! */
mem->size += realsize; printf("not enough memory (realloc returned NULL)\n");
mem->memory[mem->size] = 0; exit(EXIT_FAILURE);
} }
memcpy(&(mem->memory[mem->size]), ptr, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize; return realsize;
} }
int main(int argc, char **argv)
int main(void)
{ {
CURL *curl_handle; CURL *curl_handle;
struct MemoryStruct chunk; struct MemoryStruct chunk;
chunk.memory=NULL; /* we expect realloc(NULL, size) to work */ chunk.memory = malloc(1); /* will be grown as needed by the realloc above */
chunk.size = 0; /* no data at this point */ chunk.size = 0; /* no data at this point */
curl_global_init(CURL_GLOBAL_ALL); curl_global_init(CURL_GLOBAL_ALL);
@@ -67,7 +58,7 @@ int main(int argc, char **argv)
curl_handle = curl_easy_init(); curl_handle = curl_easy_init();
/* specify URL to get */ /* specify URL to get */
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://cool.haxx.se/"); curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/");
/* send all data to this function */ /* send all data to this function */
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
@@ -96,6 +87,8 @@ int main(int argc, char **argv)
* you're done with it, you should free() it as a nice application. * you're done with it, you should free() it as a nice application.
*/ */
printf("%lu bytes retrieved\n", (long)chunk.size);
if(chunk.memory) if(chunk.memory)
free(chunk.memory); free(chunk.memory);

View File

@@ -58,10 +58,7 @@ callback.
typedef struct _GlobalInfo { typedef struct _GlobalInfo {
CURLM *multi; CURLM *multi;
guint timer_event; guint timer_event;
int prev_running;
int still_running; int still_running;
int requested; /* count: curl_easy_init() */
int completed; /* count: curl_easy_cleanup() */
} GlobalInfo; } GlobalInfo;
@@ -95,7 +92,6 @@ static void mcode_or_die(const char *where, CURLMcode code) {
const char *s; const char *s;
switch (code) { switch (code) {
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
case CURLM_OK: s="CURLM_OK"; break;
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break; case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break; case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
@@ -113,62 +109,43 @@ static void mcode_or_die(const char *where, CURLMcode code) {
/* Check for completed transfers, and remove their easy handles */ /* Check for completed transfers, and remove their easy handles */
static void check_run_count(GlobalInfo *g) static void check_multi_info(GlobalInfo *g)
{ {
if (g->prev_running > g->still_running) { char *eff_url;
char *eff_url=NULL; CURLMsg *msg;
CURLMsg *msg; int msgs_left;
int msgs_left; ConnInfo *conn;
ConnInfo *conn=NULL; CURL *easy;
CURL*easy; CURLcode res;
CURLcode res;
MSG_OUT("REMAINING: %d\n", g->still_running); MSG_OUT("REMAINING: %d\n", g->still_running);
/* while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
I am still uncertain whether it is safe to remove an easy handle if (msg->msg == CURLMSG_DONE) {
from inside the curl_multi_info_read loop, so here I will search easy = msg->easy_handle;
for completed transfers in the inner "while" loop, and then remove res = msg->data.result;
them in the outer "do-while" loop... curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
*/ curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
do { MSG_OUT("DONE: %s => (%d) %s\n", eff_url, res, conn->error);
easy=NULL; curl_multi_remove_handle(g->multi, easy);
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) { free(conn->url);
if (msg->msg == CURLMSG_DONE) { curl_easy_cleanup(easy);
easy=msg->easy_handle; free(conn);
res=msg->data.result; }
break;
}
}
if (easy) {
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
MSG_OUT("DONE: %s => (%d) %s\n", eff_url, res, conn->error);
curl_multi_remove_handle(g->multi, easy);
g_free(conn->url);
curl_easy_cleanup(easy);
g_free(conn);
g->completed++;
}
} while ( easy );
MSG_OUT("Requested: %d Completed:%d\n", g->requested, g->completed);
} }
g->prev_running = g->still_running;
} }
/* Called by glib when our timeout expires */ /* Called by glib when our timeout expires */
static gboolean timer_cb(gpointer data) static gboolean timer_cb(gpointer data)
{ {
GlobalInfo *g = (GlobalInfo *)data; GlobalInfo *g = (GlobalInfo *)data;
CURLMcode rc; CURLMcode rc;
do { rc = curl_multi_socket_action(g->multi,
rc = curl_multi_socket(g->multi, CURL_SOCKET_TIMEOUT, &g->still_running); CURL_SOCKET_TIMEOUT, 0, &g->still_running);
} while (rc == CURLM_CALL_MULTI_PERFORM); mcode_or_die("timer_cb: curl_multi_socket_action", rc);
mcode_or_die("timer_cb: curl_multi_socket", rc); check_multi_info(g);
check_run_count(g);
return FALSE; return FALSE;
} }
@@ -198,11 +175,15 @@ static gboolean event_cb(GIOChannel *ch, GIOCondition condition, gpointer data)
GlobalInfo *g = (GlobalInfo*) data; GlobalInfo *g = (GlobalInfo*) data;
CURLMcode rc; CURLMcode rc;
int fd=g_io_channel_unix_get_fd(ch); int fd=g_io_channel_unix_get_fd(ch);
do {
rc = curl_multi_socket(g->multi, fd, &g->still_running); int action =
} while (rc == CURLM_CALL_MULTI_PERFORM); (condition & G_IO_IN ? CURL_CSELECT_IN : 0) |
mcode_or_die("event_cb: curl_multi_socket", rc); (condition & G_IO_OUT ? CURL_CSELECT_OUT : 0);
check_run_count(g);
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
mcode_or_die("event_cb: curl_multi_socket_action", rc);
check_multi_info(g);
if(g->still_running) { if(g->still_running) {
return TRUE; return TRUE;
} else { } else {
@@ -338,12 +319,9 @@ static void new_conn(char *url, GlobalInfo *g )
MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url); MSG_OUT("Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
rc =curl_multi_add_handle(g->multi, conn->easy); rc =curl_multi_add_handle(g->multi, conn->easy);
mcode_or_die("new_conn: curl_multi_add_handle", rc); mcode_or_die("new_conn: curl_multi_add_handle", rc);
g->requested++;
do { /* note that the add_handle() will set a time-out to trigger very soon so
rc = curl_multi_socket_all(g->multi, &g->still_running); that the necessary socket_action() call will be called by this app */
} while (CURLM_CALL_MULTI_PERFORM == rc);
mcode_or_die("new_conn: curl_multi_socket_all", rc);
check_run_count(g);
} }
@@ -451,9 +429,10 @@ int main(int argc, char **argv)
curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g); curl_multi_setopt(g->multi, CURLMOPT_SOCKETDATA, g);
curl_multi_setopt(g->multi, CURLMOPT_TIMERFUNCTION, update_timeout_cb); curl_multi_setopt(g->multi, CURLMOPT_TIMERFUNCTION, update_timeout_cb);
curl_multi_setopt(g->multi, CURLMOPT_TIMERDATA, g); curl_multi_setopt(g->multi, CURLMOPT_TIMERDATA, g);
do {
rc = curl_multi_socket_all(g->multi, &g->still_running); /* we don't call any curl_multi_socket*() function yet as we have no handles
} while (CURLM_CALL_MULTI_PERFORM == rc); added! */
g_main_loop_run(gmain); g_main_loop_run(gmain);
curl_multi_cleanup(g->multi); curl_multi_cleanup(g->multi);
return 0; return 0;

View File

@@ -62,7 +62,6 @@ typedef struct _GlobalInfo {
struct event fifo_event; struct event fifo_event;
struct event timer_event; struct event timer_event;
CURLM *multi; CURLM *multi;
int prev_running;
int still_running; int still_running;
FILE* input; FILE* input;
} GlobalInfo; } GlobalInfo;
@@ -110,7 +109,6 @@ static void mcode_or_die(const char *where, CURLMcode code)
const char *s; const char *s;
switch (code) { switch (code) {
case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break; case CURLM_CALL_MULTI_PERFORM: s="CURLM_CALL_MULTI_PERFORM"; break;
case CURLM_OK: s="CURLM_OK"; break;
case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break; case CURLM_BAD_HANDLE: s="CURLM_BAD_HANDLE"; break;
case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break; case CURLM_BAD_EASY_HANDLE: s="CURLM_BAD_EASY_HANDLE"; break;
case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break; case CURLM_OUT_OF_MEMORY: s="CURLM_OUT_OF_MEMORY"; break;
@@ -132,44 +130,29 @@ static void mcode_or_die(const char *where, CURLMcode code)
/* Check for completed transfers, and remove their easy handles */ /* Check for completed transfers, and remove their easy handles */
static void check_run_count(GlobalInfo *g) static void check_multi_info(GlobalInfo *g)
{ {
if (g->prev_running > g->still_running) { char *eff_url;
char *eff_url=NULL; CURLMsg *msg;
CURLMsg *msg; int msgs_left;
int msgs_left; ConnInfo *conn;
ConnInfo *conn=NULL; CURL *easy;
CURL*easy; CURLcode res;
CURLcode res;
fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running); fprintf(MSG_OUT, "REMAINING: %d\n", g->still_running);
/* while ((msg = curl_multi_info_read(g->multi, &msgs_left))) {
I am still uncertain whether it is safe to remove an easy handle if (msg->msg == CURLMSG_DONE) {
from inside the curl_multi_info_read loop, so here I will search easy = msg->easy_handle;
for completed transfers in the inner "while" loop, and then remove res = msg->data.result;
them in the outer "do-while" loop... curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
*/ curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
do { fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
easy=NULL; curl_multi_remove_handle(g->multi, easy);
while ((msg = curl_multi_info_read(g->multi, &msgs_left))) { free(conn->url);
if (msg->msg == CURLMSG_DONE) { curl_easy_cleanup(easy);
easy=msg->easy_handle; free(conn);
res=msg->data.result; }
break;
}
}
if (easy) {
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &conn);
curl_easy_getinfo(easy, CURLINFO_EFFECTIVE_URL, &eff_url);
fprintf(MSG_OUT, "DONE: %s => (%d) %s\n", eff_url, res, conn->error);
curl_multi_remove_handle(g->multi, easy);
free(conn->url);
curl_easy_cleanup(easy);
free(conn);
}
} while ( easy );
} }
g->prev_running = g->still_running;
} }
@@ -181,16 +164,13 @@ static void event_cb(int fd, short kind, void *userp)
CURLMcode rc; CURLMcode rc;
int action = int action =
(kind&EV_READ?CURL_CSELECT_IN:0)| (kind & EV_READ ? CURL_CSELECT_IN : 0) |
(kind&EV_WRITE?CURL_CSELECT_OUT:0); (kind & EV_WRITE ? CURL_CSELECT_OUT : 0);
do {
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
} while (rc == CURLM_CALL_MULTI_PERFORM);
rc = curl_multi_socket_action(g->multi, fd, action, &g->still_running);
mcode_or_die("event_cb: curl_multi_socket_action", rc); mcode_or_die("event_cb: curl_multi_socket_action", rc);
check_run_count(g); check_multi_info(g);
if ( g->still_running <= 0 ) { if ( g->still_running <= 0 ) {
fprintf(MSG_OUT, "last transfer done, kill timeout\n"); fprintf(MSG_OUT, "last transfer done, kill timeout\n");
if (evtimer_pending(&g->timer_event, NULL)) { if (evtimer_pending(&g->timer_event, NULL)) {
@@ -209,12 +189,10 @@ static void timer_cb(int fd, short kind, void *userp)
(void)fd; (void)fd;
(void)kind; (void)kind;
do { rc = curl_multi_socket_action(g->multi,
rc = curl_multi_socket_action(g->multi,
CURL_SOCKET_TIMEOUT, 0, &g->still_running); CURL_SOCKET_TIMEOUT, 0, &g->still_running);
} while (rc == CURLM_CALL_MULTI_PERFORM);
mcode_or_die("timer_cb: curl_multi_socket_action", rc); mcode_or_die("timer_cb: curl_multi_socket_action", rc);
check_run_count(g); check_multi_info(g);
} }
@@ -340,7 +318,7 @@ static void new_conn(char *url, GlobalInfo *g )
curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn); curl_easy_setopt(conn->easy, CURLOPT_PROGRESSDATA, conn);
fprintf(MSG_OUT, fprintf(MSG_OUT,
"Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url); "Adding easy %p to multi %p (%s)\n", conn->easy, g->multi, url);
rc =curl_multi_add_handle(g->multi, conn->easy); rc = curl_multi_add_handle(g->multi, conn->easy);
mcode_or_die("new_conn: curl_multi_add_handle", rc); mcode_or_die("new_conn: curl_multi_add_handle", rc);
/* note that the add_handle() will set a time-out to trigger very soon so /* note that the add_handle() will set a time-out to trigger very soon so
@@ -372,7 +350,7 @@ static int init_fifo (GlobalInfo *g)
{ {
struct stat st; struct stat st;
static const char *fifo = "hiper.fifo"; static const char *fifo = "hiper.fifo";
int sockfd; curl_socket_t sockfd;
fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo); fprintf(MSG_OUT, "Creating named pipe \"%s\"\n", fifo);
if (lstat (fifo, &st) == 0) { if (lstat (fifo, &st) == 0) {

View File

@@ -17,7 +17,7 @@ int main(void)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://sourceforge.net/"); curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
#ifdef SKIP_PEER_VERIFICATION #ifdef SKIP_PEER_VERIFICATION
/* /*

View File

@@ -27,7 +27,7 @@
#define HTTP_HANDLE 0 /* Index for the HTTP transfer */ #define HTTP_HANDLE 0 /* Index for the HTTP transfer */
#define FTP_HANDLE 1 /* Index for the FTP transfer */ #define FTP_HANDLE 1 /* Index for the FTP transfer */
int main(int argc, char **argv) int main(void)
{ {
CURL *handles[HANDLECOUNT]; CURL *handles[HANDLECOUNT];
CURLM *multi_handle; CURLM *multi_handle;
@@ -43,9 +43,9 @@ int main(int argc, char **argv)
handles[i] = curl_easy_init(); handles[i] = curl_easy_init();
/* set the options (I left out a few, you'll get the point anyway) */ /* set the options (I left out a few, you'll get the point anyway) */
curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "http://website.com"); curl_easy_setopt(handles[HTTP_HANDLE], CURLOPT_URL, "http://example.com");
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://ftpsite.com"); curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_URL, "ftp://example.com");
curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_UPLOAD, 1L); curl_easy_setopt(handles[FTP_HANDLE], CURLOPT_UPLOAD, 1L);
/* init a multi stack */ /* init a multi stack */
@@ -56,8 +56,7 @@ int main(int argc, char **argv)
curl_multi_add_handle(multi_handle, handles[i]); curl_multi_add_handle(multi_handle, handles[i]);
/* we start some action by calling perform right away */ /* we start some action by calling perform right away */
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
while(still_running) { while(still_running) {
struct timeval timeout; struct timeval timeout;
@@ -102,14 +101,9 @@ int main(int argc, char **argv)
case -1: case -1:
/* select error */ /* select error */
break; break;
case 0: case 0: /* timeout */
/* timeout, do something else */ default: /* action */
break; curl_multi_perform(multi_handle, &still_running);
default:
/* one or more of curl's file descriptors say there's data to read
or write */
while(CURLM_CALL_MULTI_PERFORM ==
curl_multi_perform(multi_handle, &still_running));
break; break;
} }
} }

View File

@@ -37,12 +37,12 @@ void dump(const char *text,
/* without the hex output, we can fit more on screen */ /* without the hex output, we can fit more on screen */
width = 0x40; width = 0x40;
fprintf(stream, "%s, %010.10ld bytes (0x%08.8lx)\n", fprintf(stream, "%s, %10.10ld bytes (0x%8.8lx)\n",
text, (long)size, (long)size); text, (long)size, (long)size);
for(i=0; i<size; i+= width) { for(i=0; i<size; i+= width) {
fprintf(stream, "%04.4lx: ", (long)i); fprintf(stream, "%4.4lx: ", (long)i);
if(!nohex) { if(!nohex) {
/* hex not disabled, show it */ /* hex not disabled, show it */
@@ -79,6 +79,7 @@ int my_trace(CURL *handle, curl_infotype type,
{ {
const char *text; const char *text;
(void)userp;
(void)handle; /* prevent compiler warning */ (void)handle; /* prevent compiler warning */
switch (type) { switch (type) {
@@ -108,7 +109,7 @@ int my_trace(CURL *handle, curl_infotype type,
/* /*
* Simply download a HTTP file. * Simply download a HTTP file.
*/ */
int main(int argc, char **argv) int main(void)
{ {
CURL *http_handle; CURL *http_handle;
CURLM *multi_handle; CURLM *multi_handle;
@@ -118,7 +119,7 @@ int main(int argc, char **argv)
http_handle = curl_easy_init(); http_handle = curl_easy_init();
/* set the options (I left out a few, you'll get the point anyway) */ /* set the options (I left out a few, you'll get the point anyway) */
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/"); curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.example.com/");
curl_easy_setopt(http_handle, CURLOPT_DEBUGFUNCTION, my_trace); curl_easy_setopt(http_handle, CURLOPT_DEBUGFUNCTION, my_trace);
curl_easy_setopt(http_handle, CURLOPT_VERBOSE, 1L); curl_easy_setopt(http_handle, CURLOPT_VERBOSE, 1L);
@@ -130,8 +131,7 @@ int main(int argc, char **argv)
curl_multi_add_handle(multi_handle, http_handle); curl_multi_add_handle(multi_handle, http_handle);
/* we start some action by calling perform right away */ /* we start some action by calling perform right away */
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
while(still_running) { while(still_running) {
struct timeval timeout; struct timeval timeout;
@@ -181,8 +181,7 @@ int main(int argc, char **argv)
case 0: case 0:
default: default:
/* timeout or readable/writable sockets */ /* timeout or readable/writable sockets */
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
break; break;
} }
} }

View File

@@ -22,7 +22,7 @@
/* /*
* Simply download two HTTP files! * Simply download two HTTP files!
*/ */
int main(int argc, char **argv) int main(void)
{ {
CURL *http_handle; CURL *http_handle;
CURL *http_handle2; CURL *http_handle2;
@@ -34,7 +34,7 @@ int main(int argc, char **argv)
http_handle2 = curl_easy_init(); http_handle2 = curl_easy_init();
/* set options */ /* set options */
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/"); curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.example.com/");
/* set options */ /* set options */
curl_easy_setopt(http_handle2, CURLOPT_URL, "http://localhost/"); curl_easy_setopt(http_handle2, CURLOPT_URL, "http://localhost/");
@@ -47,8 +47,7 @@ int main(int argc, char **argv)
curl_multi_add_handle(multi_handle, http_handle2); curl_multi_add_handle(multi_handle, http_handle2);
/* we start some action by calling perform right away */ /* we start some action by calling perform right away */
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
while(still_running) { while(still_running) {
struct timeval timeout; struct timeval timeout;
@@ -96,8 +95,7 @@ int main(int argc, char **argv)
case 0: case 0:
default: default:
/* timeout or readable/writable sockets */ /* timeout or readable/writable sockets */
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
break; break;
} }
} }

View File

@@ -15,7 +15,7 @@
#include <curl/curl.h> #include <curl/curl.h>
int main(int argc, char *argv[]) int main(void)
{ {
CURL *curl; CURL *curl;
@@ -58,8 +58,7 @@ int main(int argc, char *argv[])
if(curl && multi_handle) { if(curl && multi_handle) {
/* what URL that receives this POST */ /* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/upload.cgi");
"http://www.fillinyoururl.com/upload.cgi");
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
@@ -67,8 +66,7 @@ int main(int argc, char *argv[])
curl_multi_add_handle(multi_handle, curl); curl_multi_add_handle(multi_handle, curl);
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
while(still_running) { while(still_running) {
struct timeval timeout; struct timeval timeout;
@@ -114,12 +112,10 @@ int main(int argc, char *argv[])
/* select error */ /* select error */
break; break;
case 0: case 0:
printf("timeout!\n");
default: default:
/* timeout or readable/writable sockets */ /* timeout or readable/writable sockets */
printf("perform!\n"); printf("perform!\n");
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
printf("running: %d!\n", still_running); printf("running: %d!\n", still_running);
break; break;
} }

View File

@@ -22,7 +22,7 @@
/* /*
* Simply download a HTTP file. * Simply download a HTTP file.
*/ */
int main(int argc, char **argv) int main(void)
{ {
CURL *http_handle; CURL *http_handle;
CURLM *multi_handle; CURLM *multi_handle;
@@ -32,7 +32,7 @@ int main(int argc, char **argv)
http_handle = curl_easy_init(); http_handle = curl_easy_init();
/* set the options (I left out a few, you'll get the point anyway) */ /* set the options (I left out a few, you'll get the point anyway) */
curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.haxx.se/"); curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.example.com/");
/* init a multi stack */ /* init a multi stack */
multi_handle = curl_multi_init(); multi_handle = curl_multi_init();
@@ -41,8 +41,7 @@ int main(int argc, char **argv)
curl_multi_add_handle(multi_handle, http_handle); curl_multi_add_handle(multi_handle, http_handle);
/* we start some action by calling perform right away */ /* we start some action by calling perform right away */
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
while(still_running) { while(still_running) {
struct timeval timeout; struct timeval timeout;
@@ -92,8 +91,7 @@ int main(int argc, char **argv)
case 0: case 0:
default: default:
/* timeout or readable/writable sockets */ /* timeout or readable/writable sockets */
while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running);
curl_multi_perform(multi_handle, &still_running));
break; break;
} }
} }

View File

@@ -11,7 +11,7 @@
#include <unistd.h> #include <unistd.h>
#include <curl/curl.h> #include <curl/curl.h>
int main(int argc, char **argv) int main(void)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
@@ -24,12 +24,12 @@ int main(int argc, char **argv)
curl_easy_setopt(curl, CURLOPT_HEADER, 1L); curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
/* get the first document */ /* get the first document */
curl_easy_setopt(curl, CURLOPT_URL, "http://curl.haxx.se/"); curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
/* get another document from the same server using the same /* get another document from the same server using the same
connection */ connection */
curl_easy_setopt(curl, CURLOPT_URL, "http://curl.haxx.se/docs/"); curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/docs/");
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
/* always cleanup */ /* always cleanup */

View File

@@ -51,8 +51,8 @@ int main(void)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
/* First set the URL that is about to receive our POST. */ /* First set the URL that is about to receive our POST. */
curl_easy_setopt(curl, CURLOPT_URL, curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/index.cgi");
"http://receivingsite.com.pooh/index.cgi");
/* Now specify we want to POST data */ /* Now specify we want to POST data */
curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_POST, 1L);

View File

@@ -67,7 +67,7 @@ int main(int argc, char *argv[])
headerlist = curl_slist_append(headerlist, buf); headerlist = curl_slist_append(headerlist, buf);
if(curl) { if(curl) {
/* what URL that receives this POST */ /* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, "http://curl.haxx.se/examplepost.cgi"); curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/examplepost.cgi");
if ( (argc == 2) && (!strcmp(argv[1], "noexpectheader")) ) if ( (argc == 2) && (!strcmp(argv[1], "noexpectheader")) )
/* only disable 100-continue header if explicitly requested */ /* only disable 100-continue header if explicitly requested */
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);

View File

@@ -75,7 +75,7 @@ int main(void)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
/* use platform-specific functions for codeset conversions */ /* use platform-specific functions for codeset conversions */
curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION, curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION,

View File

@@ -14,7 +14,7 @@
#include <curl/curl.h> #include <curl/curl.h>
/* Auxiliary function that waits on the socket. */ /* Auxiliary function that waits on the socket. */
static int wait_on_socket(int sockfd, int for_recv, long timeout_ms) static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms)
{ {
struct timeval tv; struct timeval tv;
fd_set infd, outfd, errfd; fd_set infd, outfd, errfd;
@@ -48,13 +48,14 @@ int main(void)
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
/* Minimalistic http request */ /* Minimalistic http request */
const char *request = "GET / HTTP/1.0\r\nHost: curl.haxx.se\r\n\r\n"; const char *request = "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n";
int sockfd; /* socket */ curl_socket_t sockfd; /* socket */
long sockextr;
size_t iolen; size_t iolen;
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
/* Do not do the transfer - only connect to host */ /* Do not do the transfer - only connect to host */
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L); curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
@@ -65,9 +66,11 @@ int main(void)
return 1; return 1;
} }
/* Extract the socket from the curl handle - we'll need it /* Extract the socket from the curl handle - we'll need it for waiting.
* for waiting */ * Note that this API takes a pointer to a 'long' while we use
res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockfd); * curl_socket_t for sockets otherwise.
*/
res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockextr);
if(CURLE_OK != res) if(CURLE_OK != res)
{ {
@@ -75,6 +78,8 @@ int main(void)
return 1; return 1;
} }
sockfd = sockextr;
/* wait for the socket to become ready for sending */ /* wait for the socket to become ready for sending */
if(!wait_on_socket(sockfd, 0, 60000L)) if(!wait_on_socket(sockfd, 0, 60000L))
{ {

View File

@@ -21,7 +21,7 @@ static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
return written; return written;
} }
int main(int argc, char **argv) int main(void)
{ {
CURL *curl_handle; CURL *curl_handle;
static const char *headerfilename = "head.out"; static const char *headerfilename = "head.out";
@@ -35,7 +35,7 @@ int main(int argc, char **argv)
curl_handle = curl_easy_init(); curl_handle = curl_easy_init();
/* set URL to get */ /* set URL to get */
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://curl.haxx.se"); curl_easy_setopt(curl_handle, CURLOPT_URL, "http://example.com");
/* no progress meter please */ /* no progress meter please */
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);

View File

@@ -17,7 +17,7 @@ int main(void)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
/* always cleanup */ /* always cleanup */

View File

@@ -20,7 +20,7 @@ int main(void)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://posthere.com"); curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
/* if we don't provide POSTFIELDSIZE, libcurl will strlen() by /* if we don't provide POSTFIELDSIZE, libcurl will strlen() by

View File

@@ -0,0 +1,71 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
*/
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
struct curl_slist *recipients = NULL;
/* value for envelope reverse-path */
static const char *from = "<bradh@example.com>";
/* this becomes the envelope forward-path */
static const char *to = "<bradh@example.net>";
curl = curl_easy_init();
if(curl) {
/* this is the URL for your mailserver - you can also use an smtps:// URL
* here */
curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.net.");
/* Note that this option isn't strictly required, omitting it will result in
* libcurl will sent the MAIL FROM command with no sender data. All
* autoresponses should have an empty reverse-path, and should be directed
* to the address in the reverse-path which triggered them. Otherwise, they
* could cause an endless loop. See RFC 5321 Section 4.5.5 for more details.
*/
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, from);
/* Note that the CURLOPT_MAIL_RCPT takes a list, not a char array. */
recipients = curl_slist_append(recipients, to);
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
/* You provide the payload (headers and the body of the message) as the
* "data" element. There are two choices, either:
* - provide a callback function and specify the function name using the
* CURLOPT_READFUNCTION option; or
* - just provide a FILE pointer that can be used to read the data from.
* The easiest case is just to read from standard input, (which is available
* as a FILE pointer) as shown here.
*/
curl_easy_setopt(curl, CURLOPT_READDATA, stdin);
/* send the message (including headers) */
res = curl_easy_perform(curl);
/* free the list of recipients */
curl_slist_free_all(recipients);
/* curl won't send the QUIT command until you call cleanup, so you should be
* able to re-use this connection for additional messages (setting
* CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
* curl_easy_perform() again. It may not be a good idea to keep the
* connection open for a very long time though (more than a few minutes may
* result in the server timing out the connection), and you do want to clean
* up in the end.
*/
curl_easy_cleanup(curl);
}
return 0;
}

View File

@@ -32,7 +32,7 @@
*/ */
int main(int argc, char **argv) int main(void)
{ {
CURL *curl; CURL *curl;
CURLcode res; CURLcode res;
@@ -47,7 +47,7 @@ int main(int argc, char **argv)
const char *pEngine; const char *pEngine;
#if USE_ENGINE #ifdef USE_ENGINE
pKeyName = "rsa_test"; pKeyName = "rsa_test";
pKeyType = "ENG"; pKeyType = "ENG";
pEngine = "chil"; /* for nChiper HSM... */ pEngine = "chil"; /* for nChiper HSM... */

192
docs/examples/smtp-multi.c Normal file
View File

@@ -0,0 +1,192 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
*
* This is an example application source code sending SMTP mail using the
* multi interface.
*/
#include <string.h>
#include <curl/curl.h>
/*
* This is the list of basic details you need to tweak to get things right.
*/
#define USERNAME "user@example.com"
#define PASSWORD "123qwerty"
#define SMTPSERVER "smtp.example.com"
#define SMTPPORT ":587" /* it is a colon+port string, but you can set it
to "" to use the default port */
#define RECIPIENT "<recipient@example.com>"
#define MAILFROM "<realuser@example.com>"
#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
/* Note that you should include the actual meta data headers here as well if
you want the mail to have a Subject, another From:, show a To: or whatever
you think your mail should feature! */
static const char *text[]={
"one\n",
"two\n",
"three\n",
" Hello, this is CURL email SMTP\n",
NULL
};
struct WriteThis {
int counter;
};
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{
struct WriteThis *pooh = (struct WriteThis *)userp;
const char *data;
if(size*nmemb < 1)
return 0;
data = text[pooh->counter];
if(data) {
size_t len = strlen(data);
memcpy(ptr, data, len);
pooh->counter++; /* advance pointer */
return len;
}
return 0; /* no more data left to deliver */
}
static struct timeval tvnow(void)
{
/*
** time() returns the value of time in seconds since the Epoch.
*/
struct timeval now;
now.tv_sec = (long)time(NULL);
now.tv_usec = 0;
return now;
}
static long tvdiff(struct timeval newer, struct timeval older)
{
return (newer.tv_sec-older.tv_sec)*1000+
(newer.tv_usec-older.tv_usec)/1000;
}
int main(void)
{
CURL *curl;
CURLM *mcurl;
int still_running = 1;
struct timeval mp_start;
char mp_timedout = 0;
struct WriteThis pooh;
struct curl_slist* rcpt_list = NULL;
pooh.counter = 0;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(!curl)
return 1;
mcurl = curl_multi_init();
if(!mcurl)
return 2;
rcpt_list = curl_slist_append(rcpt_list, RECIPIENT);
/* more addresses can be added here
rcpt_list = curl_slist_append(rcpt_list, "<others@example.com>");
*/
curl_easy_setopt(curl, CURLOPT_URL, "smtp://" SMTPSERVER SMTPPORT);
curl_easy_setopt(curl, CURLOPT_USERNAME, USERNAME);
curl_easy_setopt(curl, CURLOPT_PASSWORD, PASSWORD);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, MAILFROM);
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt_list);
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER,0);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_easy_setopt(curl, CURLOPT_READDATA, &pooh);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_SSLVERSION, 0);
curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0);
curl_multi_add_handle(mcurl, curl);
mp_timedout = 0;
mp_start = tvnow();
/* we start some action by calling perform right away */
curl_multi_perform(mcurl, &still_running);
while(still_running) {
struct timeval timeout;
int rc; /* select() return code */
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = -1;
long curl_timeo = -1;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to play around with */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
curl_multi_timeout(mcurl, &curl_timeo);
if(curl_timeo >= 0) {
timeout.tv_sec = curl_timeo / 1000;
if(timeout.tv_sec > 1)
timeout.tv_sec = 1;
else
timeout.tv_usec = (curl_timeo % 1000) * 1000;
}
/* get file descriptors from the transfers */
curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd);
/* In a real-world program you OF COURSE check the return code of the
function calls. On success, the value of maxfd is guaranteed to be
greater or equal than -1. We call select(maxfd + 1, ...), specially in
case of (maxfd == -1), we call select(0, ...), which is basically equal
to sleep. */
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
if (tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {
fprintf(stderr, "ABORTING TEST, since it seems "
"that it would have run forever.\n");
break;
}
switch(rc) {
case -1:
/* select error */
break;
case 0: /* timeout */
default: /* action */
curl_multi_perform(mcurl, &still_running);
break;
}
}
curl_slist_free_all(rcpt_list);
curl_multi_remove_handle(mcurl, curl);
curl_multi_cleanup(mcurl);
curl_easy_cleanup(curl);
curl_global_cleanup();
return 0;
}

136
docs/examples/smtp-tls.c Normal file
View File

@@ -0,0 +1,136 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
*/
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
/* This is a simple example showing how to send mail using libcurl's SMTP
* capabilities. It builds on the simplesmtp.c example, adding some
* authentication and transport security.
*/
#define FROM "<sender@example.org>"
#define TO "<addressee@example.net>"
#define CC "<info@example.org>"
static const char *payload_text[]={
"Date: Mon, 29 Nov 2010 21:54:29 +1100\n",
"To: " TO "\n",
"From: " FROM "(Example User)\n",
"Cc: " CC "(Another example User)\n",
"Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@rfcpedant.example.org>\n",
"Subject: SMTP TLS example message\n",
"\n", /* empty line to divide headers from body, see RFC5322 */
"The body of the message starts here.\n",
"\n",
"It could be a lot of lines, could be MIME encoded, whatever.\n",
"Check RFC5322.\n",
NULL
};
struct upload_status {
int lines_read;
};
static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
{
struct upload_status *upload_ctx = (struct upload_status *)userp;
const char *data;
if ((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
return 0;
}
data = payload_text[upload_ctx->lines_read];
if (data) {
size_t len = strlen(data);
memcpy(ptr, data, len);
upload_ctx->lines_read ++;
return len;
}
return 0;
}
int main(void)
{
CURL *curl;
CURLcode res;
struct curl_slist *recipients = NULL;
struct upload_status upload_ctx;
upload_ctx.lines_read = 0;
curl = curl_easy_init();
if (curl) {
/* This is the URL for your mailserver. Note the use of port 587 here,
* instead of the normal SMTP port (25). Port 587 is commonly used for
* secure mail submission (see RFC4403), but you should use whatever
* matches your server configuration. */
curl_easy_setopt(curl, CURLOPT_URL, "smtp://mainserver.example.net:587");
/* In this example, we'll start with a plain text connection, and upgrade
* to Transport Layer Security (TLS) using the STARTTLS command. Be careful
* of using CURLUSESSL_TRY here, because if TLS upgrade fails, the transfer
* will continue anyway - see the security discussion in the libcurl
* tutorial for more details. */
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
/* If your server doesn't have a valid certificate, then you can disable
* part of the Transport Layer Security protection by setting the
* CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST options to 0 (false).
* curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
* curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
* That is, in general, a bad idea. It is still better than sending your
* authentication details in plain text though.
* Instead, you should get the issuer certificate (or the host certificate
* if the certificate is self-signed) and add it to the set of certificates
* that are known to libcurl using CURLOPT_CAINFO and/or CURLOPT_CAPATH. See
* docs/SSLCERTS for more information.
*/
curl_easy_setopt(curl, CURLOPT_CAINFO, "/path/to/certificate.pem");
/* A common reason for requiring transport security is to protect
* authentication details (user names and passwords) from being "snooped"
* on the network. Here is how the user name and password are provided: */
curl_easy_setopt(curl, CURLOPT_USERNAME, "user@example.net");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "P@ssw0rd");
/* value for envelope reverse-path */
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM);
/* Add two recipients, in this particular case they correspond to the
* To: and Cc: addressees in the header, but they could be any kind of
* recipient. */
recipients = curl_slist_append(recipients, TO);
recipients = curl_slist_append(recipients, CC);
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);
/* In this case, we're using a callback function to specify the data. You
* could just use the CURLOPT_READDATA option to specify a FILE pointer to
* read from.
*/
curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
/* Since the traffic will be encrypted, it is very useful to turn on debug
* information within libcurl to see what is happening during the transfer.
*/
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
/* send the message (including headers) */
res = curl_easy_perform(curl);
/* free the list of recipients and clean up */
curl_slist_free_all(recipients);
curl_easy_cleanup(curl);
}
return 0;
}

View File

@@ -91,10 +91,10 @@ void init_locks(void)
/* List of URLs to fetch.*/ /* List of URLs to fetch.*/
const char * const urls[]= { const char * const urls[]= {
"https://www.sf.net/", "https://www.example.com/",
"https://www.openssl.org/", "https://www2.example.com/",
"https://www.sf.net/", "https://www3.example.com/",
"https://www.openssl.org/", "https://www4.example.com/",
}; };
static void *pull_one_url(void *url) static void *pull_one_url(void *url)

105
docs/examples/version-check.pl Executable file
View File

@@ -0,0 +1,105 @@
#!/usr/bin/env perl
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
# / __| | | | |_) | |
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2010, 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.
#
###########################################################################
# This script accepts a source file as input on the command line.
#
# It first loads the 'symbols-in-versions' document and stores a lookup
# table for all known symbols for which version they were introduced.
#
# It then scans the given source file to dig up all symbols starting with CURL.
# Finally, it sorts the internal list of found symbols (using the version
# number as sort key) and then it outputs the most recent version number and
# the symbols from that version that are used.
#
# Usage:
#
# version-check.pl [source file]
#
open(S, "<../libcurl/symbols-in-versions") || die;
my %doc;
my %rem;
while(<S>) {
if(/(^CURL[^ \n]*) *(.*)/) {
my ($sym, $rest)=($1, $2);
my @a=split(/ +/, $rest);
$doc{$sym}=$a[0]; # when it was introduced
if($a[2]) {
# this symbol is documented to have been present the last time
# in this release
$rem{$sym}=$a[2];
}
}
}
close(S);
sub age {
my ($ver)=@_;
my @s=split(/\./, $ver);
return $s[0]*10000+$s[1]*100+$s[2];
}
my %used;
open(C, "<$ARGV[0]") || die;
while(<C>) {
if(/\W(CURL[_A-Z0-9v]+)\W/) {
#print "$1\n";
$used{$1}++;
}
}
close(C);
sub sortversions {
my $r = age($doc{$a}) <=> age($doc{$b});
if(!$r) {
$r = $a cmp $b;
}
return $r;
}
my @recent = reverse sort sortversions keys %used;
# the most recent symbol
my $newsym = $recent[0];
# the most recent version
my $newver = $doc{$newsym};
print "The scanned source uses these symbols introduced in $newver:\n";
for my $w (@recent) {
if($doc{$w} eq $newver) {
printf " $w\n";
next;
}
last;
}

View File

@@ -206,6 +206,8 @@ Pass a pointer to a char pointer to receive a pointer to a string holding the
path of the entry path. That is the initial path libcurl ended up in when path of the entry path. That is the initial path libcurl ended up in when
logging on to the remote FTP server. This stores a NULL as pointer if logging on to the remote FTP server. This stores a NULL as pointer if
something is wrong. (Added in 7.15.4) something is wrong. (Added in 7.15.4)
Also works for SFTP since 7.21.4
.IP CURLINFO_CERTINFO .IP CURLINFO_CERTINFO
Pass a pointer to a 'struct curl_certinfo *' and you'll get it set to point to Pass a pointer to a 'struct curl_certinfo *' and you'll get it set to point to
struct that holds a number of linked lists with info about the certificate struct that holds a number of linked lists with info about the certificate

View File

@@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___ .\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____| .\" * \___|\___/|_| \_\_____|
.\" * .\" *
.\" * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. .\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * .\" *
.\" * This software is licensed as described in the file COPYING, which .\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms .\" * you should have received as part of this distribution. The terms
@@ -84,6 +84,13 @@ If this option is set and libcurl has been built with the standard name
resolver, timeouts will not occur while the name resolve takes place. resolver, timeouts will not occur while the name resolve takes place.
Consider building libcurl with c-ares support to enable asynchronous DNS Consider building libcurl with c-ares support to enable asynchronous DNS
lookups, which enables nice timeouts for name resolves without signals. lookups, which enables nice timeouts for name resolves without signals.
Setting \fICURLOPT_NOSIGNAL\fP to 1 makes libcurl NOT ask the system to ignore
SIGPIPE signals, which otherwise are sent by the system when trying to send
data to a socket which is closed in the other end. libcurl makes an effort to
never cause such SIGPIPEs to trigger, but some operating systems have no way
to avoid them and even on those that have there are some corner cases when
they may still happen, contrary to our desire.
.IP CURLOPT_WILDCARDMATCH .IP CURLOPT_WILDCARDMATCH
Set this option to 1 if you want to transfer multiple files according to a Set this option to 1 if you want to transfer multiple files according to a
file name pattern. The pattern can be specified as part of the file name pattern. The pattern can be specified as part of the
@@ -858,7 +865,34 @@ secure.
This is a convenience macro that sets all bits except Basic and thus makes This is a convenience macro that sets all bits except Basic and thus makes
libcurl pick any it finds suitable. libcurl will automatically select the one libcurl pick any it finds suitable. libcurl will automatically select the one
it finds most secure. it finds most secure.
.IP CURLAUTH_ONLY
This is a meta symbol. Or this value together with a single specific auth
value to force libcurl to probe for un-restricted auth and if not, only that
single auth algorithm is acceptable. (Added in 7.21.3)
.RE .RE
.IP CURLOPT_TLSAUTH_TYPE
Pass a long as parameter, which is set to a bitmask, to tell libcurl which
authentication method(s) you want it to use for TLS authentication.
.RS
.IP CURLOPT_TLSAUTH_SRP
TLS-SRP authentication. Secure Remote Password authentication for TLS is
defined in RFC 5054 and provides mutual authentication if both sides have a
shared secret. To use TLS-SRP, you must also set the
\fICURLOPT_TLSAUTH_USERNAME\fP and \fICURLOPT_TLSAUTH_PASSWORD\fP options.
You need to build libcurl with GnuTLS and with TLS-SRP support for this to
work. (Added in 7.21.4)
.RE
.IP CURLOPT_TLSAUTH_USERNAME
Pass a char * as parameter, which should point to the zero-terminated username
to use for the TLS authentication method specified with the
\fICURLOPT_TLSAUTH_TYPE\fP option. Requires that the
\fICURLOPT_TLS_PASSWORD\fP option also be set. (Added in 7.21.4)
.IP CURLOPT_TLSAUTH_PASSWORD
Pass a char * as parameter, which should point to the zero-terminated password
to use for the TLS authentication method specified with the
\fICURLOPT_TLSAUTH_TYPE\fP option. Requires that the
\fICURLOPT_TLS_USERNAME\fP option also be set. (Added in 7.21.4)
.IP CURLOPT_PROXYAUTH .IP CURLOPT_PROXYAUTH
Pass a long as parameter, which is set to a bitmask, to tell libcurl which Pass a long as parameter, which is set to a bitmask, to tell libcurl which
authentication method(s) you want it to use for your proxy authentication. If authentication method(s) you want it to use for your proxy authentication. If
@@ -1178,6 +1212,10 @@ option is set to zero. (added in 7.16.2)
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
specify the sender address in a mail when sending an SMTP mail with libcurl. specify the sender address in a mail when sending an SMTP mail with libcurl.
An originator email address in SMTP lingo is specified within angle brackets
(<>) which libcurl will not add for you before version 7.21.4. Failing to
provide such brackets may cause the server to reject your mail.
(Added in 7.20.0) (Added in 7.20.0)
.IP CURLOPT_MAIL_RCPT .IP CURLOPT_MAIL_RCPT
Pass a pointer to a linked list of recipients to pass to the server in your Pass a pointer to a linked list of recipients to pass to the server in your
@@ -1259,9 +1297,15 @@ A parameter set to 1 tells the library to just list the names of files in a
directory, instead of doing a full directory listing that would include file directory, instead of doing a full directory listing that would include file
sizes, dates etc. This works for FTP and SFTP URLs. sizes, dates etc. This works for FTP and SFTP URLs.
This causes an FTP NLST command to be sent on an FTP server. Beware This causes an FTP NLST command to be sent on an FTP server. Beware that some
that some FTP servers list only files in their response to NLST; they FTP servers list only files in their response to NLST; they might not include
might not include subdirectories and symbolic links. subdirectories and symbolic links.
Setting this option to 1 also implies a directory listing even if the URL
doesn't end with a slash, which otherwise is necessary.
Do NOT use this option if you also use \fICURLOPT_WILDCARDMATCH\fP as it will
effectively break that feature then.
(This option was known as CURLOPT_FTPLISTONLY up to 7.16.4) (This option was known as CURLOPT_FTPLISTONLY up to 7.16.4)
.IP CURLOPT_APPEND .IP CURLOPT_APPEND
@@ -1331,22 +1375,6 @@ it already uses for the control connection. But it will use the port number
from the 227-response. (Added in 7.14.2) from the 227-response. (Added in 7.14.2)
This option has no effect if PORT, EPRT or EPSV is used instead of PASV. This option has no effect if PORT, EPRT or EPSV is used instead of PASV.
.IP CURLOPT_USE_SSL
Pass a long using one of the values from below, to make libcurl use your
desired level of SSL for the FTP transfer. (Added in 7.11.0)
(This option was known as CURLOPT_FTP_SSL up to 7.16.4, and the constants
were known as CURLFTPSSL_*)
.RS
.IP CURLUSESSL_NONE
Don't attempt to use SSL.
.IP CURLUSESSL_TRY
Try using SSL, proceed as normal otherwise.
.IP CURLUSESSL_CONTROL
Require SSL for the control connection or fail with \fICURLE_USE_SSL_FAILED\fP.
.IP CURLUSESSL_ALL
Require SSL for all communication or fail with \fICURLE_USE_SSL_FAILED\fP.
.RE
.IP CURLOPT_FTPSSLAUTH .IP CURLOPT_FTPSSLAUTH
Pass a long using one of the values from below, to alter how libcurl issues Pass a long using one of the values from below, to alter how libcurl issues
\&"AUTH TLS" or "AUTH SSL" when FTP over SSL is activated (see \&"AUTH TLS" or "AUTH SSL" when FTP over SSL is activated (see
@@ -1518,7 +1546,9 @@ to 0 (zero, the default), \fICURLOPT_TRANSFERTEXT\fP has no effect when doing
FTP via a proxy. Beware that not all proxies support this feature. (Added in FTP via a proxy. Beware that not all proxies support this feature. (Added in
7.18.0) 7.18.0)
.IP CURLOPT_CRLF .IP CURLOPT_CRLF
Convert Unix newlines to CRLF newlines on transfers. Pass a long. If the value is set to 1 (one), libcurl converts Unix newlines to
CRLF newlines on transfers. Disable this option again by setting the value to
0 (zero).
.IP CURLOPT_RANGE .IP CURLOPT_RANGE
Pass a char * as parameter, which should contain the specified range you Pass a char * as parameter, which should contain the specified range you
want. It should be in the format "X-Y", where X or Y may be left out. HTTP want. It should be in the format "X-Y", where X or Y may be left out. HTTP
@@ -1539,6 +1569,10 @@ want the transfer to start from. Set this option to 0 to make the transfer
start from the beginning (effectively disabling resume). For FTP, set this start from the beginning (effectively disabling resume). For FTP, set this
option to -1 to make the transfer start from the end of the target file option to -1 to make the transfer start from the end of the target file
(useful to continue an interrupted upload). (useful to continue an interrupted upload).
When doing uploads with FTP, the resume position is where in the local/source
file libcurl should try to resume the upload from and it will then append the
source file to the remote target file.
.IP CURLOPT_RESUME_FROM_LARGE .IP CURLOPT_RESUME_FROM_LARGE
Pass a curl_off_t as parameter. It contains the offset in number of bytes that Pass a curl_off_t as parameter. It contains the offset in number of bytes that
you want the transfer to start from. (Added in 7.11.0) you want the transfer to start from. (Added in 7.11.0)
@@ -1637,8 +1671,8 @@ given limit. This concerns both FTP and HTTP transfers.
.IP CURLOPT_TIMECONDITION .IP CURLOPT_TIMECONDITION
Pass a long as parameter. This defines how the \fICURLOPT_TIMEVALUE\fP time Pass a long as parameter. This defines how the \fICURLOPT_TIMEVALUE\fP time
value is treated. You can set this parameter to \fICURL_TIMECOND_IFMODSINCE\fP value is treated. You can set this parameter to \fICURL_TIMECOND_IFMODSINCE\fP
or \fICURL_TIMECOND_IFUNMODSINCE\fP. This feature applies to HTTP, FTP, and or \fICURL_TIMECOND_IFUNMODSINCE\fP. This feature applies to HTTP, FTP, RTSP,
RTSP. and FILE.
The last modification time of a file is not always known and in such instances The last modification time of a file is not always known and in such instances
this feature will have no effect even if the given time condition would not this feature will have no effect even if the given time condition would not
@@ -1753,14 +1787,56 @@ This option is useful with the \fICURLINFO_LASTSOCKET\fP option to
\fIcurl_easy_getinfo(3)\fP. The library can set up the connection and then the \fIcurl_easy_getinfo(3)\fP. The library can set up the connection and then the
application can obtain the most recently used socket for special data application can obtain the most recently used socket for special data
transfers. (Added in 7.15.2) transfers. (Added in 7.15.2)
.IP CURLOPT_USE_SSL
Pass a long using one of the values from below, to make libcurl use your
desired level of SSL for the transfer. (Added in 7.11.0)
This is for enabling SSL/TLS when you use FTP, SMTP, POP3, IMAP etc.
(This option was known as CURLOPT_FTP_SSL up to 7.16.4, and the constants
were known as CURLFTPSSL_*)
.RS
.IP CURLUSESSL_NONE
Don't attempt to use SSL.
.IP CURLUSESSL_TRY
Try using SSL, proceed as normal otherwise.
.IP CURLUSESSL_CONTROL
Require SSL for the control connection or fail with \fICURLE_USE_SSL_FAILED\fP.
.IP CURLUSESSL_ALL
Require SSL for all communication or fail with \fICURLE_USE_SSL_FAILED\fP.
.RE
.IP CURLOPT_RESOLVE
Pass a pointer to a linked list of strings with host name resolve information
to use for requests with this handle. The linked list should be a fully valid
list of \fBstruct curl_slist\fP structs properly filled in. Use
\fIcurl_slist_append(3)\fP to create the list and \fIcurl_slist_free_all(3)\fP
to clean up an entire list.
Each single name resolve string should be written using the format
HOST:PORT:ADDRESS where HOST is the name libcurl will try to resolve, PORT is
the port number of the service where libcurl wants to connect to the HOST and
ADDRESS is the numerical IP address. If libcurl is built to support IPv6,
ADDRESS can of course be either IPv4 or IPv6 style addressing.
This option effectively pre-populates the DNS cache with entries for the
host+port pair so redirects and everything that operations against the
HOST+PORT will instead use your provided ADDRESS.
You can remove names from the DNS cache again, to stop providing these fake
resolves, by including a string in the linked list that uses the format
\&"-HOST:PORT". The host name must be prefixed with a dash, and the host name
and port number must exactly match what was already added previously.
(Added in 7.12.3)
.SH SSL and SECURITY OPTIONS .SH SSL and SECURITY OPTIONS
.IP CURLOPT_SSLCERT .IP CURLOPT_SSLCERT
Pass a pointer to a zero terminated string as parameter. The string should be Pass a pointer to a zero terminated string as parameter. The string should be
the file name of your certificate. The default format is "PEM" and can be the file name of your certificate. The default format is "PEM" and can be
changed with \fICURLOPT_SSLCERTTYPE\fP. changed with \fICURLOPT_SSLCERTTYPE\fP.
With NSS this is the nickname of the certificate you wish to authenticate With NSS this can also be the nickname of the certificate you wish to
with. authenticate with. If you want to use a file from the current directory, please
precede it with "./" prefix, in order to avoid confusion with a nickname.
.IP CURLOPT_SSLCERTTYPE .IP CURLOPT_SSLCERTTYPE
Pass a pointer to a zero terminated string as parameter. The string should be Pass a pointer to a zero terminated string as parameter. The string should be
the format of your certificate. Supported formats are "PEM" and "DER". (Added the format of your certificate. Supported formats are "PEM" and "DER". (Added
@@ -1819,28 +1895,30 @@ Force SSLv2
Force SSLv3 Force SSLv3
.RE .RE
.IP CURLOPT_SSL_VERIFYPEER .IP CURLOPT_SSL_VERIFYPEER
Pass a long as parameter. Pass a long as parameter. By default, curl assumes a value of 1.
This option determines whether curl verifies the authenticity of the peer's This option determines whether curl verifies the authenticity of the peer's
certificate. A value of 1 means curl verifies; zero means it doesn't. The certificate. A value of 1 means curl verifies; 0 (zero) means it doesn't.
default is nonzero, but before 7.10, it was zero.
When negotiating an SSL connection, the server sends a certificate indicating When negotiating an SSL connection, the server sends a certificate indicating
its identity. Curl verifies whether the certificate is authentic, i.e. that its identity. Curl verifies whether the certificate is authentic, i.e. that
you can trust that the server is who the certificate says it is. This trust you can trust that the server is who the certificate says it is. This trust
is based on a chain of digital signatures, rooted in certification authority is based on a chain of digital signatures, rooted in certification authority
(CA) certificates you supply. As of 7.10, curl installs a default bundle of (CA) certificates you supply. curl uses a default bundle of CA certificates
CA certificates and you can specify alternate certificates with the (the path for that is determined at build time) and you can specify alternate
\fICURLOPT_CAINFO\fP option or the \fICURLOPT_CAPATH\fP option. certificates with the \fICURLOPT_CAINFO\fP option or the \fICURLOPT_CAPATH\fP
option.
When \fICURLOPT_SSL_VERIFYPEER\fP is nonzero, and the verification fails to When \fICURLOPT_SSL_VERIFYPEER\fP is nonzero, and the verification fails to
prove that the certificate is authentic, the connection fails. When the prove that the certificate is authentic, the connection fails. When the
option is zero, the connection succeeds regardless. option is zero, the peer certificate verification succeeds regardless.
Authenticating the certificate is not by itself very useful. You typically Authenticating the certificate is not by itself very useful. You typically
want to ensure that the server, as authentically identified by its want to ensure that the server, as authentically identified by its
certificate, is the server you mean to be talking to. Use certificate, is the server you mean to be talking to. Use
\fICURLOPT_SSL_VERIFYHOST\fP to control that. \fICURLOPT_SSL_VERIFYHOST\fP to control that. The check that the host name in
the certificate is valid for the host name you're connecting to is done
independently of the \fICURLOPT_SSL_VERIFYPEER\fP option.
.IP CURLOPT_CAINFO .IP CURLOPT_CAINFO
Pass a char * to a zero terminated string naming a file holding one or more Pass a char * to a zero terminated string naming a file holding one or more
certificates to verify the peer with. This makes sense only when used in certificates to verify the peer with. This makes sense only when used in
@@ -1871,13 +1949,15 @@ mismatch with the issuer of peer certificate (\fICURLOPT_SSL_VERIFYPEER\fP has
to be set too for the check to fail). (Added in 7.19.0) to be set too for the check to fail). (Added in 7.19.0)
.IP CURLOPT_CAPATH .IP CURLOPT_CAPATH
Pass a char * to a zero terminated string naming a directory holding multiple Pass a char * to a zero terminated string naming a directory holding multiple
CA certificates to verify the peer with. The certificate directory must be CA certificates to verify the peer with. If libcurl is built against OpenSSL,
prepared using the openssl c_rehash utility. This makes sense only when used the certificate directory must be prepared using the openssl c_rehash utility.
in combination with the \fICURLOPT_SSL_VERIFYPEER\fP option. If This makes sense only when used in combination with the
\fICURLOPT_SSL_VERIFYPEER\fP is zero, \fICURLOPT_CAPATH\fP need not even \fICURLOPT_SSL_VERIFYPEER\fP option. If \fICURLOPT_SSL_VERIFYPEER\fP is zero,
indicate an accessible path. The \fICURLOPT_CAPATH\fP function apparently \fICURLOPT_CAPATH\fP need not even indicate an accessible path. The
does not work in Windows due to some limitation in openssl. This option is \fICURLOPT_CAPATH\fP function apparently does not work in Windows due to some
OpenSSL-specific and does nothing if libcurl is built to use GnuTLS. limitation in openssl. This option is OpenSSL-specific and does nothing if
libcurl is built to use GnuTLS. NSS-powered libcurl provides the option only
for backward compatibility.
.IP CURLOPT_CRLFILE .IP CURLOPT_CRLFILE
Pass a char * to a zero terminated string naming a file with the concatenation Pass a char * to a zero terminated string naming a file with the concatenation
of CRL (in PEM format) to use in the certificate validation that occurs during of CRL (in PEM format) to use in the certificate validation that occurs during
@@ -1896,20 +1976,6 @@ A specific error code (CURLE_SSL_CRL_BADFILE) is defined with the option. It
is returned when the SSL exchange fails because the CRL file cannot be loaded. is returned when the SSL exchange fails because the CRL file cannot be loaded.
A failure in certificate verification due to a revocation information found in A failure in certificate verification due to a revocation information found in
the CRL does not trigger this specific error. (Added in 7.19.0) the CRL does not trigger this specific error. (Added in 7.19.0)
.IP CURLOPT_CERTINFO
Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With
this enabled, libcurl (if built with OpenSSL) will extract lots of information
and data about the certificates in the certificate chain used in the SSL
connection. This data is then possible to extract after a transfer using
\fIcurl_easy_getinfo(3)\fP and its option \fICURLINFO_CERTINFO\fP. (Added in
7.19.1)
.IP CURLOPT_RANDOM_FILE
Pass a char * to a zero terminated file name. The file will be used to read
from to seed the random engine for SSL. The more random the specified file is,
the more secure the SSL connection will become.
.IP CURLOPT_EGDSOCKET
Pass a char * to the zero terminated path name to the Entropy Gathering Daemon
socket. It will be used to seed the random engine for SSL.
.IP CURLOPT_SSL_VERIFYHOST .IP CURLOPT_SSL_VERIFYHOST
Pass a long as parameter. Pass a long as parameter.
@@ -1933,10 +1999,25 @@ doesn't matter what name it says. (This is not ordinarily a useful setting).
When the value is 0, the connection succeeds regardless of the names in the When the value is 0, the connection succeeds regardless of the names in the
certificate. certificate.
The default, since 7.10, is 2. The default value for this option is 2.
This option controls checking the server's claimed identity. The server could This option controls checking the server's certificate's claimed identity.
be lying. To control lying, see \fICURLOPT_SSL_VERIFYPEER\fP. The server could be lying. To control lying, see
\fICURLOPT_SSL_VERIFYPEER\fP.
.IP CURLOPT_CERTINFO
Pass a long set to 1 to enable libcurl's certificate chain info gatherer. With
this enabled, libcurl (if built with OpenSSL) will extract lots of information
and data about the certificates in the certificate chain used in the SSL
connection. This data is then possible to extract after a transfer using
\fIcurl_easy_getinfo(3)\fP and its option \fICURLINFO_CERTINFO\fP. (Added in
7.19.1)
.IP CURLOPT_RANDOM_FILE
Pass a char * to a zero terminated file name. The file will be used to read
from to seed the random engine for SSL. The more random the specified file is,
the more secure the SSL connection will become.
.IP CURLOPT_EGDSOCKET
Pass a char * to the zero terminated path name to the Entropy Gathering Daemon
socket. It will be used to seed the random engine for SSL.
.IP CURLOPT_SSL_CIPHER_LIST .IP CURLOPT_SSL_CIPHER_LIST
Pass a char *, pointing to a zero terminated string holding the list of Pass a char *, pointing to a zero terminated string holding the list of
ciphers to use for the SSL connection. The list must be syntactically correct, ciphers to use for the SSL connection. The list must be syntactically correct,

View File

@@ -275,10 +275,18 @@ NSS
is claimed to be thread-safe already without anything required. is claimed to be thread-safe already without anything required.
PolarSSL
Required actions unknown.
yassl yassl
Required actions unknown. Required actions unknown.
axTLS
Required actions unknown.
When using multiple threads you should set the CURLOPT_NOSIGNAL option to 1 When using multiple threads you should set the CURLOPT_NOSIGNAL option to 1
for all handles. Everything will or might work fine except that timeouts are for all handles. Everything will or might work fine except that timeouts are
not honored during the DNS lookup - which you can work around by building not honored during the DNS lookup - which you can work around by building
@@ -1233,6 +1241,15 @@ are used to generate structured data. Characters like embedded carriage
returns or ampersands could allow the user to create additional headers or returns or ampersands could allow the user to create additional headers or
fields that could cause malicious transactions. fields that could cause malicious transactions.
.IP "Server-supplied Names"
A server can supply data which the application may, in some cases, use as
a file name. The curl command-line tool does this with --remote-header-name,
using the Content-disposition: header to generate a file name. An application
could also use CURLINFO_EFFECTIVE_URL to generate a file name from a
server-supplied redirect URL. Special care must be taken to sanitize such
names to avoid the possibility of a malicious server supplying one like
"/etc/passwd", "\autoexec.bat" or even ".bashrc".
.IP "Server Certificates" .IP "Server Certificates"
A secure application should never use the CURLOPT_SSL_VERIFYPEER option to A secure application should never use the CURLOPT_SSL_VERIFYPEER option to
disable certificate validation. There are numerous attacks that are enabled disable certificate validation. There are numerous attacks that are enabled

View File

@@ -61,7 +61,7 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
AH_TEMPLATE([LIBCURL_PROTOCOL_SMTP],[Defined if libcurl supports SMTP]) AH_TEMPLATE([LIBCURL_PROTOCOL_SMTP],[Defined if libcurl supports SMTP])
AC_ARG_WITH(libcurl, AC_ARG_WITH(libcurl,
AC_HELP_STRING([--with-libcurl=DIR],[look for the curl library in DIR]), AC_HELP_STRING([--with-libcurl=PREFIX],[look for the curl library in PREFIX/lib and headers in PREFIX/include]),
[_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])]) [_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])])
if test "$_libcurl_with" != "no" ; then if test "$_libcurl_with" != "no" ; then
@@ -75,10 +75,10 @@ AC_DEFUN([LIBCURL_CHECK_CONFIG],
if test -d "$_libcurl_with" ; then if test -d "$_libcurl_with" ; then
LIBCURL_CPPFLAGS="-I$withval/include" LIBCURL_CPPFLAGS="-I$withval/include"
_libcurl_ldflags="-L$withval/lib" _libcurl_ldflags="-L$withval/lib"
AC_PATH_PROG([_libcurl_config],[curl-config],["$withval/bin"], AC_PATH_PROG([_libcurl_config],[curl-config],[],
["$withval/bin"]) ["$withval/bin"])
else else
AC_PATH_PROG([_libcurl_config],[curl-config]) AC_PATH_PROG([_libcurl_config],[curl-config],[],[$PATH])
fi fi
if test x$_libcurl_config != "x" ; then if test x$_libcurl_config != "x" ; then

View File

@@ -18,18 +18,26 @@ CURLAUTH_BASIC 7.10.6
CURLAUTH_DIGEST 7.10.6 CURLAUTH_DIGEST 7.10.6
CURLAUTH_DIGEST_IE 7.19.3 CURLAUTH_DIGEST_IE 7.19.3
CURLAUTH_GSSNEGOTIATE 7.10.6 CURLAUTH_GSSNEGOTIATE 7.10.6
CURLAUTH_NONE 7.10.6
CURLAUTH_NTLM 7.10.6 CURLAUTH_NTLM 7.10.6
CURLAUTH_ONLY 7.21.3
CURLCLOSEPOLICY_CALLBACK 7.7 CURLCLOSEPOLICY_CALLBACK 7.7
CURLCLOSEPOLICY_LEAST_RECENTLY_USED 7.7 CURLCLOSEPOLICY_LEAST_RECENTLY_USED 7.7
CURLCLOSEPOLICY_LEAST_TRAFFIC 7.7 CURLCLOSEPOLICY_LEAST_TRAFFIC 7.7
CURLCLOSEPOLICY_NONE 7.7
CURLCLOSEPOLICY_OLDEST 7.7 CURLCLOSEPOLICY_OLDEST 7.7
CURLCLOSEPOLICY_SLOWEST 7.7 CURLCLOSEPOLICY_SLOWEST 7.7
CURLE_ABORTED_BY_CALLBACK 7.1 CURLE_ABORTED_BY_CALLBACK 7.1
CURLE_AGAIN 7.18.2 CURLE_AGAIN 7.18.2
CURLE_ALREADY_COMPLETE 7.7.2
CURLE_BAD_CALLING_ORDER 7.1 7.17.0 CURLE_BAD_CALLING_ORDER 7.1 7.17.0
CURLE_BAD_CONTENT_ENCODING 7.10 CURLE_BAD_CONTENT_ENCODING 7.10
CURLE_BAD_DOWNLOAD_RESUME 7.10
CURLE_BAD_FUNCTION_ARGUMENT 7.1 CURLE_BAD_FUNCTION_ARGUMENT 7.1
CURLE_BAD_PASSWORD_ENTERED - 7.17.0 CURLE_BAD_PASSWORD_ENTERED - 7.17.0
CURLE_CHUNK_FAILED 7.20.1
CURLE_CONV_FAILED 7.15.4
CURLE_CONV_REQD 7.15.4
CURLE_COULDNT_CONNECT 7.1 CURLE_COULDNT_CONNECT 7.1
CURLE_COULDNT_RESOLVE_HOST 7.1 CURLE_COULDNT_RESOLVE_HOST 7.1
CURLE_COULDNT_RESOLVE_PROXY 7.1 CURLE_COULDNT_RESOLVE_PROXY 7.1
@@ -37,7 +45,9 @@ CURLE_FAILED_INIT 7.1
CURLE_FILESIZE_EXCEEDED 7.10.8 CURLE_FILESIZE_EXCEEDED 7.10.8
CURLE_FILE_COULDNT_READ_FILE 7.1 CURLE_FILE_COULDNT_READ_FILE 7.1
CURLE_FTP_ACCESS_DENIED 7.1 CURLE_FTP_ACCESS_DENIED 7.1
CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1
CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1 7.1 CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1 7.1
CURLE_FTP_BAD_FILE_LIST 7.20.1
CURLE_FTP_CANT_GET_HOST 7.1 CURLE_FTP_CANT_GET_HOST 7.1
CURLE_FTP_CANT_RECONNECT 7.1 7.17.0 CURLE_FTP_CANT_RECONNECT 7.1 7.17.0
CURLE_FTP_COULDNT_GET_SIZE 7.1 7.17.0 CURLE_FTP_COULDNT_GET_SIZE 7.1 7.17.0
@@ -65,11 +75,13 @@ CURLE_HTTP_NOT_FOUND 7.1
CURLE_HTTP_PORT_FAILED - 7.12.0 CURLE_HTTP_PORT_FAILED - 7.12.0
CURLE_HTTP_POST_ERROR 7.1 CURLE_HTTP_POST_ERROR 7.1
CURLE_HTTP_RANGE_ERROR 7.1 7.17.0 CURLE_HTTP_RANGE_ERROR 7.1 7.17.0
CURLE_HTTP_RETURNED_ERROR 7.10.3
CURLE_INTERFACE_FAILED 7.12.0 CURLE_INTERFACE_FAILED 7.12.0
CURLE_LDAP_CANNOT_BIND 7.1 CURLE_LDAP_CANNOT_BIND 7.1
CURLE_LDAP_INVALID_URL 7.10.8 CURLE_LDAP_INVALID_URL 7.10.8
CURLE_LDAP_SEARCH_FAILED 7.1 CURLE_LDAP_SEARCH_FAILED 7.1
CURLE_LIBRARY_NOT_FOUND 7.1 7.17.0 CURLE_LIBRARY_NOT_FOUND 7.1 7.17.0
CURLE_LOGIN_DENIED 7.13.1
CURLE_MALFORMAT_USER 7.1 7.17.0 CURLE_MALFORMAT_USER 7.1 7.17.0
CURLE_OK 7.1 CURLE_OK 7.1
CURLE_OPERATION_TIMEDOUT 7.17.0 CURLE_OPERATION_TIMEDOUT 7.17.0
@@ -83,12 +95,16 @@ CURLE_READ_ERROR 7.1
CURLE_RECV_ERROR 7.13.0 CURLE_RECV_ERROR 7.13.0
CURLE_REMOTE_ACCESS_DENIED 7.17.0 CURLE_REMOTE_ACCESS_DENIED 7.17.0
CURLE_REMOTE_DISK_FULL 7.17.0 CURLE_REMOTE_DISK_FULL 7.17.0
CURLE_REMOTE_FILE_EXISTS 7.17.0
CURLE_REMOTE_FILE_NOT_FOUND 7.16.1
CURLE_RTSP_CSEQ_ERROR 7.20.0 CURLE_RTSP_CSEQ_ERROR 7.20.0
CURLE_RTSP_SESSION_ERROR 7.20.0 CURLE_RTSP_SESSION_ERROR 7.20.0
CURLE_SEND_ERROR 7.13.0 CURLE_SEND_ERROR 7.13.0
CURLE_SEND_FAIL_REWIND 7.12.3
CURLE_SHARE_IN_USE - 7.17.0 CURLE_SHARE_IN_USE - 7.17.0
CURLE_SSH 7.16.1 CURLE_SSH 7.16.1
CURLE_SSL_CACERT 7.10 CURLE_SSL_CACERT 7.10
CURLE_SSL_CACERT_BADFILE 7.16.0
CURLE_SSL_CERTPROBLEM 7.10 CURLE_SSL_CERTPROBLEM 7.10
CURLE_SSL_CIPHER 7.10 CURLE_SSL_CIPHER 7.10
CURLE_SSL_CONNECT_ERROR 7.1 CURLE_SSL_CONNECT_ERROR 7.1
@@ -104,20 +120,59 @@ CURLE_TFTP_DISKFULL 7.15.0 7.17.0
CURLE_TFTP_EXISTS 7.15.0 7.17.0 CURLE_TFTP_EXISTS 7.15.0 7.17.0
CURLE_TFTP_ILLEGAL 7.15.0 CURLE_TFTP_ILLEGAL 7.15.0
CURLE_TFTP_NOSUCHUSER 7.15.0 CURLE_TFTP_NOSUCHUSER 7.15.0
CURLE_TFTP_NOTFOUND 7.15.0
CURLE_TFTP_PERM 7.15.0
CURLE_TFTP_UNKNOWNID 7.15.0 CURLE_TFTP_UNKNOWNID 7.15.0
CURLE_TOO_MANY_REDIRECTS 7.5 CURLE_TOO_MANY_REDIRECTS 7.5
CURLE_UNKNOWN_TELNET_OPTION 7.7 CURLE_UNKNOWN_TELNET_OPTION 7.7
CURLE_UNSUPPORTED_PROTOCOL 7.1 CURLE_UNSUPPORTED_PROTOCOL 7.1
CURLE_UPLOAD_FAILED 7.16.3
CURLE_URL_MALFORMAT 7.1 CURLE_URL_MALFORMAT 7.1
CURLE_URL_MALFORMAT_USER 7.1 7.17.0 CURLE_URL_MALFORMAT_USER 7.1 7.17.0
CURLE_USE_SSL_FAILED 7.17.0 CURLE_USE_SSL_FAILED 7.17.0
CURLE_WRITE_ERROR 7.1 CURLE_WRITE_ERROR 7.1
CURLFILETYPE_DEVICE_BLOCK 7.21.0
CURLFILETYPE_DEVICE_CHAR 7.21.0
CURLFILETYPE_DIRECTORY 7.21.0
CURLFILETYPE_DOOR 7.21.0
CURLFILETYPE_FILE 7.21.0
CURLFILETYPE_NAMEDPIPE 7.21.0
CURLFILETYPE_SOCKET 7.21.0
CURLFILETYPE_SYMLINK 7.21.0
CURLFILETYPE_UNKNOWN 7.21.0
CURLFINFOFLAG_KNOWN_FILENAME 7.21.0
CURLFINFOFLAG_KNOWN_FILETYPE 7.21.0
CURLFINFOFLAG_KNOWN_GID 7.21.0
CURLFINFOFLAG_KNOWN_HLINKCOUNT 7.21.0
CURLFINFOFLAG_KNOWN_PERM 7.21.0
CURLFINFOFLAG_KNOWN_SIZE 7.21.0
CURLFINFOFLAG_KNOWN_TIME 7.21.0
CURLFINFOFLAG_KNOWN_UID 7.21.0
CURLFORM_ARRAY 7.9.1
CURLFORM_BUFFER 7.9.8
CURLFORM_BUFFERLENGTH 7.9.8
CURLFORM_BUFFERPTR 7.9.8
CURLFORM_CONTENTHEADER 7.9.3
CURLFORM_CONTENTSLENGTH 7.9.1
CURLFORM_CONTENTTYPE 7.9.1
CURLFORM_COPYCONTENTS 7.9.1
CURLFORM_COPYNAME 7.9.1
CURLFORM_END 7.9.1
CURLFORM_FILE 7.9.1
CURLFORM_FILECONTENT 7.9.1
CURLFORM_FILENAME 7.9.6
CURLFORM_NAMELENGTH 7.9.1
CURLFORM_NOTHING 7.9.1
CURLFORM_PTRCONTENTS 7.9.1
CURLFORM_PTRNAME 7.9.1
CURLFORM_STREAM 7.18.2
CURLFTPAUTH_DEFAULT 7.12.2 CURLFTPAUTH_DEFAULT 7.12.2
CURLFTPAUTH_DEFAULT 7.12.2 CURLFTPAUTH_DEFAULT 7.12.2
CURLFTPAUTH_SSL 7.12.2 CURLFTPAUTH_SSL 7.12.2
CURLFTPAUTH_SSL 7.12.2 CURLFTPAUTH_SSL 7.12.2
CURLFTPAUTH_TLS 7.12.2 CURLFTPAUTH_TLS 7.12.2
CURLFTPAUTH_TLS 7.12.2 CURLFTPAUTH_TLS 7.12.2
CURLFTPMETHOD_DEFAULT 7.15.1
CURLFTPMETHOD_MULTICWD 7.15.1 CURLFTPMETHOD_MULTICWD 7.15.1
CURLFTPMETHOD_NOCWD 7.15.1 CURLFTPMETHOD_NOCWD 7.15.1
CURLFTPMETHOD_SINGLECWD 7.15.1 CURLFTPMETHOD_SINGLECWD 7.15.1
@@ -141,7 +196,9 @@ CURLINFO_CONTENT_TYPE 7.9.4
CURLINFO_COOKIELIST 7.14.1 CURLINFO_COOKIELIST 7.14.1
CURLINFO_DATA_IN 7.9.6 CURLINFO_DATA_IN 7.9.6
CURLINFO_DATA_OUT 7.9.6 CURLINFO_DATA_OUT 7.9.6
CURLINFO_DOUBLE 7.4.1
CURLINFO_EFFECTIVE_URL 7.3 CURLINFO_EFFECTIVE_URL 7.3
CURLINFO_END 7.4.1
CURLINFO_FILETIME 7.5 CURLINFO_FILETIME 7.5
CURLINFO_FTP_ENTRY_PATH 7.15.4 CURLINFO_FTP_ENTRY_PATH 7.15.4
CURLINFO_HEADER_IN 7.9.6 CURLINFO_HEADER_IN 7.9.6
@@ -150,10 +207,14 @@ CURLINFO_HEADER_SIZE 7.4.1
CURLINFO_HTTPAUTH_AVAIL 7.10.8 CURLINFO_HTTPAUTH_AVAIL 7.10.8
CURLINFO_HTTP_CODE 7.4.1 7.10.8 CURLINFO_HTTP_CODE 7.4.1 7.10.8
CURLINFO_HTTP_CONNECTCODE 7.10.7 CURLINFO_HTTP_CONNECTCODE 7.10.7
CURLINFO_LASTONE 7.4.1
CURLINFO_LASTSOCKET 7.15.2 CURLINFO_LASTSOCKET 7.15.2
CURLINFO_LOCAL_IP 7.21.0 CURLINFO_LOCAL_IP 7.21.0
CURLINFO_LOCAL_PORT 7.21.0 CURLINFO_LOCAL_PORT 7.21.0
CURLINFO_LONG 7.4.1
CURLINFO_MASK 7.4.1
CURLINFO_NAMELOOKUP_TIME 7.4.1 CURLINFO_NAMELOOKUP_TIME 7.4.1
CURLINFO_NONE 7.4.1
CURLINFO_NUM_CONNECTS 7.12.3 CURLINFO_NUM_CONNECTS 7.12.3
CURLINFO_OS_ERRNO 7.12.2 CURLINFO_OS_ERRNO 7.12.2
CURLINFO_PRETRANSFER_TIME 7.4.1 CURLINFO_PRETRANSFER_TIME 7.4.1
@@ -167,23 +228,61 @@ CURLINFO_REDIRECT_TIME 7.9.7
CURLINFO_REDIRECT_URL 7.18.2 CURLINFO_REDIRECT_URL 7.18.2
CURLINFO_REQUEST_SIZE 7.4.1 CURLINFO_REQUEST_SIZE 7.4.1
CURLINFO_RESPONSE_CODE 7.10.8 CURLINFO_RESPONSE_CODE 7.10.8
CURLINFO_RTSP_CLIENT_CSEQ 7.20.0
CURLINFO_RTSP_CSEQ_RECV 7.20.0
CURLINFO_RTSP_SERVER_CSEQ 7.20.0
CURLINFO_RTSP_SESSION_ID 7.20.0
CURLINFO_SIZE_DOWNLOAD 7.4.1 CURLINFO_SIZE_DOWNLOAD 7.4.1
CURLINFO_SIZE_UPLOAD 7.4.1 CURLINFO_SIZE_UPLOAD 7.4.1
CURLINFO_SLIST 7.12.3
CURLINFO_SPEED_DOWNLOAD 7.4.1 CURLINFO_SPEED_DOWNLOAD 7.4.1
CURLINFO_SPEED_UPLOAD 7.4.1 CURLINFO_SPEED_UPLOAD 7.4.1
CURLINFO_SSL_DATA_IN 7.12.1
CURLINFO_SSL_DATA_OUT 7.12.1
CURLINFO_SSL_ENGINES 7.12.3 CURLINFO_SSL_ENGINES 7.12.3
CURLINFO_SSL_VERIFYRESULT 7.5 CURLINFO_SSL_VERIFYRESULT 7.5
CURLINFO_STARTTRANSFER_TIME 7.9.2 CURLINFO_STARTTRANSFER_TIME 7.9.2
CURLINFO_STRING 7.4.1
CURLINFO_TEXT 7.9.6 CURLINFO_TEXT 7.9.6
CURLINFO_TOTAL_TIME 7.4.1 CURLINFO_TOTAL_TIME 7.4.1
CURLINFO_TYPEMASK 7.4.1
CURLIOCMD_NOP 7.12.3
CURLIOCMD_RESTARTREAD 7.12.3
CURLIOE_FAILRESTART 7.12.3
CURLIOE_OK 7.12.3
CURLIOE_UNKNOWNCMD 7.12.3
CURLKHMATCH_MISMATCH 7.19.6
CURLKHMATCH_MISSING 7.19.6
CURLKHMATCH_OK 7.19.6
CURLKHSTAT_DEFER 7.19.6
CURLKHSTAT_FINE 7.19.6
CURLKHSTAT_FINE_ADD_TO_FILE 7.19.6
CURLKHSTAT_REJECT 7.19.6
CURLKHTYPE_DSS 7.19.6
CURLKHTYPE_RSA 7.19.6
CURLKHTYPE_RSA1 7.19.6
CURLKHTYPE_UNKNOWN 7.19.6
CURLMOPT_MAXCONNECTS 7.16.3
CURLMOPT_PIPELINING 7.16.0
CURLMOPT_SOCKETDATA 7.15.4
CURLMOPT_SOCKETFUNCTION 7.15.4
CURLMOPT_TIMERDATA 7.16.0
CURLMOPT_TIMERFUNCTION 7.16.0
CURLMSG_DONE 7.9.6 CURLMSG_DONE 7.9.6
CURLMSG_NONE 7.9.6
CURLM_BAD_EASY_HANDLE 7.9.6 CURLM_BAD_EASY_HANDLE 7.9.6
CURLM_BAD_HANDLE 7.9.6 CURLM_BAD_HANDLE 7.9.6
CURLM_BAD_SOCKET 7.15.4
CURLM_CALL_MULTI_PERFORM 7.9.6 CURLM_CALL_MULTI_PERFORM 7.9.6
CURLM_CALL_MULTI_SOCKET 7.15.5 CURLM_CALL_MULTI_SOCKET 7.15.5
CURLM_INTERNAL_ERROR 7.9.6 CURLM_INTERNAL_ERROR 7.9.6
CURLM_OK 7.9.6 CURLM_OK 7.9.6
CURLM_OUT_OF_MEMORY 7.9.6 CURLM_OUT_OF_MEMORY 7.9.6
CURLM_UNKNOWN_OPTION 7.15.4
CURLOPTTYPE_FUNCTIONPOINT 7.1
CURLOPTTYPE_LONG 7.1
CURLOPTTYPE_OBJECTPOINT 7.1
CURLOPTTYPE_OFF_T 7.11.0
CURLOPT_ADDRESS_SCOPE 7.19.0 CURLOPT_ADDRESS_SCOPE 7.19.0
CURLOPT_APPEND 7.16.4 CURLOPT_APPEND 7.16.4
CURLOPT_AUTOREFERER 7.1 CURLOPT_AUTOREFERER 7.1
@@ -268,7 +367,7 @@ CURLOPT_IOCTLDATA 7.12.3
CURLOPT_IOCTLFUNCTION 7.12.3 CURLOPT_IOCTLFUNCTION 7.12.3
CURLOPT_IPRESOLVE 7.10.8 CURLOPT_IPRESOLVE 7.10.8
CURLOPT_ISSUERCERT 7.19.0 CURLOPT_ISSUERCERT 7.19.0
CURLOPT_KEYPASSWD - 7.17.0 CURLOPT_KEYPASSWD 7.17.0
CURLOPT_KRB4LEVEL 7.3 7.17.0 CURLOPT_KRB4LEVEL 7.3 7.17.0
CURLOPT_KRBLEVEL 7.17.0 CURLOPT_KRBLEVEL 7.17.0
CURLOPT_LOCALPORT 7.15.2 CURLOPT_LOCALPORT 7.15.2
@@ -328,8 +427,10 @@ CURLOPT_READDATA 7.9.7
CURLOPT_READFUNCTION 7.1 CURLOPT_READFUNCTION 7.1
CURLOPT_REDIR_PROTOCOLS 7.19.4 CURLOPT_REDIR_PROTOCOLS 7.19.4
CURLOPT_REFERER 7.1 CURLOPT_REFERER 7.1
CURLOPT_RESOLVE 7.21.3
CURLOPT_RESUME_FROM 7.1 CURLOPT_RESUME_FROM 7.1
CURLOPT_RESUME_FROM_LARGE 7.11.0 CURLOPT_RESUME_FROM_LARGE 7.11.0
CURLOPT_RTSPHEADER 7.20.0
CURLOPT_RTSP_CLIENT_CSEQ 7.20.0 CURLOPT_RTSP_CLIENT_CSEQ 7.20.0
CURLOPT_RTSP_REQUEST 7.20.0 CURLOPT_RTSP_REQUEST 7.20.0
CURLOPT_RTSP_SERVER_CSEQ 7.20.0 CURLOPT_RTSP_SERVER_CSEQ 7.20.0
@@ -338,6 +439,7 @@ CURLOPT_RTSP_STREAM_URI 7.20.0
CURLOPT_RTSP_TRANSPORT 7.20.0 CURLOPT_RTSP_TRANSPORT 7.20.0
CURLOPT_SEEKDATA 7.18.1 CURLOPT_SEEKDATA 7.18.1
CURLOPT_SEEKFUNCTION 7.18.1 CURLOPT_SEEKFUNCTION 7.18.1
CURLOPT_SERVER_RESPONSE_TIMEOUT 7.20.0
CURLOPT_SHARE 7.10 CURLOPT_SHARE 7.10
CURLOPT_SOCKOPTDATA 7.16.0 CURLOPT_SOCKOPTDATA 7.16.0
CURLOPT_SOCKOPTFUNCTION 7.16.0 CURLOPT_SOCKOPTFUNCTION 7.16.0
@@ -353,6 +455,9 @@ CURLOPT_SOURCE_URL 7.13.0 - 7.15.4
CURLOPT_SOURCE_USERPWD 7.12.1 - 7.15.4 CURLOPT_SOURCE_USERPWD 7.12.1 - 7.15.4
CURLOPT_SSH_AUTH_TYPES 7.16.1 CURLOPT_SSH_AUTH_TYPES 7.16.1
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 7.17.1 CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 7.17.1
CURLOPT_SSH_KEYDATA 7.19.6
CURLOPT_SSH_KEYFUNCTION 7.19.6
CURLOPT_SSH_KNOWNHOSTS 7.19.6
CURLOPT_SSH_PRIVATE_KEYFILE 7.16.1 CURLOPT_SSH_PRIVATE_KEYFILE 7.16.1
CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1 CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1
CURLOPT_SSLCERT 7.1 CURLOPT_SSLCERT 7.1
@@ -374,11 +479,14 @@ CURLOPT_SSL_VERIFYPEER 7.4.2
CURLOPT_STDERR 7.1 CURLOPT_STDERR 7.1
CURLOPT_TCP_NODELAY 7.11.2 CURLOPT_TCP_NODELAY 7.11.2
CURLOPT_TELNETOPTIONS 7.7 CURLOPT_TELNETOPTIONS 7.7
CURLOPT_TFTPBLKSIZE 7.19.4 CURLOPT_TFTP_BLKSIZE 7.19.4
CURLOPT_TIMECONDITION 7.1 CURLOPT_TIMECONDITION 7.1
CURLOPT_TIMEOUT 7.1 CURLOPT_TIMEOUT 7.1
CURLOPT_TIMEOUT_MS 7.16.2 CURLOPT_TIMEOUT_MS 7.16.2
CURLOPT_TIMEVALUE 7.1 CURLOPT_TIMEVALUE 7.1
CURLOPT_TLSAUTH_PASSWORD 7.21.4
CURLOPT_TLSAUTH_TYPE 7.21.4
CURLOPT_TLSAUTH_USERNAME 7.21.4
CURLOPT_TRANSFERTEXT 7.11.1 CURLOPT_TRANSFERTEXT 7.11.1
CURLOPT_UNRESTRICTED_AUTH 7.10.4 CURLOPT_UNRESTRICTED_AUTH 7.10.4
CURLOPT_UPLOAD 7.1 CURLOPT_UPLOAD 7.1
@@ -392,11 +500,19 @@ CURLOPT_WILDCARDMATCH 7.21.0
CURLOPT_WRITEDATA 7.9.7 CURLOPT_WRITEDATA 7.9.7
CURLOPT_WRITEFUNCTION 7.1 CURLOPT_WRITEFUNCTION 7.1
CURLOPT_WRITEHEADER 7.1 CURLOPT_WRITEHEADER 7.1
CURLOPT_WRITEINFO 7.1
CURLPAUSE_ALL 7.18.0
CURLPAUSE_CONT 7.18.0
CURLPAUSE_RECV 7.18.0
CURLPAUSE_RECV_CONT 7.18.0
CURLPAUSE_SEND 7.18.0
CURLPAUSE_SEND_CONT 7.18.0
CURLPROTO_ALL 7.19.4 CURLPROTO_ALL 7.19.4
CURLPROTO_DICT 7.19.4 CURLPROTO_DICT 7.19.4
CURLPROTO_FILE 7.19.4 CURLPROTO_FILE 7.19.4
CURLPROTO_FTP 7.19.4 CURLPROTO_FTP 7.19.4
CURLPROTO_FTPS 7.19.4 CURLPROTO_FTPS 7.19.4
CURLPROTO_GOPHER 7.21.2
CURLPROTO_HTTP 7.19.4 CURLPROTO_HTTP 7.19.4
CURLPROTO_HTTPS 7.19.4 CURLPROTO_HTTPS 7.19.4
CURLPROTO_IMAP 7.20.0 CURLPROTO_IMAP 7.20.0
@@ -424,6 +540,19 @@ CURLPROXY_SOCKS4 7.10
CURLPROXY_SOCKS4A 7.18.0 CURLPROXY_SOCKS4A 7.18.0
CURLPROXY_SOCKS5 7.10 CURLPROXY_SOCKS5 7.10
CURLPROXY_SOCKS5_HOSTNAME 7.18.0 CURLPROXY_SOCKS5_HOSTNAME 7.18.0
CURLSHE_BAD_OPTION 7.10.3
CURLSHE_INVALID 7.10.3
CURLSHE_IN_USE 7.10.3
CURLSHE_NOMEM 7.10.3
CURLSHE_OK 7.10.3
CURLSHOPT_LOCKFUNC 7.10.3
CURLSHOPT_NONE 7.10.3
CURLSHOPT_SHARE 7.10.3
CURLSHOPT_UNLOCKFUNC 7.10.3
CURLSHOPT_UNSHARE 7.10.3
CURLSHOPT_USERDATA 7.10.3
CURLSOCKTYPE_IPCXN 7.15.6
CURLSSH_AUTH_ANY 7.16.1
CURLSSH_AUTH_DEFAULT 7.16.1 CURLSSH_AUTH_DEFAULT 7.16.1
CURLSSH_AUTH_HOST 7.16.1 CURLSSH_AUTH_HOST 7.16.1
CURLSSH_AUTH_KEYBOARD 7.16.1 CURLSSH_AUTH_KEYBOARD 7.16.1
@@ -439,6 +568,7 @@ CURLUSESSL_NONE 7.17.0
CURLUSESSL_TRY 7.17.0 CURLUSESSL_TRY 7.17.0
CURLUSESSL_TRY 7.17.0 CURLUSESSL_TRY 7.17.0
CURLVERSION_FIRST 7.10 CURLVERSION_FIRST 7.10
CURLVERSION_FOURTH 7.16.1
CURLVERSION_NOW 7.10 CURLVERSION_NOW 7.10
CURLVERSION_SECOND 7.11.1 CURLVERSION_SECOND 7.11.1
CURLVERSION_THIRD 7.12.0 CURLVERSION_THIRD 7.12.0
@@ -447,21 +577,74 @@ CURL_CHUNK_BGN_FUNC_OK 7.21.0
CURL_CHUNK_BGN_FUNC_SKIP 7.21.0 CURL_CHUNK_BGN_FUNC_SKIP 7.21.0
CURL_CHUNK_END_FUNC_FAIL 7.21.0 CURL_CHUNK_END_FUNC_FAIL 7.21.0
CURL_CHUNK_END_FUNC_OK 7.21.0 CURL_CHUNK_END_FUNC_OK 7.21.0
CURL_CSELECT_ERR 7.16.3
CURL_CSELECT_IN 7.16.3
CURL_CSELECT_OUT 7.16.3
CURL_ERROR_SIZE 7.1
CURL_FNMATCHFUNC_FAIL 7.21.0 CURL_FNMATCHFUNC_FAIL 7.21.0
CURL_FNMATCHFUNC_MATCH 7.21.0 CURL_FNMATCHFUNC_MATCH 7.21.0
CURL_FNMATCHFUNC_NOMATCH 7.21.0 CURL_FNMATCHFUNC_NOMATCH 7.21.0
CURL_FORMADD_DISABLED 7.12.1
CURL_FORMADD_ILLEGAL_ARRAY 7.9.8
CURL_FORMADD_INCOMPLETE 7.9.8
CURL_FORMADD_MEMORY 7.9.8
CURL_FORMADD_NULL 7.9.8
CURL_FORMADD_OK 7.9.8
CURL_FORMADD_OPTION_TWICE 7.9.8
CURL_FORMADD_UNKNOWN_OPTION 7.9.8
CURL_GLOBAL_ALL 7.8
CURL_GLOBAL_DEFAULT 7.8
CURL_GLOBAL_NOTHING 7.8
CURL_GLOBAL_SSL 7.8
CURL_GLOBAL_WIN32 7.8.1
CURL_HTTP_VERSION_1_0 7.9.1 CURL_HTTP_VERSION_1_0 7.9.1
CURL_HTTP_VERSION_1_1 7.9.1 CURL_HTTP_VERSION_1_1 7.9.1
CURL_HTTP_VERSION_NONE 7.9.1 CURL_HTTP_VERSION_NONE 7.9.1
CURL_IPRESOLVE_V4 7.10.8 CURL_IPRESOLVE_V4 7.10.8
CURL_IPRESOLVE_V6 7.10.8 CURL_IPRESOLVE_V6 7.10.8
CURL_IPRESOLVE_WHATEVER 7.10.8 CURL_IPRESOLVE_WHATEVER 7.10.8
CURL_LOCK_ACCESS_NONE 7.10.3
CURL_LOCK_ACCESS_SHARED 7.10.3
CURL_LOCK_ACCESS_SINGLE 7.10.3
CURL_LOCK_DATA_CONNECT 7.10.3
CURL_LOCK_DATA_COOKIE 7.10.3
CURL_LOCK_DATA_DNS 7.10.3
CURL_LOCK_DATA_NONE 7.10.3
CURL_LOCK_DATA_SHARE 7.10.4
CURL_LOCK_DATA_SSL_SESSION 7.10.3
CURL_MAX_HTTP_HEADER 7.19.7
CURL_MAX_WRITE_SIZE 7.9.7
CURL_NETRC_IGNORED 7.9.8 CURL_NETRC_IGNORED 7.9.8
CURL_NETRC_OPTIONAL 7.9.8 CURL_NETRC_OPTIONAL 7.9.8
CURL_NETRC_REQUIRED 7.9.8 CURL_NETRC_REQUIRED 7.9.8
CURL_POLL_IN 7.14.0
CURL_POLL_INOUT 7.14.0
CURL_POLL_NONE 7.14.0
CURL_POLL_OUT 7.14.0
CURL_POLL_REMOVE 7.14.0
CURL_READFUNC_ABORT 7.12.1
CURL_READFUNC_PAUSE 7.18.0
CURL_REDIR_GET_ALL 7.19.1
CURL_REDIR_POST_301 7.19.1
CURL_REDIR_POST_302 7.19.1
CURL_REDIR_POST_ALL 7.19.1
CURL_RTSPREQ_ANNOUNCE 7.20.0
CURL_RTSPREQ_DESCRIBE 7.20.0
CURL_RTSPREQ_GET_PARAMETER 7.20.0
CURL_RTSPREQ_NONE 7.20.0
CURL_RTSPREQ_OPTIONS 7.20.0
CURL_RTSPREQ_PAUSE 7.20.0
CURL_RTSPREQ_PLAY 7.20.0
CURL_RTSPREQ_RECEIVE 7.20.0
CURL_RTSPREQ_RECORD 7.20.0
CURL_RTSPREQ_SETUP 7.20.0
CURL_RTSPREQ_SET_PARAMETER 7.20.0
CURL_RTSPREQ_TEARDOWN 7.20.0
CURL_SEEKFUNC_CANTSEEK 7.19.5 CURL_SEEKFUNC_CANTSEEK 7.19.5
CURL_SEEKFUNC_FAIL 7.19.5 CURL_SEEKFUNC_FAIL 7.19.5
CURL_SEEKFUNC_OK 7.19.5 CURL_SEEKFUNC_OK 7.19.5
CURL_SOCKET_BAD 7.14.0
CURL_SOCKET_TIMEOUT 7.14.0
CURL_SSLVERSION_DEFAULT 7.9.2 CURL_SSLVERSION_DEFAULT 7.9.2
CURL_SSLVERSION_SSLv2 7.9.2 CURL_SSLVERSION_SSLv2 7.9.2
CURL_SSLVERSION_SSLv3 7.9.2 CURL_SSLVERSION_SSLv3 7.9.2
@@ -469,6 +652,9 @@ CURL_SSLVERSION_TLSv1 7.9.2
CURL_TIMECOND_IFMODSINCE 7.9.7 CURL_TIMECOND_IFMODSINCE 7.9.7
CURL_TIMECOND_IFUNMODSINCE 7.9.7 CURL_TIMECOND_IFUNMODSINCE 7.9.7
CURL_TIMECOND_LASTMOD 7.9.7 CURL_TIMECOND_LASTMOD 7.9.7
CURL_TIMECOND_NONE 7.9.7
CURL_TLSAUTH_NONE 7.21.4
CURL_TLSAUTH_SRP 7.21.4
CURL_VERSION_ASYNCHDNS 7.10.7 CURL_VERSION_ASYNCHDNS 7.10.7
CURL_VERSION_CONV 7.15.4 CURL_VERSION_CONV 7.15.4
CURL_VERSION_CURLDEBUG 7.19.6 CURL_VERSION_CURLDEBUG 7.19.6
@@ -483,3 +669,5 @@ CURL_VERSION_NTLM 7.10.6
CURL_VERSION_SPNEGO 7.10.8 CURL_VERSION_SPNEGO 7.10.8
CURL_VERSION_SSL 7.10 CURL_VERSION_SSL 7.10
CURL_VERSION_SSPI 7.13.2 CURL_VERSION_SSPI 7.13.2
CURL_VERSION_TLSAUTH_SRP 7.21.4
CURL_WRITEFUNC_PAUSE 7.18.0

View File

@@ -585,6 +585,9 @@ typedef enum {
#define CURLAUTH_GSSNEGOTIATE (1<<2) /* GSS-Negotiate */ #define CURLAUTH_GSSNEGOTIATE (1<<2) /* GSS-Negotiate */
#define CURLAUTH_NTLM (1<<3) /* NTLM */ #define CURLAUTH_NTLM (1<<3) /* NTLM */
#define CURLAUTH_DIGEST_IE (1<<4) /* Digest with IE flavour */ #define CURLAUTH_DIGEST_IE (1<<4) /* Digest with IE flavour */
#define CURLAUTH_ONLY (1<<31) /* used together with a single other
type to force no auth or just that
single type */
#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) /* all fine types set */ #define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE) /* all fine types set */
#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE)) #define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE))
@@ -722,6 +725,7 @@ typedef enum {
#define CURLPROTO_RTMPTE (1<<22) #define CURLPROTO_RTMPTE (1<<22)
#define CURLPROTO_RTMPS (1<<23) #define CURLPROTO_RTMPS (1<<23)
#define CURLPROTO_RTMPTS (1<<24) #define CURLPROTO_RTMPTS (1<<24)
#define CURLPROTO_GOPHER (1<<25)
#define CURLPROTO_ALL (~0) /* enable everything */ #define CURLPROTO_ALL (~0) /* enable everything */
/* long may be 32 or 64 bits, but we should never depend on anything else /* long may be 32 or 64 bits, but we should never depend on anything else
@@ -1435,6 +1439,18 @@ typedef enum {
/* FNMATCH_FUNCTION user pointer */ /* FNMATCH_FUNCTION user pointer */
CINIT(FNMATCH_DATA, OBJECTPOINT, 202), CINIT(FNMATCH_DATA, OBJECTPOINT, 202),
/* send linked-list of name:port:address sets */
CINIT(RESOLVE, OBJECTPOINT, 203),
/* Set a username for authenticated TLS */
CINIT(TLSAUTH_USERNAME, OBJECTPOINT, 204),
/* Set a password for authenticated TLS */
CINIT(TLSAUTH_PASSWORD, OBJECTPOINT, 205),
/* Set authentication type for authenticated TLS */
CINIT(TLSAUTH_TYPE, OBJECTPOINT, 206),
CURLOPT_LASTENTRY /* the last unused */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;
@@ -1531,6 +1547,12 @@ enum {
CURL_SSLVERSION_LAST /* never use, keep last */ CURL_SSLVERSION_LAST /* never use, keep last */
}; };
enum CURL_TLSAUTH {
CURL_TLSAUTH_NONE,
CURL_TLSAUTH_SRP,
CURL_TLSAUTH_LAST /* never use, keep last */
};
/* symbols to use with CURLOPT_POSTREDIR. /* symbols to use with CURLOPT_POSTREDIR.
CURL_REDIR_POST_301 and CURL_REDIR_POST_302 can be bitwise ORed so that CURL_REDIR_POST_301 and CURL_REDIR_POST_302 can be bitwise ORed so that
CURL_REDIR_POST_301 | CURL_REDIR_POST_302 == CURL_REDIR_POST_ALL */ CURL_REDIR_POST_301 | CURL_REDIR_POST_302 == CURL_REDIR_POST_ALL */
@@ -2036,6 +2058,7 @@ typedef struct {
#define CURL_VERSION_SSPI (1<<11) /* SSPI is supported */ #define CURL_VERSION_SSPI (1<<11) /* SSPI is supported */
#define CURL_VERSION_CONV (1<<12) /* character conversions supported */ #define CURL_VERSION_CONV (1<<12) /* character conversions supported */
#define CURL_VERSION_CURLDEBUG (1<<13) /* debug memory tracking supported */ #define CURL_VERSION_CURLDEBUG (1<<13) /* debug memory tracking supported */
#define CURL_VERSION_TLSAUTH_SRP (1<<14) /* TLS-SRP auth is supported */
/* /*
* NAME curl_version_info() * NAME curl_version_info()

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -216,14 +216,23 @@ typedef char
* Macros for minimum-width signed and unsigned curl_off_t integer constants. * Macros for minimum-width signed and unsigned curl_off_t integer constants.
*/ */
#ifdef CURL_ISOCPP #if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
# define __CURL_OFF_T_C_HELPER2(Val,Suffix) Val ## Suffix # define __CURL_OFF_T_C_HLPR2(x) x
# define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x)
# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
__CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
__CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
#else #else
# define __CURL_OFF_T_C_HELPER2(Val,Suffix) Val/**/Suffix # ifdef CURL_ISOCPP
# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
# else
# define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
# endif
# define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix)
# define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
# define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
#endif #endif
#define __CURL_OFF_T_C_HELPER1(Val,Suffix) __CURL_OFF_T_C_HELPER2(Val,Suffix)
#define CURL_OFF_T_C(Val) __CURL_OFF_T_C_HELPER1(Val,CURL_SUFFIX_CURL_OFF_T)
#define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HELPER1(Val,CURL_SUFFIX_CURL_OFF_TU)
/* /*
* Get rid of macros private to this header file. * Get rid of macros private to this header file.

View File

@@ -30,13 +30,13 @@
/* 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.21.1-DEV" #define LIBCURL_VERSION "7.21.4-DEV"
/* 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 21 #define LIBCURL_VERSION_MINOR 21
#define LIBCURL_VERSION_PATCH 1 #define LIBCURL_VERSION_PATCH 4
/* 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
@@ -53,7 +53,7 @@
and it is always a greater number in a more recent release. It makes and it is always a greater number in a more recent release. It makes
comparisons with greater than and less than work. comparisons with greater than and less than work.
*/ */
#define LIBCURL_VERSION_NUM 0x071501 #define LIBCURL_VERSION_NUM 0x071504
/* /*
* This is the date and time when the full source package was created. The * This is the date and time when the full source package was created. The

View File

@@ -25,11 +25,16 @@
/* wraps curl_easy_setopt() with typechecking */ /* wraps curl_easy_setopt() with typechecking */
/* To add a new kind of warning, add an /* To add a new kind of warning, add an
* if(_curl_is_sometype_option(_curl_opt) && ! _curl_is_sometype(value)) * if(_curl_is_sometype_option(_curl_opt))
* _curl_easy_setopt_err_sometype(); * if(!_curl_is_sometype(value))
* _curl_easy_setopt_err_sometype();
* block and define _curl_is_sometype_option, _curl_is_sometype and * block and define _curl_is_sometype_option, _curl_is_sometype and
* _curl_easy_setopt_err_sometype below * _curl_easy_setopt_err_sometype below
* *
* NOTE: We use two nested 'if' statements here instead of the && operator, in
* order to work around gcc bug #32061. It affects only gcc 4.3.x/4.4.x
* when compiling with -Wlogical-op.
*
* To add an option that uses the same type as an existing option, you'll just * To add an option that uses the same type as an existing option, you'll just
* need to extend the appropriate _curl_*_option macro * need to extend the appropriate _curl_*_option macro
*/ */
@@ -37,51 +42,66 @@
__extension__ ({ \ __extension__ ({ \
__typeof__ (option) _curl_opt = option; \ __typeof__ (option) _curl_opt = option; \
if (__builtin_constant_p(_curl_opt)) { \ if (__builtin_constant_p(_curl_opt)) { \
if (_curl_is_long_option(_curl_opt) && !_curl_is_long(value)) \ if (_curl_is_long_option(_curl_opt)) \
_curl_easy_setopt_err_long(); \ if (!_curl_is_long(value)) \
if (_curl_is_off_t_option(_curl_opt) && !_curl_is_off_t(value)) \ _curl_easy_setopt_err_long(); \
_curl_easy_setopt_err_curl_off_t(); \ if (_curl_is_off_t_option(_curl_opt)) \
if (_curl_is_string_option(_curl_opt) && !_curl_is_string(value)) \ if (!_curl_is_off_t(value)) \
_curl_easy_setopt_err_string(); \ _curl_easy_setopt_err_curl_off_t(); \
if (_curl_is_write_cb_option(_curl_opt) && !_curl_is_write_cb(value)) \ if (_curl_is_string_option(_curl_opt)) \
_curl_easy_setopt_err_write_callback(); \ if (!_curl_is_string(value)) \
if ((_curl_opt) == CURLOPT_READFUNCTION && !_curl_is_read_cb(value)) \ _curl_easy_setopt_err_string(); \
_curl_easy_setopt_err_read_cb(); \ if (_curl_is_write_cb_option(_curl_opt)) \
if ((_curl_opt) == CURLOPT_IOCTLFUNCTION && !_curl_is_ioctl_cb(value)) \ if (!_curl_is_write_cb(value)) \
_curl_easy_setopt_err_ioctl_cb(); \ _curl_easy_setopt_err_write_callback(); \
if ((_curl_opt) == CURLOPT_SOCKOPTFUNCTION && !_curl_is_sockopt_cb(value))\ if ((_curl_opt) == CURLOPT_READFUNCTION) \
_curl_easy_setopt_err_sockopt_cb(); \ if (!_curl_is_read_cb(value)) \
if ((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION && \ _curl_easy_setopt_err_read_cb(); \
!_curl_is_opensocket_cb(value)) \ if ((_curl_opt) == CURLOPT_IOCTLFUNCTION) \
_curl_easy_setopt_err_opensocket_cb(); \ if (!_curl_is_ioctl_cb(value)) \
if ((_curl_opt) == CURLOPT_PROGRESSFUNCTION && \ _curl_easy_setopt_err_ioctl_cb(); \
!_curl_is_progress_cb(value)) \ if ((_curl_opt) == CURLOPT_SOCKOPTFUNCTION) \
_curl_easy_setopt_err_progress_cb(); \ if (!_curl_is_sockopt_cb(value)) \
if ((_curl_opt) == CURLOPT_DEBUGFUNCTION && !_curl_is_debug_cb(value)) \ _curl_easy_setopt_err_sockopt_cb(); \
_curl_easy_setopt_err_debug_cb(); \ if ((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION) \
if ((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION && \ if (!_curl_is_opensocket_cb(value)) \
!_curl_is_ssl_ctx_cb(value)) \ _curl_easy_setopt_err_opensocket_cb(); \
_curl_easy_setopt_err_ssl_ctx_cb(); \ if ((_curl_opt) == CURLOPT_PROGRESSFUNCTION) \
if (_curl_is_conv_cb_option(_curl_opt) && !_curl_is_conv_cb(value)) \ if (!_curl_is_progress_cb(value)) \
_curl_easy_setopt_err_conv_cb(); \ _curl_easy_setopt_err_progress_cb(); \
if ((_curl_opt) == CURLOPT_SEEKFUNCTION && !_curl_is_seek_cb(value)) \ if ((_curl_opt) == CURLOPT_DEBUGFUNCTION) \
_curl_easy_setopt_err_seek_cb(); \ if (!_curl_is_debug_cb(value)) \
if (_curl_is_cb_data_option(_curl_opt) && !_curl_is_cb_data(value)) \ _curl_easy_setopt_err_debug_cb(); \
_curl_easy_setopt_err_cb_data(); \ if ((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION) \
if ((_curl_opt) == CURLOPT_ERRORBUFFER && !_curl_is_error_buffer(value)) \ if (!_curl_is_ssl_ctx_cb(value)) \
_curl_easy_setopt_err_error_buffer(); \ _curl_easy_setopt_err_ssl_ctx_cb(); \
if ((_curl_opt) == CURLOPT_STDERR && !_curl_is_FILE(value)) \ if (_curl_is_conv_cb_option(_curl_opt)) \
_curl_easy_setopt_err_FILE(); \ if (!_curl_is_conv_cb(value)) \
if (_curl_is_postfields_option(_curl_opt) && !_curl_is_postfields(value)) \ _curl_easy_setopt_err_conv_cb(); \
_curl_easy_setopt_err_postfields(); \ if ((_curl_opt) == CURLOPT_SEEKFUNCTION) \
if ((_curl_opt) == CURLOPT_HTTPPOST && \ if (!_curl_is_seek_cb(value)) \
!_curl_is_arr((value), struct curl_httppost)) \ _curl_easy_setopt_err_seek_cb(); \
_curl_easy_setopt_err_curl_httpost(); \ if (_curl_is_cb_data_option(_curl_opt)) \
if (_curl_is_slist_option(_curl_opt) && \ if (!_curl_is_cb_data(value)) \
!_curl_is_arr((value), struct curl_slist)) \ _curl_easy_setopt_err_cb_data(); \
_curl_easy_setopt_err_curl_slist(); \ if ((_curl_opt) == CURLOPT_ERRORBUFFER) \
if ((_curl_opt) == CURLOPT_SHARE && !_curl_is_ptr((value), CURLSH)) \ if (!_curl_is_error_buffer(value)) \
_curl_easy_setopt_err_CURLSH(); \ _curl_easy_setopt_err_error_buffer(); \
if ((_curl_opt) == CURLOPT_STDERR) \
if (!_curl_is_FILE(value)) \
_curl_easy_setopt_err_FILE(); \
if (_curl_is_postfields_option(_curl_opt)) \
if (!_curl_is_postfields(value)) \
_curl_easy_setopt_err_postfields(); \
if ((_curl_opt) == CURLOPT_HTTPPOST) \
if (!_curl_is_arr((value), struct curl_httppost)) \
_curl_easy_setopt_err_curl_httpost(); \
if (_curl_is_slist_option(_curl_opt)) \
if (!_curl_is_arr((value), struct curl_slist)) \
_curl_easy_setopt_err_curl_slist(); \
if ((_curl_opt) == CURLOPT_SHARE) \
if (!_curl_is_ptr((value), CURLSH)) \
_curl_easy_setopt_err_CURLSH(); \
} \ } \
curl_easy_setopt(handle, _curl_opt, value); \ curl_easy_setopt(handle, _curl_opt, value); \
}) })
@@ -92,15 +112,18 @@ __extension__ ({ \
__extension__ ({ \ __extension__ ({ \
__typeof__ (info) _curl_info = info; \ __typeof__ (info) _curl_info = info; \
if (__builtin_constant_p(_curl_info)) { \ if (__builtin_constant_p(_curl_info)) { \
if (_curl_is_string_info(_curl_info) && !_curl_is_arr((arg), char *)) \ if (_curl_is_string_info(_curl_info)) \
_curl_easy_getinfo_err_string(); \ if (!_curl_is_arr((arg), char *)) \
if (_curl_is_long_info(_curl_info) && !_curl_is_arr((arg), long)) \ _curl_easy_getinfo_err_string(); \
_curl_easy_getinfo_err_long(); \ if (_curl_is_long_info(_curl_info)) \
if (_curl_is_double_info(_curl_info) && !_curl_is_arr((arg), double)) \ if (!_curl_is_arr((arg), long)) \
_curl_easy_getinfo_err_double(); \ _curl_easy_getinfo_err_long(); \
if (_curl_is_slist_info(_curl_info) && \ if (_curl_is_double_info(_curl_info)) \
!_curl_is_arr((arg), struct curl_slist *)) \ if (!_curl_is_arr((arg), double)) \
_curl_easy_getinfo_err_curl_slist(); \ _curl_easy_getinfo_err_double(); \
if (_curl_is_slist_info(_curl_info)) \
if (!_curl_is_arr((arg), struct curl_slist *)) \
_curl_easy_getinfo_err_curl_slist(); \
} \ } \
curl_easy_getinfo(handle, _curl_info, arg); \ curl_easy_getinfo(handle, _curl_info, arg); \
}) })

1
lib/.gitignore vendored
View File

@@ -9,3 +9,4 @@ Makefile.vc9.dist
libcurl.plist.dist libcurl.plist.dist
libcurl.vcproj libcurl.vcproj
vc6libcurl.dsp vc6libcurl.dsp
Makefile.vc10.dist

View File

@@ -5,9 +5,6 @@
!ifndef %watcom !ifndef %watcom
!error WATCOM environment variable not set! !error WATCOM environment variable not set!
!else
SYS_INCL = -I$(%watcom)\h\nt -I$(%watcom)\h
SYS_LIBS = $(%watcom)\lib386\nt;$(%watcom)\lib386
!endif !endif
!ifdef %libname !ifdef %libname
@@ -33,18 +30,30 @@ RC = wrc
! endif ! endif
!endif !endif
!if $(__VERSION__) < 1250 !ifdef __LINUX__
RM = del /q /f >NUL 2>&1 DS = /
!else CP = cp
RM = rm -f MD = mkdir -p
!endif RD = rmdir -p
RM = rm -f
!else
DS = $(X)\$(X)
CP = copy 2>NUL
MD = mkdir MD = mkdir
RD = rmdir /q /s >NUL 2>&1 RD = rmdir /q /s 2>NUL
CP = copy !if $(__VERSION__) < 1250
RM = del /q /f 2>NUL
!else
RM = rm -f
!endif
!endif
SYS_INCL = -I$(%watcom)$(DS)h$(DS)nt -I$(%watcom)$(DS)h
SYS_LIBS = $(%watcom)$(DS)lib386$(DS)nt;$(%watcom)$(DS)lib386
CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm & CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm &
-wcd=201 -bt=nt -d+ -dWIN32 -dCURL_WANTS_CA_BUNDLE_ENV & -wcd=201 -bt=nt -d+ -dWIN32 -dCURL_WANTS_CA_BUNDLE_ENV &
-dBUILDING_LIBCURL -dHAVE_SPNEGO=1 -I. -I..\include $(SYS_INCL) -dBUILDING_LIBCURL -dHAVE_SPNEGO=1 -I. -I..$(DS)include $(SYS_INCL)
!ifdef %debug !ifdef %debug
DEBUG = -dDEBUG=1 -dDEBUGBUILD DEBUG = -dDEBUG=1 -dDEBUGBUILD
@@ -57,33 +66,57 @@ CFLAGS += -d0
CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6 CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6
!endif !endif
!ifdef %use_sspi
CFLAGS += -dUSE_WINDOWS_SSPI
!endif
# #
# Change to suite. # Change to suite.
# #
!ifdef %zlib_root !ifdef %zlib_root
ZLIB_ROOT = $(%zlib_root) ZLIB_ROOT = $(%zlib_root)
!else !else
ZLIB_ROOT = ..\..\zlib-1.2.5 ZLIB_ROOT = ..$(DS)..$(DS)zlib-1.2.5
!endif
!ifdef %libssh2_root
LIBSSH2_ROOT = $(%libssh2_root)
!else
LIBSSH2_ROOT = ..$(DS)..$(DS)libssh2-1.2.7
!endif
!ifdef %librtmp_root
LIBRTMP_ROOT = $(%librtmp_root)
!else
LIBRTMP_ROOT = ..$(DS)..$(DS)rtmpdump-2.3
!endif !endif
!ifdef %openssl_root !ifdef %openssl_root
OPENSSL_ROOT = $(%openssl_root) OPENSSL_ROOT = $(%openssl_root)
!else !else
OPENSSL_ROOT = ..\..\openssl-0.9.8o OPENSSL_ROOT = ..$(DS)..$(DS)openssl-0.9.8r
!endif !endif
!ifdef %ares_root !ifdef %ares_root
ARES_ROOT = $(%ares_root) ARES_ROOT = $(%ares_root)
!else !else
ARES_ROOT = ..\ares ARES_ROOT = ..$(DS)ares
!endif !endif
!ifdef %use_zlib !ifdef %use_zlib
CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I$(ZLIB_ROOT) CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I$(ZLIB_ROOT)
!endif !endif
!ifdef %use_rtmp
CFLAGS += -dUSE_LIBRTMP -I$(LIBRTMP_ROOT)
!endif
!ifdef %use_ssh2
CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I$(LIBSSH2_ROOT)$(DS)include -I$(LIBSSH2_ROOT)$(DS)win32
!endif
!ifdef %use_ssl !ifdef %use_ssl
CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I$(OPENSSL_ROOT)\inc32 CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I$(OPENSSL_ROOT)$(DS)inc32
!endif !endif
!ifdef %use_ares !ifdef %use_ares
@@ -91,12 +124,12 @@ CFLAGS += -dUSE_ARES -I$(ARES_ROOT)
!endif !endif
!ifdef %use_watt32 !ifdef %use_watt32
CFLAGS += -dUSE_WATT32 -I$(%watt_root)\inc CFLAGS += -dUSE_WATT32 -I$(%watt_root)$(DS)inc
!endif !endif
OBJ_BASE = WC_Win32.obj OBJ_BASE = WC_Win32.obj
LINK_ARG = $(OBJ_BASE)\dyn\wlink.arg LINK_ARG = $(OBJ_BASE)$(DS)dyn$(DS)wlink.arg
LIB_ARG = $(OBJ_BASE)\stat\wlib.arg LIB_ARG = $(OBJ_BASE)$(DS)stat$(DS)wlib.arg
# In order to process Makefile.inc wmake must be called with -u switch! # In order to process Makefile.inc wmake must be called with -u switch!
!ifndef %MAKEFLAGS !ifndef %MAKEFLAGS
@@ -106,19 +139,24 @@ LIB_ARG = $(OBJ_BASE)\stat\wlib.arg
!endif !endif
OBJS = $(CSOURCES:.c=.obj) OBJS = $(CSOURCES:.c=.obj)
!ifdef __LINUX__
OBJS = $OBJ_DIR/$(OBJS: = $OBJ_DIR/)
!else
OBJS = $OBJ_DIR\$(OBJS: = $OBJ_DIR\) OBJS = $OBJ_DIR\$(OBJS: = $OBJ_DIR\)
!endif
# #
# Use $(OBJS) as a template to generate $(OBJS_STAT) and $(OBJS_DYN). # Use $(OBJS) as a template to generate $(OBJS_STAT) and $(OBJS_DYN).
# #
OBJ_DIR = $(OBJ_BASE)\stat OBJ_DIR = $(OBJ_BASE)$(DS)stat
OBJS_STAT = $+ $(OBJS) $- OBJS_STAT = $+ $(OBJS) $-
OBJ_DIR = $(OBJ_BASE)\dyn OBJ_DIR = $(OBJ_BASE)$(DS)dyn
OBJS_DYN = $+ $(OBJS) $- OBJS_DYN = $+ $(OBJS) $-
CURLBUILDH = ..\include\curl\curlbuild.h CURLBUILDH = ..$(DS)include$(DS)curl$(DS)curlbuild.h
RESOURCE = $(OBJ_BASE)\dyn\libcurl.res RESOURCE = $(OBJ_BASE)$(DS)dyn$(DS)libcurl.res
all: $(CURLBUILDH) $(OBJ_BASE) $(TARGETS) .SYMBOLIC all: $(CURLBUILDH) $(OBJ_BASE) $(TARGETS) .SYMBOLIC
@echo Welcome to libcurl @echo Welcome to libcurl
@@ -128,16 +166,16 @@ clean: .SYMBOLIC
-$(RM) $(OBJS_DYN) -$(RM) $(OBJS_DYN)
-$(RM) $(RESOURCE) $(LINK_ARG) $(LIB_ARG) -$(RM) $(RESOURCE) $(LINK_ARG) $(LIB_ARG)
vclean realclean: clean .SYMBOLIC vclean distclean: clean .SYMBOLIC
-$(RM) $(TARGETS) $(LIBNAME).map $(LIBNAME).sym -$(RM) $(TARGETS) $(LIBNAME).map $(LIBNAME).sym
-$(RD) $(OBJ_BASE)\stat -$(RD) $(OBJ_BASE)$(DS)stat
-$(RD) $(OBJ_BASE)\dyn -$(RD) $(OBJ_BASE)$(DS)dyn
-$(RD) $(OBJ_BASE) -$(RD) $(OBJ_BASE)
$(OBJ_BASE): $(OBJ_BASE):
-$(MD) $^@ -$(MD) $^@
-$(MD) $^@\stat -$(MD) $^@$(DS)stat
-$(MD) $^@\dyn -$(MD) $^@$(DS)dyn
$(CURLBUILDH): .EXISTSONLY $(CURLBUILDH): .EXISTSONLY
$(CP) $^@.dist $^@ $(CP) $^@.dist $^@
@@ -150,14 +188,14 @@ $(LIBNAME).lib: $(OBJS_STAT) $(LIB_ARG)
.ERASE .ERASE
$(RESOURCE): libcurl.rc $(RESOURCE): libcurl.rc
$(RC) $(DEBUG) -q -r -zm -I..\include $(SYS_INCL) $[@ -fo=$^@ $(RC) $(DEBUG) -q -r -zm -bt=nt -I..$(DS)include $(SYS_INCL) $[@ -fo=$^@
.ERASE .ERASE
.c{$(OBJ_BASE)\dyn}.obj: .c{$(OBJ_BASE)$(DS)dyn}.obj:
$(CC) $(CFLAGS) -bd -br $[@ -fo=$^@ $(CC) $(CFLAGS) -bd -br $[@ -fo=$^@
.ERASE .ERASE
.c{$(OBJ_BASE)\stat}.obj: .c{$(OBJ_BASE)$(DS)stat}.obj:
$(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@ $(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@
$(LINK_ARG): $(__MAKEFILES__) $(LINK_ARG): $(__MAKEFILES__)
@@ -172,18 +210,24 @@ $(LINK_ARG): $(__MAKEFILES__)
@%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS) @%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS)
@%append $^@ library wldap32.lib @%append $^@ library wldap32.lib
!ifdef %use_watt32 !ifdef %use_watt32
@%append $^@ library $(%watt_root)\lib\wattcpw_imp.lib @%append $^@ library $(%watt_root)$(DS)lib$(DS)wattcpw_imp.lib
!else !else
@%append $^@ library ws2_32.lib @%append $^@ library ws2_32.lib
!endif !endif
!ifdef %use_zlib !ifdef %use_zlib
@%append $^@ library $(ZLIB_ROOT)\zlib.lib @%append $^@ library $(ZLIB_ROOT)$(DS)zlib.lib
!endif
!ifdef %use_rtmp
@%append $^@ library $(LIBRTMP_ROOT)$(DS)librtmp$(DS)librtmp.lib
!endif
!ifdef %use_ssh2
@%append $^@ library $(LIBSSH2_ROOT)$(DS)win32$(DS)libssh2.lib
!endif !endif
!ifdef %use_ssl !ifdef %use_ssl
@%append $^@ library $(OPENSSL_ROOT)\out32\libeay32.lib, $(OPENSSL_ROOT)\out32\ssleay32.lib @%append $^@ library $(OPENSSL_ROOT)$(DS)out32$(DS)libeay32.lib, $(OPENSSL_ROOT)$(DS)out32$(DS)ssleay32.lib
!endif !endif
!ifdef %use_ares !ifdef %use_ares
@%append $^@ library $(ARES_ROOT)\cares.lib @%append $^@ library $(ARES_ROOT)$(DS)cares.lib
!endif !endif
$(LIB_ARG): $(__MAKEFILES__) $(LIB_ARG): $(__MAKEFILES__)

View File

@@ -5,7 +5,7 @@
# | (__| |_| | _ <| |___ # | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____| # \___|\___/|_| \_\_____|
# #
# Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. # Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
# #
# This software is licensed as described in the file COPYING, which # This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms # you should have received as part of this distribution. The terms
@@ -30,14 +30,15 @@ DOCS = README.encoding README.memoryleak README.ares README.curlx \
CMAKE_DIST = CMakeLists.txt curl_config.h.cmake CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 Makefile.riscos $(DSP) \ EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 $(DSP) \
vc6libcurl.dsw config-win32.h config-win32ce.h config-riscos.h \ vc6libcurl.dsw config-win32.h config-win32ce.h config-riscos.h \
config-mac.h curl_config.h.in makefile.dj config.dos libcurl.plist \ config-mac.h curl_config.h.in makefile.dj config-dos.h libcurl.plist \
libcurl.rc config-amigaos.h amigaos.c amigaos.h makefile.amiga \ libcurl.rc config-amigaos.h amigaos.c amigaos.h makefile.amiga \
Makefile.netware nwlib.c nwos.c libcurl.imp msvcproj.head msvcproj.foot \ Makefile.netware nwlib.c nwos.c libcurl.imp msvcproj.head msvcproj.foot \
config-win32ce.h config-os400.h setup-os400.h config-symbian.h \ config-win32ce.h config-os400.h setup-os400.h config-symbian.h \
Makefile.Watcom config-tpf.h $(DOCS) $(VCPROJ) mk-ca-bundle.pl \ Makefile.Watcom config-tpf.h $(DOCS) $(VCPROJ) mk-ca-bundle.pl \
firefox-db2pem.sh $(CMAKE_DIST) config-vxworks.h Makefile.vxworks mk-ca-bundle.vbs firefox-db2pem.sh $(CMAKE_DIST) config-vxworks.h \
Makefile.vxworks config-vms.h
CLEANFILES = $(DSP) $(VCPROJ) CLEANFILES = $(DSP) $(VCPROJ)
@@ -45,7 +46,7 @@ lib_LTLIBRARIES = libcurl.la
LIBCURL_LIBS = @LIBCURL_LIBS@ LIBCURL_LIBS = @LIBCURL_LIBS@
# This might hold -Werror # This might hold -Werror
CFLAGS += @CURL_CFLAG_EXTRAS@ libcurl_la_CFLAGS = $(CFLAGS) @CURL_CFLAG_EXTRAS@
# Specify our include paths here, and do it relative to $(top_srcdir) and # Specify our include paths here, and do it relative to $(top_srcdir) and
# $(top_builddir), to ensure that these paths which belong to the library # $(top_builddir), to ensure that these paths which belong to the library
@@ -115,12 +116,23 @@ if MIMPURE
MIMPURE = -mimpure-text MIMPURE = -mimpure-text
endif endif
libcurl_la_LDFLAGS = $(UNDEF) $(VERSIONINFO) $(MIMPURE) $(LIBCURL_LIBS) LINKFLAGS=$(UNDEF) $(MIMPURE) $(LIBCURL_LIBS)
libcurl_la_LDFLAGS = $(LINKFLAGS) $(VERSIONINFO)
# as unit testing will compile and link everything an extra time, we only
# do it if debug is enabled
if CURLDEBUG
noinst_LTLIBRARIES = libcurlu.la
libcurlu_la_CFLAGS = -DUNITTESTS
libcurlu_la_LDFLAGS = -static $(LINKFLAGS)
endif
# Makefile.inc provides the CSOURCES and HHEADERS defines # Makefile.inc provides the CSOURCES and HHEADERS defines
include Makefile.inc include Makefile.inc
libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS) libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
libcurlu_la_SOURCES = $(CSOURCES) $(HHEADERS)
WIN32SOURCES = $(CSOURCES) WIN32SOURCES = $(CSOURCES)
WIN32HEADERS = $(HHEADERS) config-win32.h WIN32HEADERS = $(HHEADERS) config-win32.h

View File

@@ -6,19 +6,28 @@
# #
# 'BCCDIR' has to be set up to point to the base directory # 'BCCDIR' has to be set up to point to the base directory
# of the compiler, i.e. SET BCCDIR = c:\Borland\BCC55 # of the compiler, i.e. SET BCCDIR = c:\Borland\BCC55
# where c:\Borland\BCC55 is the compiler is installed
# #
# Written by Jaepil Kim, pit@paradise.net.nz # Initially written by Jaepil Kim, pit@paradise.net.nz
############################################################ ############################################################
!if "$(__MAKE__)" == ""
!error __MAKE__ not defined. Use Borlands's MAKE to process this makefile.
!endif
# Borland's $(MAKEDIR) expands to the path where make.exe is located,
# use this feature to define BCCDIR when user has not defined BCCDIR.
!ifndef BCCDIR
BCCDIR = $(MAKEDIR)\..
!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.
!ifndef ZLIB_PATH !ifndef ZLIB_PATH
ZLIB_PATH = ../../zlib-1.2.1 ZLIB_PATH = ..\..\zlib-1.2.5
!endif !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.7d OPENSSL_PATH = ..\..\openssl-0.9.8q
!endif !endif
# Set libcurl static lib, dll and import lib # Set libcurl static lib, dll and import lib
@@ -27,55 +36,78 @@ LIBCURL_DLL = libcurl.dll
LIBCURL_IMPLIB = libcurl_imp.lib LIBCURL_IMPLIB = libcurl_imp.lib
# Setup environment # Setup environment
CXX = bcc32 PP_CMD = cpp32 -q -P-
CC_CMD = bcc32 -q -c
LD = bcc32 LD = bcc32
CP = copy RM = del 2>NUL
RM = del MKDIR = mkdir
RMDIR = rmdir /s /q 2>NUL
LIB = tlib LIB = tlib
IMPLIB = implib IMPLIB = implib
CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM CC_FLAGS = -5 -O2 -tWM -w -w-aus -w-ccc -w-dup -w-prc -w-pro -w-rch -w-sig -w-spa -Dinline=__inline
LIBFLAGS = /C /P32 LIBFLAGS = /C /P32
LDFLAGS = -q -lq -laa -tWD LDFLAGS = -q -lq -laa -tWD
INCDIRS = -I.;../include SRCDIR = .
LINKLIB = $(BCCDIR)/lib/cw32mt.lib OBJDIR = .\objs
INCDIRS = -I.;..\include
LINKLIB = $(BCCDIR)\lib\cw32mt.lib
DEFINES = -DNDEBUG -DWIN32 -DBUILDING_LIBCURL
# If you build with SSL support, set WITH_SSL=1 # By default SSPI support is enabled for BCC
DEFINES = -DNDEBUG -DWIN32 -D_CONSOLE -D_MBCS -DBUILDING_LIBCURL !ifndef DISABLE_SSPI
DEFINES = $(DEFINES) -DUSE_WINDOWS_SSPI
!endif
# By default LDAP support is disabled for BCC
!ifndef WITH_LDAP
DEFINES = $(DEFINES) -DCURL_DISABLE_LDAP
!endif
# ZLIB support is enabled setting WITH_ZLIB=1
!ifdef WITH_ZLIB !ifdef WITH_ZLIB
DEFINES = $(DEFINES) -DHAVE_LIBZ -DHAVE_ZLIB_H DEFINES = $(DEFINES) -DHAVE_LIBZ -DHAVE_ZLIB_H
INCDIRS = $(INCDIRS);$(ZLIB_PATH) INCDIRS = $(INCDIRS);$(ZLIB_PATH)
LINKLIB = $(LINKLIB) $(ZLIB_PATH)/zlib.lib LINKLIB = $(LINKLIB) $(ZLIB_PATH)\zlib.lib
!endif !endif
# SSL support is enabled setting WITH_SSL=1
!ifdef WITH_SSL !ifdef WITH_SSL
DEFINES = $(DEFINES) -DUSE_SSLEAY DEFINES = $(DEFINES) -DUSE_SSLEAY
INCDIRS = $(INCDIRS);$(OPENSSL_PATH)/inc32;$(OPENSSL_PATH)/inc32/openssl INCDIRS = $(INCDIRS);$(OPENSSL_PATH)\inc32;$(OPENSSL_PATH)\inc32\openssl
LINKLIB = $(LINKLIB) $(OPENSSL_PATH)/out32/ssleay32.lib $(OPENSSL_PATH)/out32/libeay32.lib LINKLIB = $(LINKLIB) $(OPENSSL_PATH)\out32\ssleay32.lib $(OPENSSL_PATH)\out32\libeay32.lib
!endif !endif
.autodepend .autodepend
.path.c = $(SRCDIR)
.path.obj = $(OBJDIR)
# Makefile.inc provides the CSOURCES and HHEADERS defines # Makefile.inc provides the CSOURCES and HHEADERS defines
!include Makefile.inc !include Makefile.inc
OBJECTS = $(CSOURCES:.c=.obj) OBJECTS = $(CSOURCES:.c=.obj)
.c.obj: .c.obj:
$(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $< @-$(RM) $(@R).int
$(PP_CMD) $(CC_FLAGS) $(INCDIRS) $(DEFINES) -o$(@R).int $(<)
$(CC_CMD) $(CC_FLAGS) -o$(@) $(@R).int
all: $(LIBCURL_LIB) $(LIBCURL_DLL) all: $(OBJDIR) $(LIBCURL_LIB) $(LIBCURL_DLL)
clean: clean:
-$(RM) $(LIBCURL_LIB) @-$(RMDIR) $(OBJDIR)
-$(RM) $(LIBCURL_IMPLIB) @-$(RM) $(LIBCURL_LIB)
-$(RM) libcurl.tds @-$(RM) $(LIBCURL_IMPLIB)
-$(RM) *.obj @-$(RM) libcurl.tds
$(OBJDIR):
@-$(RMDIR) $(OBJDIR)
@-$(MKDIR) $(OBJDIR)
$(LIBCURL_LIB): $(OBJECTS) $(LIBCURL_LIB): $(OBJECTS)
@-$(RM) $@ @-$(RM) $(LIBCURL_LIB)
$(LIB) $(LIBFLAGS) $@ @&&! $(LIB) $(LIBFLAGS) $@ @&&!
+$(**: = &^ +$(**: = &^
+) +)
@@ -87,3 +119,5 @@ $(LIBCURL_DLL) $(LIBCURL_IMPLIB): $(OBJECTS) $(LINKLIB)
$(LD) $(LDFLAGS) -e$(LIBCURL_DLL) $** $(LD) $(LDFLAGS) -e$(LIBCURL_DLL) $**
$(IMPLIB) $(LIBCURL_IMPLIB) $(LIBCURL_DLL) $(IMPLIB) $(LIBCURL_IMPLIB) $(LIBCURL_DLL)
# End of Makefile.b32

View File

@@ -20,7 +20,8 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
strdup.c socks.c ssh.c nss.c qssl.c rawstr.c curl_addrinfo.c \ strdup.c socks.c ssh.c nss.c qssl.c rawstr.c curl_addrinfo.c \
socks_gssapi.c socks_sspi.c curl_sspi.c slist.c nonblock.c \ socks_gssapi.c socks_sspi.c curl_sspi.c slist.c nonblock.c \
curl_memrchr.c imap.c pop3.c smtp.c pingpong.c rtsp.c curl_threads.c \ curl_memrchr.c imap.c pop3.c smtp.c pingpong.c rtsp.c curl_threads.c \
warnless.c hmac.c polarssl.c curl_rtmp.c openldap.c curl_gethostname.c warnless.c hmac.c polarssl.c curl_rtmp.c openldap.c curl_gethostname.c\
gopher.c axtls.c idn_win32.c http_negotiate_sspi.c
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \ progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
@@ -34,5 +35,6 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h qssl.h hostip.h \
tftp.h sockaddr.h splay.h strdup.h setup_once.h socks.h ssh.h nssg.h \ tftp.h sockaddr.h splay.h strdup.h setup_once.h socks.h ssh.h nssg.h \
curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h \ curl_base64.h rawstr.h curl_addrinfo.h curl_sspi.h slist.h nonblock.h \
curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h curl_threads.h \ curl_memrchr.h imap.h pop3.h smtp.h pingpong.h rtsp.h curl_threads.h \
warnless.h curl_hmac.h polarssl.h curl_rtmp.h curl_gethostname.h warnless.h curl_hmac.h polarssl.h curl_rtmp.h curl_gethostname.h \
gopher.h axtls.h

View File

@@ -4,7 +4,7 @@
## and optionally OpenSSL (0.9.8), libssh2 (1.2), zlib (1.2.5) ## and optionally OpenSSL (0.9.8), libssh2 (1.2), zlib (1.2.5)
## ##
## Usage: ## Usage:
## mingw32-make -f Makefile.m32 [SSL=1] [SSH2=1] [ZLIB=1] [IDN=1] [SSPI=1] [IPV6=1] [LDAPS=1] [DYN=1] ## mingw32-make -f Makefile.m32 [SSL=1] [SSH2=1] [ZLIB=1] [IDN=1] [SSPI=1] [IPV6=1] [LDAPS=1] [RTMP=1] [DYN=1]
## ##
## Hint: you can also set environment vars to control the build, f.e.: ## Hint: you can also set environment vars to control the build, f.e.:
## set ZLIB_PATH=c:/zlib-1.2.5 ## set ZLIB_PATH=c:/zlib-1.2.5
@@ -20,16 +20,20 @@ ZLIB_PATH = ../../zlib-1.2.5
endif 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.8o OPENSSL_PATH = ../../openssl-0.9.8r
endif endif
# Edit the path below to point to the base of your LibSSH2 package. # Edit the path below to point to the base of your LibSSH2 package.
ifndef LIBSSH2_PATH ifndef LIBSSH2_PATH
LIBSSH2_PATH = ../../libssh2-1.2.6 LIBSSH2_PATH = ../../libssh2-1.2.7
endif endif
# Edit the path below to point to the base of your libidn package. # Edit the path below to point to the base of your libidn package.
ifndef LIBIDN_PATH ifndef LIBIDN_PATH
LIBIDN_PATH = ../../libidn-1.18 LIBIDN_PATH = ../../libidn-1.18
endif endif
# Edit the path below to point to the base of your librtmp package.
ifndef LIBRTMP_PATH
LIBRTMP_PATH = ../../librtmp-2.3
endif
# Edit the path below to point to the base of your Novell LDAP NDK. # Edit the path below to point to the base of your Novell LDAP NDK.
ifndef LDAP_SDK ifndef LDAP_SDK
LDAP_SDK = c:/novell/ndk/cldapsdk/win32 LDAP_SDK = c:/novell/ndk/cldapsdk/win32
@@ -47,7 +51,7 @@ LDFLAGS = -s
RANLIB = ranlib RANLIB = ranlib
RC = windres RC = windres
RCFLAGS = --include-dir=../include -DDEBUGBUILD=0 -O COFF -i RCFLAGS = --include-dir=../include -DDEBUGBUILD=0 -O COFF -i
RM = del /q /f > NUL 2>&1 RM = del /q /f 2>NUL
STRIP = strip -g STRIP = strip -g
######################################################## ########################################################
@@ -61,6 +65,11 @@ ifdef ARES
DLL_LIBS += -L$(LIBCARES_PATH) -lcares DLL_LIBS += -L$(LIBCARES_PATH) -lcares
libcurl_dll_DEPENDENCIES = $(LIBCARES_PATH)/libcares.a libcurl_dll_DEPENDENCIES = $(LIBCARES_PATH)/libcares.a
endif endif
ifdef RTMP
INCLUDES += -I"$(LIBRTMP_PATH)"
CFLAGS += -DUSE_LIBRTMP
DLL_LIBS += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
endif
ifdef SSH2 ifdef SSH2
INCLUDES += -I"$(LIBSSH2_PATH)/include" -I"$(LIBSSH2_PATH)/win32" INCLUDES += -I"$(LIBSSH2_PATH)/include" -I"$(LIBSSH2_PATH)/win32"
CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
@@ -148,7 +157,7 @@ $(libcurl_dll_LIBRARY): $(libcurl_a_OBJECTS) $(RESOURCE) $(libcurl_dll_DEPENDENC
clean: clean:
-$(RM) $(libcurl_a_OBJECTS) $(RESOURCE) -$(RM) $(libcurl_a_OBJECTS) $(RESOURCE)
distrib: clean distclean vclean: clean
-$(RM) $(libcurl_a_LIBRARY) $(libcurl_dll_LIBRARY) $(libcurl_dll_a_LIBRARY) -$(RM) $(libcurl_a_LIBRARY) $(libcurl_dll_LIBRARY) $(libcurl_dll_a_LIBRARY)
FORCE: ; FORCE: ;
@@ -156,4 +165,3 @@ FORCE: ;
$(LIBCARES_PATH)/libcares.a: $(LIBCARES_PATH)/libcares.a:
$(MAKE) -C $(LIBCARES_PATH) -f Makefile.m32 $(MAKE) -C $(LIBCARES_PATH) -f Makefile.m32

View File

@@ -19,12 +19,17 @@ 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.8o OPENSSL_PATH = ../../openssl-0.9.8r
endif endif
# Edit the path below to point to the base of your LibSSH2 package. # Edit the path below to point to the base of your LibSSH2 package.
ifndef LIBSSH2_PATH ifndef LIBSSH2_PATH
LIBSSH2_PATH = ../../libssh2-1.2.6 LIBSSH2_PATH = ../../libssh2-1.2.7
endif
# Edit the path below to point to the base of your axTLS package.
ifndef AXTLS_PATH
AXTLS_PATH = ../../axTLS-1.2.7
endif endif
# Edit the path below to point to the base of your libidn package. # Edit the path below to point to the base of your libidn package.
@@ -32,6 +37,11 @@ ifndef LIBIDN_PATH
LIBIDN_PATH = ../../libidn-1.18 LIBIDN_PATH = ../../libidn-1.18
endif endif
# Edit the path below to point to the base of your librtmp package.
ifndef LIBRTMP_PATH
LIBRTMP_PATH = ../../librtmp-2.3
endif
# Edit the path below to point to the base of your c-ares package. # Edit the path below to point to the base of your c-ares package.
ifndef LIBCARES_PATH ifndef LIBCARES_PATH
LIBCARES_PATH = ../ares LIBCARES_PATH = ../ares
@@ -84,14 +94,13 @@ else
CC = gcc CC = gcc
endif endif
PERL = perl PERL = perl
# a native win32 awk can be downloaded from here: # Here you can find a native Win32 binary of the original awk:
# http://www.gknw.net/development/prgtools/awk-20070501.zip # http://www.gknw.net/development/prgtools/awk-20070501.zip
AWK = awk AWK = awk
YACC = bison -y
CP = cp -afv CP = cp -afv
MKDIR = mkdir MKDIR = mkdir
# RM = rm -f # RM = rm -f
# if you want to mark the target as MTSAFE you will need a tool for # If you want to mark the target as MTSAFE you will need a tool for
# generating the xdc data for the linker; here's a minimal tool: # generating the xdc data for the linker; here's a minimal tool:
# http://www.gknw.net/development/prgtools/mkxdc.zip # http://www.gknw.net/development/prgtools/mkxdc.zip
MPKXDC = mkxdc MPKXDC = mkxdc
@@ -117,13 +126,13 @@ CFLAGS += -relax_pointers
#CFLAGS += -w on #CFLAGS += -w on
ifeq ($(LIBARCH),LIBC) ifeq ($(LIBARCH),LIBC)
ifeq ($(POSIXFL),1) ifeq ($(POSIXFL),1)
PRELUDE = $(SDK_LIBC)/imports/posixpre.o PRELUDE = $(NDK_LIBC)/imports/posixpre.o
else else
PRELUDE = $(SDK_LIBC)/imports/libcpre.o PRELUDE = $(NDK_LIBC)/imports/libcpre.o
endif endif
CFLAGS += -align 4 CFLAGS += -align 4
else else
# PRELUDE = $(SDK_CLIB)/imports/clibpre.o # PRELUDE = $(NDK_CLIB)/imports/clibpre.o
# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj" PRELUDE = "$(MWCW_PATH)/libraries/runtime/prelude.obj"
# CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h" # CFLAGS += -include "$(MWCW_PATH)/headers/nlm_clib_prefix.h"
@@ -136,16 +145,20 @@ AR = ar
ARFLAGS = -cq ARFLAGS = -cq
LIBEXT = a LIBEXT = a
RANLIB = ranlib RANLIB = ranlib
CFLAGS += -fno-builtin -fpcc-struct-return -fno-strict-aliasing CFLAGS += -m32
CFLAGS += -fno-builtin -fno-strict-aliasing
ifeq ($(findstring gcc,$(CC)),gcc)
CFLAGS += -fpcc-struct-return
endif
CFLAGS += -Wall # -pedantic CFLAGS += -Wall # -pedantic
ifeq ($(LIBARCH),LIBC) ifeq ($(LIBARCH),LIBC)
ifeq ($(POSIXFL),1) ifeq ($(POSIXFL),1)
PRELUDE = $(SDK_LIBC)/imports/posixpre.gcc.o PRELUDE = $(NDK_LIBC)/imports/posixpre.gcc.o
else else
PRELUDE = $(SDK_LIBC)/imports/libcpre.gcc.o PRELUDE = $(NDK_LIBC)/imports/libcpre.gcc.o
endif endif
else else
PRELUDE = $(SDK_CLIB)/imports/clibpre.gcc.o PRELUDE = $(NDK_CLIB)/imports/clibpre.gcc.o
# to avoid the __init_* / __deinit_* whoes dont use prelude from NDK # to avoid the __init_* / __deinit_* whoes dont use prelude from NDK
# http://www.gknw.net/development/mk_nlm/gcc_pre.zip # http://www.gknw.net/development/mk_nlm/gcc_pre.zip
# PRELUDE = $(NDK_ROOT)/pre/prelude.o # PRELUDE = $(NDK_ROOT)/pre/prelude.o
@@ -154,9 +167,15 @@ endif
endif endif
NDK_ROOT = $(NDKBASE)/ndk NDK_ROOT = $(NDKBASE)/ndk
SDK_CLIB = $(NDK_ROOT)/nwsdk ifndef NDK_CLIB
SDK_LIBC = $(NDK_ROOT)/libc NDK_CLIB = $(NDK_ROOT)/nwsdk
SDK_LDAP = $(NDK_ROOT)/cldapsdk/netware endif
ifndef NDK_LIBC
NDK_LIBC = $(NDK_ROOT)/libc
endif
ifndef NDK_LDAP
NDK_LDAP = $(NDK_ROOT)/cldapsdk/netware
endif
CURL_INC = ../include CURL_INC = ../include
CURL_LIB = ../lib CURL_LIB = ../lib
@@ -175,12 +194,27 @@ else
IMPORTS += @$(LIBSSH2_PATH)/nw/libssh2.imp IMPORTS += @$(LIBSSH2_PATH)/nw/libssh2.imp
endif endif
endif endif
ifdef WITH_RTMP
INCLUDES += -I$(LIBRTMP_PATH)
LDLIBS += $(LIBRTMP_PATH)/librtmp/librtmp.$(LIBEXT)
endif
ifdef WITH_SSL ifdef WITH_SSL
INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L) INCLUDES += -I$(OPENSSL_PATH)/outinc_nw_$(LIBARCH_L)
LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT) LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/ssl.$(LIBEXT)
LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT) LDLIBS += $(OPENSSL_PATH)/out_nw_$(LIBARCH_L)/crypto.$(LIBEXT)
IMPORTS += GetProcessSwitchCount RunningProcess IMPORTS += GetProcessSwitchCount RunningProcess
INSTDEP += ca-bundle.crt INSTDEP += ca-bundle.crt
else
ifdef WITH_AXTLS
INCLUDES += -I$(AXTLS_PATH)/inc
ifdef LINK_STATIC
LDLIBS += $(AXTLS_PATH)/lib/libaxtls.$(LIBEXT)
else
MODULES += libaxtls.nlm
IMPORTS += $(AXTLS_PATH)/lib/libaxtls.imp
endif
INSTDEP += ca-bundle.crt
endif
endif endif
ifdef WITH_ZLIB ifdef WITH_ZLIB
INCLUDES += -I$(ZLIB_PATH) INCLUDES += -I$(ZLIB_PATH)
@@ -197,17 +231,17 @@ ifdef WITH_IDN
endif endif
ifeq ($(LIBARCH),LIBC) ifeq ($(LIBARCH),LIBC)
INCLUDES += -I$(SDK_LIBC)/include INCLUDES += -I$(NDK_LIBC)/include
# INCLUDES += -I$(SDK_LIBC)/include/nks # INCLUDES += -I$(NDK_LIBC)/include/nks
# INCLUDES += -I$(SDK_LIBC)/include/winsock # INCLUDES += -I$(NDK_LIBC)/include/winsock
CFLAGS += -D_POSIX_SOURCE CFLAGS += -D_POSIX_SOURCE
else else
INCLUDES += -I$(SDK_CLIB)/include/nlm INCLUDES += -I$(NDK_CLIB)/include/nlm
# INCLUDES += -I$(SDK_CLIB)/include/nlm/obsolete # INCLUDES += -I$(NDK_CLIB)/include/nlm/obsolete
# INCLUDES += -I$(SDK_CLIB)/include # INCLUDES += -I$(NDK_CLIB)/include
endif endif
ifndef DISABLE_LDAP ifndef DISABLE_LDAP
INCLUDES += -I$(SDK_LDAP)/$(LIBARCH_L)/inc INCLUDES += -I$(NDK_LDAP)/$(LIBARCH_L)/inc
endif endif
CFLAGS += $(INCLUDES) CFLAGS += $(INCLUDES)
@@ -269,7 +303,7 @@ clean:
-$(RM) curl_config.h -$(RM) curl_config.h
-$(RM) -r $(OBJDIR) -$(RM) -r $(OBJDIR)
distclean: clean distclean vclean: clean
-$(RM) $(TARGET).$(LIBEXT) $(TARGET).nlm -$(RM) $(TARGET).$(LIBEXT) $(TARGET).nlm
-$(RM) certdata.txt ca-bundle.crt -$(RM) certdata.txt ca-bundle.crt
@@ -323,15 +357,15 @@ endif
ifeq ($(LIBARCH),CLIB) ifeq ($(LIBARCH),CLIB)
@echo $(DL)start _Prelude$(DL) >> $@ @echo $(DL)start _Prelude$(DL) >> $@
@echo $(DL)exit _Stop$(DL) >> $@ @echo $(DL)exit _Stop$(DL) >> $@
@echo $(DL)import @$(SDK_CLIB)/imports/clib.imp$(DL) >> $@ @echo $(DL)import @$(NDK_CLIB)/imports/clib.imp$(DL) >> $@
@echo $(DL)import @$(SDK_CLIB)/imports/threads.imp$(DL) >> $@ @echo $(DL)import @$(NDK_CLIB)/imports/threads.imp$(DL) >> $@
@echo $(DL)import @$(SDK_CLIB)/imports/nlmlib.imp$(DL) >> $@ @echo $(DL)import @$(NDK_CLIB)/imports/nlmlib.imp$(DL) >> $@
@echo $(DL)import @$(SDK_CLIB)/imports/socklib.imp$(DL) >> $@ @echo $(DL)import @$(NDK_CLIB)/imports/socklib.imp$(DL) >> $@
@echo $(DL)module clib$(DL) >> $@ @echo $(DL)module clib$(DL) >> $@
ifndef DISABLE_LDAP ifndef DISABLE_LDAP
@echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapsdk.imp$(DL) >> $@ @echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapsdk.imp$(DL) >> $@
@echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapssl.imp$(DL) >> $@ @echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapssl.imp$(DL) >> $@
# @echo $(DL)import @$(SDK_LDAP)/clib/imports/ldapx.imp$(DL) >> $@ # @echo $(DL)import @$(NDK_LDAP)/clib/imports/ldapx.imp$(DL) >> $@
@echo $(DL)module ldapsdk ldapssl$(DL) >> $@ @echo $(DL)module ldapsdk ldapssl$(DL) >> $@
endif endif
else else
@@ -348,13 +382,13 @@ else
@echo $(DL)exit _LibCPostlude$(DL) >> $@ @echo $(DL)exit _LibCPostlude$(DL) >> $@
@echo $(DL)check _LibCCheckUnload$(DL) >> $@ @echo $(DL)check _LibCCheckUnload$(DL) >> $@
endif endif
@echo $(DL)import @$(SDK_LIBC)/imports/libc.imp$(DL) >> $@ @echo $(DL)import @$(NDK_LIBC)/imports/libc.imp$(DL) >> $@
@echo $(DL)import @$(SDK_LIBC)/imports/netware.imp$(DL) >> $@ @echo $(DL)import @$(NDK_LIBC)/imports/netware.imp$(DL) >> $@
@echo $(DL)module libc$(DL) >> $@ @echo $(DL)module libc$(DL) >> $@
ifndef DISABLE_LDAP ifndef DISABLE_LDAP
@echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapsdk.imp$(DL) >> $@ @echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapsdk.imp$(DL) >> $@
@echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapssl.imp$(DL) >> $@ @echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapssl.imp$(DL) >> $@
# @echo $(DL)import @$(SDK_LDAP)/libc/imports/lldapx.imp$(DL) >> $@ # @echo $(DL)import @$(NDK_LDAP)/libc/imports/lldapx.imp$(DL) >> $@
@echo $(DL)module lldapsdk lldapssl$(DL) >> $@ @echo $(DL)module lldapsdk lldapssl$(DL) >> $@
endif endif
endif endif
@@ -410,6 +444,7 @@ ifeq ($(LIBARCH),CLIB)
@echo $(DL)#define SEND_TYPE_ARG3 int$(DL) >> $@ @echo $(DL)#define SEND_TYPE_ARG3 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@ @echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@ @echo $(DL)#define SEND_TYPE_RETV int$(DL) >> $@
@echo $(DL)#define SIZEOF_SIZE_T 4$(DL) >> $@
@echo $(DL)#define pressanykey PressAnyKeyToContinue$(DL) >> $@ @echo $(DL)#define pressanykey PressAnyKeyToContinue$(DL) >> $@
else else
@echo $(DL)#define OS "i586-pc-libc-NetWare"$(DL) >> $@ @echo $(DL)#define OS "i586-pc-libc-NetWare"$(DL) >> $@
@@ -425,13 +460,6 @@ else
@echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@ @echo $(DL)#define HAVE_SYS_PARAM_H 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@ @echo $(DL)#define HAVE_SYS_SELECT_H 1$(DL) >> $@
@echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@ @echo $(DL)#define HAVE_TERMIOS_H 1$(DL) >> $@
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_FREEADDRINFO 1$(DL) >> $@
@echo $(DL)#define HAVE_GETADDRINFO 1$(DL) >> $@
@echo $(DL)#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@ @echo $(DL)#define RECV_TYPE_ARG1 int$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG2 void *$(DL) >> $@ @echo $(DL)#define RECV_TYPE_ARG2 void *$(DL) >> $@
@echo $(DL)#define RECV_TYPE_ARG3 size_t$(DL) >> $@ @echo $(DL)#define RECV_TYPE_ARG3 size_t$(DL) >> $@
@@ -451,11 +479,20 @@ else
@echo $(DL)#define SEND_TYPE_ARG3 size_t$(DL) >> $@ @echo $(DL)#define SEND_TYPE_ARG3 size_t$(DL) >> $@
@echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@ @echo $(DL)#define SEND_TYPE_ARG4 int$(DL) >> $@
@echo $(DL)#define SEND_TYPE_RETV ssize_t$(DL) >> $@ @echo $(DL)#define SEND_TYPE_RETV ssize_t$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
@echo $(DL)#define SIZEOF_OFF_T 8$(DL) >> $@ @echo $(DL)#define SIZEOF_OFF_T 8$(DL) >> $@
@echo $(DL)#define SIZEOF_SIZE_T 8$(DL) >> $@
@echo $(DL)#define _LARGEFILE 1$(DL) >> $@ @echo $(DL)#define _LARGEFILE 1$(DL) >> $@
ifdef ENABLE_IPV6 ifdef ENABLE_IPV6
@echo $(DL)#define ENABLE_IPV6 1$(DL) >> $@ @echo $(DL)#define ENABLE_IPV6 1$(DL) >> $@
@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_PF_INET6 1$(DL) >> $@
@echo $(DL)#define HAVE_FREEADDRINFO 1$(DL) >> $@
@echo $(DL)#define HAVE_GETADDRINFO 1$(DL) >> $@
@echo $(DL)#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_SOCKADDR_IN6 1$(DL) >> $@
@echo $(DL)#define SIZEOF_STRUCT_IN6_ADDR 16$(DL) >> $@
endif endif
endif endif
@echo $(DL)#define USE_MANUAL 1$(DL) >> $@ @echo $(DL)#define USE_MANUAL 1$(DL) >> $@
@@ -491,7 +528,6 @@ endif
@echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@ @echo $(DL)#define HAVE_STRFTIME 1$(DL) >> $@
@echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@ @echo $(DL)#define HAVE_STRING_H 1$(DL) >> $@
@echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@ @echo $(DL)#define HAVE_STRSTR 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_ADDRINFO 1$(DL) >> $@
@echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@ @echo $(DL)#define HAVE_STRUCT_TIMEVAL 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_IOCTL_H 1$(DL) >> $@ @echo $(DL)#define HAVE_SYS_IOCTL_H 1$(DL) >> $@
@echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@ @echo $(DL)#define HAVE_SYS_STAT_H 1$(DL) >> $@
@@ -547,6 +583,10 @@ ifdef WITH_SSL
@echo $(DL)#define HAVE_LIBSSL 1$(DL) >> $@ @echo $(DL)#define HAVE_LIBSSL 1$(DL) >> $@
@echo $(DL)#define HAVE_LIBCRYPTO 1$(DL) >> $@ @echo $(DL)#define HAVE_LIBCRYPTO 1$(DL) >> $@
@echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@ @echo $(DL)#define OPENSSL_NO_KRB5 1$(DL) >> $@
else
ifdef WITH_AXTLS
@echo $(DL)#define USE_AXTLS 1$(DL) >> $@
endif
endif endif
ifdef WITH_SSH2 ifdef WITH_SSH2
@echo $(DL)#define USE_LIBSSH2 1$(DL) >> $@ @echo $(DL)#define USE_LIBSSH2 1$(DL) >> $@
@@ -555,6 +595,9 @@ endif
ifdef WITH_IDN ifdef WITH_IDN
@echo $(DL)#define HAVE_LIBIDN 1$(DL) >> $@ @echo $(DL)#define HAVE_LIBIDN 1$(DL) >> $@
@echo $(DL)#define HAVE_TLD_H 1$(DL) >> $@ @echo $(DL)#define HAVE_TLD_H 1$(DL) >> $@
endif
ifdef WITH_RTMP
@echo $(DL)#define USE_LIBRTMP 1$(DL) >> $@
endif endif
@echo $(DL)#ifdef __GNUC__$(DL) >> $@ @echo $(DL)#ifdef __GNUC__$(DL) >> $@
@echo $(DL)#define HAVE_VARIADIC_MACROS_GCC 1$(DL) >> $@ @echo $(DL)#define HAVE_VARIADIC_MACROS_GCC 1$(DL) >> $@

View File

@@ -1,229 +0,0 @@
# Makefile for project libcurl
# Project objects:
objs = o.base64 o.connect o.cookie o.dict \
o.dllinit o.easy o.escape o.file \
o.formdata o.ftp o.getenv \
o.getinfo o.getpass o.hostip \
o.hostip4 o.hostsyn o.http \
o.http_chunks o.inet_ntop o.inet_pton o.if2ip o.krb4 o.ldap \
o.curl_fnmatch o.fileinfo o.ftplistparser o.wildcard \
o.memdebug o.mprintf o.netrc o.parsedate o.progress \
o.security o.select o.sendf o.speedcheck o.ssluse \
o.strequal o.strtok o.telnet o.timeval \
o.transfer o.url o.version o.strtoofft o.sslgen o.gtls \
o.rawstr o.curl_addrinfo o.slist o.nonblock o.curl_rand \
o.curl_memrchr o.imap o.pop3 o.smtp o.pingpong o.rtsp \
o.curl_threads o.warnless o.hmac o.md5 o.curl_rtmp \
o.openldap o.polarssl o.md4 o.curl_gethostname
# Compile options:
linkopts = -o libcurl
compileropts = -mpoke-function-name -IUtilLib: -mthrowback
# Project target:
libcurl: $(objs)
makealf $(linkopts) $(objs)
# Static dependancies:
o.base64: c.base64
gcc $(compileropts) -c -o base64.o c.base64
o.connect: c.connect
gcc $(compileropts) -c -o connect.o c.connect
o.cookie: c.cookie
gcc $(compileropts) -c -o cookie.o c.cookie
o.curl_addrinfo: c.curl_addrinfo
gcc $(compileropts) -c -o curl_addrinfo.o c.curl_addrinfo
o.curl_gethostname: c.curl_gethostname
gcc $(compileropts) -c -o curl_gethostname.o c.curl_gethostname
o.curl_memrchr: c.curl_memrchr
gcc $(compileropts) -c -o curl_memrchr.o c.curl_memrchr
o.curl_rand: c.curl_rand
gcc $(compileropts) -c -o curl_rand.o c.curl_rand
o.curl_rtmp: c.curl_rtmp
gcc $(compileropts) -c -o curl_rtmp.o c.curl_rtmp
o.curl_threads: c.curl_threads
gcc $(compileropts) -c -o curl_threads.o c.curl_threads
o.dict: c.dict
gcc $(compileropts) -c -o dict.o c.dict
o.dllinit: c.dllinit
gcc $(compileropts) -c -o dllinit.o c.dllinit
o.easy: c.easy
gcc $(compileropts) -c -o easy.o c.easy
o.escape: c.escape
gcc $(compileropts) -c -o escape.o c.escape
o.file: c.file
gcc $(compileropts) -c -o file.o c.file
o.formdata: c.formdata
gcc $(compileropts) -c -o formdata.o c.formdata
o.ftp: c.ftp
gcc $(compileropts) -c -o ftp.o c.ftp
o.getenv: c.getenv
gcc $(compileropts) -c -o getenv.o c.getenv
o.getinfo: c.getinfo
gcc $(compileropts) -c -o getinfo.o c.getinfo
o.getpass: c.getpass
gcc $(compileropts) -c -o getpass.o c.getpass
o.hmac: c.hmac
gcc $(compileropts) -c -o hmac.o c.hmac
o.hostip: c.hostip
gcc $(compileropts) -c -o hostip.o c.hostip
o.hostip4: c.hostip4
gcc $(compileropts) -c -o hostip4.o c.hostip4
o.hostsyn: c.hostsyn
gcc $(compileropts) -c -o hostsyn.o c.hostsyn
o.http: c.http
gcc $(compileropts) -c -o http.o c.http
o.http_chunks: c.http_chunks
gcc $(compileropts) -c -o http_chunks.o c.http_chunks
o.if2ip: c.if2ip
gcc $(compileropts) -c -o if2ip.o c.if2ip
o.imap: c.imap
gcc $(compileropts) -c -o imap.o c.imap
o.inet_ntop: c.inet_ntop
gcc $(compileropts) -c -o inet_ntop.o c.inet_ntop
o.inet_pton: c.inet_pton
gcc $(compileropts) -c -o inet_pton.o c.inet_pton
o.krb4: c.krb4
gcc $(compileropts) -c -o krb4.o c.krb4
o.ldap: c.ldap
gcc $(compileropts) -IOpenLDAP: -c -o ldap.o c.ldap
o.md4: c.md4
gcc $(compileropts) -c -o md4.o c.md4
o.md5: c.md5
gcc $(compileropts) -c -o md5.o c.md5
o.memdebug: c.memdebug
gcc $(compileropts) -c -o memdebug.o c.memdebug
o.mprintf: c.mprintf
gcc $(compileropts) -c -o mprintf.o c.mprintf
o.netrc: c.netrc
gcc $(compileropts) -c -o netrc.o c.netrc
o.openldap: c.openldap
gcc $(compileropts) -c -o openldap.o c.openldap
o.parsedate: c.parsedate
gcc $(compileropts) -c -o parsedate.o c.parsedate
o.pingpong: c.pingpong
gcc $(compileropts) -c -o pingpong.o c.pingpong
o.polarssl: c.polarssl
gcc $(compileropts) -c -o polarssl.o c.polarssl
o.pop3: c.pop3
gcc $(compileropts) -c -o pop3.o c.pop3
o.progress: c.progress
gcc $(compileropts) -c -o progress.o c.progress
o.rtsp: c.rtsp
gcc $(compileropts) -c -o rtsp.o c.rtsp
o.security: c.security
gcc $(compileropts) -c -o security.o c.security
o.select: c.select
gcc $(compileropts) -c -o select.o c.select
o.sendf: c.sendf
gcc $(compileropts) -c -o sendf.o c.sendf
o.slist: c.slist
gcc $(compileropts) -c -o slist.o c.slist
o.smtp: c.smtp
gcc $(compileropts) -c -o smtp.o c.smtp
o.speedcheck: c.speedcheck
gcc $(compileropts) -c -o speedcheck.o c.speedcheck
o.gtls: c.gtls
gcc $(compileropts) -c -o gtls.o c.gtls
o.sslgen: c.sslgen
gcc $(compileropts) -c -o sslgen.o c.sslgen
o.ssluse: c.ssluse
gcc $(compileropts) -c -o ssluse.o c.ssluse
o.nonblock: c.nonblock
gcc $(compileropts) -c -o nonblock.o c.nonblock
o.rawstr: c.rawstr
gcc $(compileropts) -c -o rawstr.o c.rawstr
o.strequal: c.strequal
gcc $(compileropts) -c -o strequal.o c.strequal
o.strtok: c.strtok
gcc $(compileropts) -c -o strtok.o c.strtok
o.strtoofft: c.strtoofft
gcc $(compileropts) -c -o strtoofft.o c.strtoofft
o.telnet: c.telnet
gcc $(compileropts) -c -o telnet.o c.telnet
o.timeval: c.timeval
gcc $(compileropts) -c -o timeval.o c.timeval
o.transfer: c.transfer
gcc $(compileropts) -c -o transfer.o c.transfer
o.url: c.url
gcc $(compileropts) -c -o url.o c.url
o.version: c.version
gcc $(compileropts) -c -o version.o c.version
o.warnless: c.warnless
gcc $(compileropts) -c -o warnless.o c.warnless
o.curl_fnmatch: c.curl_fnmatch
gcc $(compileropts) -c -o curl_fnmatch.o c.curl_fnmatch
o.fileinfo: c.fileinfo
gcc $(compileropts) -c -o fileinfo.o c.fileinfo
o.ftplistparser: c.ftplistparser
gcc $(compileropts) -c -o ftplistparser.o c.ftplistparser
o.wildcard: c.wildcard
gcc $(compileropts) -c -o wildcard.o c.wildcard

View File

@@ -18,6 +18,8 @@
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied. # KIND, either express or implied.
# #
#***************************************************************************
########################################################################### ###########################################################################
# #
# Makefile for building libcurl with MSVC6 # Makefile for building libcurl with MSVC6
@@ -41,20 +43,27 @@
# #
############################################################## ##############################################################
# # ----------------------------------------------
# Stem for static libs and DLLs # Verify that current subdir is libcurl's 'lib'
# # ----------------------------------------------
LIB_NAME = libcurl
LIB_NAME_DEBUG = libcurld !IF ! EXIST(.\curl_addrinfo.c)
! MESSAGE Can not process this makefile from outside of libcurl's 'lib' subdirectory.
! MESSAGE Change to libcurl's 'lib' subdirectory, and try again.
! ERROR See previous message.
!ENDIF
# ------------------------------------------------
# Makefile.msvc.names provides libcurl file names
# ------------------------------------------------
!INCLUDE ..\Makefile.msvc.names
#
# Stem for DLL import libs
#
IMPLIB_NAME = libcurl_imp
IMPLIB_NAME_DEBUG = libcurld_imp
!IFNDEF OPENSSL_PATH !IFNDEF OPENSSL_PATH
OPENSSL_PATH = ../../openssl-0.9.8o OPENSSL_PATH = ../../openssl-0.9.8r
!ENDIF !ENDIF
!IFNDEF ZLIB_PATH !IFNDEF ZLIB_PATH
@@ -81,7 +90,7 @@ MACHINE = X86
!IFDEF WINDOWS_SSPI !IFDEF WINDOWS_SSPI
!IFNDEF WINDOWS_SDK_PATH !IFNDEF WINDOWS_SDK_PATH
WINDOWS_SDK_PATH = "C:\Program Files\Microsoft SDK" WINDOWS_SDK_PATH = "$(PROGRAMFILES)\Microsoft SDK"
!ENDIF !ENDIF
!ENDIF !ENDIF
@@ -129,42 +138,18 @@ RTLIBD = /MTd
# release # release
!IF "$(CFG)" == "release" !IF "$(CFG)" == "release"
TARGET = $(LIB_NAME).lib TARGET = $(LIBCURL_STA_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB) CC = $(CCNODBG) $(RTLIB) $(CFLAGSLIB)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
######################
# release-zlib
!IF "$(CFG)" == "release-zlib"
TARGET = $(LIB_NAME).lib
DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
CFGSET = TRUE
!ENDIF
######################
# release-dll
!IF "$(CFG)" == "release-dll"
TARGET = $(LIB_NAME).dll
DIROBJ = $(CFG)
LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib
CC = $(CCNODBG) $(RTLIB)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
###################### ######################
# release-ssl # release-ssl
!IF "$(CFG)" == "release-ssl" !IF "$(CFG)" == "release-ssl"
TARGET = $(LIB_NAME).lib TARGET = $(LIBCURL_STA_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
@@ -173,14 +158,14 @@ CFGSET = TRUE
!ENDIF !ENDIF
###################### ######################
# release-ssl-dll # release-zlib
!IF "$(CFG)" == "release-ssl-dll" !IF "$(CFG)" == "release-zlib"
TARGET = $(LIB_NAME).lib TARGET = $(LIBCURL_STA_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB) CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) $(CFLAGSLIB)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
@@ -188,7 +173,7 @@ CFGSET = TRUE
# release-ssl-zlib # release-ssl-zlib
!IF "$(CFG)" == "release-ssl-zlib" !IF "$(CFG)" == "release-ssl-zlib"
TARGET = $(LIB_NAME).lib TARGET = $(LIBCURL_STA_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
@@ -198,23 +183,22 @@ CFGSET = TRUE
!ENDIF !ENDIF
###################### ######################
# release-dll-ssl-dll # release-ssl-dll
!IF "$(CFG)" == "release-dll-ssl-dll" !IF "$(CFG)" == "release-ssl-dll"
TARGET = $(LIB_NAME).dll TARGET = $(LIBCURL_STA_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSLIB)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF !ENDIF
###################### ######################
# release-zlib-dll # release-zlib-dll
!IF "$(CFG)" == "release-zlib-dll" !IF "$(CFG)" == "release-zlib-dll"
TARGET = $(LIB_NAME).lib TARGET = $(LIBCURL_STA_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
@@ -226,7 +210,7 @@ CFGSET = TRUE
# release-ssl-dll-zlib-dll # release-ssl-dll-zlib-dll
!IF "$(CFG)" == "release-ssl-dll-zlib-dll" !IF "$(CFG)" == "release-ssl-dll-zlib-dll"
TARGET = $(LIB_NAME).lib TARGET = $(LIBCURL_STA_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
@@ -235,14 +219,39 @@ CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
######################
# release-dll
!IF "$(CFG)" == "release-dll"
TARGET = $(LIBCURL_DYN_LIB_REL)
DIROBJ = $(CFG)
LNK = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
CC = $(CCNODBG) $(RTLIB)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
######################
# release-dll-ssl-dll
!IF "$(CFG)" == "release-dll-ssl-dll"
TARGET = $(LIBCURL_DYN_LIB_REL)
DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL)
CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res
!ENDIF
###################### ######################
# release-dll-zlib-dll # release-dll-zlib-dll
!IF "$(CFG)" == "release-dll-zlib-dll" !IF "$(CFG)" == "release-dll-zlib-dll"
TARGET = $(LIB_NAME).dll TARGET = $(LIBCURL_DYN_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB) CC = $(CCNODBG) $(RTLIB) $(CFLAGSZLIB)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
@@ -252,11 +261,11 @@ RESOURCE = $(DIROBJ)\libcurl.res
# release-dll-ssl-dll-zlib-dll # release-dll-ssl-dll-zlib-dll
!IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll" !IF "$(CFG)" == "release-dll-ssl-dll-zlib-dll"
TARGET = $(LIB_NAME).dll TARGET = $(LIBCURL_DYN_LIB_REL)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_REL)
CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB) CC = $(CCNODBG) $(RTLIB) $(CFLAGSSSL) $(CFLAGSZLIB)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
@@ -266,7 +275,7 @@ RESOURCE = $(DIROBJ)\libcurl.res
# debug # debug
!IF "$(CFG)" == "debug" !IF "$(CFG)" == "debug"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIBCURL_STA_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET) LNK = $(LNKLIB) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB) CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSLIB)
@@ -277,7 +286,7 @@ CFGSET = TRUE
# debug-ssl # debug-ssl
!IF "$(CFG)" == "debug-ssl" !IF "$(CFG)" == "debug-ssl"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIBCURL_STA_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
@@ -289,7 +298,7 @@ CFGSET = TRUE
# debug-zlib # debug-zlib
!IF "$(CFG)" == "debug-zlib" !IF "$(CFG)" == "debug-zlib"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIBCURL_STA_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) LNK = $(LNKLIB) $(ZLIBLIBS) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
@@ -297,23 +306,11 @@ CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) $(CFLAGSLIB)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
######################
# debug-ssl-dll
!IF "$(CFG)" == "debug-ssl-dll"
TARGET = $(LIB_NAME_DEBUG).lib
DIROBJ = $(CFG)
LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
CFGSET = TRUE
!ENDIF
###################### ######################
# debug-ssl-zlib # debug-ssl-zlib
!IF "$(CFG)" == "debug-ssl-zlib" !IF "$(CFG)" == "debug-ssl-zlib"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIBCURL_STA_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32"
@@ -322,11 +319,23 @@ CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) $(CFLAGSLIB)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
######################
# debug-ssl-dll
!IF "$(CFG)" == "debug-ssl-dll"
TARGET = $(LIBCURL_STA_LIB_DBG)
DIROBJ = $(CFG)
LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)\out32dll
LNK = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET)
CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSLIB)
CFGSET = TRUE
!ENDIF
###################### ######################
# debug-zlib-dll # debug-zlib-dll
!IF "$(CFG)" == "debug-zlib-dll" !IF "$(CFG)" == "debug-zlib-dll"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIBCURL_STA_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET) LNK = $(LNKLIB) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /out:$(DIROBJ)\$(TARGET)
@@ -338,7 +347,7 @@ CFGSET = TRUE
# debug-ssl-dll-zlib-dll # debug-ssl-dll-zlib-dll
!IF "$(CFG)" == "debug-ssl-dll-zlib-dll" !IF "$(CFG)" == "debug-ssl-dll-zlib-dll"
TARGET = $(LIB_NAME_DEBUG).lib TARGET = $(LIBCURL_STA_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
@@ -351,9 +360,9 @@ CFGSET = TRUE
# debug-dll # debug-dll
!IF "$(CFG)" == "debug-dll" !IF "$(CFG)" == "debug-dll"
TARGET = $(LIB_NAME_DEBUG).dll TARGET = $(LIBCURL_DYN_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
CC = $(CCDEBUG) $(RTLIBD) CC = $(CCDEBUG) $(RTLIBD)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
@@ -363,10 +372,10 @@ RESOURCE = $(DIROBJ)\libcurl.res
# debug-dll-ssl-dll # debug-dll-ssl-dll
!IF "$(CFG)" == "debug-dll-ssl-dll" !IF "$(CFG)" == "debug-dll-ssl-dll"
TARGET = $(LIB_NAME_DEBUG).dll TARGET = $(LIBCURL_DYN_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
@@ -376,10 +385,10 @@ RESOURCE = $(DIROBJ)\libcurl.res
# debug-dll-zlib-dll # debug-dll-zlib-dll
!IF "$(CFG)" == "debug-dll-zlib-dll" !IF "$(CFG)" == "debug-dll-zlib-dll"
TARGET = $(LIB_NAME_DEBUG).dll TARGET = $(LIBCURL_DYN_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb LNK = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB) CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSZLIB)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
@@ -389,11 +398,11 @@ RESOURCE = $(DIROBJ)\libcurl.res
# debug-dll-ssl-dll-zlib-dll # debug-dll-ssl-dll-zlib-dll
!IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll" !IF "$(CFG)" == "debug-dll-ssl-dll-zlib-dll"
TARGET = $(LIB_NAME_DEBUG).dll TARGET = $(LIBCURL_DYN_LIB_DBG)
DIROBJ = $(CFG) DIROBJ = $(CFG)
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll"
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) /PDB:$(DIROBJ)\$(LIBCURL_DYN_LIB_PDB)
CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB) CC = $(CCDEBUG) $(RTLIBD) $(CFLAGSSSL) $(CFLAGSZLIB)
CFGSET = TRUE CFGSET = TRUE
RESOURCE = $(DIROBJ)\libcurl.res RESOURCE = $(DIROBJ)\libcurl.res
@@ -471,6 +480,7 @@ X_OBJS= \
$(DIROBJ)\getenv.obj \ $(DIROBJ)\getenv.obj \
$(DIROBJ)\getinfo.obj \ $(DIROBJ)\getinfo.obj \
$(DIROBJ)\gtls.obj \ $(DIROBJ)\gtls.obj \
$(DIROBJ)\gopher.obj \
$(DIROBJ)\hash.obj \ $(DIROBJ)\hash.obj \
$(DIROBJ)\hmac.obj \ $(DIROBJ)\hmac.obj \
$(DIROBJ)\hostares.obj \ $(DIROBJ)\hostares.obj \
@@ -497,7 +507,7 @@ X_OBJS= \
$(DIROBJ)\mprintf.obj \ $(DIROBJ)\mprintf.obj \
$(DIROBJ)\multi.obj \ $(DIROBJ)\multi.obj \
$(DIROBJ)\netrc.obj \ $(DIROBJ)\netrc.obj \
$(DIROBJ)\nonblock.obj \ $(DIROBJ)\nonblock.obj \
$(DIROBJ)\openldap.obj \ $(DIROBJ)\openldap.obj \
$(DIROBJ)\parsedate.obj \ $(DIROBJ)\parsedate.obj \
$(DIROBJ)\pingpong.obj \ $(DIROBJ)\pingpong.obj \
@@ -537,14 +547,14 @@ all : $(TARGET)
$(TARGET): $(X_OBJS) $(TARGET): $(X_OBJS)
$(LNK) $(LFLAGS) $(X_OBJS) $(LNK) $(LFLAGS) $(X_OBJS)
-xcopy $(DIROBJ)\$(LIB_NAME).dll . /y -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_REL) . /y
-xcopy $(DIROBJ)\$(LIB_NAME).lib . /y -xcopy $(DIROBJ)\$(LIBCURL_STA_LIB_DBG) . /y
-xcopy $(DIROBJ)\$(LIB_NAME_DEBUG).dll . /y -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_REL) . /y
-xcopy $(DIROBJ)\$(LIB_NAME_DEBUG).lib . /y -xcopy $(DIROBJ)\$(LIBCURL_DYN_LIB_DBG) . /y
-xcopy $(DIROBJ)\$(IMPLIB_NAME).lib . /y -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_REL) . /y
-xcopy $(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib . /y -xcopy $(DIROBJ)\$(LIBCURL_IMP_LIB_DBG) . /y
-xcopy $(DIROBJ)\*.exp . /y -xcopy $(DIROBJ)\*.exp . /y
-xcopy $(DIROBJ)\*.pdb . /y -xcopy $(DIROBJ)\*.pdb . /y
$(X_OBJS): $(DIROBJ) $(X_OBJS): $(DIROBJ)

View File

@@ -11,7 +11,7 @@ c-ares:
http://c-ares.haxx.se/ http://c-ares.haxx.se/
NOTE NOTE
The latest libcurl version requires c-ares 1.4.0 or later. The latest libcurl version requires c-ares 1.6.0 or later.
Once upon the time libcurl built fine with the "original" ares. That is no Once upon the time libcurl built fine with the "original" ares. That is no
longer true. You need to use c-ares. longer true. You need to use c-ares.

500
lib/axtls.c Normal file
View File

@@ -0,0 +1,500 @@
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010, DirecTV
* contact: Eric Hu <ehu@directv.com>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://curl.haxx.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
***************************************************************************/
/*
* Source file for all axTLS-specific code for the TLS/SSL layer. No code
* but sslgen.c should ever call or use these functions.
*/
#include "setup.h"
#ifdef USE_AXTLS
#include <axTLS/ssl.h>
#include "axtls.h"
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#include "sendf.h"
#include "inet_pton.h"
#include "sslgen.h"
#include "parsedate.h"
#include "connect.h" /* for the connect timeout */
#include "select.h"
#define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h>
#include "curl_memory.h"
/* The last #include file should be: */
#include "memdebug.h"
/* SSL_read is opied from axTLS compat layer */
static int SSL_read(SSL *ssl, void *buf, int num)
{
uint8_t *read_buf;
int ret;
while((ret = ssl_read(ssl, &read_buf)) == SSL_OK);
if(ret > SSL_OK){
memcpy(buf, read_buf, ret > num ? num : ret);
}
return ret;
}
/* Global axTLS init, called from Curl_ssl_init() */
int Curl_axtls_init(void)
{
/* axTLS has no global init. Everything is done through SSL and SSL_CTX
* structs stored in connectdata structure. Perhaps can move to axtls.h.
*/
return 1;
}
int Curl_axtls_cleanup(void)
{
/* axTLS has no global cleanup. Perhaps can move this to axtls.h. */
return 1;
}
static CURLcode map_error_to_curl(int axtls_err)
{
switch (axtls_err)
{
case SSL_ERROR_NOT_SUPPORTED:
case SSL_ERROR_INVALID_VERSION:
case -70: /* protocol version alert from server */
return CURLE_UNSUPPORTED_PROTOCOL;
break;
case SSL_ERROR_NO_CIPHER:
return CURLE_SSL_CIPHER;
break;
case SSL_ERROR_BAD_CERTIFICATE: /* this may be bad server cert too */
case SSL_ERROR_NO_CERT_DEFINED:
case -42: /* bad certificate alert from server */
case -43: /* unsupported cert alert from server */
case -44: /* cert revoked alert from server */
case -45: /* cert expired alert from server */
case -46: /* cert unknown alert from server */
return CURLE_SSL_CERTPROBLEM;
break;
case SSL_X509_ERROR(X509_NOT_OK):
case SSL_X509_ERROR(X509_VFY_ERROR_NO_TRUSTED_CERT):
case SSL_X509_ERROR(X509_VFY_ERROR_BAD_SIGNATURE):
case SSL_X509_ERROR(X509_VFY_ERROR_NOT_YET_VALID):
case SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED):
case SSL_X509_ERROR(X509_VFY_ERROR_SELF_SIGNED):
case SSL_X509_ERROR(X509_VFY_ERROR_INVALID_CHAIN):
case SSL_X509_ERROR(X509_VFY_ERROR_UNSUPPORTED_DIGEST):
case SSL_X509_ERROR(X509_INVALID_PRIV_KEY):
return CURLE_PEER_FAILED_VERIFICATION;
break;
case -48: /* unknown ca alert from server */
return CURLE_SSL_CACERT;
break;
case -49: /* access denied alert from server */
return CURLE_REMOTE_ACCESS_DENIED;
break;
case SSL_ERROR_CONN_LOST:
case SSL_ERROR_SOCK_SETUP_FAILURE:
case SSL_ERROR_INVALID_HANDSHAKE:
case SSL_ERROR_INVALID_PROT_MSG:
case SSL_ERROR_INVALID_HMAC:
case SSL_ERROR_INVALID_SESSION:
case SSL_ERROR_INVALID_KEY: /* it's too bad this doesn't map better */
case SSL_ERROR_FINISHED_INVALID:
case SSL_ERROR_NO_CLIENT_RENOG:
default:
return CURLE_SSL_CONNECT_ERROR;
break;
}
}
static Curl_recv axtls_recv;
static Curl_send axtls_send;
/*
* This function is called after the TCP connect has completed. Setup the TLS
* layer and do all necessary magic.
*/
CURLcode
Curl_axtls_connect(struct connectdata *conn,
int sockindex)
{
struct SessionHandle *data = conn->data;
SSL_CTX *ssl_ctx;
SSL *ssl;
int cert_types[] = {SSL_OBJ_X509_CERT, SSL_OBJ_PKCS12, 0};
int key_types[] = {SSL_OBJ_RSA_KEY, SSL_OBJ_PKCS8, SSL_OBJ_PKCS12, 0};
int i, ssl_fcn_return;
const uint8_t *ssl_sessionid;
size_t ssl_idsize;
const char *x509;
/* Assuming users will not compile in custom key/cert to axTLS */
uint32_t client_option = SSL_NO_DEFAULT_KEY|SSL_SERVER_VERIFY_LATER;
if(conn->ssl[sockindex].state == ssl_connection_complete)
/* to make us tolerant against being called more than once for the
same connection */
return CURLE_OK;
/* axTLS only supports TLSv1 */
/* check to see if we've been told to use an explicit SSL/TLS version */
switch(data->set.ssl.version) {
case CURL_SSLVERSION_DEFAULT:
case CURL_SSLVERSION_TLSv1:
break;
default:
failf(data, "axTLS only supports TLSv1");
return CURLE_SSL_CONNECT_ERROR;
}
#ifdef AXTLSDEBUG
client_option |= SSL_DISPLAY_STATES | SSL_DISPLAY_RSA | SSL_DISPLAY_CERTS;
#endif /* AXTLSDEBUG */
/* Allocate an SSL_CTX struct */
ssl_ctx = ssl_ctx_new(client_option, SSL_DEFAULT_CLNT_SESS);
if(ssl_ctx == NULL) {
failf(data, "unable to create client SSL context");
return CURLE_SSL_CONNECT_ERROR;
}
/* Load the trusted CA cert bundle file */
if(data->set.ssl.CAfile) {
if(ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CACERT, data->set.ssl.CAfile, NULL)
!= SSL_OK){
infof(data, "error reading ca cert file %s \n",
data->set.ssl.CAfile);
if(data->set.ssl.verifypeer){
Curl_axtls_close(conn, sockindex);
return CURLE_SSL_CACERT_BADFILE;
}
}
else
infof(data, "found certificates in %s\n", data->set.ssl.CAfile);
}
/* gtls.c tasks we're skipping for now:
* 1) certificate revocation list checking
* 2) dns name assignment to host
* 3) set protocol priority. axTLS is TLSv1 only, so can probably ignore
* 4) set certificate priority. axTLS ignores type and sends certs in
* order added. can probably ignore this.
*/
/* Load client certificate */
if(data->set.str[STRING_CERT]){
i=0;
/* Instead of trying to analyze cert type here, let axTLS try them all. */
while(cert_types[i] != 0){
ssl_fcn_return = ssl_obj_load(ssl_ctx, cert_types[i],
data->set.str[STRING_CERT], NULL);
if(ssl_fcn_return == SSL_OK){
infof(data, "successfully read cert file %s \n",
data->set.str[STRING_CERT]);
break;
}
i++;
}
/* Tried all cert types, none worked. */
if(cert_types[i] == 0){
failf(data, "%s is not x509 or pkcs12 format",
data->set.str[STRING_CERT]);
Curl_axtls_close(conn, sockindex);
return CURLE_SSL_CERTPROBLEM;
}
}
/* Load client key.
If a pkcs12 file successfully loaded a cert, then there's nothing to do
because the key has already been loaded. */
if(data->set.str[STRING_KEY] && cert_types[i] != SSL_OBJ_PKCS12){
i=0;
/* Instead of trying to analyze key type here, let axTLS try them all. */
while(key_types[i] != 0){
ssl_fcn_return = ssl_obj_load(ssl_ctx, key_types[i],
data->set.str[STRING_KEY], NULL);
if(ssl_fcn_return == SSL_OK){
infof(data, "successfully read key file %s \n",
data->set.str[STRING_KEY]);
break;
}
i++;
}
/* Tried all key types, none worked. */
if(key_types[i] == 0){
failf(data, "Failure: %s is not a supported key file",
data->set.str[STRING_KEY]);
Curl_axtls_close(conn, sockindex);
return CURLE_SSL_CONNECT_ERROR;
}
}
/* gtls.c does more here that is being left out for now
* 1) set session credentials. can probably ignore since axtls puts this
* info in the ssl_ctx struct
* 2) setting up callbacks. these seem gnutls specific
*/
/* In axTLS, handshaking happens inside ssl_client_new. */
if(!Curl_ssl_getsessionid(conn, (void **) &ssl_sessionid, &ssl_idsize)) {
/* we got a session id, use it! */
infof (data, "SSL re-using session ID\n");
ssl = ssl_client_new(ssl_ctx, conn->sock[sockindex],
ssl_sessionid, (uint8_t)ssl_idsize);
}
else
ssl = ssl_client_new(ssl_ctx, conn->sock[sockindex], NULL, 0);
/* Check to make sure handshake was ok. */
ssl_fcn_return = ssl_handshake_status(ssl);
if(ssl_fcn_return != SSL_OK){
Curl_axtls_close(conn, sockindex);
ssl_display_error(ssl_fcn_return); /* goes to stdout. */
return map_error_to_curl(ssl_fcn_return);
}
infof (data, "handshake completed successfully\n");
/* Here, gtls.c gets the peer certificates and fails out depending on
* settings in "data." axTLS api doesn't have get cert chain fcn, so omit?
*/
/* Verify server's certificate */
if(data->set.ssl.verifypeer){
if(ssl_verify_cert(ssl) != SSL_OK){
Curl_axtls_close(conn, sockindex);
failf(data, "server cert verify failed");
return CURLE_SSL_CONNECT_ERROR;
}
}
else
infof(data, "\t server certificate verification SKIPPED\n");
/* Here, gtls.c does issuer verfication. axTLS has no straightforward
* equivalent, so omitting for now.*/
/* See if common name was set in server certificate */
x509 = ssl_get_cert_dn(ssl, SSL_X509_CERT_COMMON_NAME);
if(x509 == NULL)
infof(data, "error fetching CN from cert\n");
/* Here, gtls.c does the following
* 1) x509 hostname checking per RFC2818. axTLS doesn't support this, but
* it seems useful. Omitting for now.
* 2) checks cert validity based on time. axTLS does this in ssl_verify_cert
* 3) displays a bunch of cert information. axTLS doesn't support most of
* this, but a couple fields are available.
*/
/* General housekeeping */
conn->ssl[sockindex].state = ssl_connection_complete;
conn->ssl[sockindex].ssl = ssl;
conn->ssl[sockindex].ssl_ctx = ssl_ctx;
conn->recv[sockindex] = axtls_recv;
conn->send[sockindex] = axtls_send;
/* Put our freshly minted SSL session in cache */
ssl_idsize = ssl_get_session_id_size(ssl);
ssl_sessionid = ssl_get_session_id(ssl);
if(Curl_ssl_addsessionid(conn, (void *) ssl_sessionid, ssl_idsize)
!= CURLE_OK)
infof (data, "failed to add session to cache\n");
return CURLE_OK;
}
/* return number of sent (non-SSL) bytes */
static ssize_t axtls_send(struct connectdata *conn,
int sockindex,
const void *mem,
size_t len,
CURLcode *err)
{
/* ssl_write() returns 'int' while write() and send() returns 'size_t' */
int rc = ssl_write(conn->ssl[sockindex].ssl, mem, (int)len);
infof(conn->data, " axtls_send\n");
if(rc < 0 ) {
*err = map_error_to_curl(rc);
rc = -1; /* generic error code for send failure */
}
*err = CURLE_OK;
return rc;
}
void Curl_axtls_close_all(struct SessionHandle *data)
{
(void)data;
infof(data, " Curl_axtls_close_all\n");
}
void Curl_axtls_close(struct connectdata *conn, int sockindex)
{
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
infof(conn->data, " Curl_axtls_close\n");
if(connssl->ssl) {
/* line from ssluse.c: (void)SSL_shutdown(connssl->ssl);
axTLS compat layer does nothing for SSL_shutdown */
/* The following line is from ssluse.c. There seems to be no axTLS
equivalent. ssl_free and ssl_ctx_free close things.
SSL_set_connect_state(connssl->handle); */
ssl_free (connssl->ssl);
connssl->ssl = NULL;
}
if(connssl->ssl_ctx) {
ssl_ctx_free (connssl->ssl_ctx);
connssl->ssl_ctx = NULL;
}
}
/*
* This function is called to shut down the SSL layer but keep the
* socket open (CCC - Clear Command Channel)
*/
int Curl_axtls_shutdown(struct connectdata *conn, int sockindex)
{
/* Outline taken from ssluse.c since functions are in axTLS compat layer.
axTLS's error set is much smaller, so a lot of error-handling was removed.
*/
int retval = 0;
struct ssl_connect_data *connssl = &conn->ssl[sockindex];
struct SessionHandle *data = conn->data;
char buf[120]; /* We will use this for the OpenSSL error buffer, so it has
to be at least 120 bytes long. */
ssize_t nread;
infof(conn->data, " Curl_axtls_shutdown\n");
/* This has only been tested on the proftpd server, and the mod_tls code
sends a close notify alert without waiting for a close notify alert in
response. Thus we wait for a close notify alert from the server, but
we do not send one. Let's hope other servers do the same... */
/* axTLS compat layer does nothing for SSL_shutdown, so we do nothing too
if(data->set.ftp_ccc == CURLFTPSSL_CCC_ACTIVE)
(void)SSL_shutdown(connssl->ssl);
*/
if(connssl->ssl) {
int what = Curl_socket_ready(conn->sock[sockindex],
CURL_SOCKET_BAD, SSL_SHUTDOWN_TIMEOUT);
if(what > 0) {
/* Something to read, let's do it and hope that it is the close
notify alert from the server */
nread = (ssize_t)SSL_read(conn->ssl[sockindex].ssl, buf,
sizeof(buf));
if (nread < SSL_OK){
failf(data, "close notify alert not received during shutdown");
retval = -1;
}
}
else if(0 == what) {
/* timeout */
failf(data, "SSL shutdown timeout");
}
else {
/* anything that gets here is fatally bad */
failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);
retval = -1;
}
ssl_free (connssl->ssl);
connssl->ssl = NULL;
}
return retval;
}
static ssize_t axtls_recv(struct connectdata *conn, /* connection data */
int num, /* socketindex */
char *buf, /* store read data here */
size_t buffersize, /* max amount to read */
CURLcode *err)
{
struct ssl_connect_data *connssl = &conn->ssl[num];
ssize_t ret = 0;
infof(conn->data, " axtls_recv\n");
if(connssl){
ret = (ssize_t)SSL_read(conn->ssl[num].ssl, buf, (int)buffersize);
/* axTLS isn't terribly generous about error reporting */
/* With patched axTLS, SSL_CLOSE_NOTIFY=-3. Hard-coding until axTLS
team approves proposed fix. */
if(ret == -3 ){
Curl_axtls_close(conn, num);
}
else if(ret < 0) {
failf(conn->data, "axTLS recv error (%d)", (int)ret);
*err = map_error_to_curl(ret);
return -1;
}
}
*err = CURLE_OK;
return ret;
}
/*
* Return codes:
* 1 means the connection is still in place
* 0 means the connection has been closed
* -1 means the connection status is unknown
*/
int Curl_axtls_check_cxn(struct connectdata *conn)
{
/* ssluse.c line: rc = SSL_peek(conn->ssl[FIRSTSOCKET].ssl, (void*)&buf, 1);
axTLS compat layer always returns the last argument, so connection is
always alive? */
infof(conn->data, " Curl_axtls_check_cxn\n");
return 1; /* connection still in place */
}
void Curl_axtls_session_free(void *ptr)
{
(void)ptr;
/* free the ID */
/* both ssluse.c and gtls.c do something here, but axTLS's OpenSSL
compatibility layer does nothing, so we do nothing too. */
}
size_t Curl_axtls_version(char *buffer, size_t size)
{
return snprintf(buffer, size, "axTLS/%s", ssl_version());
}
#endif /* USE_AXTLS */

62
lib/axtls.h Normal file
View File

@@ -0,0 +1,62 @@
#ifndef __AXTLS_H
#define __AXTLS_H
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2010, DirecTV
* contact: Eric Hu <ehu@directv.com>
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://curl.haxx.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
***************************************************************************/
#ifdef USE_AXTLS
#include "curl/curl.h"
#include "urldata.h"
int Curl_axtls_init(void);
int Curl_axtls_cleanup(void);
CURLcode Curl_axtls_connect(struct connectdata *conn, int sockindex);
/* tell axTLS to close down all open information regarding connections (and
thus session ID caching etc) */
void Curl_axtls_close_all(struct SessionHandle *data);
/* close a SSL connection */
void Curl_axtls_close(struct connectdata *conn, int sockindex);
void Curl_axtls_session_free(void *ptr);
size_t Curl_axtls_version(char *buffer, size_t size);
int Curl_axtls_shutdown(struct connectdata *conn, int sockindex);
int Curl_axtls_check_cxn(struct connectdata *conn);
/* API setup for axTLS */
#define curlssl_init Curl_axtls_init
#define curlssl_cleanup Curl_axtls_cleanup
#define curlssl_connect Curl_axtls_connect
#define curlssl_session_free(x) Curl_axtls_session_free(x)
#define curlssl_close_all Curl_axtls_close_all
#define curlssl_close Curl_axtls_close
#define curlssl_shutdown(x,y) Curl_axtls_shutdown(x,y)
#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_FAILED_INIT)
#define curlssl_set_engine_default(x) (x=x, CURLE_FAILED_INIT)
#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL)
#define curlssl_version Curl_axtls_version
#define curlssl_check_cxn(x) Curl_axtls_check_cxn(x)
#define curlssl_data_pending(x,y) (x=x, y=y, 0)
#endif /* USE_AXTLS */
#endif

View File

@@ -86,6 +86,7 @@
#define SIZEOF_INT 4 #define SIZEOF_INT 4
#define SIZEOF_SHORT 2 #define SIZEOF_SHORT 2
#define SIZEOF_SIZE_T 4
#define USE_OPENSSL 1 #define USE_OPENSSL 1
#define USE_SSLEAY 1 #define USE_SSLEAY 1

View File

@@ -3,7 +3,7 @@
/* ================================================================ */ /* ================================================================ */
/* lib/config.dos - Hand crafted config file for DOS */ /* lib/config-dos.h - Hand crafted config file for DOS */
/* ================================================================ */ /* ================================================================ */
#if defined(DJGPP) #if defined(DJGPP)
@@ -67,6 +67,7 @@
#define SIZEOF_INT 4 #define SIZEOF_INT 4
#define SIZEOF_LONG_DOUBLE 16 #define SIZEOF_LONG_DOUBLE 16
#define SIZEOF_SHORT 2 #define SIZEOF_SHORT 2
#define SIZEOF_SIZE_T 4
#define STDC_HEADERS 1 #define STDC_HEADERS 1
#define TIME_WITH_SYS_TIME 1 #define TIME_WITH_SYS_TIME 1

View File

@@ -61,6 +61,7 @@
#define SIZEOF_INT 4 #define SIZEOF_INT 4
#define SIZEOF_SHORT 2 #define SIZEOF_SHORT 2
#define SIZEOF_SIZE_T 4
#define HAVE_GETNAMEINFO 1 #define HAVE_GETNAMEINFO 1
#define GETNAMEINFO_QUAL_ARG1 const #define GETNAMEINFO_QUAL_ARG1 const

View File

@@ -364,6 +364,9 @@
/* The size of `short', as computed by sizeof. */ /* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2 #define SIZEOF_SHORT 2
/* The size of `size_t', as computed by sizeof. */
#define SIZEOF_SIZE_T 8
/* Whether long long constants must be suffixed by LL. */ /* Whether long long constants must be suffixed by LL. */
#define HAVE_LL #define HAVE_LL

View File

@@ -350,6 +350,9 @@
/* The size of `short', as computed by sizeof. */ /* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2 #define SIZEOF_SHORT 2
/* The size of `size_t', as computed by sizeof. */
#define SIZEOF_SIZE_T 4
/* Define if you have the ANSI C header files. */ /* Define if you have the ANSI C header files. */
#undef STDC_HEADERS #undef STDC_HEADERS

View File

@@ -41,6 +41,9 @@
/* The size of `short', as computed by sizeof. */ /* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2 #define SIZEOF_SHORT 2
/* The size of `size_t', as computed by sizeof. */
#define SIZEOF_SIZE_T 4
/* Define if you have the alarm function. */ /* Define if you have the alarm function. */
#define HAVE_ALARM 1 #define HAVE_ALARM 1

View File

@@ -345,12 +345,19 @@
/* The size of `short', as computed by sizeof. */ /* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2 #define SIZEOF_SHORT 2
/* The size of `size_t', as computed by sizeof. */
#if defined(_WIN64)
# define SIZEOF_SIZE_T 8
#else
# define SIZEOF_SIZE_T 4
#endif
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
/* STRUCT RELATED */ /* STRUCT RELATED */
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
/* Define this if you have struct sockaddr_storage */ /* Define this if you have struct sockaddr_storage */
#ifndef __SALFORDC__ #if !defined(__SALFORDC__) && !defined(__BORLANDC__)
#define HAVE_STRUCT_SOCKADDR_STORAGE 1 #define HAVE_STRUCT_SOCKADDR_STORAGE 1
#endif #endif

View File

@@ -322,6 +322,13 @@
/* The size of `short', as computed by sizeof. */ /* The size of `short', as computed by sizeof. */
#define SIZEOF_SHORT 2 #define SIZEOF_SHORT 2
/* The size of `size_t', as computed by sizeof. */
#if defined(_WIN64)
# define SIZEOF_SIZE_T 8
#else
# define SIZEOF_SIZE_T 4
#endif
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */
/* STRUCT RELATED */ /* STRUCT RELATED */
/* ---------------------------------------------------------------- */ /* ---------------------------------------------------------------- */

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -124,15 +124,17 @@ singleipconnect(struct connectdata *conn,
* transfer/connection. If the value is negative, the timeout time has already * transfer/connection. If the value is negative, the timeout time has already
* elapsed. * elapsed.
* *
* The start time is stored in progress.t_startsingle - as set with
* Curl_pgrsTime(..., TIMER_STARTSINGLE);
*
* If 'nowp' is non-NULL, it points to the current time. * If 'nowp' is non-NULL, it points to the current time.
* 'duringconnect' is FALSE if not during a connect, as then of course the * 'duringconnect' is FALSE if not during a connect, as then of course the
* connect timeout is not taken into account! * connect timeout is not taken into account!
*/ */
long Curl_timeleft(struct connectdata *conn, long Curl_timeleft(struct SessionHandle *data,
struct timeval *nowp, struct timeval *nowp,
bool duringconnect) bool duringconnect)
{ {
struct SessionHandle *data = conn->data;
int timeout_set = 0; int timeout_set = 0;
long timeout_ms = duringconnect?DEFAULT_CONNECT_TIMEOUT:0; long timeout_ms = duringconnect?DEFAULT_CONNECT_TIMEOUT:0;
struct timeval now; struct timeval now;
@@ -174,6 +176,9 @@ long Curl_timeleft(struct connectdata *conn,
/* substract elapsed time */ /* substract elapsed time */
timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startsingle); timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startsingle);
if(!timeout_ms)
/* avoid returning 0 as that means no timeout! */
return -1;
return timeout_ms; return timeout_ms;
} }
@@ -307,20 +312,20 @@ static CURLcode bindlocal(struct connectdata *conn,
* of the connection. The resolve functions should really be changed * of the connection. The resolve functions should really be changed
* to take a type parameter instead. * to take a type parameter instead.
*/ */
long ipver = data->set.ip_version; long ipver = conn->ip_version;
int rc; int rc;
if (af == AF_INET) if (af == AF_INET)
data->set.ip_version = CURL_IPRESOLVE_V4; conn->ip_version = CURL_IPRESOLVE_V4;
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
else if (af == AF_INET6) else if (af == AF_INET6)
data->set.ip_version = CURL_IPRESOLVE_V6; conn->ip_version = CURL_IPRESOLVE_V6;
#endif #endif
rc = Curl_resolv(conn, dev, 0, &h); rc = Curl_resolv(conn, dev, 0, &h);
if(rc == CURLRESOLV_PENDING) if(rc == CURLRESOLV_PENDING)
(void)Curl_wait_for_resolv(conn, &h); (void)Curl_wait_for_resolv(conn, &h);
data->set.ip_version = ipver; conn->ip_version = ipver;
if(h) { if(h) {
/* convert the resolved address, sizeof myhost >= INET_ADDRSTRLEN */ /* convert the resolved address, sizeof myhost >= INET_ADDRSTRLEN */
@@ -529,6 +534,16 @@ static CURLcode trynextip(struct connectdata *conn,
return CURLE_COULDNT_CONNECT; return CURLE_COULDNT_CONNECT;
} }
/* Copies connection info into the session handle to make it available
when the session handle is no longer associated with a connection. */
void Curl_persistconninfo(struct connectdata *conn)
{
memcpy(conn->data->info.conn_primary_ip, conn->primary_ip, MAX_IPADR_LEN);
memcpy(conn->data->info.conn_local_ip, conn->local_ip, MAX_IPADR_LEN);
conn->data->info.conn_primary_port = conn->primary_port;
conn->data->info.conn_local_port = conn->local_port;
}
/* retrieves ip address and port from a sockaddr structure */ /* retrieves ip address and port from a sockaddr structure */
static bool getaddressinfo(struct sockaddr* sa, char* addr, static bool getaddressinfo(struct sockaddr* sa, char* addr,
long* port) long* port)
@@ -538,31 +553,46 @@ static bool getaddressinfo(struct sockaddr* sa, char* addr,
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
struct sockaddr_in6* si6 = NULL; struct sockaddr_in6* si6 = NULL;
#endif #endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
struct sockaddr_un* su = NULL;
#endif
switch (sa->sa_family) { switch (sa->sa_family) {
case AF_INET: case AF_INET:
si = (struct sockaddr_in*) sa; si = (struct sockaddr_in*) sa;
if(Curl_inet_ntop(sa->sa_family, &si->sin_addr, if(Curl_inet_ntop(sa->sa_family, &si->sin_addr,
addr, MAX_IPADR_LEN) == NULL) addr, MAX_IPADR_LEN)) {
return FALSE; us_port = ntohs(si->sin_port);
us_port = ntohs(si->sin_port); *port = us_port;
*port = us_port; return TRUE;
}
break; break;
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
case AF_INET6: case AF_INET6:
si6 = (struct sockaddr_in6*)sa; si6 = (struct sockaddr_in6*)sa;
if(Curl_inet_ntop(sa->sa_family, &si6->sin6_addr, if(Curl_inet_ntop(sa->sa_family, &si6->sin6_addr,
addr, MAX_IPADR_LEN) == NULL) addr, MAX_IPADR_LEN)) {
return FALSE; us_port = ntohs(si6->sin6_port);
us_port = ntohs(si6->sin6_port); *port = us_port;
*port = us_port; return TRUE;
}
break; break;
#endif #endif
default: #if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
addr[0] = '\0'; case AF_UNIX:
su = (struct sockaddr_un*)sa;
snprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
*port = 0; *port = 0;
return TRUE;
#endif
default:
break;
} }
return TRUE;
addr[0] = '\0';
*port = 0;
return FALSE;
} }
/* retrieves the start/end point information of a socket of an established /* retrieves the start/end point information of a socket of an established
@@ -574,43 +604,45 @@ void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
struct Curl_sockaddr_storage ssrem; struct Curl_sockaddr_storage ssrem;
struct Curl_sockaddr_storage ssloc; struct Curl_sockaddr_storage ssloc;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
struct PureInfo *info = &conn->data->info;
if(conn->bits.reuse) if(!conn->bits.reuse) {
/* reusing same connection */
return; len = sizeof(struct Curl_sockaddr_storage);
if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) {
error = SOCKERRNO;
failf(data, "getpeername() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
}
len = sizeof(struct Curl_sockaddr_storage);
if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) {
error = SOCKERRNO;
failf(data, "getsockname() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
}
if(!getaddressinfo((struct sockaddr*)&ssrem,
conn->primary_ip, &conn->primary_port)) {
error = ERRNO;
failf(data, "ssrem inet_ntop() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
}
if(!getaddressinfo((struct sockaddr*)&ssloc,
conn->local_ip, &conn->local_port)) {
error = ERRNO;
failf(data, "ssloc inet_ntop() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
}
len = sizeof(struct Curl_sockaddr_storage);
if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) {
error = SOCKERRNO;
failf(data, "getpeername() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
} }
len = sizeof(struct Curl_sockaddr_storage); /* persist connection info in session handle */
if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) { Curl_persistconninfo(conn);
error = SOCKERRNO;
failf(data, "getsockname() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
}
if(!getaddressinfo((struct sockaddr*)&ssrem,
info->ip, &info->port)) {
error = ERRNO;
failf(data, "ssrem inet_ntop() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
}
if(!getaddressinfo((struct sockaddr*)&ssloc,
info->localip, &info->localport)) {
error = ERRNO;
failf(data, "ssloc inet_ntop() failed with errno %d: %s",
error, Curl_strerror(conn, error));
return;
}
} }
/* /*
@@ -627,6 +659,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
CURLcode code = CURLE_OK; CURLcode code = CURLE_OK;
curl_socket_t sockfd = conn->sock[sockindex]; curl_socket_t sockfd = conn->sock[sockindex];
long allow = DEFAULT_CONNECT_TIMEOUT; long allow = DEFAULT_CONNECT_TIMEOUT;
int error = 0;
struct timeval now;
DEBUGASSERT(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET); DEBUGASSERT(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET);
@@ -634,19 +668,14 @@ CURLcode Curl_is_connected(struct connectdata *conn,
if(conn->bits.tcpconnect) { if(conn->bits.tcpconnect) {
/* we are connected already! */ /* we are connected already! */
long allow_total = 0;
/* subtract the most strict timeout of the ones */
if(data->set.timeout)
allow_total = data->set.timeout;
Curl_expire(data, allow_total);
*connected = TRUE; *connected = TRUE;
return CURLE_OK; return CURLE_OK;
} }
now = Curl_tvnow();
/* figure out how long time we have left to connect */ /* figure out how long time we have left to connect */
allow = Curl_timeleft(conn, NULL, TRUE); allow = Curl_timeleft(data, &now, TRUE);
if(allow < 0) { if(allow < 0) {
/* time-out, bail out, go home */ /* time-out, bail out, go home */
@@ -654,13 +683,20 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OPERATION_TIMEDOUT; return CURLE_OPERATION_TIMEDOUT;
} }
Curl_expire(data, allow);
/* check for connect without timeout as we want to return immediately */ /* check for connect without timeout as we want to return immediately */
rc = waitconnect(conn, sockfd, 0); rc = waitconnect(conn, sockfd, 0);
if(WAITCONN_TIMEOUT == rc) {
if(curlx_tvdiff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
infof(data, "After %ldms connect time, move on!\n",
conn->timeoutms_per_addr);
goto next;
}
/* not an error, but also no connection yet */
return code;
}
if(WAITCONN_CONNECTED == rc) { if(WAITCONN_CONNECTED == rc) {
int error;
if(verifyconnect(sockfd, &error)) { if(verifyconnect(sockfd, &error)) {
/* we are connected, awesome! */ /* we are connected, awesome! */
conn->bits.tcpconnect = TRUE; conn->bits.tcpconnect = TRUE;
@@ -672,38 +708,35 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OK; return CURLE_OK;
} }
/* nope, not connected for real */ /* nope, not connected for real */
data->state.os_errno = error;
infof(data, "Connection failed\n");
code = trynextip(conn, sockindex, connected);
if(code)
failf(data, "Failed connect to %s:%ld; %s",
conn->host.name, conn->port, Curl_strerror(conn, error));
} }
else if(WAITCONN_TIMEOUT != rc) { else {
int error = 0;
/* nope, not connected */ /* nope, not connected */
if(WAITCONN_FDSET_ERROR == rc) { if(WAITCONN_FDSET_ERROR == rc) {
(void)verifyconnect(sockfd, &error); (void)verifyconnect(sockfd, &error);
data->state.os_errno = error; infof(data, "%s\n",Curl_strerror(conn, error));
infof(data, "%s\n",Curl_strerror(conn,error));
} }
else else
infof(data, "Connection failed\n"); infof(data, "Connection failed\n");
code = trynextip(conn, sockindex, connected);
if(code) {
error = SOCKERRNO;
data->state.os_errno = error;
failf(data, "Failed connect to %s:%ld; %s",
conn->host.name, conn->port, Curl_strerror(conn, error));
}
} }
/* /*
* If the connection failed here, we should attempt to connect to the "next * The connection failed here, we should attempt to connect to the "next
* address" for the given host. * address" for the given host. But first remember the latest error.
*/ */
if(error) {
data->state.os_errno = error;
SET_SOCKERRNO(error);
}
next:
code = trynextip(conn, sockindex, connected);
if(code) {
error = SOCKERRNO;
data->state.os_errno = error;
failf(data, "Failed connect to %s:%ld; %s",
conn->host.name, conn->port, Curl_strerror(conn, error));
}
return code; return code;
} }
@@ -802,16 +835,13 @@ singleipconnect(struct connectdata *conn,
bool *connected) bool *connected)
{ {
struct Curl_sockaddr_ex addr; struct Curl_sockaddr_ex addr;
char addr_buf[128];
int rc; int rc;
int error; int error;
bool isconnected; bool isconnected;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
curl_socket_t sockfd; curl_socket_t sockfd;
CURLcode res = CURLE_OK; CURLcode res = CURLE_OK;
const void *iptoprint; #if defined(ENABLE_IPV6) && defined(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID)
struct sockaddr_in * const sa4 = (void *)&addr.sa_addr;
#ifdef ENABLE_IPV6
struct sockaddr_in6 * const sa6 = (void *)&addr.sa_addr; struct sockaddr_in6 * const sa6 = (void *)&addr.sa_addr;
#endif #endif
@@ -827,7 +857,7 @@ singleipconnect(struct connectdata *conn,
addr.family = ai->ai_family; addr.family = ai->ai_family;
addr.socktype = conn->socktype; addr.socktype = conn->socktype;
addr.protocol = ai->ai_protocol; addr.protocol = conn->socktype==SOCK_DGRAM?IPPROTO_UDP:ai->ai_protocol;
addr.addrlen = ai->ai_addrlen; addr.addrlen = ai->ai_addrlen;
if(addr.addrlen > sizeof(struct Curl_sockaddr_storage)) if(addr.addrlen > sizeof(struct Curl_sockaddr_storage))
@@ -862,37 +892,25 @@ singleipconnect(struct connectdata *conn,
sa6->sin6_scope_id = conn->scope; sa6->sin6_scope_id = conn->scope;
#endif #endif
/* FIXME: do we have Curl_printable_address-like with struct sockaddr* as /* store remote address and port used in this connection attempt */
argument? */ if(!getaddressinfo((struct sockaddr*)&addr.sa_addr,
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX) conn->primary_ip, &conn->primary_port)) {
if(addr.family == AF_UNIX) { /* malformed address or bug in inet_ntop, try next address */
infof(data, " Trying %s... ", error = ERRNO;
((const struct sockaddr_un*)(&addr.sa_addr))->sun_path); failf(data, "sa_addr inet_ntop() failed with errno %d: %s",
snprintf(data->info.ip, MAX_IPADR_LEN, "%s", error, Curl_strerror(conn, error));
((const struct sockaddr_un*)(&addr.sa_addr))->sun_path); sclose(sockfd);
strcpy(conn->ip_addr_str, data->info.ip); return CURLE_OK;
} }
else memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
#endif infof(data, " Trying %s... ", conn->ip_addr_str);
{
#ifdef ENABLE_IPV6
if(addr.family == AF_INET6) {
iptoprint = &sa6->sin6_addr;
conn->bits.ipv6 = TRUE;
}
else
#endif
{
iptoprint = &sa4->sin_addr;
}
if(Curl_inet_ntop(addr.family, iptoprint, addr_buf, Curl_persistconninfo(conn);
sizeof(addr_buf)) != NULL) {
infof(data, " Trying %s... ", addr_buf); #ifdef ENABLE_IPV6
snprintf(data->info.ip, MAX_IPADR_LEN, "%s", addr_buf); if(addr.family == AF_INET6)
strcpy(conn->ip_addr_str, data->info.ip); conn->bits.ipv6 = TRUE;
} #endif
}
if(data->set.tcp_nodelay) if(data->set.tcp_nodelay)
tcpnodelay(conn, sockfd); tcpnodelay(conn, sockfd);
@@ -908,7 +926,7 @@ singleipconnect(struct connectdata *conn,
CURLSOCKTYPE_IPCXN); CURLSOCKTYPE_IPCXN);
if(error) { if(error) {
sclose(sockfd); /* close the socket and bail out */ sclose(sockfd); /* close the socket and bail out */
return res; return CURLE_ABORTED_BY_CALLBACK;
} }
} }
@@ -923,8 +941,12 @@ singleipconnect(struct connectdata *conn,
curlx_nonblock(sockfd, TRUE); curlx_nonblock(sockfd, TRUE);
/* Connect TCP sockets, bind UDP */ /* Connect TCP sockets, bind UDP */
if(conn->socktype == SOCK_STREAM) if(conn->socktype == SOCK_STREAM) {
rc = connect(sockfd, &addr.sa_addr, addr.addrlen); rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
conn->connecttime = Curl_tvnow();
if(conn->num_addr > 1)
Curl_expire(data, conn->timeoutms_per_addr);
}
else else
rc = 0; rc = 0;
@@ -952,7 +974,7 @@ singleipconnect(struct connectdata *conn,
default: default:
/* unknown error, fallthrough and try another address! */ /* unknown error, fallthrough and try another address! */
failf(data, "Failed to connect to %s: %s", failf(data, "Failed to connect to %s: %s",
addr_buf, Curl_strerror(conn,error)); conn->ip_addr_str, Curl_strerror(conn,error));
data->state.os_errno = error; data->state.os_errno = error;
break; break;
} }
@@ -1005,7 +1027,6 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
curl_socket_t sockfd = CURL_SOCKET_BAD; curl_socket_t sockfd = CURL_SOCKET_BAD;
int aliasindex; int aliasindex;
int num_addr;
Curl_addrinfo *ai; Curl_addrinfo *ai;
Curl_addrinfo *curr_addr; Curl_addrinfo *curr_addr;
@@ -1016,24 +1037,22 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
* Figure out what maximum time we have left * Figure out what maximum time we have left
*************************************************************/ *************************************************************/
long timeout_ms; long timeout_ms;
long timeout_per_addr;
DEBUGASSERT(sockconn); DEBUGASSERT(sockconn);
*connected = FALSE; /* default to not connected */ *connected = FALSE; /* default to not connected */
/* get the timeout left */ /* get the timeout left */
timeout_ms = Curl_timeleft(conn, &before, TRUE); timeout_ms = Curl_timeleft(data, &before, TRUE);
if(timeout_ms < 0) { if(timeout_ms < 0) {
/* a precaution, no need to continue if time already is up */ /* a precaution, no need to continue if time already is up */
failf(data, "Connection time-out"); failf(data, "Connection time-out");
return CURLE_OPERATION_TIMEDOUT; return CURLE_OPERATION_TIMEDOUT;
} }
Curl_expire(data, timeout_ms);
/* Max time for each address */ /* Max time for each address */
num_addr = Curl_num_addresses(remotehost->addr); conn->num_addr = Curl_num_addresses(remotehost->addr);
timeout_per_addr = timeout_ms / num_addr; conn->timeoutms_per_addr = timeout_ms / conn->num_addr;
ai = remotehost->addr; ai = remotehost->addr;
@@ -1041,10 +1060,6 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
* know for the given host. One by one until one IP succeeds. * know for the given host. One by one until one IP succeeds.
*/ */
if(data->state.used_interface == Curl_if_multi)
/* don't hang when doing multi */
timeout_per_addr = 0;
/* /*
* Connecting with a Curl_addrinfo chain * Connecting with a Curl_addrinfo chain
*/ */
@@ -1053,7 +1068,10 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
/* start connecting to the IP curr_addr points to */ /* start connecting to the IP curr_addr points to */
CURLcode res = CURLcode res =
singleipconnect(conn, curr_addr, timeout_per_addr, &sockfd, connected); singleipconnect(conn, curr_addr,
/* don't hang when doing multi */
(data->state.used_interface == Curl_if_multi)?0:
conn->timeoutms_per_addr, &sockfd, connected);
if(res) if(res)
return res; return res;
@@ -1094,12 +1112,12 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
* Used to extract socket and connectdata struct for the most recent * Used to extract socket and connectdata struct for the most recent
* transfer on the given SessionHandle. * transfer on the given SessionHandle.
* *
* The socket 'long' will be -1 in case of failure! * The returned socket will be CURL_SOCKET_BAD in case of failure!
*/ */
CURLcode Curl_getconnectinfo(struct SessionHandle *data, curl_socket_t Curl_getconnectinfo(struct SessionHandle *data,
long *param_longp, struct connectdata **connp)
struct connectdata **connp)
{ {
curl_socket_t sockfd;
if((data->state.lastconnect != -1) && if((data->state.lastconnect != -1) &&
(data->state.connc->connects[data->state.lastconnect] != NULL)) { (data->state.connc->connects[data->state.lastconnect] != NULL)) {
struct connectdata *c = struct connectdata *c =
@@ -1107,13 +1125,13 @@ CURLcode Curl_getconnectinfo(struct SessionHandle *data,
if(connp) if(connp)
/* only store this if the caller cares for it */ /* only store this if the caller cares for it */
*connp = c; *connp = c;
*param_longp = c->sock[FIRSTSOCKET]; sockfd = c->sock[FIRSTSOCKET];
/* we have a socket connected, let's determine if the server shut down */ /* we have a socket connected, let's determine if the server shut down */
/* determine if ssl */ /* determine if ssl */
if(c->ssl[FIRSTSOCKET].use) { if(c->ssl[FIRSTSOCKET].use) {
/* use the SSL context */ /* use the SSL context */
if(!Curl_ssl_check_cxn(c)) if(!Curl_ssl_check_cxn(c))
*param_longp = -1; /* FIN received */ return CURL_SOCKET_BAD; /* FIN received */
} }
/* Minix 3.1 doesn't support any flags on recv; just assume socket is OK */ /* Minix 3.1 doesn't support any flags on recv; just assume socket is OK */
#ifdef MSG_PEEK #ifdef MSG_PEEK
@@ -1122,13 +1140,13 @@ CURLcode Curl_getconnectinfo(struct SessionHandle *data,
char buf; char buf;
if(recv((RECV_TYPE_ARG1)c->sock[FIRSTSOCKET], (RECV_TYPE_ARG2)&buf, if(recv((RECV_TYPE_ARG1)c->sock[FIRSTSOCKET], (RECV_TYPE_ARG2)&buf,
(RECV_TYPE_ARG3)1, (RECV_TYPE_ARG4)MSG_PEEK) == 0) { (RECV_TYPE_ARG3)1, (RECV_TYPE_ARG4)MSG_PEEK) == 0) {
*param_longp = -1; /* FIN received */ return CURL_SOCKET_BAD; /* FIN received */
} }
} }
#endif #endif
} }
else else
*param_longp = -1; return CURL_SOCKET_BAD;
return CURLE_OK; return sockfd;
} }

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@@ -37,7 +37,7 @@ CURLcode Curl_connecthost(struct connectdata *conn,
/* generic function that returns how much time there's left to run, according /* generic function that returns how much time there's left to run, according
to the timeouts set */ to the timeouts set */
long Curl_timeleft(struct connectdata *conn, long Curl_timeleft(struct SessionHandle *data,
struct timeval *nowp, struct timeval *nowp,
bool duringconnect); bool duringconnect);
@@ -47,11 +47,10 @@ long Curl_timeleft(struct connectdata *conn,
* Used to extract socket and connectdata struct for the most recent * Used to extract socket and connectdata struct for the most recent
* transfer on the given SessionHandle. * transfer on the given SessionHandle.
* *
* The socket 'long' will be -1 in case of failure! * The returned socket will be CURL_SOCKET_BAD in case of failure!
*/ */
CURLcode Curl_getconnectinfo(struct SessionHandle *data, curl_socket_t Curl_getconnectinfo(struct SessionHandle *data,
long *param_longp, struct connectdata **connp);
struct connectdata **connp);
#ifdef WIN32 #ifdef WIN32
/* When you run a program that uses the Windows Sockets API, you may /* When you run a program that uses the Windows Sockets API, you may
@@ -70,4 +69,6 @@ void Curl_sndbufset(curl_socket_t sockfd);
void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd); void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd);
void Curl_persistconninfo(struct connectdata *conn);
#endif #endif

View File

@@ -123,7 +123,9 @@ inflate_stream(struct connectdata *conn,
} }
/* Done with these bytes, exit */ /* Done with these bytes, exit */
if(status == Z_OK && z->avail_in == 0) {
/* status is always Z_OK at this point! */
if(z->avail_in == 0) {
free(decomp); free(decomp);
return result; return result;
} }

View File

@@ -270,6 +270,7 @@ Curl_cookie_add(struct SessionHandle *data,
we don't care about that, we treat the names the same anyway */ we don't care about that, we treat the names the same anyway */
const char *domptr=whatptr; const char *domptr=whatptr;
const char *nextptr;
int dotcount=1; int dotcount=1;
/* Count the dots, we need to make sure that there are enough /* Count the dots, we need to make sure that there are enough
@@ -280,12 +281,13 @@ Curl_cookie_add(struct SessionHandle *data,
domptr++; domptr++;
do { do {
domptr = strchr(domptr, '.'); nextptr = strchr(domptr, '.');
if(domptr) { if(nextptr) {
domptr++; if(domptr != nextptr)
dotcount++; dotcount++;
domptr = nextptr+1;
} }
} while(domptr); } while(nextptr);
/* The original Netscape cookie spec defined that this domain name /* The original Netscape cookie spec defined that this domain name
MUST have three dots (or two if one of the seven holy TLDs), MUST have three dots (or two if one of the seven holy TLDs),
@@ -353,8 +355,8 @@ Curl_cookie_add(struct SessionHandle *data,
break; break;
} }
co->expires = co->expires =
atoi((*co->maxage=='\"')?&co->maxage[1]:&co->maxage[0]) + strtol((*co->maxage=='\"')?&co->maxage[1]:&co->maxage[0],NULL,10)
(long)now; + (long)now;
} }
else if(Curl_raw_equal("expires", name)) { else if(Curl_raw_equal("expires", name)) {
strstore(&co->expirestr, whatptr); strstore(&co->expirestr, whatptr);

View File

@@ -49,6 +49,7 @@
#endif #endif
#include "curl_addrinfo.h" #include "curl_addrinfo.h"
#include "inet_pton.h"
#define _MPRINTF_REPLACE /* use our functions only */ #define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h> #include <curl/mprintf.h>
@@ -117,12 +118,12 @@ Curl_getaddrinfo_ex(const char *nodename,
const struct addrinfo *hints, const struct addrinfo *hints,
Curl_addrinfo **result) Curl_addrinfo **result)
{ {
const struct addrinfo *ainext;
const struct addrinfo *ai; const struct addrinfo *ai;
struct addrinfo *aihead; struct addrinfo *aihead;
Curl_addrinfo *cafirst = NULL; Curl_addrinfo *cafirst = NULL;
Curl_addrinfo *calast = NULL; Curl_addrinfo *calast = NULL;
Curl_addrinfo *ca; Curl_addrinfo *ca;
size_t ss_size;
int error; int error;
*result = NULL; /* assume failure */ *result = NULL; /* assume failure */
@@ -131,7 +132,28 @@ Curl_getaddrinfo_ex(const char *nodename,
if(error) if(error)
return error; return error;
for(ai = aihead; ai != NULL; ai = ainext) { /* traverse the addrinfo list */
for(ai = aihead; ai != NULL; ai = ai->ai_next) {
/* ignore elements with unsupported address family, */
/* settle family-specific sockaddr structure size. */
if(ai->ai_family == AF_INET)
ss_size = sizeof(struct sockaddr_in);
#ifdef ENABLE_IPV6
else if(ai->ai_family == AF_INET6)
ss_size = sizeof(struct sockaddr_in6);
#endif
else
continue;
/* ignore elements without required address info */
if((ai->ai_addr == NULL) || !(ai->ai_addrlen > 0))
continue;
/* ignore elements with bogus address size */
if((size_t)ai->ai_addrlen < ss_size)
continue;
if((ca = malloc(sizeof(Curl_addrinfo))) == NULL) { if((ca = malloc(sizeof(Curl_addrinfo))) == NULL) {
error = EAI_MEMORY; error = EAI_MEMORY;
@@ -139,35 +161,28 @@ Curl_getaddrinfo_ex(const char *nodename,
} }
/* copy each structure member individually, member ordering, */ /* copy each structure member individually, member ordering, */
/* size, or padding might be different for each structure. */ /* size, or padding might be different for each platform. */
ca->ai_flags = ai->ai_flags; ca->ai_flags = ai->ai_flags;
ca->ai_family = ai->ai_family; ca->ai_family = ai->ai_family;
ca->ai_socktype = ai->ai_socktype; ca->ai_socktype = ai->ai_socktype;
ca->ai_protocol = ai->ai_protocol; ca->ai_protocol = ai->ai_protocol;
ca->ai_addrlen = 0; ca->ai_addrlen = (curl_socklen_t)ss_size;
ca->ai_addr = NULL; ca->ai_addr = NULL;
ca->ai_canonname = NULL; ca->ai_canonname = NULL;
ca->ai_next = NULL; ca->ai_next = NULL;
if((ai->ai_addrlen > 0) && (ai->ai_addr != NULL)) { if((ca->ai_addr = malloc(ss_size)) == NULL) {
/* typecast below avoid warning on at least win64: error = EAI_MEMORY;
conversion from 'size_t' to 'curl_socklen_t', possible loss of data free(ca);
*/ break;
ca->ai_addrlen = (curl_socklen_t)ai->ai_addrlen;
if((ca->ai_addr = malloc(ca->ai_addrlen)) == NULL) {
error = EAI_MEMORY;
free(ca);
break;
}
memcpy(ca->ai_addr, ai->ai_addr, ca->ai_addrlen);
} }
memcpy(ca->ai_addr, ai->ai_addr, ss_size);
if(ai->ai_canonname != NULL) { if(ai->ai_canonname != NULL) {
if((ca->ai_canonname = strdup(ai->ai_canonname)) == NULL) { if((ca->ai_canonname = strdup(ai->ai_canonname)) == NULL) {
error = EAI_MEMORY; error = EAI_MEMORY;
if(ca->ai_addr) free(ca->ai_addr);
free(ca->ai_addr);
free(ca); free(ca);
break; break;
} }
@@ -182,8 +197,6 @@ Curl_getaddrinfo_ex(const char *nodename,
calast->ai_next = ca; calast->ai_next = ca;
calast = ca; calast = ca;
/* fetch next element fom the addrinfo list */
ainext = ai->ai_next;
} }
/* destroy the addrinfo list */ /* destroy the addrinfo list */
@@ -195,6 +208,18 @@ Curl_getaddrinfo_ex(const char *nodename,
Curl_freeaddrinfo(cafirst); Curl_freeaddrinfo(cafirst);
cafirst = NULL; cafirst = NULL;
} }
else if(!cafirst) {
#ifdef EAI_NONAME
/* rfc3493 conformant */
error = EAI_NONAME;
#else
/* rfc3493 obsoleted */
error = EAI_NODATA;
#endif
#ifdef USE_WINSOCK
SET_SOCKERRNO(error);
#endif
}
*result = cafirst; *result = cafirst;
@@ -434,6 +459,26 @@ Curl_ip2addr(int af, const void *inaddr, const char *hostname, int port)
return ai; return ai;
} }
/*
* Given an IPv4 or IPv6 dotted string address, this converts it to a proper
* allocated Curl_addrinfo struct and returns it.
*/
Curl_addrinfo *Curl_str2addr(char *address, int port)
{
struct in_addr in;
if(Curl_inet_pton(AF_INET, address, &in) > 0)
/* This is a dotted IP address 123.123.123.123-style */
return Curl_ip2addr(AF_INET, &in, address, port);
#ifdef ENABLE_IPV6
else {
struct in6_addr in6;
if(Curl_inet_pton(AF_INET6, address, &in6) > 0)
/* This is a dotted IPv6 address ::1-style */
return Curl_ip2addr(AF_INET6, &in6, address, port);
}
#endif
return NULL; /* bad input format */
}
#if defined(CURLDEBUG) && defined(HAVE_FREEADDRINFO) #if defined(CURLDEBUG) && defined(HAVE_FREEADDRINFO)
/* /*

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