Compare commits

..

376 Commits

Author SHA1 Message Date
Daniel Stenberg
bfd00ac2ed 7.10.4 commit 2003-04-02 07:48:56 +00:00
Daniel Stenberg
735a4714f4 Version 7.10.4 2003-04-02 07:42:39 +00:00
Daniel Stenberg
827fd47198 documented the new killserver tag 2003-04-01 08:43:09 +00:00
Daniel Stenberg
e26b917661 kill the ftp server afterwards, it is just so messed up 2003-04-01 08:42:37 +00:00
Daniel Stenberg
92872a2a3c log when we've returned verification that we are the test server 2003-04-01 08:42:14 +00:00
Daniel Stenberg
16ddb09cb4 support the new <killserver> tag 2003-04-01 08:41:49 +00:00
Daniel Stenberg
d37031f14e ignore lib505 too 2003-04-01 07:13:28 +00:00
Daniel Stenberg
b4e84ca7d2 lib505.c is a new test case for ftp uploading with rename 2003-04-01 07:13:04 +00:00
Daniel Stenberg
47970b9e6f Added support for the RNFR/RNTO commands 2003-04-01 07:10:08 +00:00
Daniel Stenberg
f65f120d50 updated 2003-03-31 22:16:12 +00:00
Daniel Stenberg
df00ec3c82 move the ssl config clone call to before the connectionexists call and then
also subsequently free the ssl struct if the connection struct is to be
deleted
2003-03-31 21:43:05 +00:00
Sterling Hughes
ad6fca28f9 testing, ignore this commit 2003-03-31 15:59:17 +00:00
Daniel Stenberg
fd33923496 7.10.4-pre6 commit 2003-03-31 14:02:43 +00:00
Daniel Stenberg
a55649dc82 added dist-hook that clears the tests/log dir properly as otherwise
'make distcheck' doesn't pass
2003-03-31 11:37:47 +00:00
Daniel Stenberg
9558f229db Fixup after talks with Richard Bramante. We should now make better
comparisons before re-using SSL connections and re-using SSL connection IDs.
2003-03-31 05:13:26 +00:00
Daniel Stenberg
7917bfb1c9 --location-trusted added, which does a normal location plus the new
CURLOPT_UNRESTRICTED_AUTH option set TRUE.

Patch by Guillaume Cottenceau.
2003-03-31 04:42:20 +00:00
Daniel Stenberg
25f611ca42 Guillaume Cottenceau's patch that adds CURLOPT_UNRESTRICTED_AUTH that
disables the host name check in the FOLLOWLOCATION code. With that option
set, libcurl will send user+password to all hosts.
2003-03-31 04:41:05 +00:00
Daniel Stenberg
e6eb49e7e0 10 days of fixes 2003-03-31 04:05:03 +00:00
Daniel Stenberg
9a075f53dc clarify USERPWD somewhat more 2003-03-31 04:04:40 +00:00
Daniel Stenberg
4b3f800c03 Frankie Fong filed bug report #708708 which identified a problem with
ConnectionExists() when first doing a proxy connecto to a HTTPS site and then
switching over to a HTTP connection to the same host.

This fix corrects the problem.
2003-03-31 03:42:01 +00:00
Daniel Stenberg
82bc76b243 Dan Shearer's fix from bug report #618892, which makes 'curl -O' output
an error message about a missing URL.
2003-03-29 11:03:30 +00:00
Daniel Stenberg
18b9b04907 send as much as possible of the POST at once 2003-03-28 12:56:07 +00:00
Daniel Stenberg
87f1f08b36 added section titles and a CONTACT paragraph asking people to use the mailing
lists
2003-03-27 15:09:33 +00:00
Daniel Stenberg
7d7ebbe9f7 fixed the pkg-config stuff for rh9 2003-03-26 19:05:24 +00:00
Daniel Stenberg
5111ce782f add URLs to patch and diff 2003-03-26 11:48:03 +00:00
Daniel Stenberg
20b0e563ce mention the URL to the mailing lists 2003-03-26 11:44:04 +00:00
Daniel Stenberg
8b6cf239a3 attempt to extract openssl information using pkg-config 2003-03-25 22:40:43 +00:00
Daniel Stenberg
bcc285cffd Renamed configure.in to configure.ac, as this is the supposedly new preferred
name for it.
2003-03-25 15:56:33 +00:00
Daniel Stenberg
d5ba030942 use init and copyright to get a better header in the generated script 2003-03-25 15:54:06 +00:00
Daniel Stenberg
803f43592a white space and indent fix 2003-03-25 14:23:12 +00:00
Daniel Stenberg
904b9ccaa3 ignore getdate.c 2003-03-24 23:11:16 +00:00
Daniel Stenberg
89721ff04a Richard Bramante's provided a fix for a handle re-use problem seen when you
change options on an SSL-enabled connection between requests.
2003-03-24 23:10:38 +00:00
Daniel Stenberg
6164823921 Removed the "TC TrustCenter, Germany, Class 0 CA." certificate:
"It is a DEMO certificate and was never intended to be in any list of trusted
CA certificates."

(quote by Gtz Babin-Ebell, trustcenter.de)
2003-03-24 11:06:57 +00:00
Daniel Stenberg
f8b3c47f99 all those changes 2003-03-24 10:47:06 +00:00
Daniel Stenberg
56dd2da962 Hopefully this change addresses these two bug reports: 707003 and 706624.
We need to make sure that when we init a 'connectdata' struct and then
afterwards check for and re-use another one, we must be careful so that the
newly set values are transmitted and used in the surviving connectdata struct.
2003-03-21 08:09:48 +00:00
Daniel Stenberg
68bb74d172 lib/getdate.c.cvs may need a rename if you don't have yacc or bison 2003-03-20 15:12:43 +00:00
Daniel Stenberg
bf5e12c8e0 if the cvs update fails, don't continue further 2003-03-20 14:38:42 +00:00
Daniel Stenberg
de11f5e53a make the ENGINE depend on the USE_SSLEAY define too 2003-03-19 21:28:39 +00:00
Daniel Stenberg
b125e8e23a set binary mode for some file handling and it might work better on some
cygwin installations (using DOS-style files somehow?)
2003-03-19 09:26:29 +00:00
Daniel Stenberg
b28b616eb2 typecast the conversion from const char * to char * 2003-03-19 09:16:59 +00:00
Daniel Stenberg
4534ca238d Rename getdate.c to getdate.c.cvs, since the "normal" build procedure do
imply that yacc/bison exists and can generate this file. Those without one
of those tools can then checkout and rename the getdate.c.cvs file.
2003-03-19 09:09:40 +00:00
Daniel Stenberg
cee0e94294 clarify that 22 can be returned on --fail for all HTTP errors being 400
or above
2003-03-18 10:01:51 +00:00
Daniel Stenberg
8319ea7078 more defensive checking as platforms differ... 2003-03-17 17:20:26 +00:00
Daniel Stenberg
5334a58f9b Andy Cedilnik's corrections 2003-03-17 12:38:08 +00:00
Daniel Stenberg
2616bdc4cd it just never ends 2003-03-16 18:41:00 +00:00
Daniel Stenberg
c149b3f797 regenerated from getdate.y 2003-03-16 16:20:56 +00:00
Daniel Stenberg
d349eb3d43 Juan F. Codagnone pointed out a missing thing from the march 2 fix 2003-03-16 16:15:24 +00:00
Daniel Stenberg
9b43ade1c0 typecase getpid() to int to prevent compiler warning 2003-03-16 10:46:52 +00:00
Daniel Stenberg
ad05d0a8d9 figure out select()'s argument types 2003-03-15 21:04:01 +00:00
Daniel Stenberg
e6bfbe9683 Gisle Vanem's fix to get this working nicely on windows 2003-03-15 21:02:20 +00:00
Daniel Stenberg
c871efca4b Gisle Vanem fixed a name collision with structure '"CONTEXT" in <winnt.h> 2003-03-15 21:00:47 +00:00
Daniel Stenberg
12c72b419c missing newline added 2003-03-15 17:26:59 +00:00
Daniel Stenberg
a15b7691ca no server needed 2003-03-15 17:12:46 +00:00
Daniel Stenberg
01618d323b allow 'none' as server 2003-03-15 17:11:13 +00:00
Daniel Stenberg
bb6d0e37e3 Sort out the ENGINE problems people seem to be having. Now we put all ENGINE
related stuff within HAVE_OPENSSL_ENGINE_H and we don't make any private
typedef or similar if the header is missing...
2003-03-15 16:51:43 +00:00
Daniel Stenberg
24a6100897 * use the pid returned back from test-servers and kill them before starting
them the first time
* verify that the server we start really comes up fine and works as
  expected before continue
* count test cases where the server can't be run (for whatever reason)
* prefix lots of messages with RUN: to make it easier to realize which script
  is saying what when running tests verbose
* remove the generic sleep(1) from each test, makes the suite fly! ;-)

I hope these changes will make the tests run somewhat more reliably on more
platforms.
2003-03-15 16:43:58 +00:00
Daniel Stenberg
0251563c98 report pid back in the WE ROOLZ message 2003-03-15 16:39:15 +00:00
Daniel Stenberg
72673a351b removed the "banner" when the server is starting 2003-03-15 16:05:47 +00:00
Daniel Stenberg
96b7131844 detect lack of perl before running tests 2003-03-15 15:08:55 +00:00
Daniel Stenberg
dcc2f16416 Rick Jones' minor thing to build better on HPUX 11 2003-03-15 14:47:09 +00:00
Daniel Stenberg
c2b8a04000 Nico Baggus little adjustment to build with OpenSSL 0.9.7 (the ENGINE thing) 2003-03-14 17:21:06 +00:00
Daniel Stenberg
d65587b06c improved "deeper" check 2003-03-14 12:44:56 +00:00
Daniel Stenberg
1ab0134522 No longer halts operation if select or socket are missing, since in most
cases this is wrong... and if they're truly missing, we won't succeed to
link later on anyway.
2003-03-13 23:02:33 +00:00
Daniel Stenberg
afffce80f0 Philippe Raoult needed this to build on FreeBSD 2003-03-13 21:41:02 +00:00
Daniel Stenberg
70b80b0160 Extra function-find magic for platforms that don't like the way the
default AC_CHECK_FUNCS() work. HPUX 11 is one of them.
2003-03-13 17:06:55 +00:00
Daniel Stenberg
64067a04b5 output what cvs returned, see if we can make the script bail out when
cvs update fails
2003-03-13 15:56:31 +00:00
Daniel Stenberg
38cf0268c0 use include path from BUILD dir since we want the config.h 2003-03-13 15:54:46 +00:00
Daniel Stenberg
2d2034703f Things are moving along... 2003-03-12 14:29:47 +00:00
Daniel Stenberg
571ceeff90 When we append stuff to the URL, we must make sure the text is properly
URL encoded before. Test case 58 added to verify this.
2003-03-12 14:20:16 +00:00
Daniel Stenberg
34c4ba4321 -m on curl on windows with telnet doesn't work 2003-03-12 14:14:52 +00:00
Daniel Stenberg
babb372eb9 This verifies that my fix for bug report #700275 works. 2003-03-12 14:04:23 +00:00
Daniel Stenberg
5b9b82c1cd test58 added 2003-03-12 14:03:53 +00:00
Daniel Stenberg
075c534270 improved the header checks
--enable-libgcc
check for a sed before using it
2003-03-12 13:42:07 +00:00
Daniel Stenberg
f317f8b149 Add include files to prevent warnings on some (HPUX) systems. 2003-03-12 08:54:45 +00:00
Daniel Stenberg
f8d552dde5 include "config.h" from the lib's private dir 2003-03-12 08:54:11 +00:00
Daniel Stenberg
606f72bb13 Setup include path to the lib dir to enable inclusion of "config.h" 2003-03-12 08:53:44 +00:00
Daniel Stenberg
327e6a2b4f Made set_local_option() properly static as reported by Rick Jones 2003-03-12 08:44:00 +00:00
Daniel Stenberg
be8f6c7f5c Prefix defines and symbols with CURL_ to reduce the risk of colliding with
various system's other defines.
2003-03-12 08:40:45 +00:00
Daniel Stenberg
073448e0ea support a few more common typedefs 2003-03-12 08:11:24 +00:00
Daniel Stenberg
f136f435b5 Massige use of AC_HELP_STRING() all over makes the --help output so much
nicer!
2003-03-12 08:07:30 +00:00
Daniel Stenberg
ebea6b487b another week of changes, especially libtool gave us an adventure to remember 2003-03-11 19:22:10 +00:00
Daniel Stenberg
e5b7dc56e6 syntax error 2003-03-11 19:12:07 +00:00
Daniel Stenberg
c2d8025a0a Christophe Demory fixed the check to work better for non-blocking on HP-UX
systems. Bug report #701749.
2003-03-11 19:07:41 +00:00
Daniel Stenberg
853e240e1d Use ssize_t instead of 'int' to make the 64 bit sparc compiler happier.
Fix by Richard Gorton.
2003-03-11 18:58:21 +00:00
Daniel Stenberg
8755a6d1ac Richard Gorton improved the random_the_seed() function for systems where
we don't find/know of a good random source. This way, we get a better
randomness which in turn should make SSL connections more secure.
2003-03-11 18:55:34 +00:00
Daniel Stenberg
9f723061cb don't check for netinet/if_ether.h, we don't include it and it causes
configure warnings on many systems
2003-03-11 17:16:02 +00:00
Daniel Stenberg
652683fc04 Martin C. Martin's fix to produce an error message in case of failure
in the Curl_is_connected() function.
2003-03-11 16:28:23 +00:00
Daniel Stenberg
83a463891d added things to fix at the next major release/change 2003-03-10 20:46:54 +00:00
Daniel Stenberg
957b618fdc clarify 2003-03-10 20:43:59 +00:00
Daniel Stenberg
ebe5191b63 no the data is not freed, this is left for the app to do when needed 2003-03-10 17:01:11 +00:00
Daniel Stenberg
c426234df7 AAAARG
libtool 1.4.3 is scary as hell and caused just about every build on all sorts
of platforms to stop working, thanks to the fact that it ruquires a SED
variables somehow set by the configure script. It works fine on my linux
running autoconf 2.57 and automake 1.7 but others seem not to do as fine.

Reverting back to the ltmain.sh we had previously, which I believe is 1.4.2
including handmade patches for FreeBSD.

ALERT ALERT ALERT before we try 1.4.3 or similar versions again, check the
${SED} stuff and similar carefully.
2003-03-10 14:52:33 +00:00
Daniel Stenberg
8c3a10392e Include sys/types.h as well. Ray DeGennaro reports successful compiling on
AIX when this fix is applied and I cannot see how this will break any
systems.
2003-03-10 12:25:32 +00:00
Daniel Stenberg
d0e44946e9 figure out the path to a 'sed' as otherwise libtool gets crazy 2003-03-07 13:36:32 +00:00
Daniel Stenberg
46a593d968 libtoolize 1.4.3 brought these 2003-03-07 09:03:09 +00:00
Daniel Stenberg
eb0cc34951 Removed define, risc os build, POST-GET bug fixed, AIX 4.3 problems solved
and two makefiles fixed.
2003-03-04 06:41:50 +00:00
Daniel Stenberg
1c7dfda4bc output the md5sum as the last step 2003-03-03 23:26:39 +00:00
Daniel Stenberg
3c0e4a2fa1 Added share.obj 2003-03-03 22:39:34 +00:00
Daniel Stenberg
c753072ae1 moved the disable-thread warning to the switch code so that the AIX 4.3
automatic disable won't cause a warning
2003-03-03 22:31:58 +00:00
Daniel Stenberg
243942a7aa Detect AIX 4.3 or later, and if found disable the check for the thread-safe
*_r() functions as they're not needed (and if fact mess things up for us).
Brought to our attention by the friendly Troels Walsted Hansen in bug report
#696217.
2003-03-03 22:30:25 +00:00
Daniel Stenberg
8d5ac8b43c AIX 4.3 or later should use gethostbyname() and not the *_r() version. 2003-03-03 22:23:48 +00:00
Daniel Stenberg
17962b3d2e Added typecast to please the MSVC compiler. 2003-03-03 06:45:27 +00:00
Daniel Stenberg
f70acd5979 another typecast added to please the borland compiler 2003-03-03 06:42:52 +00:00
Daniel Stenberg
ffe5c46224 Add (void) on our uses of the swrite() macro when we don't read the return
code as this makes compiler warnings. We *should* fix the code to deal with
the return codes instead...
2003-03-03 06:40:36 +00:00
Daniel Stenberg
3242ea5f66 Init postdata properly before issuing a request, so that there isn't any
lingering POST-stuff that confuses GET requests. Juan F. Codagnone reported
this problem in bug report #653859.
2003-03-02 17:43:42 +00:00
Daniel Stenberg
39a282bffc moved a variable declaration to remove a compiler warnings with the MSVC
compiler, mentioned by Andi Jahja
2003-03-02 17:20:59 +00:00
Daniel Stenberg
29583004ce include the engine stuff 2003-02-28 15:50:05 +00:00
Daniel Stenberg
0a1a185874 Andres Garcia Garcia updated to build with the most recent OpenSSL and
the recent libcurl changes.
2003-02-28 15:49:32 +00:00
Daniel Stenberg
8f809e2a93 James Bursa made it compile on RISC OS as well. 2003-02-28 13:11:10 +00:00
Daniel Stenberg
f216059b49 James Bursa wrote a section about cross-compiling for RISC OS 2003-02-28 13:10:54 +00:00
Daniel Stenberg
9121b1f41d the strequal and strnequal should now be called with the proper curl_ prefix 2003-02-28 12:20:08 +00:00
Daniel Stenberg
60e015d0c1 Removed the defines for strequal() and strnequal(). 2003-02-28 12:17:56 +00:00
Daniel Stenberg
7e049fca61 recent stuff 2003-02-28 08:40:57 +00:00
Daniel Stenberg
0f0e4de6a4 mention what happens if size is set to -1 2003-02-28 07:55:01 +00:00
Daniel Stenberg
bc1102922b spell out that POSTFIELDS should be url-encoded in most cases 2003-02-28 07:53:31 +00:00
Daniel Stenberg
a3d3642a30 spell better 2003-02-27 23:10:38 +00:00
Daniel Stenberg
248eb47329 Updated to better reflect reality. Also displays how the CURLMsg struct
looks like.
2003-02-27 14:25:54 +00:00
Daniel Stenberg
52ebf50607 It appears that there are FTP-servers that return size 0 for files
when SIZE is used on the file while being in BINARY mode. To work
around that (stupid) behavior, we attempt to parse the RETR response
even if the SIZE returned size zero.

Debugging help from Salvatore Sorrentino on February 26, 2003.
2003-02-27 12:50:54 +00:00
Daniel Stenberg
d34a4b126e test138 is for RETR without size and without a working SIZE 2003-02-26 17:09:47 +00:00
Daniel Stenberg
de96719a45 support <size>-1</size> to completely disable the SIZE command 2003-02-26 17:05:36 +00:00
Daniel Stenberg
9876ed09fe added support for RETRNOSIZE in the control file to tell RETR to not
include size in the 150-reply
2003-02-26 16:57:00 +00:00
Daniel Stenberg
17cbbe3dc5 added a test case for RETR that doesn't get the size in the 150-reply 2003-02-26 16:56:00 +00:00
Daniel Stenberg
b995af17eb added index.html 2003-02-26 13:46:38 +00:00
Daniel Stenberg
6589579850 random updates 2003-02-26 13:01:29 +00:00
Daniel Stenberg
5ddc260fc2 No longer loop to read multiple times before returning back from the transfer
function, as this could easily end up looping for a very long time (more or
less until the whole transfer was done) and no library-using app would want
that.

Found thanks to a report by Kyle Sallee.
2003-02-26 12:42:25 +00:00
Daniel Stenberg
db5c9cd4c0 updated, now features less mentions about older versions 2003-02-25 08:52:32 +00:00
Daniel Stenberg
9b6d010aef better sslcerts link 2003-02-25 08:36:29 +00:00
Daniel Stenberg
065b87e949 7.10.4-pre2 commit 2003-02-24 18:14:48 +00:00
Daniel Stenberg
a6206a3aef Fixes to bring back the the "Expect: 100-continue" functionality. If the
header is used, we must wait for a 100-code (or timeout), before we send the
data. The timeout is merely 1000 ms at this point. We may have reason to set
a longer timeout in the future.
2003-02-24 16:53:53 +00:00
Daniel Stenberg
30639ed72b Kjetil Jacobsen found out that setting CURLOPT_MAXCONNECTS to a value higher
than 5 could cause a segfault.
2003-02-24 14:50:20 +00:00
Daniel Stenberg
9d02a39e13 fixed language for limit-rate 2003-02-24 13:28:32 +00:00
Daniel Stenberg
fc0af0d4d1 daily was weekly, added a little thing about feb 2003 2003-02-24 08:18:17 +00:00
Daniel Stenberg
a683416081 added an EXAMPLE section 2003-02-21 15:19:50 +00:00
Daniel Stenberg
9faf57ee8d how to disable FTP PORT 2003-02-17 23:23:11 +00:00
Daniel Stenberg
44b9ccb7e2 This script clearly misses to remove the build dir at times when it exits,
so we now remove everything matching "build-*" when the script starts.
2003-02-17 09:15:26 +00:00
Daniel Stenberg
de003d9cf8 mention --trace and --trace-ascii in the -v/--versbose section to remind
people how to get even more details shown
2003-02-17 09:02:51 +00:00
Daniel Stenberg
8a2a523c70 mention more cacert magic 2003-02-14 22:28:12 +00:00
Daniel Stenberg
c3dfe50aaf Fix Curl_is_connected() even more to deal with waitconnect() return codes
even better (also based on input from Martin).
2003-02-14 09:11:51 +00:00
Daniel Stenberg
9659d862c7 Matthew Clarke built curl on AIX 3.2.5 2003-02-14 09:06:07 +00:00
Daniel Stenberg
69ab4cd391 include <sys/socket.h> to compile the fd_set stuff properly on all systems 2003-02-14 09:03:03 +00:00
Daniel Stenberg
498f3985b3 geterrno() renamed to ourerrno() to prevent the name clash that occurred in
AIX 3.2.5 and possibly other OSF-like system headers.
2003-02-14 09:01:01 +00:00
Daniel Stenberg
977175d4fd Martin C. Martin's fix for multi-interface connects to non-listening ports. 2003-02-14 08:02:55 +00:00
Daniel Stenberg
3ddc7b9390 Christopher R. Palmer fixed Curl_base64_encode() to deal with zeroes in the
data to encode.
2003-02-13 18:30:10 +00:00
Daniel Stenberg
10e9bf623f language 2003-02-08 14:36:18 +00:00
Daniel Stenberg
48a5c64e94 include stdarg.h since we use va_* stuff 2003-02-06 19:28:17 +00:00
Daniel Stenberg
140606ccd5 I made curl run fine on a XScale/PXA250 2003-02-05 08:09:33 +00:00
Daniel Stenberg
f56d006f93 Re-arranged the SSL connection code (again). The recent fix was not a very
good one. This should work fine again.
2003-02-05 07:43:05 +00:00
Jean-Philippe Barette-LaPierre
beb13a1d3e added the sharing of DNS cache 2003-02-04 23:48:46 +00:00
Daniel Stenberg
fa47138327 VMS has setjmp.h 2003-02-04 22:28:36 +00:00
Daniel Stenberg
9421d4510a Nico Baggus updated build script for VMS 2003-02-04 22:28:19 +00:00
Daniel Stenberg
ff8abfca85 assume zlib 1.1.4 - pointed out by Kevin Roth 2003-02-04 18:24:55 +00:00
Daniel Stenberg
5c858965b8 HAVE_LIBZ is the actual name of the define we use 2003-02-04 18:23:41 +00:00
Daniel Stenberg
e3f83cb17a make it more obvious what this is by not even trying to show a manual 2003-02-04 18:22:31 +00:00
Daniel Stenberg
de6008e01a James Bursa corrected a bad comment 2003-02-04 18:12:41 +00:00
Daniel Stenberg
6417e696df fixes during the last couple of days 2003-02-04 12:33:13 +00:00
Daniel Stenberg
5d28f3781b Improved error reporting in case of bad SSL_connect()s, and we also no
longer use the SSL functions that store the error message in a static buffer
since that is not very multi-thread friendly.
2003-02-04 12:29:57 +00:00
Daniel Stenberg
10026bb62e scan through the PATH as well, to find stunnel 2003-02-03 22:15:33 +00:00
Daniel Stenberg
21c16f923c Julian Noble pointed out that capath is indeed working fine on Windows
these days since the c_rehash tool is written (fixed) to do the proper
action even on file systems that don't support symlinks.
2003-02-03 21:36:52 +00:00
Daniel Stenberg
32cef52f0d Kevin Roth corrected the zlib stuff to work better. 2003-01-31 07:07:28 +00:00
Daniel Stenberg
e7dd7c54ff don't check for the CA cert bundle if --insecure is used 2003-01-30 14:48:07 +00:00
Daniel Stenberg
b0b50bd12a typecast the argument to isspace() to an int to prevent warnings on some
compilers
2003-01-30 06:06:24 +00:00
Daniel Stenberg
f2c6057490 curl now uses stricter VERIFYHOST by default and only uses a lesser check
if --insecure is used. Reported by Hamish Mackenzie.
2003-01-30 05:15:57 +00:00
Daniel Stenberg
169b2eeb94 Fixes bug #669059. We now extract the Content-Type better and more accurate. 2003-01-30 05:04:02 +00:00
Daniel Stenberg
f81d027f60 test case 57 - verifies that the Content-Type extraction does not stop on
the first space anymore but cuts off the trailing spaces only.

Bug report #669059.
2003-01-30 05:03:19 +00:00
Daniel Stenberg
872eeb7339 changes from the last week or so 2003-01-29 13:56:04 +00:00
Daniel Stenberg
7f67a28c2a HAVE_WRITABLE_ARGV is set if argv[] is writable on the system, and then
we attempt to hide some of the more sensitive command line arguments
2003-01-29 13:16:03 +00:00
Daniel Stenberg
30a46e1135 John McGowan found a problem where the DEBUGFUNCTION was called with bad
data on uploads.
2003-01-29 12:52:45 +00:00
Daniel Stenberg
3a01478ce8 add the new emacs file and removed the former one 2003-01-29 12:15:16 +00:00
Daniel Stenberg
53d71fab60 example showing how a .emacs using curl-style.el could look like, thanks
to Mats Lidell for awesome elisp hacking!
2003-01-29 12:14:37 +00:00
Daniel Stenberg
be891f112c this is the former emacs file we no longer use, go with curl-style.el and
be happy!
2003-01-29 11:55:16 +00:00
Daniel Stenberg
89934239d7 reset conn->size to -1 on the ftp-do function to make it not go on to
ftp_done() with the previous transfer's value, as Dave Halbakken found out.
He also verified this fixed corrected the problem.
2003-01-29 10:54:39 +00:00
Daniel Stenberg
8986037fdd previous changes 2003-01-29 10:17:10 +00:00
Daniel Stenberg
a7c72b7abf removed the local variables for emacs and vim, use the new sample.emacs
way for emacs, and vim users should provide a similar non-polluting style
2003-01-29 10:14:20 +00:00
Daniel Stenberg
409ac80710 removed weirdo {{{ and }}} comments
removed emacs local-variables stuff
2003-01-29 10:12:06 +00:00
Daniel Stenberg
fc7bebdf55 the README.curl is named MANUAL these days 2003-01-28 16:33:05 +00:00
Daniel Stenberg
ca52549557 revised and better 2003-01-28 08:03:13 +00:00
Daniel Stenberg
8948a65654 removed -Wcast-align from --enable-debug with gcc, it just gives too many
warnings that I can't be concerned about at this point.
2003-01-27 14:26:06 +00:00
Daniel Stenberg
b4e33cfcc7 Removed the long-living compiler warnings on the des_pcbc_encrypt() function
calls!
2003-01-27 14:19:22 +00:00
Daniel Stenberg
86742e8334 tests that were not run due to restraints (the netrc-tests) were counted
as skipped twice, and thus the total number of tests appeared wrong
2003-01-27 13:51:35 +00:00
Daniel Stenberg
173b35eaf8 made it work
made it cause less compiler warnings
made it require 7.9.7 to build
2003-01-27 10:25:20 +00:00
Daniel Stenberg
2b054e5309 Bertrand Demiddelaer found and fixed this memory leak. 2003-01-24 11:13:59 +00:00
Daniel Stenberg
a302ff1605 string.h keeps the proto for memset() on some platforms, used for FD_ZERO 2003-01-23 19:41:30 +00:00
Daniel Stenberg
f7bb4e6138 added a default to the switch() in order to prevent a compiler warning 2003-01-23 12:00:15 +00:00
Daniel Stenberg
5c5489916b fix the configure option query 2003-01-23 07:37:21 +00:00
Daniel Stenberg
5627cf7167 mention what kind of error you may get if this is not followed 2003-01-23 06:15:26 +00:00
Daniel Stenberg
c05dae4a68 spell 2003-01-23 06:09:35 +00:00
Daniel Stenberg
57e61e3743 This is the new Emacs style for curl hacking, based on work written by
Mats Lidell in project Rockbox.
2003-01-23 06:00:02 +00:00
Daniel Stenberg
a6c395c156 Duncan Wilcox reported a crash with --interface on FreeBSD when ipv6-enabled
and this has been verified to correct the problem.
2003-01-23 05:38:20 +00:00
Daniel Stenberg
543e0b1e0f oops, broken comment fixed 2003-01-22 18:50:51 +00:00
Daniel Stenberg
64b0ff875f extern C this to work in C++ conditions 2003-01-22 18:30:58 +00:00
Daniel Stenberg
a034208a00 reversed the actions on the cmp check for detecting if we're re-running
a test on the same CVS setup as previous, as they seemed to be wrong.

We're not actually using the result for anything at this point though.
2003-01-22 12:29:19 +00:00
Daniel Stenberg
5f1251586b use LANG set to C to prevent localized dates etc 2003-01-22 09:46:33 +00:00
Daniel Stenberg
6f6cffdc32 pass the options to configure properly 2003-01-22 07:57:52 +00:00
Daniel Stenberg
21a98ef264 check for empty confopts before asking for it 2003-01-22 07:41:35 +00:00
Daniel Stenberg
aa90436435 put the configure options in the setup file was well
make -i
show lib/config.h
and some initial checks to prevent this running multiple times without the
CVS having changed
2003-01-22 06:59:52 +00:00
Daniel Stenberg
61225052f9 updated copyright years 2003-01-21 17:25:58 +00:00
Daniel Stenberg
dee3163d95 when a chunked error is noticed, store the error number in the error string
to enable better error-tracking
2003-01-21 16:03:38 +00:00
Daniel Stenberg
8b0668b99e skip the chmod 2003-01-21 15:09:20 +00:00
Daniel Stenberg
8471a82c85 run 'make test-full' instead of 'make test' to get more details in case of
errors
2003-01-21 10:36:35 +00:00
Daniel Stenberg
ed4dff63b9 make test-full in the root dir should run verbose tests but not stop on
single failures
2003-01-21 10:35:34 +00:00
Daniel Stenberg
838e776542 use 'make test-full' instead of only 'make test' as it gives a lot of more
info in case of failures
2003-01-21 10:33:29 +00:00
Daniel Stenberg
39c12790bc Added a 'test-full' target to run the tests in verbose mode. 2003-01-21 10:32:40 +00:00
Daniel Stenberg
126e6d6645 pass srcdir to the ftps-server as well 2003-01-21 10:29:06 +00:00
Daniel Stenberg
5796a1b282 runtests.pl now passes the sourcedir path to the httpsserver.pl script 2003-01-21 10:14:25 +00:00
Daniel Stenberg
90982529fc automake 1.5 should be enough 2003-01-21 09:36:15 +00:00
Daniel Stenberg
aba51d6b60 use process id in build directory name to do better 2003-01-20 20:20:51 +00:00
Daniel Stenberg
49bc4567bb first attempt at script for distributed testing on various unix hosts 2003-01-20 20:07:49 +00:00
Daniel Stenberg
2ac52705c6 output summary with easy identifyable string prefixes 2003-01-20 15:43:50 +00:00
Daniel Stenberg
d0eb56dd97 made this script detect proper versions of the tools we need to build a full
curl on a unix host from CVS
2003-01-20 15:24:54 +00:00
Daniel Stenberg
b9c60df04b added description in all AC_DEFINE() calls 2003-01-20 15:16:56 +00:00
Daniel Stenberg
8c236e4dfa not used anymore 2003-01-20 15:16:17 +00:00
Daniel Stenberg
154a59f21f Five more names we owe a big THANKS for their donations to the project. 2003-01-20 14:49:57 +00:00
Daniel Stenberg
9689e1c548 today's patches and Markus' correction 2003-01-20 14:40:06 +00:00
Daniel Stenberg
5a83976c99 Markus F.X.J. Oberhumer's patch that reduces memory usage quite a bit by
only allocating the scratch memory buffer once it is needed and not always
in the handle.
2003-01-20 12:52:34 +00:00
Daniel Stenberg
b5276a9a69 given passwords in netrc must be respected accordingly 2003-01-20 12:00:46 +00:00
Daniel Stenberg
30377baa5e steps I *MUST* perform when I release a package 2003-01-20 11:29:40 +00:00
Daniel Stenberg
aa8b7dd336 reverted bad header replacement 2003-01-16 21:10:10 +00:00
Daniel Stenberg
f26a338a54 copyright year update in the source header 2003-01-16 21:08:12 +00:00
Daniel Stenberg
c4383f1d99 fixes Marcus brought 2003-01-16 21:07:50 +00:00
Daniel Stenberg
4527995e66 Allow CURLINFO_PRIVATE to be NULL, patch by Markus Oberhumer 2003-01-16 10:59:53 +00:00
Daniel Stenberg
b0fbb98f41 Markus Oberhumer fixed the -cflags option 2003-01-16 10:58:49 +00:00
Daniel Stenberg
63667dfd96 no TABs in source code 2003-01-15 11:44:33 +00:00
Daniel Stenberg
77c388c928 removed a TAB 2003-01-15 11:43:03 +00:00
Daniel Stenberg
a69b814ded Kevin fixed the bad list address 2003-01-15 08:04:09 +00:00
Daniel Stenberg
c51ada766d previous legal file, no longer accurate nor used 2003-01-14 12:55:08 +00:00
Daniel Stenberg
ef2709f97c COPYING is the name of the file 2003-01-14 12:54:11 +00:00
Daniel Stenberg
bf9b9ca29d 7.10.3 commit 2003-01-14 12:42:26 +00:00
Daniel Stenberg
64f224bb22 more 2003-01-13 12:08:39 +00:00
Daniel Stenberg
285a8fe4d0 there is SOCKS support these days 2003-01-13 06:35:31 +00:00
Daniel Stenberg
3773d76dfd Steve Oliphant pointed out that test case 105 did not work anymore and this
was due to a missing fix for the password prompting
2003-01-10 16:19:32 +00:00
Daniel Stenberg
94c5c7bd6d added test 136 2003-01-09 16:48:51 +00:00
Daniel Stenberg
12cfc4c0b0 verify -u username: with ftp to use a blank password 2003-01-09 16:47:55 +00:00
Daniel Stenberg
9a2de6e6ee if userpwd is "username:", this now implies a blank password while only
"username" will cause libcurl to prompt for password. Bryan Kemp noticed.

test case 136 is added for this
2003-01-09 16:47:09 +00:00
Daniel Stenberg
2ede47b8c8 Wai (Simon) Liu provided the HTTP200ALIASES paragraph. 2003-01-09 15:04:55 +00:00
Daniel Stenberg
76e107506f Philippe Raoult's added note for HTTPHEADER 2003-01-09 14:58:54 +00:00
Daniel Stenberg
6f35ed51dc This fixed yet another connect problem with the multi interface and ipv4
stack. Kjetil Jacobsen reported and verified the fix.
2003-01-09 14:52:51 +00:00
Daniel Stenberg
c94ba66310 removed 2003-01-09 11:57:50 +00:00
Daniel Stenberg
a15133f5cf removed unused code 2003-01-09 11:50:34 +00:00
Daniel Stenberg
cc09e9d4c2 fix 2003-01-09 11:43:08 +00:00
Daniel Stenberg
16e0da2c4b call curl_multi_perform() correctly 2003-01-09 11:42:07 +00:00
Daniel Stenberg
ed22f75241 proper indent 2003-01-09 11:31:49 +00:00
Daniel Stenberg
ba25cad6e2 pass a file name to memanalyze to read from instead of using stdin 2003-01-09 11:26:57 +00:00
Daniel Stenberg
abb01123cb share.h is now a used header file 2003-01-09 11:19:51 +00:00
Daniel Stenberg
e2d249f8c5 fixed to deal with file names that contain colons, as in Windows 2003-01-09 11:03:02 +00:00
Daniel Stenberg
4a2ac166fa 7.10.3-pre4 2003-01-09 10:36:24 +00:00
Daniel Stenberg
5fab55383d rename the curl share error enum prefix 2003-01-09 10:26:29 +00:00
Daniel Stenberg
f152f23a68 Updated more and now looks and and the API possibly works almost like the
design document specifies. There is still no code inside that uses this.
2003-01-09 10:21:03 +00:00
Daniel Stenberg
24e78b3571 7+8 jan 2003 2003-01-09 09:53:08 +00:00
Daniel Stenberg
9a239edb52 updated to use the modified share-types 2003-01-08 15:50:52 +00:00
Daniel Stenberg
abcc5c5a82 cleaned up the share data types and prototypes to be more in line what
the design draft mentioned and what I think is fit
2003-01-08 15:50:06 +00:00
Daniel Stenberg
cb5ba675a7 mkdir() fix for win32 2003-01-08 15:04:42 +00:00
Daniel Stenberg
2288086695 nah, include test.h instead 2003-01-08 09:37:35 +00:00
Daniel Stenberg
61421b7a8f include curl.h without directory 2003-01-08 09:33:19 +00:00
Jean-Philippe Barette-LaPierre
6a7e53a7c7 fixed a very, very rare and very, very little memory leak 2003-01-08 02:27:47 +00:00
Daniel Stenberg
ca134d5522 Philippe Raoult's fix to handle wildcard certificate name checks 2003-01-07 16:33:11 +00:00
Daniel Stenberg
ec24efda74 Simon Liu's HTTP200ALIASES-patch! 2003-01-07 16:15:53 +00:00
Daniel Stenberg
7f0f10e498 stuff 2003-01-07 15:40:01 +00:00
Daniel Stenberg
aa5af100b4 clarified error code 19 2003-01-07 15:39:38 +00:00
Daniel Stenberg
37ae32f688 Only output valid filetime.
Return file-error if 550 is returned when trying MDTM
2003-01-07 11:25:44 +00:00
Daniel Stenberg
d0cffdec5d when sending an error message to the debugfunction, we append a newline so
that the output looks better
2003-01-07 11:23:52 +00:00
Daniel Stenberg
0f34521612 fixed the create_dir_hierarchy() to not use uninited memory, as noticed by
Matthew Blain.
2003-01-07 09:35:57 +00:00
Daniel Stenberg
e69362df22 Matthew Blain's improvements for debug builds 2003-01-07 09:31:45 +00:00
Daniel Stenberg
3de8f6f38e better ignore 2003-01-07 09:30:05 +00:00
Daniel Stenberg
5359bc8083 ignore lib504 too 2003-01-07 09:27:32 +00:00
Daniel Stenberg
eb6a14fe10 updated 2003-01-07 07:54:14 +00:00
Daniel Stenberg
2912537533 indent fix 2003-01-06 12:41:33 +00:00
Sterling Hughes
cfb32da198 fix bug (?) :-)
previously, if you called curl_easy_perform and then set the global dns
cache, the global cache wouldn't be used.  I don't see this really happening
in practice, but this code allows you to do it.
2003-01-06 06:17:15 +00:00
Daniel Stenberg
9b4f92130f return -1 even if SSL_pending() doesn't return non-zero, as we don't really
care how many bytes that is readable NOW. Philippe Raoult reported the
bug in 7.10.3-pre3.
2002-12-29 16:27:31 +00:00
Daniel Stenberg
5a2ab686a6 Marc Herbert's suggstion: mention that insecure is ignored if cacert or capath
is used.
2002-12-29 16:23:52 +00:00
Daniel Stenberg
3b8583b014 example configure command line 2002-12-20 16:00:56 +00:00
Daniel Stenberg
ed29552b1e Use AM_MAINTAINER_MODE which thus makes less maintainer stuff in the default
makefile when --enable-maintainer-mode is not used.
2002-12-20 15:54:24 +00:00
Daniel Stenberg
a2ada3cf96 7.10.3-commit 2002-12-20 09:03:38 +00:00
Daniel Stenberg
88825a1187 fixes 2002-12-19 16:37:07 +00:00
Daniel Stenberg
264e7fc58b removed fruitless attempts to overload some targets 2002-12-19 16:36:35 +00:00
Daniel Stenberg
1698015e3c Curl_base64_decode() fixed by Matthew B 2002-12-19 16:02:51 +00:00
Daniel Stenberg
39dc14c002 Fixed the usage of SSL_read() to properly return -1 if the EWOULDBLOCK
situation occurs, which it previously didn't!

This was reptoed by Evan Jordan in bug report #653022.

Also, if ERROR_SYSCALL is returned from SSL_write(), include the errno number
in the error string for easier error detection.
2002-12-19 15:45:15 +00:00
Daniel Stenberg
04c499a5fc CURLOPT_DNS_USE_GLOBAL_CACHE is not thread-safe 2002-12-19 15:22:36 +00:00
Daniel Stenberg
efbe930a69 CURLE_HTTP_NOT_FOUND => CURLE_HTTP_RETURNED_ERROR 2002-12-18 16:51:02 +00:00
Daniel Stenberg
747f87f61e Removed weird special multi interface condition that caused bug report
#651464.
2002-12-17 10:05:00 +00:00
Daniel Stenberg
5a4c56fc44 don't install the test programs 2002-12-17 09:40:13 +00:00
Daniel Stenberg
81f45ba92a writefunction data is not zero terminated 2002-12-16 17:33:21 +00:00
Daniel Stenberg
a5dc4e32f2 removed junk 2002-12-16 15:32:37 +00:00
Daniel Stenberg
2b839853ec Added test case 504, using multi interface and a local proxy without anything
listening on the port we use.
2002-12-16 15:30:10 +00:00
Daniel Stenberg
66b6cd68ed better desc 2002-12-16 15:05:31 +00:00
Daniel Stenberg
0ef3d90838 mistake, this only requires http 2002-12-16 14:50:10 +00:00
Daniel Stenberg
5cc50f9b27 the hostip.c commit 2002-12-16 11:40:57 +00:00
Daniel Stenberg
e879e26a5b EAGAIN on older (correct) glibc versions indicate a problem and not the need
for a bigger buffer and this is indeed badness for us. Making this work
on both old and new glibc versions require an ugly loop that in its worse
form cause 45 bad loops when using the correct glibc and a non-resolving
host name... :-/

We want a better fix. Badly.
2002-12-16 11:33:44 +00:00
Daniel Stenberg
96d84150e1 changes from last week 2002-12-16 10:55:18 +00:00
Daniel Stenberg
2aa0c6c488 cut off -O properly when building for debug
setup the Makefile in tests/libtest/
2002-12-16 10:31:25 +00:00
Daniel Stenberg
811138386f documented the %-variables 2002-12-13 16:25:39 +00:00
Daniel Stenberg
c433cf7459 fixed another space issue 2002-12-13 16:24:57 +00:00
Daniel Stenberg
e0d6ebc2f2 please mr CVS ignore these 2002-12-13 16:24:04 +00:00
Daniel Stenberg
4938991ab8 set up arg2 to point to argv[2] to be used at will by programs 2002-12-13 16:22:57 +00:00
Daniel Stenberg
13722f536e added 503 2002-12-13 16:22:17 +00:00
Daniel Stenberg
57f0e3292d used this to verify bug report 651460 2002-12-13 16:21:18 +00:00
Daniel Stenberg
da5ae565ab added support for CONNECT, both good and bad 2002-12-13 16:20:07 +00:00
Daniel Stenberg
87c5066242 test case 503 entered the dir 2002-12-13 16:17:27 +00:00
Daniel Stenberg
b528bde470 conn->bits.tcpconnect now keeps track of if this connection is connected
or not
2002-12-13 16:15:19 +00:00
Daniel Stenberg
57572e550f include files without the curl/ to reduce the risk of us including the wrong
set of include files during tests
2002-12-13 14:14:35 +00:00
Daniel Stenberg
3aea0d3d68 Evan Jordan's fix for a memory leak. Bug report 650989. 2002-12-13 14:08:49 +00:00
Daniel Stenberg
9ae920c1b6 make a little work-around for file:// in _is_connected() and voila, now the
multi interface works with file:// URLs fine (previously it crashed). This
won't make it work on Windows though...
2002-12-13 13:47:58 +00:00
Daniel Stenberg
dff406a360 one slash too many 2002-12-13 13:41:28 +00:00
Daniel Stenberg
d346ba5c3c lib502.c for multi interface tests on a single URL without select() 2002-12-13 13:40:25 +00:00
Daniel Stenberg
978541adc2 test 502, multi interface with file:// 2002-12-13 13:39:39 +00:00
Daniel Stenberg
637bce2707 bail out on crap received, makes test case 402 *NOT* ruin the test series
anymore!
2002-12-12 18:07:10 +00:00
Daniel Stenberg
07e3dc2ee2 missing space added, nows run old tests fine again 2002-12-12 16:46:45 +00:00
Daniel Stenberg
ead065d803 remove test piece 2002-12-12 13:44:26 +00:00
Daniel Stenberg
0150bff7b4 make ftps and https invoke both necessary servers 2002-12-12 13:42:21 +00:00
Daniel Stenberg
0f493b6038 fixes 2002-12-12 13:40:16 +00:00
Daniel Stenberg
f26b709c50 link the test tools this way instead 2002-12-12 13:39:02 +00:00
Daniel Stenberg
ae10d9cf22 no more 2002-12-12 13:36:50 +00:00
Daniel Stenberg
81af9674ed corrected 2002-12-12 12:49:29 +00:00
Daniel Stenberg
b63df7991a new subdir added 'libtest' 2002-12-12 12:20:33 +00:00
Daniel Stenberg
a79990465c supports the new 'tool' and 'server' tags 2002-12-12 12:20:06 +00:00
Daniel Stenberg
ad6bd530ac describe the new sections added for (better) libcurl testing 2002-12-12 12:15:02 +00:00
Daniel Stenberg
c1b369fd4c 500 + 501 added 2002-12-12 12:13:18 +00:00
Daniel Stenberg
01fcd3c2d5 run tiny specific libcurl-testing tools 2002-12-12 12:12:01 +00:00
Daniel Stenberg
7196d784d3 The first ever attempts to do pure libcurl test cases 2002-12-12 12:11:16 +00:00
Daniel Stenberg
0f0aaf51e0 Deal with HTML where ' is used instead of "
Cut off name from option
2002-12-12 11:43:59 +00:00
Daniel Stenberg
b5f493c55a moved the includes to outside the extern "C" stuff
decreased the write buffer size to 16KB to perform a lot better on Windows(!)
2002-12-11 11:42:40 +00:00
Daniel Stenberg
0aa031beb9 recent fluff 2002-12-10 13:11:24 +00:00
Daniel Stenberg
db6ff224f8 The initial HTTP request can now be sent in multiple parts, as part of the
regular transfer process. This required some new tweaks, like for example
we need to be able to tell the tranfer loop to not chunky-encode uploads
while we're transferring the rest of the request...
2002-12-10 13:10:00 +00:00
Daniel Stenberg
b3c7cd61f3 send_buffer is no more here 2002-12-10 13:08:22 +00:00
Daniel Stenberg
9ae05c4d91 added test56, nearly 100KB big! 2002-12-10 13:01:05 +00:00
Daniel Stenberg
264e6f6efd Test case for sending insanely big HTTP requests. Mainly done this way to
make sure that it isn't all sent off in one single send() but instead
really tests the multiple-part-send logic.
2002-12-10 13:00:32 +00:00
Daniel Stenberg
ec7bccf671 more logging, now logs the full response too, basic support for dealing
with chunked transfer-encoding uploads added
2002-12-10 12:59:16 +00:00
Daniel Stenberg
49f75ee8ce A normal POST now provides data to the main transfer loop via the usual
read callback, and thus won't put a lot of stress on the request sending
code (which currently does an ugly loop).
2002-12-09 16:05:57 +00:00
Daniel Stenberg
4bcc866c52 The fread() callback pointer and associated pointer is now stored in the
connectdata struct instead, and is no longer modified within the 'set' struct
as previously (which was a really BAAAD thing).
2002-12-09 15:37:54 +00:00
Daniel Stenberg
c65e088caf Added a default headers section and also made some minor details more
up-to-date with recent changes.
2002-12-09 14:39:01 +00:00
Daniel Stenberg
6ca4116555 better errno include and no extern 2002-12-05 19:39:17 +00:00
Daniel Stenberg
f6cdb820af read and write as much as possible until end of data or EWOULDBLOCK before
returning back to the select() loop. Consider this a test so far.
2002-12-05 14:26:30 +00:00
Daniel Stenberg
081e5a82ff deal with spaces in name and value tags a lot better! 2002-12-05 12:54:08 +00:00
Daniel Stenberg
2ad2a4bd9f changed proto for Curl_krb_kauth() 2002-12-05 11:26:20 +00:00
Daniel Stenberg
645e700da3 Solaris needs errno as an extern int. 2002-12-05 11:25:36 +00:00
Daniel Stenberg
92aea29a30 make WIN32 defined for Borland properly, as told by Alexander J. Oss 2002-12-04 11:06:17 +00:00
Daniel Stenberg
e1c01af929 called SSLCERTS now 2002-12-04 09:53:09 +00:00
Daniel Stenberg
7ef749497d 7.10.3-pre2 2002-12-04 09:09:26 +00:00
Daniel Stenberg
d72aa49126 The waiting for the 226 or 250 line expected to come after a transfer is
complete is now only made for 60 seconds and if no data was received during
those 60 seconds, we store a special error message (preparing to make this
a special error code) as this most likely means that the control connection
has died while we were transferring data.
2002-12-04 08:56:55 +00:00
Daniel Stenberg
e92bd312ec missing } 2002-12-03 12:41:10 +00:00
Daniel Stenberg
b097c2cfb0 clarified 2002-12-03 12:40:12 +00:00
Daniel Stenberg
a39cdc80b7 Jeff pointed out this flaw in the example 2002-12-03 12:34:43 +00:00
Daniel Stenberg
a47250810e -@ is no longer an official shortcut for --create-dirs 2002-12-03 11:13:12 +00:00
Daniel Stenberg
1f50f3031f don't officially use -@ for --create-dirs, only use the long form 2002-12-03 11:12:18 +00:00
Daniel Stenberg
75145dd753 clarify the DEBUGFUNCTION data not being zero terminated 2002-12-03 10:37:20 +00:00
Daniel Stenberg
d0b97f7e1f Curl_GetFTPResponse() takes a different set of parameters and now return a
proper CURLcode. The default timeout for reading one response is now also
possible to change while running.
2002-12-03 10:25:31 +00:00
Daniel Stenberg
199a0311e2 updated to reality 2002-12-03 09:32:57 +00:00
Daniel Stenberg
fa446f860f Nicolas Berloquin's fix of his previous dir creation patch 2002-12-03 08:07:52 +00:00
Daniel Stenberg
7a74303f3c Nicolas Berloquin's description of his -@/--create-dirs fix 2002-12-02 14:40:54 +00:00
Daniel Stenberg
7d9eabb981 Nicolas Berloquin's added code for dealing with -@/--create-dirs to create
the necessary directories as specified with -o.
2002-12-02 14:37:59 +00:00
Daniel Stenberg
ff5308a5af if the PWD reply parser failed, we leaked memory 2002-12-02 07:18:24 +00:00
Daniel Stenberg
3f8ba3a986 clarified SSL_VERIFYPEER and SSL_VERIFYHOST a bit, thanks to Soren Spies 2002-12-02 06:47:16 +00:00
Daniel Stenberg
4a555de1b2 wrapped the line for PRIVATE nicer 2002-12-01 11:23:06 +00:00
Daniel Stenberg
d27e4a08f9 more to ignore 2002-12-01 11:21:36 +00:00
Daniel Stenberg
bf678a1ca9 only use Content-Length: header if not transfering data chunked 2002-12-01 11:20:41 +00:00
Daniel Stenberg
13a903de28 mention CVS-INFO for more info when checked out from CVS
removed old section about problems with old autoconfs, I don't think that
happens anymore
2002-11-30 16:00:10 +00:00
Daniel Stenberg
a3c14c031e stuff done since the 7.10.2 release 2002-11-29 08:29:21 +00:00
Daniel Stenberg
e90d528026 let the Curl_FormReader() return 0 when it reaches end of data to that the
chunked transfer work
2002-11-29 08:12:20 +00:00
Daniel Stenberg
d64dd77993 fix the hash init to call the correct dns cleanup function 2002-11-28 15:48:54 +00:00
Daniel Stenberg
113850a748 added compareheader proto 2002-11-28 15:48:23 +00:00
Daniel Stenberg
1c49a00d64 compareheader() was moved over to http.c and got a Curl_ prefix
The chunked transfer upload never stopped due to a silly add before we checked
for >0!
2002-11-28 15:46:22 +00:00
Daniel Stenberg
eef6c83503 Moved the compareheader function into this file and added Curl_ prefix
We now check if the chunked transfer-encoding header has been added "by force"
and if so, we enabled the chunky upload!
2002-11-28 15:45:06 +00:00
Daniel Stenberg
ceb5648eb7 mention how to generate patches 2002-11-28 14:07:14 +00:00
Daniel Stenberg
a0eadb76ea bad use of AM_CONDITIONAL removed and now configure runs better when used
with --disable-ipv6 --without-zlib
2002-11-28 13:29:42 +00:00
Daniel Stenberg
065852e46c execve.net is an official download mirror in HK 2002-11-27 11:59:52 +00:00
Daniel Stenberg
e5e2fb8274 Dan Becker fixed a minor memory leak on persistent connnections using
FOLLOWLOCATION and CURLOPT_USERPWD.
2002-11-26 17:32:15 +00:00
Daniel Stenberg
0210b3c893 removed extra space from trace output 'Send data' 2002-11-26 17:13:30 +00:00
Daniel Stenberg
7df5677b46 fixed Curl_freeaddrinfo() to only free addrinfo, and added Curl_freednsinfo()
for freeing single dns cache entries
2002-11-26 09:41:54 +00:00
sm
2e71876b28 Removed MFC dependency in Release Build when using VC++ IDE 2002-11-26 02:12:27 +00:00
Daniel Stenberg
11576b1142 Nedelcho Stanev's work-around for SFU 3.0 2002-11-24 19:30:21 +00:00
Daniel Stenberg
ce011b8a2d bug fix for the problem Juan Ignacio Hervs discovered today 2002-11-22 16:59:40 +00:00
Daniel Stenberg
12cfb4f7ee this fix seems to make the '305 306' test case combination to run ok finally! 2002-11-22 13:48:24 +00:00
Daniel Stenberg
9e1123debe don't use curl.haxx.se 2002-11-22 07:39:15 +00:00
Daniel Stenberg
c7354142c0 dead code removal 2002-11-21 15:11:26 +00:00
Daniel Stenberg
dee84f448f new name, supports <textarea> and the <option> tags within <select> better 2002-11-21 15:09:04 +00:00
Daniel Stenberg
1607711603 4.12 Why do I get "certificate verify failed" ? 2002-11-20 19:17:43 +00:00
Daniel Stenberg
8bca5e05b8 Kjetil Jacobsen's patch that introduces CURLOPT_PRIVATE and CURLINFO_PRIVATE
for storage and retrieval of private data in the curl handle.
2002-11-20 19:11:22 +00:00
Daniel Stenberg
f68505ee23 Karol Pietrzak pointed out that simply including the include dir in --cflags
is not a good thing, as recent gccs for example complain if it is /usr/include

Right now, we just output "" until we think of something better.
2002-11-20 19:04:34 +00:00
195 changed files with 6819 additions and 6363 deletions

539
CHANGES
View File

@@ -6,6 +6,543 @@
Changelog Changelog
Version 7.10.4 (2 Apr 2003)
Daniel (1 Apr)
- Added test case 505 to exercise FTP upload with rename done with libcurl,
and for that I had to extend the test suite's FTP server to deal with the
RNFR and RNTO commands.
Daniel (31 Mar)
- Even more SSL config check modifications after Richard's testing.
Version 7.10.4-pre6 (31 Mar 2003)
Daniel (31 Mar)
- More fixes for the SSL session ID cache checks when SSL configs are changed
between connections. Based on tests and talks with Richard Bramante.
- Guillaume Cottenceau provided a patch that added CURLOPT_UNRESTRICTED_AUTH.
When enabled, it will prevent libcurl from limiting to which host it sends
user+password to when following locations. By default, libcurl only sends
name and password to the original host used in the first URL, but with this
option set it will send the auth info to all hosts it follows location
headers to. The new tool command line option for this is named
"--location-trusted".
- Frankie Fong reported a problem with libcurl if you re-used an easy handle
with a proxy, and you first made a https:// connction to a host and then
switched to a http:// one to the same host. libcurl would then wrongly re-use
the same connection for it and fail to get the second URL properly
Daniel (29 Mar)
- Dan Shearer's fix that makes curl complain if invoked with nothing but "curl
-O" was applied.
Daniel (26 Mar)
- Bryan Kemp was friendly enough to lend me an account on his Redhat 9 box and
I could fix the configure problems on redhat 8.1 and 9 in no time thanks to
this. Thanks a bunch Bryan!
Daniel (25 Mar)
- Renamed configure.in to configure.ac
Version 7.10.4-pre5 (25 Mar 2003)
Daniel (25 Mar)
- Richard Bramante provided a fix for a handle re-use problem seen when you
change options on an SSL-enabled connection between requests. Previously,
changing peer verification or host verification and similar things was not
taken into account when a connection were checked for re-use and thus
enabling stricter check between requests on a re-used connection made no
difference and the connection would thus be used erroneously.
Daniel (24 Mar)
- G<>tz Babin-Ebell pointed out that the ca-bundle.crt file contained a
certificate from Trustcenter that was a demo certificate only that was never
indended to be part of a CA bundle.
Daniel (21 Mar)
- Life is a mystery. Within a time period of 17 hours, Tim Pope and Michael
Churchill filed one bug report each, both identifying problems with a second
transfer when doing persistant transfers re-using a connection. Tim's one is
#706624, labeled "Multiple uploads per handle fail" and Michael's #707003
"Does not send Authorization: header when reusing connection". I could track
both down to the same piece of logic and it turned out libcurl was not using
new settings properly when re-using an existing connection. This concerned
both uploading and downloading and involved exactly those pieces these two
reports identified. This code has been this faulty since the day I
introduced persistant connection support in libcurl, more than 2 years ago.
Daniel (20 Mar 2003)
- Five year anniversary. Today five years ago, the first ever curl release saw
the light of day.
Daniel (17 Mar)
- Andy Cedilnik corrected flaws in some libcurl example-usage sources.
Daniel (16 Mar)
- Juan F. Codagnone reported that the fix from March 2nd was incomplete.
- Added code to the configure.in to check for select() argument types. I've
not made any code use the results just yet though.
Daniel (15 Mar)
- Gisle Vanem provided two patches to build better on Windows.
- Adjusted the test suite code to better make sure that the server(s) required
for a specific test is properly started before the test case is attempted.
Many tests now run a lot faster than before.
Daniel (14 Mar)
- Another configure.in adjustment made the configure detect functions properly
on HPUX now.
Daniel (13 Mar)
- Philippe Raoult fixed pre4-compile quirks for FreeBSD.
Version 7.10.4-pre4 (13 Mar 2003)
Daniel (13 Mar)
- Added a backup-check for functions that aren't found by AC_CHECK_FUNCS()
as I believe some checks on HPUX need this. At least some of the info given
to us by Rick Jones seemed to indicate this.
Daniel (12 Mar)
- Thomas Tonino found out that if you used the curl tool to do PUT operations
as in 'curl www.foo.com/dir/ -T file' and the file name included for example
space or other characters that don't belong in URLs, curl did not properly
URL encode them before using them in the URL.
- Added an option to configure called --enable-libgcc that simply adds -lgcc
to the LIBS variable, as this seems to be a common problem.
- I modified the configure.in file, so that the headers are now checked in an
order of "viality". We must also make sure to use the "default headers"
parameter to AC_CHECK_HEADERS() so that headers are checked with the proper
prerequisites included (i.e all the major and generally important header
files are included there by default). This might be what we need for various
Sun, HP, AIX and Tru64 systems to behave good again on the header check
front.
- Rick Jones pointed out a few compiler warnings on HP-UX that I addressed.
- I made the configure --help output nicer by using AC_HELP_STRING() a lot
more.
Daniel (11 Mar)
- Christophe Demory fixed the socket sending code to work better on HP-UX
when sending data to a socket that would block. It then returns EAGAIN, not
EWOULDBLOCK.
- Richard Gorton improved the seeding function for systems without a good
and reliable random source.
- Richard Gorton fixed a few warnings that popped up when you built curl
using the Sun compiler on a 64bit SPARC platform.
- Martin C. Martin fixed a case where a connect failure using the multi
interface didn't produce a human readable error string.
Daniel (10 Mar)
- Reverted ltmain.sh back to libtool 1.4.2 status again, as the 1.4.3 version
broke the build on numerous platforms. It seems that libtool 1.4.3 puts some
requirements on what versions of the other tools (autoconf + automake) that
I am not familiar with and thus I couldn't fulfill at this point.
Yes, this is more than mildly frustrating.
Daniel (7 Mar)
- Run libtoolize version 1.4.3.
Version 7.10.4-pre3 (4 Mar 2003)
Daniel (3 Mar)
- Added share.obj to the VC6 and Borland libcurl makefiles.
- Troels Walsted Hansen found and investigated a problem with libcurl on AIX,
presumably only on 4.3 or later. gethostbyname_r() is not returning data
that is possible to "keep" and cache the way libcurl does. But instead these
versions of AIX uses a gethostbyname() that works thread-safely we can
instead use the ordinary gethostbyname() and our pack_hostent() approach to
achieve what we want. The configure script now attempts to detect AIX 4.3 or
later to adjust for this.
Daniel (2 Mar)
- Juan F. Codagnone found a problem introduced in 7.10.3 when you first did a
POST and then back to a GET using the same easy handle.
Daniel (28 Feb)
- Removed the strequal and strnequal defines from curl/curl.h header. They
were never meant for the public header anyway. Philippe Raoult brought it
up.
- James Bursa fixed the RISC OS build.
Daniel (27 Feb)
- Avery Fay pointed out the very misleading curl_multi_info_read man page, and
I updated it to become more accurate.
- Salvatore Sorrentino found a problem with FTP downloading that turned out to
be his FTP server returning size zero (0 bytes) when SIZE was used on a file
while being in BINARY mode. We now make a second check for the actual size
by scanning the RETR reply anyway, even if the SIZE command returned 0.
Daniel (26 Feb)
- Kyle Sallee reported a case where he would do a transfer that didn't update
the progress meter properly. It turned out to be a case where libcurl would
loop a little too eagerly in the tranfer loop, which isn't really good for
the APIs, especially not the multi API.
Version 7.10.4-pre2 (24 Feb 2003)
Daniel (24 Feb)
- Kjetil Jacobsen found out that setting CURLOPT_MAXCONNECTS to a value higher
than 5 could cause a segfault.
- I believe I fixed the 'Expect: 100-continue' behavior that has been broken
for a while (I think since my change dated Dec 10 2002). When this header is
used, libcurl should wait for a HTTP 100 (or timeout) before sending the
post/put data.
Daniel (14 Feb)
- Matthew Clarke provided some info what to modify to make curl build
flawlessly on AIX 3.2.5.
- Martin C. Martin found and fixed a problem in the multi interface when
running on Windows and trying to connect to a port without a listener.
Daniel (13 Feb)
- Christopher R. Palmer fixed Curl_base64_encode() to deal with zeroes in the
data to encode.
Daniel (4 Feb)
- Jean-Philippe added the first code that enables the 'share' system. This
should now enable sharing of DNS data between two curl easy handles.
- Incorporated Nico Baggus' fixes to again compile flawlessly on VMS.
- James Bursa corrected a bad comment in the public include file curl/multi.h
- Peter Forret reported one of those error:00000000 cases in libcurl again
when connecting to a HTTPS site, and this time I did discover some oddities
in how curl reports SSL errors back. It could miss showing the actual error.
Version 7.10.4-pre1 (3 Feb 2003)
Daniel (3 Feb)
- Removed things in the docs saying capath doesn't work on Windows, as Julian
Noble told us it works fine.
Daniel (31 Jan)
- Kevin Roth fixed the zlib build stuff in the Mingw32 makefile.
Daniel (30 Jan)
- Kevin Roth found out that curl on Windows always checked for the CA cert
bundle using the environment variable and the path scan, even though
-k/--insecure was used.
- Hamish Mackenzie pointed out that curl only did strict host name verifying
if capath or cainfo was used. Now it'll always do it unless -k / --insecure
is used!
- Pavel Cenek pointed out that the Content-Type extraction was done wrongly
as the full string was not fetched. Added test case 57 to verify that curl
does it right now.
Daniel (29 Jan)
- Jamie Wilkinson provided a patch that now makes curl attempt to clear out
"sensitive" command line arguments so that they don't appear in ps outputs
(only on platforms that allow writing to argv[]).
- John McGowan found out that the DEBUGFUNCTION could be called with bad
arguments and thus cause the --trace outputs to go wrong.
- Removed all the emacs local variables from all files. Mats Lidell provided
the new sample.emacs file (for a sample of what to include in your .emacs)
and the curl-style.el that sets a better c-style for editing curl sources.
- Dave Halbakken found a problem with FTP downloads that could accidently
return CURLE_PARTIAL_FILE when curl_easy_perform() was called with NOBODY
set TRUE.
Daniel (27 Jan)
- The fopen.c example was flawed as Nick Humfrey noticed, and I fixed it to
work again.
Daniel (24 Jan)
- Bertrand Demiddelaer found and fixed a memory leak (the content-type string)
when following locations.
Daniel (22 Jan 2003)
- Ian Wilkes and Legoff Vincent both independently provided fixes for making
curl/multi.h work properly when compiled with a C++ compiler.
Daniel (20 Jan 2003)
- Fixed 'buildconf' to check version number of the required tools before
they're actually used.
- Wrote 'testcurl.sh', a script targeted for automatic and distributed curl
tests on various platforms.
- David Thiel pointed out that the .netrc file was not being dealt with
properly anymore. I broke this in the password prompting "fix".
- Markus F.X.J. Oberhumer patched libcurl to allocate the scratch buffer only
on demand and thus we save 32KB in each curl handle that don't use that
buffer. This need appeared when some people started using thousands of
simultaneous curl handles... :-)
Daniel (16 Jan 2003)
- Markus Oberhumer fixed curl-config --cflags when the includedir was not
/usr/include.
- Markus Oberhumer fixed CURLINFO_PRIVATE to properly return NULL if it was
set to NULL!
Version 7.10.3 (14 Jan 2003)
Daniel (10 Jan 2003)
- Steve Oliphant pointed out that test case 105 did not work anymore and this
was due to a missing fix for the password prompting.
Version 7.10.3-pre6 (10 Jan 2003)
Daniel (9 Jan 2003)
- Bryan Kemp pointed out that curl -u could not provide a blank password
without prompting the user. It can now. -u username: makes the password
empty, while -u username makes curl prompt the user for a password.
- Kjetil Jacobsen found a remaining connect problem in the multi interface on
ipv4 systems (Linux only?), that I fixed and Kjetil verified that it fixed
his problems.
- memanalyze.pl now reads a file name from the command line, and no longer
takes the data on stdin as before.
Version 7.10.3-pre5 (9 Jan 2003)
Daniel (9 Jan 2003)
- Fixed tests/memanalyze.pl to work with file names that contain colons (as on
Windows).
- Kjetil Jacobsen quickly pointed out that lib/share.h was missing...
Version 7.10.3-pre4 (9 Jan 2003)
Daniel (9 Jan 2003)
- Updated lib/share.c quite a bit to match the design document at
http://curl.haxx.se/dev/sharing.txt a lot more.
I'll try to update the document soonish. share.c is still not actually used
by libcurl, but the API is slowly getting there and we can start
implementing code that takes advantage of this system.
Daniel (8 Jan 2003)
- Updated share stuff in curl/curl.h, including data types, structs and
function prototypes. The corresponding files in lib/ were also modified
of course to remain compilable. Based on input from Jean-Philippe and also
to make it more in line with the design document.
- Jean-Philippe Barrette-LaPierre patched a very trivial memory leak in
curl_escape() that would happen when realloc() returns NULL...
- Matthew Blain provided feedback to make the --create-dirs stuff build
properly on Windows.
- Fixed the #include in tests/libtest/first.c as Legoff Vincent pointed out.
Daniel (7 Jan 2003)
- Philippe Raoult provided a patch that now makes libcurl properly support
wildcard checks for certificate names.
- Simon Liu added CURLOPT_HTTP200ALIASES, to let an application set other
strings recognized as "HTTP 200" to allow http-like protocols to get
downloaded fine by curl.
- Now using autoconf 2.57 and automake 1.7.2
- Doing "curl -I ftp://domain/non-existing-file" still outputed a date!
Wayne Haigh reported.
- The error message is now written properly with a newline in the --trace
file.
Daniel (6 Jan 2003)
- Sterling Hughes fixed a possible bug: previously, if you called
curl_easy_perform and then set the global dns cache, the global cache
wouldn't be used. Pointed out by Jean-Philippe Barrette-LaPierre.
- Matthew Blain's fixed the VC6 libcurl makefile to include better debug data
on debug builds.
Daniel (27 Dec 2002)
- Philippe Raoult reported a bug with HTTPS connections which I evidently
added in my 19 dec fix. I corrected it.
Daniel (20 Dec)
- Idea from the Debian latest patch: use AM_MAINTAINER_MODE in the configure
script to make the default makefile less confusing "to the casual
installer".
Version 7.10.3-pre3 (20 Dec)
Daniel (19 Dec)
- Matthew Blain patched the Curl_base64_decode() function.
- Evan Jordan reported in bug report #653022 that the SSL_read() usage was
wrong, and it certainly was. It could lead to curl using too much CPU due to
a stupid loop.
Daniel (18 Dec)
- As suggested by Margus Freudenthal, CURLE_HTTP_NOT_FOUND was renamed to
CURLE_HTTP_RETURNED_ERROR since it is returned on any >= 400 code when
CURLOPT_FAILONERROR is set.
Daniel (17 Dec)
- Bug reported #651464, reported by Christopher Palmer, provided an example
source code using the multi interface that hang when trying to connect to a
proxy on a localhost port where no proxy was listening. This bug was not
repeatable on libcurls that were IPv6-enabled.
Daniel (16 Dec)
- Christopher Palmer also noticed what Vojtech Janota already was
experiencing: The attempted name resolve fix for glibc 2.2.93 caused libcurl
to crash when used on some older glibc versions. The problem is of course
the silliness of the 2.2.93. I committed a fix that hopefully should make
the binary run fine on either one of the versions, even though the solution
is not as nice as I'd like it to be.
Daniel (13 Dec)
- Bug report #651460 by Christopher R. Palmer showed that when using libcurl
to for example go over a proxy on localhost, it would attempt to connect
through the proxy TWICE.
I added test case 503 with which I managed to repeat this problem and I
fixed the code to not re-attempt any connects (which also made it a nicer
fix for the #650941 bug mentioned below).
The sws server was extended to deal with CONNECT in order to make test
case 503 do good.
- Evan Jordan posted bug report #650989 about a memory leak in the public key
retrieving code. He provided a suggested fix and I merely applied it!
- Bug report #650941, posted by Christopher R. Palmer identified a problem
with the multi interface and getting file:// URLs. This was now fixed and
test case 502 was added to verify this.
Daniel (12 Dec)
- Test case 500 and 501 are the first ever libcurl test cases that run.
- Made "configure --enable-debug" cut off all -O* options to the compiler
- Finally fixed the test suite's ftp server so that test case 402 doesn't
cause the following test case to fail anymore!
Daniel (11 Dec)
- CURL_MAX_WRITE_SIZE is now decreased to 16KB since it makes the Windows
version perform uploads much faster!!! RBramante did lots of research on
this topic.
- Fixed the #include in curl/curl.h to include the other files outside the
extern "C" scope.
Daniel (10 Dec)
- Moved around and added more logic:
First, POST data is never sent as part of the request headers in the http.c
code. It is always sent the "normal" read callback then send() way. This now
enables a plain HTTP POST to be sent chunked if we want to. This also
reduces the risk of having very big POSTs causing problems.
Further, sending off the initial HTTP request is not done using a loop
anymore. If it wasn't all sent off in the first send(), the rest of the
request is sent off in the normal transfer select() loop. This makes several
things possible, but mainly it makes libcurl block less when used from the
multi interface and it also reduces the risk of problems with issuing very
large requests.
Daniel (9 Dec)
- Moved the read callback pointer and data within the structs to a more
suitable place. This in preparation for a better HTTP-request sending code
without (a silly) loop.
- The Dodds fix seems not to work.
- Vojtech Janota tests proved that the resolve fix from oct 21st is not good
enough since obviously older glibcs might return EAGAIN without this meaning
that the buffer was too small.
- [the other day] Made libcurl loop on recv() and send() now until done, and
then get back to select(). Previously it went back to select() more often
which really was a slight overhead. This was due to the reported performance
problems on HTTP PUT on Windows. I couldn't see any notable difference on
Linux...
Version 7.10.3-pre2 (4 Dec 2002)
Daniel (4 Dec 2002)
- Lots of work with Malcolm Dodds made me add a temporary code fix that now
shortens the timeout waiting for the 226 or 250 line after a completed
FTP transfer.
If no data is received within 60 seconds, this is taken as a sign of a dead
control connection and we bail out.
Daniel (3 Dec 2002)
- Ralph's bug report #644841 identified a problem in which curl returned a
timeout error code when in fact the problem was not a timeout. The proper
error should now be propagated better when they're detected in the FTP
response reading function.
- Updated the Borland Makefiles.
Daniel (2 Dec 2002)
- Nicolas Berloquin provided a patch that introduced --create-dirs to the
command line tool. When used in combination with -o, it lets curl create
[non-existing] directories used in -o, suitably used with #-combinations
such as:
curl "www.images.com/{flowers,cities,parks,mountains}/pic_[1-100].jpg \
-o "dir_#1/pic#2.jpg" --create-dirs
Version 7.10.3-pre1
Daniel (28 Nov 2002)
- I visited Lars Nordgren and had a go with his problem, which lead me to
implement this fix. If libcurl detects the added custom header
"Transfer-Encoding: chunked", it will now enable a chunked transfer.
Also, chunked transfer didn't quite work before but seems to do so now.
- Kjetil Jacobsen pointed out that ./configure --disable-ipv6 --without-zlib
didn't work on any platform...
Daniel (26 Nov 2002)
- Fixed a bad addrinfo free in the hostip.c code, hardly exposed anywhere
- Dan Becker found and fixed a minor memory leak on persistent connnections
using CURLOPT_USERPWD.
Daniel (22 Nov 2002)
- Based on Ralph Mitchell's excellent analysis I found a bug in the test suite
web server (sws) which now lets test case 306 run fine even in combination
with the other test cases.
- Juan Ignacio Herv<72>s found a crash in the verbose connect message that is
used on persistent connections. This bug was added in 7.10.2 due to the
rearranged name resolve code.
Daniel (20 Nov 2002)
- Kjetil Jacobsen provided a patch that introduces:
CURLOPT_PRIVATE stores a private pointer in the curl handle.
CURLINFO_PRIVATE retrieves the private pointer from the curl handle.
- Karol Pietrzak pointed out how curl-config --cflags didn't output a good
include dir so I've removed that for now.
Version 7.10.2 (18 Nov 2002) Version 7.10.2 (18 Nov 2002)
@@ -1342,4 +1879,4 @@ Daniel (2 January 2002)
changes done on dec-20 made test case 104 cease to work (in both branches). changes done on dec-20 made test case 104 cease to work (in both branches).
- Philip Gladstone pointed out a few portability problems in the source code - Philip Gladstone pointed out a few portability problems in the source code
that didn't compile on 64-bit sparcs using Sun's native that didn't compile on 64-bit sparcs using Sun's native compiler.

View File

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

View File

@@ -15,7 +15,8 @@ Compile and build instructions follow below.
CHANGES.0 contains ancient changes. CHANGES.0 contains ancient changes.
CHANGES.$year contains changes for the particular year. CHANGES.$year contains changes for the particular year.
memanalyze.pl is for analyzing the output generated by curl if -DMALLOCDEBUG tests/memanalyze.pl
is for analyzing the output generated by curl if -DMALLOCDEBUG
is used when compiling is used when compiling
buildconf builds the makefiles and configure stuff buildconf builds the makefiles and configure stuff
@@ -30,6 +31,11 @@ To build after having extracted everything from CVS, do this:
./configure ./configure
make make
Daniel uses a ./configure line similar to this for easier development:
./configure --disable-shared --enable-debug --enable-maintainer-mode
REQUIREMENTS REQUIREMENTS
You need the following software installed: You need the following software installed:
@@ -39,12 +45,19 @@ REQUIREMENTS
o libtool 1.4 (or later) o libtool 1.4 (or later)
o GNU m4 (required by autoconf) o GNU m4 (required by autoconf)
o nroff + perl (if you don't have nroff and perl and you for some reason o nroff + perl
don't want to install them, you can rename the source file
src/hugehelp.c.cvs to src/hugehelp.c and avoid having to generate this If you don't have nroff and perl and you for some reason don't want to
file. This will of course give you an older version of the file that isn't install them, you can rename the source file src/hugehelp.c.cvs to
up-to-date. That file was checked in once and won't be updated very src/hugehelp.c and avoid having to generate this file. This will of course
regularly.) give you an older version of the file that isn't up-to-date. That file was
checked in once and won't be updated very regularly.
o yacc/bison
If you don't have yacc or bison, you must rename the lib/getdate.c.cvs file
to lib/getdate.c to be able to build libcurl. yacc/bison is normally used
to generate the lib/getdate.c file from the lib/getdate.y source file.
MAC OS X MAC OS X

25
LEGAL
View File

@@ -1,25 +0,0 @@
Copyright (C) 1998-2002, Daniel Stenberg, <daniel@haxx.se>, et al.
Everyone is permitted to copy and distribute verbatim copies of this license
document, but changing it is not allowed.
In order to be useful for every potential user, the curl and libcurl are
dual-licensed under the MPL and the MIT/X-derivate licenses.
You may opt to use, copy, modify, merge, publish, distribute and/or sell
copies of the Software, and permit persons to whom the Software is furnished
to do so, under the terms of the MPL or the MIT/X-derivate licenses. You may
pick one of these licenses. The files MITX.txt and MPL-1.1.txt contain the
license texts.
As a courtesy to the open-source and free software community, we ask you to
dual-license any modifications that you make as well, under the terms of this
document.
Please remember to always keep the licensing information included in
individual source files up-to-date, so as to avoid misleading anyone as to
the status of these files.
I will use a submission policy according to which I will only enter
contributions into the CVS tree if the contributor agrees to both licenses
and this dual-license approach.

View File

@@ -1,21 +0,0 @@
COPYRIGHT AND PERMISSION NOTICE
Copyright (c) 1996 - 2002, Daniel Stenberg, <daniel@haxx.se>.
All rights reserved.
Permission to use, copy, modify, and distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright
notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of a copyright holder shall not
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization of the copyright holder.

View File

@@ -1,470 +0,0 @@
MOZILLA PUBLIC LICENSE
Version 1.1
---------------
1. Definitions.
1.0.1. "Commercial Use" means distribution or otherwise making the
Covered Code available to a third party.
1.1. "Contributor" means each entity that creates or contributes to
the creation of Modifications.
1.2. "Contributor Version" means the combination of the Original
Code, prior Modifications used by a Contributor, and the Modifications
made by that particular Contributor.
1.3. "Covered Code" means the Original Code or Modifications or the
combination of the Original Code and Modifications, in each case
including portions thereof.
1.4. "Electronic Distribution Mechanism" means a mechanism generally
accepted in the software development community for the electronic
transfer of data.
1.5. "Executable" means Covered Code in any form other than Source
Code.
1.6. "Initial Developer" means the individual or entity identified
as the Initial Developer in the Source Code notice required by Exhibit
A.
1.7. "Larger Work" means a work which combines Covered Code or
portions thereof with code not governed by the terms of this License.
1.8. "License" means this document.
1.8.1. "Licensable" means having the right to grant, to the maximum
extent possible, whether at the time of the initial grant or
subsequently acquired, any and all of the rights conveyed herein.
1.9. "Modifications" means any addition to or deletion from the
substance or structure of either the Original Code or any previous
Modifications. When Covered Code is released as a series of files, a
Modification is:
A. Any addition to or deletion from the contents of a file
containing Original Code or previous Modifications.
B. Any new file that contains any part of the Original Code or
previous Modifications.
1.10. "Original Code" means Source Code of computer software code
which is described in the Source Code notice required by Exhibit A as
Original Code, and which, at the time of its release under this
License is not already Covered Code governed by this License.
1.10.1. "Patent Claims" means any patent claim(s), now owned or
hereafter acquired, including without limitation, method, process,
and apparatus claims, in any patent Licensable by grantor.
1.11. "Source Code" means the preferred form of the Covered Code for
making modifications to it, including all modules it contains, plus
any associated interface definition files, scripts used to control
compilation and installation of an Executable, or source code
differential comparisons against either the Original Code or another
well known, available Covered Code of the Contributor's choice. The
Source Code can be in a compressed or archival form, provided the
appropriate decompression or de-archiving software is widely available
for no charge.
1.12. "You" (or "Your") means an individual or a legal entity
exercising rights under, and complying with all of the terms of, this
License or a future version of this License issued under Section 6.1.
For legal entities, "You" includes any entity which controls, is
controlled by, or is under common control with You. For purposes of
this definition, "control" means (a) the power, direct or indirect,
to cause the direction or management of such entity, whether by
contract or otherwise, or (b) ownership of more than fifty percent
(50%) of the outstanding shares or beneficial ownership of such
entity.
2. Source Code License.
2.1. The Initial Developer Grant.
The Initial Developer hereby grants You a world-wide, royalty-free,
non-exclusive license, subject to third party intellectual property
claims:
(a) under intellectual property rights (other than patent or
trademark) Licensable by Initial Developer to use, reproduce,
modify, display, perform, sublicense and distribute the Original
Code (or portions thereof) with or without Modifications, and/or
as part of a Larger Work; and
(b) under Patents Claims infringed by the making, using or
selling of Original Code, to make, have made, use, practice,
sell, and offer for sale, and/or otherwise dispose of the
Original Code (or portions thereof).
(c) the licenses granted in this Section 2.1(a) and (b) are
effective on the date Initial Developer first distributes
Original Code under the terms of this License.
(d) Notwithstanding Section 2.1(b) above, no patent license is
granted: 1) for code that You delete from the Original Code; 2)
separate from the Original Code; or 3) for infringements caused
by: i) the modification of the Original Code or ii) the
combination of the Original Code with other software or devices.
2.2. Contributor Grant.
Subject to third party intellectual property claims, each Contributor
hereby grants You a world-wide, royalty-free, non-exclusive license
(a) under intellectual property rights (other than patent or
trademark) Licensable by Contributor, to use, reproduce, modify,
display, perform, sublicense and distribute the Modifications
created by such Contributor (or portions thereof) either on an
unmodified basis, with other Modifications, as Covered Code
and/or as part of a Larger Work; and
(b) under Patent Claims infringed by the making, using, or
selling of Modifications made by that Contributor either alone
and/or in combination with its Contributor Version (or portions
of such combination), to make, use, sell, offer for sale, have
made, and/or otherwise dispose of: 1) Modifications made by that
Contributor (or portions thereof); and 2) the combination of
Modifications made by that Contributor with its Contributor
Version (or portions of such combination).
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
effective on the date Contributor first makes Commercial Use of
the Covered Code.
(d) Notwithstanding Section 2.2(b) above, no patent license is
granted: 1) for any code that Contributor has deleted from the
Contributor Version; 2) separate from the Contributor Version;
3) for infringements caused by: i) third party modifications of
Contributor Version or ii) the combination of Modifications made
by that Contributor with other software (except as part of the
Contributor Version) or other devices; or 4) under Patent Claims
infringed by Covered Code in the absence of Modifications made by
that Contributor.
3. Distribution Obligations.
3.1. Application of License.
The Modifications which You create or to which You contribute are
governed by the terms of this License, including without limitation
Section 2.2. The Source Code version of Covered Code may be
distributed only under the terms of this License or a future version
of this License released under Section 6.1, and You must include a
copy of this License with every copy of the Source Code You
distribute. You may not offer or impose any terms on any Source Code
version that alters or restricts the applicable version of this
License or the recipients' rights hereunder. However, You may include
an additional document offering the additional rights described in
Section 3.5.
3.2. Availability of Source Code.
Any Modification which You create or to which You contribute must be
made available in Source Code form under the terms of this License
either on the same media as an Executable version or via an accepted
Electronic Distribution Mechanism to anyone to whom you made an
Executable version available; and if made available via Electronic
Distribution Mechanism, must remain available for at least twelve (12)
months after the date it initially became available, or at least six
(6) months after a subsequent version of that particular Modification
has been made available to such recipients. You are responsible for
ensuring that the Source Code version remains available even if the
Electronic Distribution Mechanism is maintained by a third party.
3.3. Description of Modifications.
You must cause all Covered Code to which You contribute to contain a
file documenting the changes You made to create that Covered Code and
the date of any change. You must include a prominent statement that
the Modification is derived, directly or indirectly, from Original
Code provided by the Initial Developer and including the name of the
Initial Developer in (a) the Source Code, and (b) in any notice in an
Executable version or related documentation in which You describe the
origin or ownership of the Covered Code.
3.4. Intellectual Property Matters
(a) Third Party Claims.
If Contributor has knowledge that a license under a third party's
intellectual property rights is required to exercise the rights
granted by such Contributor under Sections 2.1 or 2.2,
Contributor must include a text file with the Source Code
distribution titled "LEGAL" which describes the claim and the
party making the claim in sufficient detail that a recipient will
know whom to contact. If Contributor obtains such knowledge after
the Modification is made available as described in Section 3.2,
Contributor shall promptly modify the LEGAL file in all copies
Contributor makes available thereafter and shall take other steps
(such as notifying appropriate mailing lists or newsgroups)
reasonably calculated to inform those who received the Covered
Code that new knowledge has been obtained.
(b) Contributor APIs.
If Contributor's Modifications include an application programming
interface and Contributor has knowledge of patent licenses which
are reasonably necessary to implement that API, Contributor must
also include this information in the LEGAL file.
(c) Representations.
Contributor represents that, except as disclosed pursuant to
Section 3.4(a) above, Contributor believes that Contributor's
Modifications are Contributor's original creation(s) and/or
Contributor has sufficient rights to grant the rights conveyed by
this License.
3.5. Required Notices.
You must duplicate the notice in Exhibit A in each file of the Source
Code. If it is not possible to put such notice in a particular Source
Code file due to its structure, then You must include such notice in a
location (such as a relevant directory) where a user would be likely
to look for such a notice. If You created one or more Modification(s)
You may add your name as a Contributor to the notice described in
Exhibit A. You must also duplicate this License in any documentation
for the Source Code where You describe recipients' rights or ownership
rights relating to Covered Code. You may choose to offer, and to
charge a fee for, warranty, support, indemnity or liability
obligations to one or more recipients of Covered Code. However, You
may do so only on Your own behalf, and not on behalf of the Initial
Developer or any Contributor. You must make it absolutely clear than
any such warranty, support, indemnity or liability obligation is
offered by You alone, and You hereby agree to indemnify the Initial
Developer and every Contributor for any liability incurred by the
Initial Developer or such Contributor as a result of warranty,
support, indemnity or liability terms You offer.
3.6. Distribution of Executable Versions.
You may distribute Covered Code in Executable form only if the
requirements of Section 3.1-3.5 have been met for that Covered Code,
and if You include a notice stating that the Source Code version of
the Covered Code is available under the terms of this License,
including a description of how and where You have fulfilled the
obligations of Section 3.2. The notice must be conspicuously included
in any notice in an Executable version, related documentation or
collateral in which You describe recipients' rights relating to the
Covered Code. You may distribute the Executable version of Covered
Code or ownership rights under a license of Your choice, which may
contain terms different from this License, provided that You are in
compliance with the terms of this License and that the license for the
Executable version does not attempt to limit or alter the recipient's
rights in the Source Code version from the rights set forth in this
License. If You distribute the Executable version under a different
license You must make it absolutely clear that any terms which differ
from this License are offered by You alone, not by the Initial
Developer or any Contributor. You hereby agree to indemnify the
Initial Developer and every Contributor for any liability incurred by
the Initial Developer or such Contributor as a result of any such
terms You offer.
3.7. Larger Works.
You may create a Larger Work by combining Covered Code with other code
not governed by the terms of this License and distribute the Larger
Work as a single product. In such a case, You must make sure the
requirements of this License are fulfilled for the Covered Code.
4. Inability to Comply Due to Statute or Regulation.
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Code due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description
must be included in the LEGAL file described in Section 3.4 and must
be included with all distributions of the Source Code. Except to the
extent prohibited by statute or regulation, such description must be
sufficiently detailed for a recipient of ordinary skill to be able to
understand it.
5. Application of this License.
This License applies to code to which the Initial Developer has
attached the notice in Exhibit A and to related Covered Code.
6. Versions of the License.
6.1. New Versions.
Netscape Communications Corporation ("Netscape") may publish revised
and/or new versions of the License from time to time. Each version
will be given a distinguishing version number.
6.2. Effect of New Versions.
Once Covered Code has been published under a particular version of the
License, You may always continue to use it under the terms of that
version. You may also choose to use such Covered Code under the terms
of any subsequent version of the License published by Netscape. No one
other than Netscape has the right to modify the terms applicable to
Covered Code created under this License.
6.3. Derivative Works.
If You create or use a modified version of this License (which you may
only do in order to apply it to code which is not already Covered Code
governed by this License), You must (a) rename Your license so that
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
"MPL", "NPL" or any confusingly similar phrase do not appear in your
license (except to note that your license differs from this License)
and (b) otherwise make it clear that Your version of the license
contains terms which differ from the Mozilla Public License and
Netscape Public License. (Filling in the name of the Initial
Developer, Original Code or Contributor in the notice described in
Exhibit A shall not of themselves be deemed to be modifications of
this License.)
7. DISCLAIMER OF WARRANTY.
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
8. TERMINATION.
8.1. This License and the rights granted hereunder will terminate
automatically if You fail to comply with terms herein and fail to cure
such breach within 30 days of becoming aware of the breach. All
sublicenses to the Covered Code which are properly granted shall
survive any termination of this License. Provisions which, by their
nature, must remain in effect beyond the termination of this License
shall survive.
8.2. If You initiate litigation by asserting a patent infringement
claim (excluding declatory judgment actions) against Initial Developer
or a Contributor (the Initial Developer or Contributor against whom
You file such action is referred to as "Participant") alleging that:
(a) such Participant's Contributor Version directly or indirectly
infringes any patent, then any and all rights granted by such
Participant to You under Sections 2.1 and/or 2.2 of this License
shall, upon 60 days notice from Participant terminate prospectively,
unless if within 60 days after receipt of notice You either: (i)
agree in writing to pay Participant a mutually agreeable reasonable
royalty for Your past and future use of Modifications made by such
Participant, or (ii) withdraw Your litigation claim with respect to
the Contributor Version against such Participant. If within 60 days
of notice, a reasonable royalty and payment arrangement are not
mutually agreed upon in writing by the parties or the litigation claim
is not withdrawn, the rights granted by Participant to You under
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
the 60 day notice period specified above.
(b) any software, hardware, or device, other than such Participant's
Contributor Version, directly or indirectly infringes any patent, then
any rights granted to You by such Participant under Sections 2.1(b)
and 2.2(b) are revoked effective as of the date You first made, used,
sold, distributed, or had made, Modifications made by that
Participant.
8.3. If You assert a patent infringement claim against Participant
alleging that such Participant's Contributor Version directly or
indirectly infringes any patent where such claim is resolved (such as
by license or settlement) prior to the initiation of patent
infringement litigation, then the reasonable value of the licenses
granted by such Participant under Sections 2.1 or 2.2 shall be taken
into account in determining the amount or value of any payment or
license.
8.4. In the event of termination under Sections 8.1 or 8.2 above,
all end user license agreements (excluding distributors and resellers)
which have been validly granted by You or any distributor hereunder
prior to termination shall survive termination.
9. LIMITATION OF LIABILITY.
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
10. U.S. GOVERNMENT END USERS.
The Covered Code is a "commercial item," as that term is defined in
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
software" and "commercial computer software documentation," as such
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
all U.S. Government End Users acquire Covered Code with only those
rights set forth herein.
11. MISCELLANEOUS.
This License represents the complete agreement concerning subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. This License shall be governed by
California law provisions (except to the extent applicable law, if
any, provides otherwise), excluding its conflict-of-law provisions.
With respect to disputes in which at least one party is a citizen of,
or an entity chartered or registered to do business in the United
States of America, any litigation relating to this License shall be
subject to the jurisdiction of the Federal Courts of the Northern
District of California, with venue lying in Santa Clara County,
California, with the losing party responsible for costs, including
without limitation, court costs and reasonable attorneys' fees and
expenses. The application of the United Nations Convention on
Contracts for the International Sale of Goods is expressly excluded.
Any law or regulation which provides that the language of a contract
shall be construed against the drafter shall not apply to this
License.
12. RESPONSIBILITY FOR CLAIMS.
As between Initial Developer and the Contributors, each party is
responsible for claims and damages arising, directly or indirectly,
out of its utilization of rights under this License and You agree to
work with Initial Developer and Contributors to distribute such
responsibility on an equitable basis. Nothing herein is intended or
shall be deemed to constitute any admission of liability.
13. MULTIPLE-LICENSED CODE.
Initial Developer may designate portions of the Covered Code as
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
Developer permits you to utilize portions of the Covered Code under
Your choice of the NPL or the alternative licenses, if any, specified
by the Initial Developer in the file described in Exhibit A.
EXHIBIT A -Mozilla Public License.
``The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS"
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.
The Original Code is ______________________________________.
The Initial Developer of the Original Code is ________________________.
Portions created by ______________________ are Copyright (C) ______
_______________________. All Rights Reserved.
Contributor(s): ______________________________________.
Alternatively, the contents of this file may be used under the terms
of the _____ license (the "[___] License"), in which case the
provisions of [______] License are applicable instead of those
above. If you wish to allow use of your version of this file only
under the terms of the [____] License and not to allow others to use
your version of this file under the MPL, indicate your decision by
deleting the provisions above and replace them with the notice and
other provisions required by the [___] License. If you do not delete
the provisions above, a recipient may use your version of this file
under either the MPL or the [___] License."
[NOTE: The text of this Exhibit A may differ slightly from the text of
the notices in the Source Code files of the Original Code. You should
use the text of this Exhibit A rather than the text found in the
Original Code Source Code for Your Modifications.]

View File

@@ -5,7 +5,7 @@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
EXTRA_DIST = CHANGES COPYING maketgz SSLCERTS reconf Makefile.dist \ EXTRA_DIST = CHANGES COPYING maketgz SSLCERTS reconf Makefile.dist \
curl-config.in build_vms.com curl-mode.el curl-config.in build_vms.com curl-style.el sample.emacs testcurl.sh
bin_SCRIPTS = curl-config bin_SCRIPTS = curl-config
@@ -13,6 +13,7 @@ SUBDIRS = docs lib src include tests packages
# create a root makefile in the distribution: # create a root makefile in the distribution:
dist-hook: dist-hook:
rm -rf $(top_builddir)/tests/log
cp $(srcdir)/Makefile.dist $(distdir)/Makefile cp $(srcdir)/Makefile.dist $(distdir)/Makefile
html: html:
@@ -26,6 +27,9 @@ check: test
test: test:
@(cd tests; $(MAKE) quiet-test) @(cd tests; $(MAKE) quiet-test)
test-full:
@(cd tests; $(MAKE) full-test)
# #
# Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros # Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros
# must contain the following line: # must contain the following line:

32
README
View File

@@ -11,27 +11,41 @@ README
MANUAL document. Find out how to install Curl by reading the INSTALL MANUAL document. Find out how to install Curl by reading the INSTALL
document. document.
libcurl is a library that Curl is using to do its job. It is readily libcurl is the library curl is using to do its job. It is readily
available to be used by your software. Read the libcurl.3 man page to available to be used by your software. Read the libcurl.3 man page to
find out how! learn how!
You find answers to the most frequent questions we get in the FAQ document. You find answers to the most frequent questions we get in the FAQ document.
Study the LEGAL file for distribution terms and similar. Study the COPYING file for distribution terms and similar.
CONTACT
If you have problems, questions, ideas or suggestions, please contact us
by posting to a suitable mailing list. See http://curl.haxx.se/mail/
Many major contributors to the project are listed in the THANKS document.
WEB SITE
Visit the curl web site or mirrors for the latest news: Visit the curl web site or mirrors for the latest news:
http://curl.haxx.se/ Sweden -- http://curl.haxx.se/
http://curl.sf.net/ US -- http://curl.sf.net/
http://curl.planetmirror.com/ Australia -- http://curl.planetmirror.com/
DOWNLOAD
The official download mirror sites are: The official download mirror sites are:
Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/ Sweden -- ftp://ftp.sunet.se/pub/www/utilities/curl/
Sweden -- http://cool.haxx.se/curl/ Sweden -- http://cool.haxx.se/curl/
Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/ Germany -- ftp://ftp.fu-berlin.de/pub/unix/network/curl/
Australia -- http://curl.planetmirror.com/pub/curl/ Australia -- http://curl.planetmirror.com/download/
US -- http://curl.sourceforge.net/download.html US -- http://curl.sourceforge.net/download/
Hongkong -- http://www.execve.net/curl/
CVS
To download the very latest source off the CVS server do this: To download the very latest source off the CVS server do this:
@@ -47,6 +61,8 @@ README
(you're off the hook!) (you're off the hook!)
NOTICE
Curl contains pieces of source code that is Copyright (c) 1998, 1999 Curl contains pieces of source code that is Copyright (c) 1998, 1999
Kungliga Tekniska H<>gskolan. This notice is included here to comply with the Kungliga Tekniska H<>gskolan. This notice is included here to comply with the
distribution terms. distribution terms.

View File

@@ -6,9 +6,9 @@ default. This is done by installing a default CA cert bundle on 'make install'
(or similar), that CA bundle package is used by default on operations against (or similar), that CA bundle package is used by default on operations against
SSL servers. SSL servers.
Alas, if you communicate with HTTPS servers using certifcates that are signed Alas, if you communicate with HTTPS servers using certificates that are signed
by CAs present in the bundle, you will not notice any changed behavior and you by CAs present in the bundle, you will not notice any changed behavior and you
will seeminglessly get a higher security level on your SSL connections since will seamlessly get a higher security level on your SSL connections since you
can be sure that the remote server really is the one it claims to be. can be sure that the remote server really is the one it claims to be.
If the remote server uses a self-signed certificate, or if you don't install If the remote server uses a self-signed certificate, or if you don't install
@@ -26,10 +26,14 @@ included in the bundle, then you need to do one of the following:
With the curl command tool: --cacert [file] With the curl command tool: --cacert [file]
This upgrade procedure has been deemed The Right Thing even though it adds Neglecting to use one of the above menthods when dealing with a server using a
this extra trouble for some users, since it adds security to a majority of the certficate that isn't signed by one of the certficates in the installed CA
SSL connections that previously weren't really secure. cert bundle, will cause SSL to report an error ("certificate verify failed")
during the handshake and SSL will then refuse further communication with that
server.
It turned out many people were using previous versions of curl/libcurl without This procedure has been deemed The Right Thing even though it adds this extra
realizing the need for the CA cert options to get truly secure SSL trouble for some users, since it adds security to a majority of the SSL
connections. connections that previously weren't really secure. It turned out many people
were using previous versions of curl/libcurl without realizing the need for
the CA cert options to get truly secure SSL connections.

34
UPGRADE
View File

@@ -1,34 +0,0 @@
Upgrading to curl/libcurl 7.10 from any previous version
========================================================
libcurl 7.10 performs peer SSL certificate verification by default. This is
done by installing a default CA cert bundle on 'make install' (or similar),
that CA bundle package is used by default on operations against SSL servers.
Alas, if you communicate with HTTPS servers using certifcates that are signed
by CAs present in the bundle, you will not notice any changed behavior and you
will seeminglessly get a higher security level on your SSL connections since
can be sure that the remote server really is the one it claims to be.
If the remote server uses a self-signed certificate, or if you don't install
curl's CA cert bundle or if it uses a certificate signed by a CA that isn't
included in the bundle, then you need to do one of the following:
1. Tell libcurl to *not* verify the peer. With libcurl you disable with with
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
With the curl command tool, you disable this with -k/--insecure.
2. Get a CA certificate that can verify the remote server and use the proper
option to point out this CA cert for verification when connecting. For
libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
With the curl command tool: --cacert [file]
This upgrade procedure has been deemed The Right Thing even though it adds
this extra trouble for some users, since it adds security to a majority of the
SSL connections that previously weren't really secure.
It turned out many people were using previous versions of curl/libcurl without
realizing the need for the CA cert options to get truly secure SSL
connections.

View File

@@ -1,90 +0,0 @@
/* Name of this package! */
#undef PACKAGE
/* Version number of this archive. */
#undef VERSION
/* Define if you have the getpass function. */
#undef HAVE_GETPASS
/* Define cpu-machine-OS */
#undef OS
/* Define if you have the gethostbyaddr_r() function with 5 arguments */
#undef HAVE_GETHOSTBYADDR_R_5
/* Define if you have the gethostbyaddr_r() function with 7 arguments */
#undef HAVE_GETHOSTBYADDR_R_7
/* Define if you have the gethostbyaddr_r() function with 8 arguments */
#undef HAVE_GETHOSTBYADDR_R_8
/* Define if you have the gethostbyname_r() function with 3 arguments */
#undef HAVE_GETHOSTBYNAME_R_3
/* Define if you have the gethostbyname_r() function with 5 arguments */
#undef HAVE_GETHOSTBYNAME_R_5
/* Define if you have the gethostbyname_r() function with 6 arguments */
#undef HAVE_GETHOSTBYNAME_R_6
/* Define if you have the inet_ntoa_r function declared. */
#undef HAVE_INET_NTOA_R_DECL
/* Define if you need the _REENTRANT define for some functions */
#undef NEED_REENTRANT
/* Define if you have the Kerberos4 libraries (including -ldes) */
#undef KRB4
/* Define if you want to enable IPv6 support */
#undef ENABLE_IPV6
/* Define this to 'int' if ssize_t is not an available typedefed type */
#undef ssize_t
/* Define this to 'int' if socklen_t is not an available typedefed type */
#undef socklen_t
/* Define this as a suitable file to read random data from */
#undef RANDOM_FILE
/* Define this to your Entropy Gathering Daemon socket pathname */
#undef EGD_SOCKET
/* Define if you have a working OpenSSL installation */
#undef OPENSSL_ENABLED
/* Define the one correct non-blocking socket method below */
#undef HAVE_FIONBIO
#undef HAVE_IOCTLSOCKET
#undef HAVE_IOCTLSOCKET_CASE
#undef HAVE_O_NONBLOCK
#undef HAVE_DISABLED_NONBLOCKING
/* Define this to 'int' if in_addr_t is not an available typedefed type */
#undef in_addr_t
/* Define to disable DICT */
#undef CURL_DISABLE_DICT
/* Define to disable FILE */
#undef CURL_DISABLE_FILE
/* Define to disable FTP */
#undef CURL_DISABLE_FTP
/* Define to disable GOPHER */
#undef CURL_DISABLE_GOPHER
/* Define to disable HTTP */
#undef CURL_DISABLE_HTTP
/* Define to disable LDAP */
#undef CURL_DISABLE_LDAP
/* Define to disable TELNET */
#undef CURL_DISABLE_TELNET
/* Define if you have zlib present */
#undef HAVE_LIBZ

View File

@@ -38,7 +38,7 @@ AC_DEFUN(CURL_CHECK_NONBLOCKING_SOCKET,
],[ ],[
dnl the O_NONBLOCK test was fine dnl the O_NONBLOCK test was fine
nonblock="O_NONBLOCK" nonblock="O_NONBLOCK"
AC_DEFINE(HAVE_O_NONBLOCK) AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])
],[ ],[
dnl the code was bad, try a different program now, test 2 dnl the code was bad, try a different program now, test 2
@@ -52,7 +52,7 @@ dnl the code was bad, try a different program now, test 2
],[ ],[
dnl FIONBIO test was good dnl FIONBIO test was good
nonblock="FIONBIO" nonblock="FIONBIO"
AC_DEFINE(HAVE_FIONBIO) AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
],[ ],[
dnl FIONBIO test was also bad dnl FIONBIO test was also bad
dnl the code was bad, try a different program now, test 3 dnl the code was bad, try a different program now, test 3
@@ -66,7 +66,7 @@ dnl the code was bad, try a different program now, test 3
],[ ],[
dnl ioctlsocket test was good dnl ioctlsocket test was good
nonblock="ioctlsocket" nonblock="ioctlsocket"
AC_DEFINE(HAVE_IOCTLSOCKET) AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
],[ ],[
dnl ioctlsocket didnt compile! dnl ioctlsocket didnt compile!
@@ -79,11 +79,11 @@ dnl ioctlsocket didnt compile!
],[ ],[
dnl ioctlsocket test was good dnl ioctlsocket test was good
nonblock="IoctlSocket" nonblock="IoctlSocket"
AC_DEFINE(HAVE_IOCTLSOCKET_CASE) AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
],[ ],[
dnl ioctlsocket didnt compile! dnl ioctlsocket didnt compile!
nonblock="nada" nonblock="nada"
AC_DEFINE(HAVE_DISABLED_NONBLOCKING) AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
]) ])
dnl end of forth test dnl end of forth test
@@ -272,15 +272,15 @@ AC_DEFUN(CURL_CHECK_INET_NTOA_R,
AC_MSG_CHECKING(whether inet_ntoa_r is declared) AC_MSG_CHECKING(whether inet_ntoa_r is declared)
AC_EGREP_CPP(inet_ntoa_r,[ AC_EGREP_CPP(inet_ntoa_r,[
#include <arpa/inet.h>],[ #include <arpa/inet.h>],[
AC_DEFINE(HAVE_INET_NTOA_R_DECL) AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
AC_MSG_RESULT(yes)],[ AC_MSG_RESULT(yes)],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared) AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared)
AC_EGREP_CPP(inet_ntoa_r,[ AC_EGREP_CPP(inet_ntoa_r,[
#define _REENTRANT #define _REENTRANT
#include <arpa/inet.h>],[ #include <arpa/inet.h>],[
AC_DEFINE(HAVE_INET_NTOA_R_DECL) AC_DEFINE(HAVE_INET_NTOA_R_DECL, 1, [inet_ntoa_r() is declared])
AC_DEFINE(NEED_REENTRANT) AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT defined])
AC_MSG_RESULT(yes)], AC_MSG_RESULT(yes)],
AC_MSG_RESULT(no))])]) AC_MSG_RESULT(no))])])
]) ])
@@ -302,7 +302,7 @@ struct hostent_data hdata;
int rc; int rc;
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[ rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5) AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
ac_cv_gethostbyaddr_args=5],[ ac_cv_gethostbyaddr_args=5],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments) AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments)
@@ -318,8 +318,8 @@ struct hostent_data hdata;
int rc; int rc;
rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[ rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GETHOSTBYADDR_R_5) AC_DEFINE(HAVE_GETHOSTBYADDR_R_5, 1, [gethostbyaddr_r() takes 5 args])
AC_DEFINE(NEED_REENTRANT) AC_DEFINE(NEED_REENTRANT, 1, [need REENTRANT])
ac_cv_gethostbyaddr_args=5],[ ac_cv_gethostbyaddr_args=5],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments) AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments)
@@ -337,7 +337,7 @@ struct hostent * hp;
hp = gethostbyaddr_r(address, length, type, &h, hp = gethostbyaddr_r(address, length, type, &h,
buffer, 8192, &h_errnop);],[ buffer, 8192, &h_errnop);],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GETHOSTBYADDR_R_7) AC_DEFINE(HAVE_GETHOSTBYADDR_R_7, 1, [gethostbyaddr_r() takes 7 args] )
ac_cv_gethostbyaddr_args=7],[ ac_cv_gethostbyaddr_args=7],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments) AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments)
@@ -356,7 +356,7 @@ int rc;
rc = gethostbyaddr_r(address, length, type, &h, rc = gethostbyaddr_r(address, length, type, &h,
buffer, 8192, &hp, &h_errnop);],[ buffer, 8192, &hp, &h_errnop);],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GETHOSTBYADDR_R_8) AC_DEFINE(HAVE_GETHOSTBYADDR_R_8, 1, [gethostbyaddr_r() takes 8 args])
ac_cv_gethostbyaddr_args=8],[ ac_cv_gethostbyaddr_args=8],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])]) have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])])
@@ -380,7 +380,7 @@ gethostbyname_r(const char *, struct hostent *, struct hostent_data *);],[
struct hostent_data data; struct hostent_data data;
gethostbyname_r(NULL, NULL, NULL);],[ gethostbyname_r(NULL, NULL, NULL);],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3) AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
ac_cv_gethostbyname_args=3],[ ac_cv_gethostbyname_args=3],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments]) AC_MSG_CHECKING([if gethostbyname_r with -D_REENTRANT takes 3 arguments])
@@ -398,8 +398,8 @@ gethostbyname_r(const char *,struct hostent *, struct hostent_data *);],[
struct hostent_data data; struct hostent_data data;
gethostbyname_r(NULL, NULL, NULL);],[ gethostbyname_r(NULL, NULL, NULL);],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GETHOSTBYNAME_R_3) AC_DEFINE(HAVE_GETHOSTBYNAME_R_3, 1, [gethostbyname_r() takes 3 args])
AC_DEFINE(NEED_REENTRANT) AC_DEFINE(NEED_REENTRANT, 1, [needs REENTRANT])
ac_cv_gethostbyname_args=3],[ ac_cv_gethostbyname_args=3],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments]) AC_MSG_CHECKING([if gethostbyname_r takes 5 arguments])
@@ -413,7 +413,7 @@ struct hostent *
gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[ gethostbyname_r(const char *, struct hostent *, char *, int, int *);],[
gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[ gethostbyname_r(NULL, NULL, NULL, 0, NULL);],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GETHOSTBYNAME_R_5) AC_DEFINE(HAVE_GETHOSTBYNAME_R_5, 1, [gethostbyname_r() takes 5 args])
ac_cv_gethostbyname_args=5],[ ac_cv_gethostbyname_args=5],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments]) AC_MSG_CHECKING([if gethostbyname_r takes 6 arguments])
@@ -428,7 +428,7 @@ gethostbyname_r(const char *, struct hostent *, char *, size_t,
struct hostent **, int *);],[ struct hostent **, int *);],[
gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);],[ gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);],[
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_GETHOSTBYNAME_R_6) AC_DEFINE(HAVE_GETHOSTBYNAME_R_6, 1, [gethostbyname_r() takes 6 args])
ac_cv_gethostbyname_args=6],[ ac_cv_gethostbyname_args=6],[
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"], have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"],

View File

@@ -6,7 +6,7 @@ $ loc = f$environment("PROCEDURE")
$ def = f$parse("X.X;1",loc) - "X.X;1" $ def = f$parse("X.X;1",loc) - "X.X;1"
$ $
$ set def 'def' $ set def 'def'
$ cc_qual = "/define=HAVE_CONFIG_H=1/include=(""../include/"",""../"",""../../openssl-0_9_6c/include/"")" $ cc_qual = "/define=HAVE_CONFIG_H=1/include=(""../include/"",""../"",""../../openssl-0_9_7/include/"")"
$ if p1 .eqs. "LISTING" then cc_qual = cc_qual + "/LIST/MACHINE" $ if p1 .eqs. "LISTING" then cc_qual = cc_qual + "/LIST/MACHINE"
$ if p1 .eqs. "DEBUG" then cc_qual = cc_qual + "/LIST/MACHINE/DEBUG" $ if p1 .eqs. "DEBUG" then cc_qual = cc_qual + "/LIST/MACHINE/DEBUG"
$ msg_qual = "" $ msg_qual = ""
@@ -14,8 +14,8 @@ $ call build "[.lib]" "*.c"
$ call build "[.src]" "*.c" $ call build "[.src]" "*.c"
$ call build "[.src]" "*.msg" $ call build "[.src]" "*.msg"
$ link /exe=curl.exe [.src]curl/lib/include=main,[.lib]curl/lib, - $ link /exe=curl.exe [.src]curl/lib/include=main,[.lib]curl/lib, -
[-.openssl-0_9_6c.axp.exe.ssl]libssl/lib, - [-.openssl-0_9_7.axp.exe.ssl]libssl/lib, -
[-.openssl-0_9_6c.axp.exe.crypto]libcrypto/lib [-.openssl-0_9_7.axp.exe.crypto]libcrypto/lib
$ $
$ $
$ goto Common_Exit $ goto Common_Exit

109
buildconf
View File

@@ -5,7 +5,114 @@ die(){
exit exit
} }
#--------------------------------------------------------------------------
# autoconf 2.50 or newer
#
ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
if test -z "$ac_version"; then
echo "buildconf: autoconf not found."
echo " You need autoconf version 2.50 or newer installed."
exit 1
fi
IFS=.; set $ac_version; IFS=' '
if test "$1" = "2" -a "$2" -lt "50" || test "$1" -lt "2"; then
echo "buildconf: autoconf version $ac_version found."
echo " You need autoconf version 2.50 or newer installed."
echo " If you have a sufficient autoconf installed, but it"
echo " is not named 'autoconf', then try setting the"
echo " AUTOCONF environment variable."
exit 1
fi
echo "buildconf: autoconf version $ac_version (ok)"
#--------------------------------------------------------------------------
# autoheader 2.50 or newer
#
ah_version=`${AUTOHEADER:-autoheader} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
if test -z "$ah_version"; then
echo "buildconf: autoheader not found."
echo " You need autoheader version 2.50 or newer installed."
exit 1
fi
IFS=.; set $ah_version; IFS=' '
if test "$1" = "2" -a "$2" -lt "50" || test "$1" -lt "2"; then
echo "buildconf: autoheader version $ah_version found."
echo " You need autoheader version 2.50 or newer installed."
echo " If you have a sufficient autoheader installed, but it"
echo " is not named 'autoheader', then try setting the"
echo " AUTOHEADER environment variable."
exit 1
fi
echo "buildconf: autoheader version $ah_version (ok)"
#--------------------------------------------------------------------------
# automake 1.5 or newer
#
am_version=`${AUTOMAKE:-automake} --version 2>/dev/null|head -1| sed -e 's/^[^0-9]*//' -e 's/[a-z]* *$//'`
if test -z "$am_version"; then
echo "buildconf: automake not found."
echo " You need automake version 1.5 or newer installed."
exit 1
fi
IFS=.; set $am_version; IFS=' '
if test "$1" = "1" -a "$2" -lt "5" || test "$1" -lt "1"; then
echo "buildconf: automake version $am_version found."
echo " You need automake version 1.5 or newer installed."
echo " If you have a sufficient automake installed, but it"
echo " is not named 'autommake', then try setting the"
echo " AUTOMAKE environment variable."
exit 1
fi
echo "buildconf: automake version $am_version (ok)"
#--------------------------------------------------------------------------
# libtool 1.4 or newer
#
LIBTOOL_WANTED_MAJOR=1
LIBTOOL_WANTED_MINOR=4
LIBTOOL_WANTED_PATCH=
LIBTOOL_WANTED_VERSION=1.4
libtool=`which glibtool 2>/dev/null`
if test ! -x "$libtool"; then
libtool=`which libtool`
fi
lt_pversion=`$libtool --version 2>/dev/null|sed -e 's/^[^0-9]*//' -e 's/[- ].*//'`
if test -z "$lt_pversion"; then
echo "buildconf: libtool not found."
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
exit 1
fi
lt_version=`echo $lt_pversion|sed -e 's/\([a-z]*\)$/.\1/'`
IFS=.; set $lt_version; IFS=' '
lt_status="good"
if test "$1" = "$LIBTOOL_WANTED_MAJOR"; then
if test "$2" -lt "$LIBTOOL_WANTED_MINOR"; then
lt_status="bad"
elif test ! -z "$LIBTOOL_WANTED_PATCH"; then
if test "$3" -lt "$LIBTOOL_WANTED_PATCH"; then
lt_status="bad"
fi
fi
fi
if test $lt_status != "good"; then
echo "buildconf: libtool version $lt_pversion found."
echo " You need libtool version $LIBTOOL_WANTED_VERSION or newer installed"
exit 1
fi
echo "buildconf: libtool version $lt_pversion (ok)"
echo "buildconf: running aclocal"
aclocal || die "The command 'aclocal' failed" aclocal || die "The command 'aclocal' failed"
echo "buildconf: running autoheader"
autoheader || die "The command 'autoheader' failed" autoheader || die "The command 'autoheader' failed"
echo "buildconf: running autoconf"
autoconf || die "The command 'autoconf' failed" autoconf || die "The command 'autoconf' failed"
automake -a || die "The command 'automake $MAKEFILES' failed" echo "buildconf: running automake"
automake -a || die "The command 'automake -a' failed"
exit 0

350
config.guess vendored
View File

@@ -1,9 +1,9 @@
#! /bin/sh #! /bin/sh
# Attempt to guess a canonical system name. # Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# Free Software Foundation, Inc. # 2000, 2001, 2002 Free Software Foundation, Inc.
timestamp='2001-09-04' timestamp='2002-10-21'
# This file is free software; you can redistribute it and/or modify it # This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by # under the terms of the GNU General Public License as published by
@@ -24,8 +24,9 @@ timestamp='2001-09-04'
# configuration script generated by Autoconf, you may include it under # configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program. # the same distribution terms that you use for the rest of that program.
# Written by Per Bothner <bothner@cygnus.com>. # Originally written by Per Bothner <per@bothner.com>.
# Please send patches to <config-patches@gnu.org>. # Please send patches to <config-patches@gnu.org>. Submit a context
# diff and a properly formatted ChangeLog entry.
# #
# This script attempts to guess a canonical system name similar to # This script attempts to guess a canonical system name similar to
# config.sub. If it succeeds, it prints the system name on stdout, and # config.sub. If it succeeds, it prints the system name on stdout, and
@@ -87,30 +88,40 @@ if test $# != 0; then
exit 1 exit 1
fi fi
trap 'exit 1' 1 2 15
dummy=dummy-$$ # CC_FOR_BUILD -- compiler used by this script. Note that the use of a
trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 # compiler to aid in system detection is discouraged as it requires
# temporary files to be created and, as you can see below, it is a
# headache to deal with in a portable fashion.
# CC_FOR_BUILD -- compiler used by this script.
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
# use `HOST_CC' if defined, but it is deprecated. # use `HOST_CC' if defined, but it is deprecated.
set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in # This shell variable is my proudest work .. or something. --bje
,,) echo "int dummy(){}" > $dummy.c ;
for c in cc gcc c89 ; do set_cc_for_build='tmpdir=${TMPDIR-/tmp}/config-guess-$$ ;
($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; (old=`umask` && umask 077 && mkdir $tmpdir && umask $old && unset old)
if test $? = 0 ; then || (echo "$me: cannot create $tmpdir" >&2 && exit 1) ;
dummy=$tmpdir/dummy ;
files="$dummy.c $dummy.o $dummy.rel $dummy" ;
trap '"'"'rm -f $files; rmdir $tmpdir; exit 1'"'"' 1 2 15 ;
case $CC_FOR_BUILD,$HOST_CC,$CC in
,,) echo "int x;" > $dummy.c ;
for c in cc gcc c89 c99 ; do
if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
CC_FOR_BUILD="$c"; break ; CC_FOR_BUILD="$c"; break ;
fi ; fi ;
done ; done ;
rm -f $dummy.c $dummy.o $dummy.rel ; rm -f $files ;
if test x"$CC_FOR_BUILD" = x ; then if test x"$CC_FOR_BUILD" = x ; then
CC_FOR_BUILD=no_compiler_found ; CC_FOR_BUILD=no_compiler_found ;
fi fi
;; ;;
,,*) CC_FOR_BUILD=$CC ;; ,,*) CC_FOR_BUILD=$CC ;;
,*,*) CC_FOR_BUILD=$HOST_CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;;
esac' esac ;
unset files'
# This is needed to find uname on a Pyramid OSx when run in the BSD universe. # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
# (ghazi@noc.rutgers.edu 1994-08-24) # (ghazi@noc.rutgers.edu 1994-08-24)
@@ -127,29 +138,30 @@ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:NetBSD:*:*) *:NetBSD:*:*)
# Netbsd (nbsd) targets should (where applicable) match one or # NetBSD (nbsd) targets should (where applicable) match one or
# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
# *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
# switched to ELF, *-*-netbsd* would select the old # switched to ELF, *-*-netbsd* would select the old
# object file format. This provides both forward # object file format. This provides both forward
# compatibility and a consistent mechanism for selecting the # compatibility and a consistent mechanism for selecting the
# object file format. # object file format.
# Determine the machine/vendor (is the vendor relevant). #
case "${UNAME_MACHINE}" in # Note: NetBSD doesn't particularly care about the vendor
amiga) machine=m68k-unknown ;; # portion of the name. We always set it to "unknown".
arm32) machine=arm-unknown ;; sysctl="sysctl -n hw.machine_arch"
atari*) machine=m68k-atari ;; UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
sun3*) machine=m68k-sun ;; /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
mac68k) machine=m68k-apple ;; case "${UNAME_MACHINE_ARCH}" in
macppc) machine=powerpc-apple ;; armeb) machine=armeb-unknown ;;
hp3[0-9][05]) machine=m68k-hp ;; arm*) machine=arm-unknown ;;
ibmrt|romp-ibm) machine=romp-ibm ;; sh3el) machine=shl-unknown ;;
*) machine=${UNAME_MACHINE}-unknown ;; sh3eb) machine=sh-unknown ;;
*) machine=${UNAME_MACHINE_ARCH}-unknown ;;
esac esac
# The Operating System including object format, if it has switched # The Operating System including object format, if it has switched
# to ELF recently, or will in the future. # to ELF recently, or will in the future.
case "${UNAME_MACHINE}" in case "${UNAME_MACHINE_ARCH}" in
i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) arm*|i386|m68k|ns32k|sh3*|sparc|vax)
eval $set_cc_for_build eval $set_cc_for_build
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep __ELF__ >/dev/null | grep __ELF__ >/dev/null
@@ -172,6 +184,45 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
echo "${machine}-${os}${release}" echo "${machine}-${os}${release}"
exit 0 ;; exit 0 ;;
amiga:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
arc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
hp300:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mac68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
macppc:OpenBSD:*:*)
echo powerpc-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mvme68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mvme88k:OpenBSD:*:*)
echo m88k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mvmeppc:OpenBSD:*:*)
echo powerpc-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
pmax:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sgi:OpenBSD:*:*)
echo mipseb-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sun3:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
wgrisc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
*:OpenBSD:*:*)
echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
alpha:OSF1:*:*) alpha:OSF1:*:*)
if test $UNAME_RELEASE = "V4.0"; then if test $UNAME_RELEASE = "V4.0"; then
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
@@ -180,6 +231,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# A Tn.n version is a released field test version. # A Tn.n version is a released field test version.
# A Xn.n version is an unreleased experimental baselevel. # A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r. # 1.2 uses "1.2" for uname -r.
eval $set_cc_for_build
cat <<EOF >$dummy.s cat <<EOF >$dummy.s
.data .data
\$Lformat: \$Lformat:
@@ -205,10 +257,9 @@ main:
jsr \$26,exit jsr \$26,exit
.end main .end main
EOF EOF
eval $set_cc_for_build $CC_FOR_BUILD -o $dummy $dummy.s 2>/dev/null
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
if test "$?" = 0 ; then if test "$?" = 0 ; then
case `./$dummy` in case `$dummy` in
0-0) 0-0)
UNAME_MACHINE="alpha" UNAME_MACHINE="alpha"
;; ;;
@@ -230,9 +281,12 @@ EOF
2-1307) 2-1307)
UNAME_MACHINE="alphaev68" UNAME_MACHINE="alphaev68"
;; ;;
3-1307)
UNAME_MACHINE="alphaev7"
;;
esac esac
fi fi
rm -f $dummy.s $dummy rm -f $dummy.s $dummy && rmdir $tmpdir
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
exit 0 ;; exit 0 ;;
Alpha\ *:Windows_NT*:*) Alpha\ *:Windows_NT*:*)
@@ -247,29 +301,11 @@ EOF
Amiga*:UNIX_System_V:4.0:*) Amiga*:UNIX_System_V:4.0:*)
echo m68k-unknown-sysv4 echo m68k-unknown-sysv4
exit 0;; exit 0;;
amiga:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
*:[Aa]miga[Oo][Ss]:*:*) *:[Aa]miga[Oo][Ss]:*:*)
echo ${UNAME_MACHINE}-unknown-amigaos echo ${UNAME_MACHINE}-unknown-amigaos
exit 0 ;; exit 0 ;;
arc64:OpenBSD:*:*) *:[Mm]orph[Oo][Ss]:*:*)
echo mips64el-unknown-openbsd${UNAME_RELEASE} echo ${UNAME_MACHINE}-unknown-morphos
exit 0 ;;
arc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
hkmips:OpenBSD:*:*)
echo mips-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
pmax:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
sgi:OpenBSD:*:*)
echo mips-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
wgrisc:OpenBSD:*:*)
echo mipsel-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:OS/390:*:*) *:OS/390:*:*)
echo i370-ibm-openedition echo i370-ibm-openedition
@@ -291,6 +327,10 @@ EOF
NILE*:*:*:dcosx) NILE*:*:*:dcosx)
echo pyramid-pyramid-svr4 echo pyramid-pyramid-svr4
exit 0 ;; exit 0 ;;
DRS?6000:UNIX_SV:4.2*:7*)
case `/usr/bin/uname -p` in
sparc) echo sparc-icl-nx7 && exit 0 ;;
esac ;;
sun4H:SunOS:5.*:*) sun4H:SunOS:5.*:*)
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit 0 ;; exit 0 ;;
@@ -319,7 +359,7 @@ EOF
echo m68k-sun-sunos${UNAME_RELEASE} echo m68k-sun-sunos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
sun*:*:4.2BSD:*) sun*:*:4.2BSD:*)
UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
case "`/bin/arch`" in case "`/bin/arch`" in
sun3) sun3)
@@ -333,12 +373,6 @@ EOF
aushp:SunOS:*:*) aushp:SunOS:*:*)
echo sparc-auspex-sunos${UNAME_RELEASE} echo sparc-auspex-sunos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
sparc*:NetBSD:*)
echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
exit 0 ;;
atari*:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
# The situation for MiNT is a little confusing. The machine name # The situation for MiNT is a little confusing. The machine name
# can be virtually everything (everything which is not # can be virtually everything (everything which is not
# "atarist" or "atariste" at least should have a processor # "atarist" or "atariste" at least should have a processor
@@ -365,18 +399,6 @@ EOF
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
echo m68k-unknown-mint${UNAME_RELEASE} echo m68k-unknown-mint${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
sun3*:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mac68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mvme68k:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
mvme88k:OpenBSD:*:*)
echo m88k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
powerpc:machten:*:*) powerpc:machten:*:*)
echo powerpc-apple-machten${UNAME_RELEASE} echo powerpc-apple-machten${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -415,15 +437,21 @@ EOF
exit (-1); exit (-1);
} }
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy \ $CC_FOR_BUILD -o $dummy $dummy.c \
&& ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
&& rm -f $dummy.c $dummy && exit 0 && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy && rmdir $tmpdir
echo mips-mips-riscos${UNAME_RELEASE} echo mips-mips-riscos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
Motorola:PowerMAX_OS:*:*) Motorola:PowerMAX_OS:*:*)
echo powerpc-motorola-powermax echo powerpc-motorola-powermax
exit 0 ;; exit 0 ;;
Motorola:*:4.3:PL8-*)
echo powerpc-harris-powermax
exit 0 ;;
Night_Hawk:*:*:PowerMAX_OS)
echo powerpc-harris-powermax
exit 0 ;;
Night_Hawk:Power_UNIX:*:*) Night_Hawk:Power_UNIX:*:*)
echo powerpc-harris-powerunix echo powerpc-harris-powerunix
exit 0 ;; exit 0 ;;
@@ -496,8 +524,8 @@ EOF
exit(0); exit(0);
} }
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy && rmdir $tmpdir
echo rs6000-ibm-aix3.2.5 echo rs6000-ibm-aix3.2.5
elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
echo rs6000-ibm-aix3.2.4 echo rs6000-ibm-aix3.2.4
@@ -506,7 +534,7 @@ EOF
fi fi
exit 0 ;; exit 0 ;;
*:AIX:*:[45]) *:AIX:*:[45])
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
IBM_ARCH=rs6000 IBM_ARCH=rs6000
else else
@@ -546,10 +574,8 @@ EOF
9000/31? ) HP_ARCH=m68000 ;; 9000/31? ) HP_ARCH=m68000 ;;
9000/[34]?? ) HP_ARCH=m68k ;; 9000/[34]?? ) HP_ARCH=m68k ;;
9000/[678][0-9][0-9]) 9000/[678][0-9][0-9])
case "${HPUX_REV}" in if [ -x /usr/bin/getconf ]; then
11.[0-9][0-9]) sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
if [ -x /usr/bin/getconf ]; then
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
case "${sc_cpu_version}" in case "${sc_cpu_version}" in
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
@@ -558,13 +584,13 @@ EOF
case "${sc_kernel_bits}" in case "${sc_kernel_bits}" in
32) HP_ARCH="hppa2.0n" ;; 32) HP_ARCH="hppa2.0n" ;;
64) HP_ARCH="hppa2.0w" ;; 64) HP_ARCH="hppa2.0w" ;;
'') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
esac ;; esac ;;
esac esac
fi ;; fi
esac if [ "${HP_ARCH}" = "" ]; then
if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build
eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c
sed 's/^ //' << EOF >$dummy.c
#define _HPUX_SOURCE #define _HPUX_SOURCE
#include <stdlib.h> #include <stdlib.h>
@@ -597,10 +623,10 @@ EOF
exit (0); exit (0);
} }
EOF EOF
(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
rm -f $dummy.c $dummy rm -f $dummy.c $dummy && rmdir $tmpdir
fi ;; fi ;;
esac esac
echo ${HP_ARCH}-hp-hpux${HPUX_REV} echo ${HP_ARCH}-hp-hpux${HPUX_REV}
exit 0 ;; exit 0 ;;
@@ -635,8 +661,8 @@ EOF
exit (0); exit (0);
} }
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy && rmdir $tmpdir
echo unknown-hitachi-hiuxwe2 echo unknown-hitachi-hiuxwe2
exit 0 ;; exit 0 ;;
9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
@@ -664,9 +690,6 @@ EOF
parisc*:Lites*:*:*) parisc*:Lites*:*:*)
echo hppa1.1-hp-lites echo hppa1.1-hp-lites
exit 0 ;; exit 0 ;;
hppa*:OpenBSD:*:*)
echo hppa-unknown-openbsd
exit 0 ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd echo c1-convex-bsd
exit 0 ;; exit 0 ;;
@@ -685,9 +708,6 @@ EOF
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
echo c4-convex-bsd echo c4-convex-bsd
exit 0 ;; exit 0 ;;
CRAY*X-MP:*:*:*)
echo xmp-cray-unicos
exit 0 ;;
CRAY*Y-MP:*:*:*) CRAY*Y-MP:*:*:*)
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;; exit 0 ;;
@@ -709,18 +729,12 @@ EOF
CRAY*SV1:*:*:*) CRAY*SV1:*:*:*)
echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;; exit 0 ;;
CRAY-2:*:*:*)
echo cray2-cray-unicos
exit 0 ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;; exit 0 ;;
hp300:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -731,10 +745,19 @@ EOF
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:FreeBSD:*:*) *:FreeBSD:*:*)
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` # Determine whether the default compiler uses glibc.
exit 0 ;; eval $set_cc_for_build
*:OpenBSD:*:*) sed 's/^ //' << EOF >$dummy.c
echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` #include <features.h>
#if __GLIBC__ >= 2
LIBC=gnu
#else
LIBC=
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
rm -f $dummy.c && rmdir $tmpdir
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
exit 0 ;; exit 0 ;;
i*:CYGWIN*:*) i*:CYGWIN*:*)
echo ${UNAME_MACHINE}-pc-cygwin echo ${UNAME_MACHINE}-pc-cygwin
@@ -745,6 +768,9 @@ EOF
i*:PW*:*) i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32 echo ${UNAME_MACHINE}-pc-pw32
exit 0 ;; exit 0 ;;
x86:Interix*:3*)
echo i386-pc-interix3
exit 0 ;;
i*:Windows_NT*:* | Pentium*:Windows_NT*:*) i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem? # How do we know it's Interix rather than the generic POSIX subsystem?
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
@@ -770,16 +796,30 @@ EOF
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;; exit 0 ;;
ia64:Linux:*:*) ia64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;; exit 0 ;;
m68*:Linux:*:*) m68*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;; exit 0 ;;
mips:Linux:*:*) mips:Linux:*:*)
case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in eval $set_cc_for_build
big) echo mips-unknown-linux-gnu && exit 0 ;; sed 's/^ //' << EOF >$dummy.c
little) echo mipsel-unknown-linux-gnu && exit 0 ;; #undef CPU
esac #undef mips
#undef mipsel
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
CPU=mipsel
#else
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
CPU=mips
#else
CPU=
#endif
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
rm -f $dummy.c && rmdir $tmpdir
test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0
;; ;;
ppc:Linux:*:*) ppc:Linux:*:*)
echo powerpc-unknown-linux-gnu echo powerpc-unknown-linux-gnu
@@ -828,7 +868,8 @@ EOF
# The BFD linker knows what the default object file format is, so # The BFD linker knows what the default object file format is, so
# first see if it will tell us. cd to the root directory to prevent # first see if it will tell us. cd to the root directory to prevent
# problems with other programs or directories called `ld' in the path. # problems with other programs or directories called `ld' in the path.
ld_supported_targets=`cd /; ld --help 2>&1 \ # Set LC_ALL=C to ensure ld outputs messages in English.
ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
| sed -ne '/supported targets:/!d | sed -ne '/supported targets:/!d
s/[ ][ ]*/ /g s/[ ][ ]*/ /g
s/.*supported targets: *// s/.*supported targets: *//
@@ -852,32 +893,29 @@ EOF
esac esac
# Determine whether the default compiler is a.out or elf # Determine whether the default compiler is a.out or elf
eval $set_cc_for_build eval $set_cc_for_build
cat >$dummy.c <<EOF sed 's/^ //' << EOF >$dummy.c
#include <features.h> #include <features.h>
#ifdef __cplusplus #ifdef __ELF__
#include <stdio.h> /* for printf() prototype */ # ifdef __GLIBC__
int main (int argc, char *argv[]) { # if __GLIBC__ >= 2
#else LIBC=gnu
int main (argc, argv) int argc; char *argv[]; { # else
#endif LIBC=gnulibc1
#ifdef __ELF__ # endif
# ifdef __GLIBC__ # else
# if __GLIBC__ >= 2 LIBC=gnulibc1
printf ("%s-pc-linux-gnu\n", argv[1]); # endif
# else #else
printf ("%s-pc-linux-gnulibc1\n", argv[1]); #ifdef __INTEL_COMPILER
# endif LIBC=gnu
# else #else
printf ("%s-pc-linux-gnulibc1\n", argv[1]); LIBC=gnuaout
# endif #endif
#else #endif
printf ("%s-pc-linux-gnuaout\n", argv[1]);
#endif
return 0;
}
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
rm -f $dummy.c $dummy rm -f $dummy.c && rmdir $tmpdir
test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
;; ;;
i*86:DYNIX/ptx:4*:*) i*86:DYNIX/ptx:4*:*)
@@ -915,13 +953,13 @@ EOF
UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
echo ${UNAME_MACHINE}-pc-isc$UNAME_REL echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
elif /bin/uname -X 2>/dev/null >/dev/null ; then elif /bin/uname -X 2>/dev/null >/dev/null ; then
UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
&& UNAME_MACHINE=i586 && UNAME_MACHINE=i586
(/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
&& UNAME_MACHINE=i686 && UNAME_MACHINE=i686
(/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
&& UNAME_MACHINE=i686 && UNAME_MACHINE=i686
echo ${UNAME_MACHINE}-pc-sco$UNAME_REL echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
else else
@@ -954,9 +992,12 @@ EOF
# "miniframe" # "miniframe"
echo m68010-convergent-sysv echo m68010-convergent-sysv
exit 0 ;; exit 0 ;;
mc68k:UNIX:SYSTEM5:3.51m)
echo m68k-convergent-sysv
exit 0 ;;
M68*:*:R3V[567]*:*) M68*:*:R3V[567]*:*)
test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0)
OS_REL='' OS_REL=''
test -r /etc/.relid \ test -r /etc/.relid \
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
@@ -1047,6 +1088,9 @@ EOF
SX-5:SUPER-UX:*:*) SX-5:SUPER-UX:*:*)
echo sx5-nec-superux${UNAME_RELEASE} echo sx5-nec-superux${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
SX-6:SUPER-UX:*:*)
echo sx6-nec-superux${UNAME_RELEASE}
exit 0 ;;
Power*:Rhapsody:*:*) Power*:Rhapsody:*:*)
echo powerpc-apple-rhapsody${UNAME_RELEASE} echo powerpc-apple-rhapsody${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -1057,15 +1101,17 @@ EOF
echo `uname -p`-apple-darwin${UNAME_RELEASE} echo `uname -p`-apple-darwin${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*) *:procnto*:*:* | *:QNX:[0123456789]*:*)
if test "${UNAME_MACHINE}" = "x86pc"; then UNAME_PROCESSOR=`uname -p`
if test "$UNAME_PROCESSOR" = "x86"; then
UNAME_PROCESSOR=i386
UNAME_MACHINE=pc UNAME_MACHINE=pc
fi fi
echo `uname -p`-${UNAME_MACHINE}-nto-qnx echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:QNX:*:4*) *:QNX:*:4*)
echo i386-pc-qnx echo i386-pc-qnx
exit 0 ;; exit 0 ;;
NSR-[KW]:NONSTOP_KERNEL:*:*) NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE} echo nsr-tandem-nsk${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:NonStop-UX:*:*) *:NonStop-UX:*:*)
@@ -1237,8 +1283,8 @@ main ()
} }
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy && rmdir $tmpdir
# Apollos put the system type in the environment. # Apollos put the system type in the environment.

253
config.sub vendored
View File

@@ -1,9 +1,9 @@
#! /bin/sh #! /bin/sh
# Configuration validation subroutine script. # Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# Free Software Foundation, Inc. # 2000, 2001, 2002 Free Software Foundation, Inc.
timestamp='2001-09-07' timestamp='2002-09-05'
# This file is (in principle) common to ALL GNU software. # This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software # The presence of a machine in this file suggests that SOME GNU software
@@ -29,7 +29,8 @@ timestamp='2001-09-07'
# configuration script generated by Autoconf, you may include it under # configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program. # the same distribution terms that you use for the rest of that program.
# Please send patches to <config-patches@gnu.org>. # Please send patches to <config-patches@gnu.org>. Submit a context
# diff and a properly formatted ChangeLog entry.
# #
# Configuration subroutine to validate and canonicalize a configuration type. # Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument. # Supply the specified configuration type as an argument.
@@ -117,7 +118,7 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations. # Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in case $maybe_os in
nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) nto-qnx* | linux-gnu* | freebsd*-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*)
os=-$maybe_os os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;; ;;
@@ -226,32 +227,42 @@ case $basic_machine in
1750a | 580 \ 1750a | 580 \
| a29k \ | a29k \
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
| c4x | clipper \ | clipper \
| d10v | d30v | dsp16xx \ | d10v | d30v | dlx | dsp16xx \
| fr30 \ | fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| i370 | i860 | i960 | ia64 \ | i370 | i860 | i960 | ia64 \
| ip2k \
| m32r | m68000 | m68k | m88k | mcore \ | m32r | m68000 | m68k | m88k | mcore \
| mips16 | mips64 | mips64el | mips64orion | mips64orionel \ | mips | mipsbe | mipseb | mipsel | mipsle \
| mips64vr4100 | mips64vr4100el | mips64vr4300 \ | mips16 \
| mips64vr4300el | mips64vr5000 | mips64vr5000el \ | mips64 | mips64el \
| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ | mips64vr | mips64vrel \
| mipsisa32 \ | mips64orion | mips64orionel \
| mips64vr4100 | mips64vr4100el \
| mips64vr4300 | mips64vr4300el \
| mips64vr5000 | mips64vr5000el \
| mipsisa32 | mipsisa32el \
| mipsisa64 | mipsisa64el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
| mipstx39 | mipstx39el \
| mn10200 | mn10300 \ | mn10200 | mn10300 \
| ns16k | ns32k \ | ns16k | ns32k \
| openrisc \ | openrisc | or32 \
| pdp10 | pdp11 | pj | pjl \ | pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
| pyramid \ | pyramid \
| s390 | s390x \ | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
| sh | sh[34] | sh[34]eb | shbe | shle \ | sh64 | sh64le \
| sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
| stormy16 | strongarm \ | strongarm \
| tahoe | thumb | tic80 | tron \ | tahoe | thumb | tic80 | tron \
| v850 \ | v850 | v850e \
| we32k \ | we32k \
| x86 | xscale \ | x86 | xscale | xstormy16 | xtensa \
| z8k) | z8k)
basic_machine=$basic_machine-unknown basic_machine=$basic_machine-unknown
;; ;;
@@ -278,38 +289,51 @@ case $basic_machine in
580-* \ 580-* \
| a29k-* \ | a29k-* \
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
| alphapca5[67]-* | arc-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
| arm-* | armbe-* | armle-* | armv*-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* \
| bs2000-* \ | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c54x-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \
| clipper-* | cray2-* | cydra-* \ | clipper-* | cydra-* \
| d10v-* | d30v-* \ | d10v-* | d30v-* | dlx-* \
| elxsi-* \ | elxsi-* \
| f30[01]-* | f700-* | fr30-* | fx80-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \ | h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
| i*86-* | i860-* | i960-* | ia64-* \ | i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* \
| m32r-* \ | m32r-* \
| m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
| m88110-* | m88k-* | mcore-* \ | m88110-* | m88k-* | mcore-* \
| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ | mips16-* \
| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ | mips64-* | mips64el-* \
| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ | mips64vr-* | mips64vrel-* \
| mips64orion-* | mips64orionel-* \
| mips64vr4100-* | mips64vr4100el-* \
| mips64vr4300-* | mips64vr4300el-* \
| mips64vr5000-* | mips64vr5000el-* \
| mipsisa32-* | mipsisa32el-* \
| mipsisa64-* | mipsisa64el-* \
| mipsisa64sb1-* | mipsisa64sb1el-* \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
| mipstx39 | mipstx39el \
| none-* | np1-* | ns16k-* | ns32k-* \ | none-* | np1-* | ns16k-* | ns32k-* \
| orion-* \ | orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
| pyramid-* \ | pyramid-* \
| romp-* | rs6000-* \ | romp-* | rs6000-* \
| s390-* | s390x-* \ | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \
| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc86x-* | sparclite-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
| sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
| t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \
| v850-* | vax-* \ | v850-* | v850e-* | vax-* \
| we32k-* \ | we32k-* \
| x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
| xtensa-* \
| ymp-* \ | ymp-* \
| z8k-*) | z8k-*)
;; ;;
@@ -374,6 +398,10 @@ case $basic_machine in
basic_machine=ns32k-sequent basic_machine=ns32k-sequent
os=-dynix os=-dynix
;; ;;
c90)
basic_machine=c90-cray
os=-unicos
;;
convex-c1) convex-c1)
basic_machine=c1-convex basic_machine=c1-convex
os=-bsd os=-bsd
@@ -394,16 +422,8 @@ case $basic_machine in
basic_machine=c38-convex basic_machine=c38-convex
os=-bsd os=-bsd
;; ;;
cray | ymp) cray | j90)
basic_machine=ymp-cray basic_machine=j90-cray
os=-unicos
;;
cray2)
basic_machine=cray2-cray
os=-unicos
;;
[cjt]90)
basic_machine=${basic_machine}-cray
os=-unicos os=-unicos
;; ;;
crds | unos) crds | unos)
@@ -418,6 +438,14 @@ case $basic_machine in
decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
basic_machine=mips-dec basic_machine=mips-dec
;; ;;
decsystem10* | dec10*)
basic_machine=pdp10-dec
os=-tops10
;;
decsystem20* | dec20*)
basic_machine=pdp10-dec
os=-tops20
;;
delta | 3300 | motorola-3300 | motorola-delta \ delta | 3300 | motorola-3300 | motorola-delta \
| 3300-motorola | delta-motorola) | 3300-motorola | delta-motorola)
basic_machine=m68k-motorola basic_machine=m68k-motorola
@@ -598,14 +626,6 @@ case $basic_machine in
basic_machine=m68k-atari basic_machine=m68k-atari
os=-mint os=-mint
;; ;;
mipsel*-linux*)
basic_machine=mipsel-unknown
os=-linux-gnu
;;
mips*-linux*)
basic_machine=mips-unknown
os=-linux-gnu
;;
mips3*-*) mips3*-*)
basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
;; ;;
@@ -620,6 +640,10 @@ case $basic_machine in
basic_machine=m68k-rom68k basic_machine=m68k-rom68k
os=-coff os=-coff
;; ;;
morphos)
basic_machine=powerpc-unknown
os=-morphos
;;
msdos) msdos)
basic_machine=i386-pc basic_machine=i386-pc
os=-msdos os=-msdos
@@ -699,6 +723,10 @@ case $basic_machine in
basic_machine=hppa1.1-oki basic_machine=hppa1.1-oki
os=-proelf os=-proelf
;; ;;
or32 | or32-*)
basic_machine=or32-unknown
os=-coff
;;
OSE68000 | ose68000) OSE68000 | ose68000)
basic_machine=m68000-ericsson basic_machine=m68000-ericsson
os=-ose os=-ose
@@ -721,19 +749,19 @@ case $basic_machine in
pbb) pbb)
basic_machine=m68k-tti basic_machine=m68k-tti
;; ;;
pc532 | pc532-*) pc532 | pc532-*)
basic_machine=ns32k-pc532 basic_machine=ns32k-pc532
;; ;;
pentium | p5 | k5 | k6 | nexgen) pentium | p5 | k5 | k6 | nexgen | viac3)
basic_machine=i586-pc basic_machine=i586-pc
;; ;;
pentiumpro | p6 | 6x86 | athlon) pentiumpro | p6 | 6x86 | athlon | athlon_*)
basic_machine=i686-pc basic_machine=i686-pc
;; ;;
pentiumii | pentium2) pentiumii | pentium2)
basic_machine=i686-pc basic_machine=i686-pc
;; ;;
pentium-* | p5-* | k5-* | k6-* | nexgen-*) pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
pentiumpro-* | p6-* | 6x86-* | athlon-*) pentiumpro-* | p6-* | 6x86-* | athlon-*)
@@ -748,22 +776,22 @@ case $basic_machine in
power) basic_machine=power-ibm power) basic_machine=power-ibm
;; ;;
ppc) basic_machine=powerpc-unknown ppc) basic_machine=powerpc-unknown
;; ;;
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
ppcle | powerpclittle | ppc-le | powerpc-little) ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown basic_machine=powerpcle-unknown
;; ;;
ppcle-* | powerpclittle-*) ppcle-* | powerpclittle-*)
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
ppc64) basic_machine=powerpc64-unknown ppc64) basic_machine=powerpc64-unknown
;; ;;
ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
ppc64le | powerpc64little | ppc64-le | powerpc64-little) ppc64le | powerpc64little | ppc64-le | powerpc64-little)
basic_machine=powerpc64le-unknown basic_machine=powerpc64le-unknown
;; ;;
ppc64le-* | powerpc64little-*) ppc64le-* | powerpc64little-*)
basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
@@ -784,10 +812,22 @@ case $basic_machine in
rtpc | rtpc-*) rtpc | rtpc-*)
basic_machine=romp-ibm basic_machine=romp-ibm
;; ;;
s390 | s390-*)
basic_machine=s390-ibm
;;
s390x | s390x-*)
basic_machine=s390x-ibm
;;
sa29200) sa29200)
basic_machine=a29k-amd basic_machine=a29k-amd
os=-udi os=-udi
;; ;;
sb1)
basic_machine=mipsisa64sb1-unknown
;;
sb1el)
basic_machine=mipsisa64sb1el-unknown
;;
sequent) sequent)
basic_machine=i386-sequent basic_machine=i386-sequent
;; ;;
@@ -795,7 +835,7 @@ case $basic_machine in
basic_machine=sh-hitachi basic_machine=sh-hitachi
os=-hms os=-hms
;; ;;
sparclite-wrs) sparclite-wrs | simso-wrs)
basic_machine=sparclite-wrs basic_machine=sparclite-wrs
os=-vxworks os=-vxworks
;; ;;
@@ -861,10 +901,22 @@ case $basic_machine in
basic_machine=i386-sequent basic_machine=i386-sequent
os=-dynix os=-dynix
;; ;;
t3e) t3d)
basic_machine=t3e-cray basic_machine=alpha-cray
os=-unicos os=-unicos
;; ;;
t3e)
basic_machine=alphaev5-cray
os=-unicos
;;
t90)
basic_machine=t90-cray
os=-unicos
;;
tic4x | c4x*)
basic_machine=tic4x-unknown
os=-coff
;;
tic54x | c54x*) tic54x | c54x*)
basic_machine=tic54x-unknown basic_machine=tic54x-unknown
os=-coff os=-coff
@@ -875,6 +927,10 @@ case $basic_machine in
tx39el) tx39el)
basic_machine=mipstx39el-unknown basic_machine=mipstx39el-unknown
;; ;;
toad1)
basic_machine=pdp10-xkl
os=-tops20
;;
tower | tower-32) tower | tower-32)
basic_machine=m68k-ncr basic_machine=m68k-ncr
;; ;;
@@ -899,8 +955,8 @@ case $basic_machine in
os=-vms os=-vms
;; ;;
vpp*|vx|vx-*) vpp*|vx|vx-*)
basic_machine=f301-fujitsu basic_machine=f301-fujitsu
;; ;;
vxworks960) vxworks960)
basic_machine=i960-wrs basic_machine=i960-wrs
os=-vxworks os=-vxworks
@@ -925,13 +981,13 @@ case $basic_machine in
basic_machine=i386-pc basic_machine=i386-pc
os=-windows32-msvcrt os=-windows32-msvcrt
;; ;;
xmp) xps | xps100)
basic_machine=xmp-cray
os=-unicos
;;
xps | xps100)
basic_machine=xps100-honeywell basic_machine=xps100-honeywell
;; ;;
ymp)
basic_machine=ymp-cray
os=-unicos
;;
z8k-*-coff) z8k-*-coff)
basic_machine=z8k-unknown basic_machine=z8k-unknown
os=-sim os=-sim
@@ -952,13 +1008,6 @@ case $basic_machine in
op60c) op60c)
basic_machine=hppa1.1-oki basic_machine=hppa1.1-oki
;; ;;
mips)
if [ x$os = x-linux-gnu ]; then
basic_machine=mips-unknown
else
basic_machine=mips-mips
fi
;;
romp) romp)
basic_machine=romp-ibm basic_machine=romp-ibm
;; ;;
@@ -978,13 +1027,16 @@ case $basic_machine in
we32k) we32k)
basic_machine=we32k-att basic_machine=we32k-att
;; ;;
sh3 | sh4 | sh3eb | sh4eb) sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele)
basic_machine=sh-unknown basic_machine=sh-unknown
;; ;;
sh64)
basic_machine=sh64-unknown
;;
sparc | sparcv9 | sparcv9b) sparc | sparcv9 | sparcv9b)
basic_machine=sparc-sun basic_machine=sparc-sun
;; ;;
cydra) cydra)
basic_machine=cydra-cydrome basic_machine=cydra-cydrome
;; ;;
orion) orion)
@@ -999,10 +1051,6 @@ case $basic_machine in
pmac | pmac-mpw) pmac | pmac-mpw)
basic_machine=powerpc-apple basic_machine=powerpc-apple
;; ;;
c4x*)
basic_machine=c4x-none
os=-coff
;;
*-unknown) *-unknown)
# Make sure to match an already-canonicalized machine name. # Make sure to match an already-canonicalized machine name.
;; ;;
@@ -1068,7 +1116,8 @@ case $os in
| -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos*) | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* | -powermax*)
# Remember, each alternative MUST END IN *, to match a version number. # Remember, each alternative MUST END IN *, to match a version number.
;; ;;
-qnx*) -qnx*)
@@ -1120,14 +1169,20 @@ case $os in
-acis*) -acis*)
os=-aos os=-aos
;; ;;
-atheos*)
os=-atheos
;;
-386bsd) -386bsd)
os=-bsd os=-bsd
;; ;;
-ctix* | -uts*) -ctix* | -uts*)
os=-sysv os=-sysv
;; ;;
-nova*)
os=-rtmk-nova
;;
-ns2 ) -ns2 )
os=-nextstep2 os=-nextstep2
;; ;;
-nsk*) -nsk*)
os=-nsk os=-nsk
@@ -1166,8 +1221,8 @@ case $os in
-xenix) -xenix)
os=-xenix os=-xenix
;; ;;
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
os=-mint os=-mint
;; ;;
-none) -none)
;; ;;
@@ -1200,10 +1255,11 @@ case $basic_machine in
arm*-semi) arm*-semi)
os=-aout os=-aout
;; ;;
# This must come before the *-dec entry.
pdp10-*) pdp10-*)
os=-tops20 os=-tops20
;; ;;
pdp11-*) pdp11-*)
os=-none os=-none
;; ;;
*-dec | vax-*) *-dec | vax-*)
@@ -1230,6 +1286,9 @@ case $basic_machine in
mips*-*) mips*-*)
os=-elf os=-elf
;; ;;
or32-*)
os=-coff
;;
*-tti) # must be before sparc entry or we get the wrong os. *-tti) # must be before sparc entry or we get the wrong os.
os=-sysv3 os=-sysv3
;; ;;
@@ -1293,19 +1352,19 @@ case $basic_machine in
*-next) *-next)
os=-nextstep3 os=-nextstep3
;; ;;
*-gould) *-gould)
os=-sysv os=-sysv
;; ;;
*-highlevel) *-highlevel)
os=-bsd os=-bsd
;; ;;
*-encore) *-encore)
os=-bsd os=-bsd
;; ;;
*-sgi) *-sgi)
os=-irix os=-irix
;; ;;
*-siemens) *-siemens)
os=-sysv4 os=-sysv4
;; ;;
*-masscomp) *-masscomp)
@@ -1377,7 +1436,7 @@ case $basic_machine in
-ptx*) -ptx*)
vendor=sequent vendor=sequent
;; ;;
-vxsim* | -vxworks*) -vxsim* | -vxworks* | -windiss*)
vendor=wrs vendor=wrs
;; ;;
-aux*) -aux*)

View File

@@ -5,18 +5,30 @@ dnl Ensure that this file is processed with autoconf 2.50 or newer
dnl Don't even think about removing this check! dnl Don't even think about removing this check!
AC_PREREQ(2.50) AC_PREREQ(2.50)
dnl First some basic init macros dnl We don't know the version number "staticly" so we use a dash here
AC_INIT AC_INIT(curl, [-], [curl-bug@haxx.se])
dnl configure script copyright
AC_COPYRIGHT([Copyright (c) 1998 - 2003 Daniel Stenberg, <daniel@haxx.se>
This configure script may be copied, distributed and modified under the
terms of the curl license; see COPYING for more details])
AC_CONFIG_SRCDIR([lib/urldata.h]) AC_CONFIG_SRCDIR([lib/urldata.h])
AM_CONFIG_HEADER(lib/config.h src/config.h tests/server/config.h lib/ca-bundle.h) AM_CONFIG_HEADER(lib/config.h src/config.h tests/server/config.h lib/ca-bundle.h)
AM_MAINTAINER_MODE
AC_PATH_PROG( SED, sed, , $PATH:/usr/bin:/usr/local/bin)
AC_SUBST(SED)
dnl figure out the libcurl version dnl figure out the libcurl version
VERSION=`sed -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curl.h` VERSION=`$SED -ne 's/^#define LIBCURL_VERSION "\(.*\)"/\1/p' ${srcdir}/include/curl/curl.h`
AM_INIT_AUTOMAKE(curl,$VERSION) AM_INIT_AUTOMAKE(curl,$VERSION)
AC_MSG_CHECKING([curl version])
AC_MSG_RESULT($VERSION)
dnl dnl
dnl we extract the numerical version for curl-config only dnl we extract the numerical version for curl-config only
VERSIONNUM=`sed -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curl.h` VERSIONNUM=`$SED -ne 's/^#define LIBCURL_VERSION_NUM 0x\(.*\)/\1/p' ${srcdir}/include/curl/curl.h`
AC_SUBST(VERSIONNUM) AC_SUBST(VERSIONNUM)
dnl Solaris pkgadd support definitions dnl Solaris pkgadd support definitions
@@ -71,8 +83,8 @@ dnl switch off particular protocols
dnl dnl
AC_MSG_CHECKING([whether to support http]) AC_MSG_CHECKING([whether to support http])
AC_ARG_ENABLE(http, AC_ARG_ENABLE(http,
[ --enable-http Enable HTTP support AC_HELP_STRING([--enable-http],[Enable HTTP support])
--disable-http Disable HTTP support], AC_HELP_STRING([--disable-http],[Disable HTTP support]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -89,8 +101,8 @@ AC_ARG_ENABLE(http,
) )
AC_MSG_CHECKING([whether to support ftp]) AC_MSG_CHECKING([whether to support ftp])
AC_ARG_ENABLE(ftp, AC_ARG_ENABLE(ftp,
[ --enable-ftp Enable FTP support AC_HELP_STRING([--enable-ftp],[Enable FTP support])
--disable-ftp Disable FTP support], AC_HELP_STRING([--disable-ftp],[Disable FTP support]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -104,8 +116,8 @@ AC_ARG_ENABLE(ftp,
) )
AC_MSG_CHECKING([whether to support gopher]) AC_MSG_CHECKING([whether to support gopher])
AC_ARG_ENABLE(gopher, AC_ARG_ENABLE(gopher,
[ --enable-gopher Enable GOPHER support AC_HELP_STRING([--enable-gopher],[Enable GOPHER support])
--disable-gopher Disable GOPHER support], AC_HELP_STRING([--disable-gopher],[Disable GOPHER support]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -119,8 +131,8 @@ AC_ARG_ENABLE(gopher,
) )
AC_MSG_CHECKING([whether to support file]) AC_MSG_CHECKING([whether to support file])
AC_ARG_ENABLE(file, AC_ARG_ENABLE(file,
[ --enable-file Enable FILE support AC_HELP_STRING([--enable-file],[Enable FILE support])
--disable-file Disable FILE support], AC_HELP_STRING([--disable-file],[Disable FILE support]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -134,8 +146,8 @@ AC_ARG_ENABLE(file,
) )
AC_MSG_CHECKING([whether to support ldap]) AC_MSG_CHECKING([whether to support ldap])
AC_ARG_ENABLE(ldap, AC_ARG_ENABLE(ldap,
[ --enable-ldap Enable LDAP support AC_HELP_STRING([--enable-ldap],[Enable LDAP support])
--disable-ldap Disable LDAP support], AC_HELP_STRING([--disable-ldap],[Disable LDAP support]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -149,12 +161,12 @@ AC_ARG_ENABLE(ldap,
) )
AC_MSG_CHECKING([whether to support dict]) AC_MSG_CHECKING([whether to support dict])
AC_ARG_ENABLE(dict, AC_ARG_ENABLE(dict,
[ --enable-dict Enable DICT support AC_HELP_STRING([--enable-dict],[Enable DICT support])
--disable-dict Disable DICT support], AC_HELP_STRING([--disable-dict],[Disable DICT support]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
AC_DEFINE(CURL_DISABLE_DICT, 1 [to disable DICT]) AC_DEFINE(CURL_DISABLE_DICT, 1, [to disable DICT])
AC_SUBST(CURL_DISABLE_DICT) AC_SUBST(CURL_DISABLE_DICT)
;; ;;
*) AC_MSG_RESULT(yes) *) AC_MSG_RESULT(yes)
@@ -164,8 +176,8 @@ AC_ARG_ENABLE(dict,
) )
AC_MSG_CHECKING([whether to support telnet]) AC_MSG_CHECKING([whether to support telnet])
AC_ARG_ENABLE(telnet, AC_ARG_ENABLE(telnet,
[ --enable-telnet Enable TELNET support AC_HELP_STRING([--enable-telnet],[Enable TELNET support])
--disable-telnet Disable TELNET support], AC_HELP_STRING([--disable-telnet],[Disable TELNET support]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -185,8 +197,8 @@ dnl **********************************************************************
AC_MSG_CHECKING([whether to enable ipv6]) AC_MSG_CHECKING([whether to enable ipv6])
AC_ARG_ENABLE(ipv6, AC_ARG_ENABLE(ipv6,
[ --enable-ipv6 Enable ipv6 (with ipv4) support AC_HELP_STRING([--enable-ipv6],[Enable ipv6 (with ipv4) support])
--disable-ipv6 Disable ipv6 support], AC_HELP_STRING([--disable-ipv6],[Disable ipv6 support]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -270,12 +282,26 @@ AC_CHECK_FUNC(connect, , [ AC_CHECK_LIB(socket, connect) ])
dnl dl lib? dnl dl lib?
AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ]) AC_CHECK_FUNC(dlclose, , [ AC_CHECK_LIB(dl, dlopen) ])
AC_MSG_CHECKING([whether to use libgcc])
AC_ARG_ENABLE(libgcc,
AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
[ case "$enableval" in
yes)
LIBS="$LIBS -lgcc"
AC_MSG_RESULT(yes)
;;
*) AC_MSG_RESULT(no)
;;
esac ],
AC_MSG_RESULT(no)
)
dnl ********************************************************************** dnl **********************************************************************
dnl Check how non-blocking sockets are set dnl Check how non-blocking sockets are set
dnl ********************************************************************** dnl **********************************************************************
AC_ARG_ENABLE(nonblocking, AC_ARG_ENABLE(nonblocking,
[ --enable-nonblocking Makes the script detect how to do it AC_HELP_STRING([--enable-nonblocking],[Enable detecting how to do it])
--disable-nonblocking Makes the script disable non-blocking sockets], AC_HELP_STRING([--disable-nonblocking],[Disable non-blocking socket detection]),
[ [
if test "$enableval" = "no" ; then if test "$enableval" = "no" ; then
AC_MSG_WARN([non-blocking sockets disabled]) AC_MSG_WARN([non-blocking sockets disabled])
@@ -294,7 +320,8 @@ dnl Check for the random seed preferences
dnl ********************************************************************** dnl **********************************************************************
AC_ARG_WITH(egd-socket, AC_ARG_WITH(egd-socket,
[ --with-egd-socket=FILE Entropy Gathering Daemon socket pathname], AC_HELP_STRING([--with-egd-socket=FILE],
[Entropy Gathering Daemon socket pathname]),
[ EGD_SOCKET="$withval" ] [ EGD_SOCKET="$withval" ]
) )
if test -n "$EGD_SOCKET" ; then if test -n "$EGD_SOCKET" ; then
@@ -304,7 +331,7 @@ fi
dnl Check for user-specified random device dnl Check for user-specified random device
AC_ARG_WITH(random, AC_ARG_WITH(random,
[ --with-random=FILE read randomness from FILE (default=/dev/urandom)], AC_HELP_STRING([--with-random=FILE],[read randomness from FILE (default=/dev/urandom)]),
[ RANDOM_FILE="$withval" ], [ RANDOM_FILE="$withval" ],
[ [
dnl Check for random device dnl Check for random device
@@ -317,19 +344,36 @@ if test -n "$RANDOM_FILE" ; then
[a suitable file to read random data from]) [a suitable file to read random data from])
fi fi
dnl **********************************************************************
dnl Check if the operating system allows programs to write to their own argv[]
dnl **********************************************************************
AC_MSG_CHECKING([if argv can be written to])
AC_TRY_RUN([
int main(int argc, char ** argv) {
argv[0][0] = ' ';
return (argv[0][0] == ' ')?0:1;
}
],
AC_DEFINE(HAVE_WRITABLE_ARGV, 1, [Define this symbol if your OS supports changing the contents of argv])
AC_MSG_RESULT(yes),
AC_MSG_RESULT(no)
)
dnl ********************************************************************** dnl **********************************************************************
dnl Check for the presence of Kerberos4 libraries and headers dnl Check for the presence of Kerberos4 libraries and headers
dnl ********************************************************************** dnl **********************************************************************
AC_ARG_WITH(krb4-includes, AC_ARG_WITH(krb4-includes,
[ --with-krb4-includes[=DIR] Specify location of kerberos4 headers],[ AC_HELP_STRING([--with-krb4-includes=DIR],
[Specify location of kerberos4 headers]),[
CPPFLAGS="$CPPFLAGS -I$withval" CPPFLAGS="$CPPFLAGS -I$withval"
KRB4INC="$withval" KRB4INC="$withval"
want_krb4=yes want_krb4=yes
]) ])
AC_ARG_WITH(krb4-libs, AC_ARG_WITH(krb4-libs,
[ --with-krb4-libs[=DIR] Specify location of kerberos4 libs],[ AC_HELP_STRING([--with-krb4-libs=DIR],[Specify location of kerberos4 libs]),[
LDFLAGS="$LDFLAGS -L$withval" LDFLAGS="$LDFLAGS -L$withval"
KRB4LIB="$withval" KRB4LIB="$withval"
want_krb4=yes want_krb4=yes
@@ -338,7 +382,7 @@ AC_ARG_WITH(krb4-libs,
OPT_KRB4=off OPT_KRB4=off
AC_ARG_WITH(krb4,dnl AC_ARG_WITH(krb4,dnl
[ --with-krb4[=DIR] where to look for Kerberos4],[ AC_HELP_STRING([--with-krb4=DIR],[where to look for Kerberos4]),[
OPT_KRB4="$withval" OPT_KRB4="$withval"
if test X"$OPT_KRB4" != Xyes if test X"$OPT_KRB4" != Xyes
then then
@@ -408,6 +452,31 @@ else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
fi fi
dnl Detect the pkg-config tool, as it may have extra info about the
dnl openssl installation we can use. I *believe* this is what we are
dnl expected to do on really recent Redhat Linux hosts.
AC_PATH_PROG( PKGCONFIG, pkg-config, no, $PATH:/usr/bin:/usr/local/bin)
if test "$PKGCONFIG" != "no" ; then
AC_MSG_CHECKING([for OpenSSL options using pkg-config])
$PKGCONFIG --exists openssl
SSL_EXISTS=$?
if test "$SSL_EXISTS" -eq "0"; then
SSL_LIBS=`$PKGCONFIG --libs-only-l openssl 2>/dev/null`
SSL_LDFLAGS=`$PKGCONFIG --libs-only-L openssl 2>/dev/null`
SSL_CPPFLAGS=`$PKGCONFIG --cflags-only-I openssl 2>/dev/null`
LIBS="$LIBS $SSL_LIBS"
CPPFLAGS="$CPPFLAGS $SSL_CPPFLAGS"
LDFLAGS="$LDFLAGS $SSL_LDFLAGS"
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
fi
dnl ********************************************************************** dnl **********************************************************************
dnl Check for the presence of SSL libraries and headers dnl Check for the presence of SSL libraries and headers
@@ -416,7 +485,7 @@ dnl **********************************************************************
dnl Default to compiler & linker defaults for SSL files & libraries. dnl Default to compiler & linker defaults for SSL files & libraries.
OPT_SSL=off OPT_SSL=off
AC_ARG_WITH(ssl,dnl AC_ARG_WITH(ssl,dnl
AC_HELP_STRING([--with-ssl=PATH], [where to look for SSL, PATH points to the SSL installation (default: /usr/local/ssl)]) AC_HELP_STRING([--with-ssl=PATH],[where to look for SSL, PATH points to the SSL installation (default: /usr/local/ssl)])
AC_HELP_STRING([--without-ssl], [disable SSL]), AC_HELP_STRING([--without-ssl], [disable SSL]),
OPT_SSL=$withval) OPT_SSL=$withval)
@@ -524,9 +593,9 @@ _cppflags=$CPPFLAGS
_ldflags=$LDFLAGS _ldflags=$LDFLAGS
OPT_ZLIB="/usr/local" OPT_ZLIB="/usr/local"
AC_ARG_WITH(zlib, AC_ARG_WITH(zlib,
AC_HELP_STRING([--with-zlib=PATH], [search for zlib in PATH]) AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH])
AC_HELP_STRING([--without-zlib], [disable use of zlib]), AC_HELP_STRING([--without-zlib],[disable use of zlib]),
[OPT_ZLIB="$withval"]) [OPT_ZLIB="$withval"])
case "$OPT_ZLIB" in case "$OPT_ZLIB" in
no) no)
@@ -543,8 +612,7 @@ case "$OPT_ZLIB" in
AC_CHECK_HEADER(zlib.h,[ AC_CHECK_HEADER(zlib.h,[
AC_CHECK_LIB(z, gzread, AC_CHECK_LIB(z, gzread,
[AM_CONDITIONAL(CONTENT_ENCODING, true) [HAVE_LIBZ="1"
HAVE_LIBZ="1"
AC_SUBST(HAVE_LIBZ) AC_SUBST(HAVE_LIBZ)
LIBS="$LIBS -lz" LIBS="$LIBS -lz"
AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file]) AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file])
@@ -559,14 +627,30 @@ esac
dnl Default is to try the thread-safe versions of a few functions dnl Default is to try the thread-safe versions of a few functions
OPT_THREAD=on OPT_THREAD=on
dnl detect AIX 4.3 or later
dnl see full docs on this reasoning in the lib/hostip.c source file
AC_MSG_CHECKING([AIX 4.3 or later])
AC_PREPROC_IFELSE([
#if defined(_AIX) && defined(_AIX43)
printf("just fine");
#else
#error "this is not AIX 4.3 or later"
#endif
],
[ AC_MSG_RESULT([yes])
OPT_THREAD=off ],
[ AC_MSG_RESULT([no]) ]
)
AC_ARG_ENABLE(thread,dnl AC_ARG_ENABLE(thread,dnl
[ --disable-thread tell configure to not look for thread-safe functions], AC_HELP_STRING([--disable-thread],[don't look for thread-safe functions]),
OPT_THREAD=off OPT_THREAD=off
AC_MSG_WARN(libcurl will not get built using thread-safe functions)
) )
if test X"$OPT_THREAD" = Xoff if test X"$OPT_THREAD" = Xoff
then then
AC_MSG_WARN(libcurl will not get built using thread-safe functions)
AC_DEFINE(DISABLED_THREADSAFE, 1, \ AC_DEFINE(DISABLED_THREADSAFE, 1, \
Set to explicitly specify we don't want to use thread-safe functions) Set to explicitly specify we don't want to use thread-safe functions)
else else
@@ -593,21 +677,23 @@ dnl **********************************************************************
dnl Checks for header files. dnl Checks for header files.
AC_HEADER_STDC AC_HEADER_STDC
AC_CHECK_HEADERS( \
dnl First check for the very most basic headers. Then we can use these
dnl ones as default-headers when checking for the rest!
AC_CHECK_HEADERS(
sys/types.h \
sys/time.h \
sys/select.h \
sys/socket.h \
unistd.h \ unistd.h \
malloc.h \ malloc.h \
stdlib.h \ stdlib.h \
arpa/inet.h \ arpa/inet.h \
net/if.h \ net/if.h \
netinet/in.h \ netinet/in.h \
netinet/if_ether.h \
netdb.h \ netdb.h \
sys/select.h \
sys/socket.h \
sys/sockio.h \ sys/sockio.h \
sys/stat.h \ sys/stat.h \
sys/types.h \
sys/time.h \
sys/param.h \ sys/param.h \
termios.h \ termios.h \
termio.h \ termio.h \
@@ -622,7 +708,26 @@ AC_CHECK_HEADERS( \
utime.h \ utime.h \
sys/utime.h \ sys/utime.h \
sys/poll.h \ sys/poll.h \
setjmp.h setjmp.h,
dnl to do if not found
[],
dnl to do if found
[],
dnl default includes
[
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
]
) )
dnl Checks for typedefs, structures, and compiler characteristics. dnl Checks for typedefs, structures, and compiler characteristics.
@@ -643,6 +748,8 @@ AC_CHECK_TYPE(ssize_t, int)
TYPE_SOCKLEN_T TYPE_SOCKLEN_T
TYPE_IN_ADDR_T TYPE_IN_ADDR_T
AC_FUNC_SELECT_ARGTYPES
dnl Checks for library functions. dnl Checks for library functions.
dnl AC_PROG_GCC_TRADITIONAL dnl AC_PROG_GCC_TRADITIONAL
AC_TYPE_SIGNAL AC_TYPE_SIGNAL
@@ -675,7 +782,21 @@ AC_CHECK_FUNCS( socket \
dlopen \ dlopen \
utime \ utime \
sigsetjmp \ sigsetjmp \
poll poll,
dnl if found
[],
dnl if not found, $ac_func is the name we check for
func="$ac_func"
AC_MSG_CHECKING([deeper for $func])
AC_TRY_LINK( [],
[ $func ();],
AC_MSG_RESULT(yes!)
eval "ac_cv_func_$func=yes"
def=`echo "HAVE_$func" | tr 'a-z' 'A-Z'`
AC_DEFINE_UNQUOTED($def, 1, [If you have $func]),
AC_MSG_RESULT(but still no)
)
) )
dnl sigsetjmp() might be a macro and no function so if it isn't found already dnl sigsetjmp() might be a macro and no function so if it isn't found already
@@ -691,15 +812,6 @@ if test "$ac_cv_func_sigsetjmp" != "yes"; then
) )
fi fi
dnl removed 'getpass' check on October 26, 2000
if test "$ac_cv_func_select" != "yes"; then
AC_MSG_ERROR(Can't work without an existing select() function)
fi
if test "$ac_cv_func_socket" != "yes"; then
AC_MSG_ERROR(Can't work without an existing socket() function)
fi
AC_PATH_PROG( PERL, perl, , AC_PATH_PROG( PERL, perl, ,
$PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin ) $PATH:/usr/local/bin/perl:/usr/bin/:/usr/local/bin )
AC_SUBST(PERL) AC_SUBST(PERL)
@@ -708,7 +820,6 @@ AC_PATH_PROGS( NROFF, gnroff nroff, ,
$PATH:/usr/bin/:/usr/local/bin ) $PATH:/usr/bin/:/usr/local/bin )
AC_SUBST(NROFF) AC_SUBST(NROFF)
AC_MSG_CHECKING([CA cert bundle install path]) AC_MSG_CHECKING([CA cert bundle install path])
AC_ARG_WITH(ca-bundle, AC_ARG_WITH(ca-bundle,
@@ -745,8 +856,8 @@ dnl lame option to switch on debug options
dnl dnl
AC_MSG_CHECKING([whether to enable debug options]) AC_MSG_CHECKING([whether to enable debug options])
AC_ARG_ENABLE(debug, AC_ARG_ENABLE(debug,
[ --enable-debug Enable pedantic debug options AC_HELP_STRING([--enable-debug],[Enable pedantic debug options])
--disable-debug Disable debug options], AC_HELP_STRING([--disable-debug],[Disable debug options]),
[ case "$enableval" in [ case "$enableval" in
no) no)
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -756,10 +867,21 @@ AC_ARG_ENABLE(debug,
CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG" CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG"
CFLAGS="$CFLAGS -g" CFLAGS="$CFLAGS -g"
if test "$GCC" = "yes"; then if test "$GCC" = "yes"; then
CFLAGS="$CFLAGS -W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wcast-align -Wnested-externs" CFLAGS="$CFLAGS -W -Wall -Wwrite-strings -pedantic -Wundef -Wpointer-arith -Wnested-externs"
fi fi
dnl strip off optimizer flags dnl strip off optimizer flags
CFLAGS=`echo $CFLAGS | sed -e 's/-O[0-9 ]//g'` NEWFLAGS=""
for flag in $CFLAGS; do
case "$flag" in
-O*)
dnl echo "cut off $flag"
;;
*)
NEWFLAGS="$NEWFLAGS $flag"
;;
esac
done
CFLAGS=$NEWFLAGS
;; ;;
esac ], esac ],
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@@ -776,6 +898,7 @@ AC_CONFIG_FILES([Makefile \
tests/Makefile \ tests/Makefile \
tests/data/Makefile \ tests/data/Makefile \
tests/server/Makefile \ tests/server/Makefile \
tests/libtest/Makefile \
packages/Makefile \ packages/Makefile \
packages/Win32/Makefile \ packages/Win32/Makefile \
packages/Win32/cygwin/Makefile \ packages/Win32/cygwin/Makefile \

View File

@@ -107,7 +107,11 @@ while test $# -gt 0; do
;; ;;
--cflags) --cflags)
echo -I@includedir@ if test "X@includedir@" = "X/usr/include"; then
echo ""
else
echo "-I@includedir@"
fi
;; ;;
--libs) --libs)

View File

@@ -1,21 +0,0 @@
;;;; Emacs Lisp help for writing curl code. ;;;;
;;; In C files, put something like this to load this file automatically:
;;
;; /* -----------------------------------------------------------------
;; * local variables:
;; * eval: (load-file "../curl-mode.el")
;; * end:
;; */
;;
;; (note: make sure to get the path right in the argument to load-file).
;;; The curl hacker's C conventions
;;; we use intent-level 2
(setq c-basic-offset 2)
;;; never ever use tabs to indent!
(setq indent-tabs-mode nil)
;;; I like this, stolen from Subversion! ;-)
(setq angry-mob-with-torches-and-pitchforks t)

50
curl-style.el Normal file
View File

@@ -0,0 +1,50 @@
;;;; Emacs Lisp help for writing curl code. ;;;;
;;;; $Id$
;;; The curl hacker's C conventions.
;;; After loading this file and added the mode-hook you can in C
;;; files, put something like this to use the curl style
;;; automatically:
;;
;; /* -----------------------------------------------------------------
;; * local variables:
;; * eval: (set c-file-style "curl")
;; * end:
;; */
;;
(defconst curl-c-style
'((c-basic-offset . 2)
(c-comment-only-line-offset . 0)
(c-hanging-braces-alist . ((substatement-open before after)))
(c-offsets-alist . ((topmost-intro . 0)
(topmost-intro-cont . 0)
(substatement . +)
(substatement-open . 0)
(statement-case-intro . +)
(statement-case-open . 0)
(case-label . 0)
))
)
"Curl C Programming Style")
;; Customizations for all of c-mode, c++-mode, and objc-mode
(defun curl-c-mode-common-hook ()
"Curl C mode hook"
;; add curl style and set it for the current buffer
(c-add-style "curl" curl-c-style t)
(setq tab-width 8
indent-tabs-mode nil ; Use spaces. Not tabs.
comment-column 40
c-font-lock-extra-types (append '("bool" "CURL" "CURLcode" "ssize_t" "size_t" "socklen_t" "fd_set"))
)
;; keybindings for C, C++, and Objective-C. We can put these in
;; c-mode-base-map because of inheritance ...
(define-key c-mode-base-map "\M-q" 'c-fill-paragraph)
(setq c-recognize-knr-p nil)
)
;; Set this is in your .emacs if you want to use the c-mode-hook as
;; defined here right out of the box.
; (add-hook 'c-mode-common-hook 'curl-c-mode-common-hook)

View File

@@ -8,7 +8,7 @@ $Id$
BUGS BUGS
Curl and libcurl have grown substantially since the beginning. At the time Curl and libcurl have grown substantially since the beginning. At the time
of writing (end of April 2002), there are 32000 lines of source code, and by of writing (end of March 2003), there are 35000 lines of source code, and by
the time you read this it has probably grown even more. the time you read this it has probably grown even more.
Of course there are lots of bugs left. And lots of misfeatures. Of course there are lots of bugs left. And lots of misfeatures.
@@ -19,18 +19,21 @@ BUGS
WHERE TO REPORT WHERE TO REPORT
If you can't fix a bug yourself and submit a fix for it, try to report an as If you can't fix a bug yourself and submit a fix for it, try to report an as
detailed report as possible to the curl mailing list to allow one of us to detailed report as possible to a curl mailing list to allow one of us to
have a go at a solution. You should also post your bug/problem at curl's bug have a go at a solution. You should also post your bug/problem at curl's bug
tracking system over at tracking system over at
http://sourceforge.net/bugs/?group_id=976 http://sourceforge.net/bugs/?group_id=976
(but please read the section below first before doing that) (but please read the sections below first before doing that)
If you feel you need to ask around first, find a suitable mailing list and
post there. The lists are available on http://curl.haxx.se/mail/
WHAT TO REPORT WHAT TO REPORT
When reporting a bug, you should include information that will help us When reporting a bug, you should include information that will help us
understand what's wrong what you expected to happen and how to repeat the understand what's wrong, what you expected to happen and how to repeat the
bad behavior. You therefore need to tell us: bad behavior. You therefore need to tell us:
- your operating system's name and version number (uname -a under a unix - your operating system's name and version number (uname -a under a unix

View File

@@ -42,7 +42,8 @@ Naming
understandable and be named according to what they're used for. File-local understandable and be named according to what they're used for. File-local
functions should be made static. We like lower case names. functions should be made static. We like lower case names.
See the INTERNALS document on how we name non-exported library-global symbols. See the INTERNALS document on how we name non-exported library-global
symbols.
Indenting Indenting
@@ -55,7 +56,7 @@ Indenting
Commenting Commenting
Comment your source code extensively using C comments (/* comment */), do not Comment your source code extensively using C comments (/* comment */), DO NOT
use C++ comments (// this style). Commented code is quality code and enables use C++ comments (// this style). Commented code is quality code and enables
future modifications much more. Uncommented code much more risk being future modifications much more. Uncommented code much more risk being
completely replaced when someone wants to extend things, since other persons' completely replaced when someone wants to extend things, since other persons'
@@ -64,7 +65,7 @@ Commenting
General Style General Style
Keep your functions small. If they're small you avoid a lot of mistakes and Keep your functions small. If they're small you avoid a lot of mistakes and
you don't accidentally mix up variables. you don't accidentally mix up variables etc.
Non-clobbering All Over Non-clobbering All Over
@@ -78,11 +79,11 @@ Non-clobbering All Over
Platform Dependent Code Platform Dependent Code
Use #ifdef HAVE_FEATURE to do conditional code. We avoid checking for Use #ifdef HAVE_FEATURE to do conditional code. We avoid checking for
particular operting systems or hardware in the #ifdef lines. The HAVE_FEATURE particular operating systems or hardware in the #ifdef lines. The
shall be generated by the configure script for unix-like systems and they are HAVE_FEATURE shall be generated by the configure script for unix-like systems
hard-coded in the config-[system].h files for the others. and they are hard-coded in the config-[system].h files for the others.
Separate Patches Doing Different Things Separate Patches
It is annoying when you get a huge patch from someone that is said to fix 511 It is annoying when you get a huge patch from someone that is said to fix 511
odd problems, but discussions and opinions don't agree with 510 of them - or odd problems, but discussions and opinions don't agree with 510 of them - or
@@ -128,3 +129,31 @@ Test Cases
in the test suite. Every feature that is added should get at least one valid in the test suite. Every feature that is added should get at least one valid
test case that verifies that it works as documented. If every submitter also test case that verifies that it works as documented. If every submitter also
post a few test cases, it won't end up as a heavy burden on a single person! post a few test cases, it won't end up as a heavy burden on a single person!
How To Make a Patch
Keep a copy of the unmodified curl sources. Make your changes in a separate
source tree. When you think you have something that you want to offer the
curl community, use GNU diff to generate patches.
If you have modified a single file, try something like:
diff -u undmodified-file.c my-changed-one.c > my-fixes.diff
If you have modified several files, possibly in different directories, you
can use diff recursively:
diff -ur curl-original-dir curl-modfied-sources-dir > my-fixes.diff
The GNU diff and GNU patch tools exist for virtually all platforms, including
all kinds of unixes and Windows:
For unix-like operating systems:
http://www.fsf.org/software/patch/patch.html
http://www.gnu.org/directory/diffutils.html
For Windows:
http://gnuwin32.sourceforge.net/packages/patch.htm
http://gnuwin32.sourceforge.net/packages/diffutils.htm

105
docs/FAQ
View File

@@ -1,4 +1,4 @@
Updated: November 12, 2002 (http://curl.haxx.se/docs/faq.html) Updated: February 25, 2003 (http://curl.haxx.se/docs/faq.html)
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@@ -59,6 +59,7 @@ 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?
4.10 My HTTP request using HEAD, PUT or DELETE doesn't work! 4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
4.11 Why does my HTTP range requests return the full document? 4.11 Why does my HTTP range requests return the full document?
4.12 Why do I get "certificate verify failed" ?
5. libcurl Issues 5. libcurl Issues
5.1 Is libcurl thread-safe? 5.1 Is libcurl thread-safe?
@@ -174,20 +175,21 @@ FAQ
Project cURL is entirely free and open. No person gets paid for developing Project cURL is entirely free and open. No person gets paid for developing
curl. We do this voluntarily on our spare time. curl. We do this voluntarily on our spare time.
We get some help from companies. Contactor Data hosts the curl web site and We get some help from companies. Contactor Data hosts the curl web site,
the main mailing list, Haxx owns the curl web site's domain and Haxx owns the curl web site's domain and sourceforge.net hosts several
sourceforge.net hosts several project tools we take advantage from like the project services we take advantage from, like the bug tracker, mailing lists
bug tracker, mailing lists and more. and more.
If you want to support our project with a donation or similar, one way of If you want to support our project with a donation or similar, one way of
doing that would be to buy "gift certificates" at useful online shopping doing that would be to buy "gift certificates" at useful online shopping
sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor
us through a banner-program or even better: by helping us coding, us through a banner-program or even better: by helping us coding,
documenting, testing etc. documenting, testing etc. You're welcome to send us a buck using paypal, as
described here: http://curl.haxx.se/donation.html
1.7 What about CURL from curl.com? 1.7 What about CURL from curl.com?
During the summer 2001, curl.com has been busy advertising their client-side During the summer 2001, curl.com was busy advertising their client-side
programming language for the web, named CURL. programming language for the web, named CURL.
We are in no way associated with curl.com or their CURL programming We are in no way associated with curl.com or their CURL programming
@@ -202,17 +204,17 @@ FAQ
1.8 I have a problem who do I mail? 1.8 I have a problem who do I mail?
Please do not attempt to mail any single individual unless you really need Please do not mail any single individual unless you really need to. Keep
to. Keep curl-related questions on a suitable mailing list. All available curl-related questions on a suitable mailing list. All available mailing
mailing lists are listed in the MANUAL document and online at lists are listed in the MANUAL document and online at
http://curl.haxx.se/mail/ http://curl.haxx.se/mail/
Keeping curl-related questions and discussions on mailing lists allows others Keeping curl-related questions and discussions on mailing lists allows
to join in and help, to share their ideas, contribute their suggestions and others to join in and help, to share their ideas, contribute their
spread their wisdom. Keeping discussions on public mailing lists also allows suggestions and spread their wisdom. Keeping discussions on public mailing
for others to learn from this (both current and future users thanks to the lists also allows for others to learn from this (both current and future
web based archives of the mailing lists), thus saving us from having to users thanks to the web based archives of the mailing lists), thus saving us
repeat ourselves even more. Thanks for respecting this. from having to repeat ourselves even more. Thanks for respecting this.
2. Install Related Problems 2. Install Related Problems
@@ -274,8 +276,8 @@ FAQ
2.4. Does cURL support Socks (RFC 1928) ? 2.4. Does cURL support Socks (RFC 1928) ?
No. Nobody has wanted it that badly yet. We appreciate patches that bring There is limited support for SOCKS5 for curl built with IPv6 support
this functionality. disabled.
3. Usage problems 3. Usage problems
@@ -367,9 +369,10 @@ FAQ
http://curl.haxx.se/libcurl/ http://curl.haxx.se/libcurl/
In December 2001, there are interfaces available for the following In February 2003, there are interfaces available for the following
languages: C/C++, Cocoa, Dylan, Java, Perl, PHP, Python, Rexx, Ruby, Scheme languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
and Tcl. By the time you read this, additional ones may have appeared! Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the
time you read this, additional ones may have appeared!
3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP? 3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
@@ -378,8 +381,8 @@ FAQ
XML-RPC are all such ones. You can use -X to set custom requests and -H to XML-RPC are all such ones. You can use -X to set custom requests and -H to
set custom headers (or replace internally generated ones). set custom headers (or replace internally generated ones).
Using libcurl or PHP's curl modules is just as fine and you'd just use the Using libcurl is of course just as fine and you'd just use the proper
proper library options to do the same. library options to do the same.
3.11 How do I POST with a different Content-Type? 3.11 How do I POST with a different Content-Type?
@@ -493,8 +496,7 @@ FAQ
curl '{curl,www}.haxx.se' curl '{curl,www}.haxx.se'
To be able to use those letters as actual parts of the URL (without using To be able to use those letters as actual parts of the URL (without using
them for the curl URL "globbing" system), use the -g/--globoff option (curl them for the curl URL "globbing" system), use the -g/--globoff option:
7.6 and later):
curl -g 'www.site.com/weirdname[].html' curl -g 'www.site.com/weirdname[].html'
@@ -607,6 +609,30 @@ FAQ
Because the range may not be supported by the server, or the server may Because the range may not be supported by the server, or the server may
choose to ignore it and return the full document anyway. choose to ignore it and return the full document anyway.
4.12 Why do I get "certificate verify failed" ?
You invoke curl 7.10 or later to communicate on a https:// URL and get an
error back looking something similar to this:
curl: (35) SSL: error:14090086:SSL routines:
SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Then it means that curl couldn't verify that the server's certificate was
good. Curl verifies the certificate using the CA cert bundle that comes with
the curl installation.
To disable the verification (which makes it act like curl did before 7.10),
use -k. This does however enable man-in-the-middle attacks.
If you get this failure but are having a CA cert bundle installed and used,
the server's certificate is not signed by one of the CA's in the bundle. It
might for example be self-signed. You then correct this problem by obtaining
a valid CA cert for the server. Or again, decrease the security by disabling
this check.
Details are also in the SSLCERTS file in the release archives, found online
here: http://curl.haxx.se/docs/sslcerts.html
5. libcurl Issues 5. libcurl Issues
5.1. Is libcurl thread-safe? 5.1. Is libcurl thread-safe?
@@ -657,20 +683,15 @@ FAQ
5.3 How do I fetch multiple files with libcurl? 5.3 How do I fetch multiple files with libcurl?
Starting with version 7.7, curl and libcurl will have excellent support for libcurl has excellent support for transferring multiple files. You should
transferring multiple files. You should just repeatedly set new URLs with just repeatedly set new URLs with curl_easy_setopt() and then transfer it
curl_easy_setopt() and then transfer it with curl_easy_perform(). The handle with curl_easy_perform(). The handle you get from curl_easy_init() is not
you get from curl_easy_init() is not only reusable starting with libcurl only reusable, but you're even encouraged to reuse it if you can, as that
7.7, but also you're encouraged to reuse it if you can, as that will enable will enable libcurl to use persistent connections.
libcurl to use persistent connections.
For libcurl prior to 7.7, there was no multiple file support. The only
available way to do multiple requests was to init/perform/cleanup for each
transfer.
5.4 Does libcurl do Winsock initialization on win32 systems? 5.4 Does libcurl do Winsock initialization on win32 systems?
Yes (since 7.8.1) if told to in the curl_global_init() call. Yes, if told to in the curl_global_init() call.
5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ? 5.5 Does CURLOPT_FILE and CURLOPT_INFILE work on win32 ?
@@ -684,13 +705,11 @@ FAQ
5.6 What about Keep-Alive or persistent connections? 5.6 What about Keep-Alive or persistent connections?
Starting with version 7.7, curl and libcurl will have excellent support for curl and libcurl have excellent support for persistent connections when
persistent connections when transferring several files from the same server. transferring several files from the same server. Curl will attempt to reuse
Curl will attempt to reuse connections for all URLs specified on the same connections for all URLs specified on the same command line/config file, and
command line/config file, and libcurl will reuse connections for all libcurl will reuse connections for all transfers that are made using the
transfers that are made using the same libcurl handle. same libcurl handle.
Previous versions had no persistent connection support.
5.7 Link errors when building libcurl on Windows! 5.7 Link errors when building libcurl on Windows!

View File

@@ -54,7 +54,7 @@ OpenSSL took over where SSLeay was abandoned.
May 1999, first Debian package. May 1999, first Debian package.
August 1999, LDAP:// and FILE:// support added. The curl web site gets 1300 August 1999, LDAP:// and FILE:// support added. The curl web site gets 1300
visits daily. visits weekly.
Released curl 6.0 in September. 15000 lines of code. Released curl 6.0 in September. 15000 lines of code.
@@ -67,7 +67,7 @@ the easy interface and turned out to be the beginning of actually getting
other software and programs to get based on and powered by libcurl. Almost other software and programs to get based on and powered by libcurl. Almost
20000 lines of code. 20000 lines of code.
August 2000, the curl web site gets 4000 visits daily. August 2000, the curl web site gets 4000 visits weekly.
The PHP guys adopted libcurl already the same month, when the first ever third The PHP guys adopted libcurl already the same month, when the first ever third
party libcurl binding showed up. CURL has been a supported module in PHP since party libcurl binding showed up. CURL has been a supported module in PHP since
@@ -92,7 +92,7 @@ code.
August 2001. curl is bundled in Mac OS X, 10.1. It was already becoming more August 2001. curl is bundled in Mac OS X, 10.1. It was already becoming more
and more of a standard utility of Linux distributions and a regular in the BSD and more of a standard utility of Linux distributions and a regular in the BSD
ports collections. The curl web site gets 8000 visits daily. Curl Corporation ports collections. The curl web site gets 8000 visits weekly. Curl Corporation
contacted Daniel to discuss "the name issue". After Daniel's reply, they have contacted Daniel to discuss "the name issue". After Daniel's reply, they have
never since got in touch again. never since got in touch again.
@@ -100,7 +100,7 @@ September 2001, libcurl 7.9 introduces cookie jar and curl_formadd(). During
the forthcoming 7.9.x releases, we introduced the multi interface slowly and the forthcoming 7.9.x releases, we introduced the multi interface slowly and
without much whistles. without much whistles.
June 2002, the curl web site gets 13000 visits daily. curl and libcurl is June 2002, the curl web site gets 13000 visits weekly. curl and libcurl is
35000 lines of code. Reported successful compiles on more than 40 combinations 35000 lines of code. Reported successful compiles on more than 40 combinations
of CPUs and operating systems. of CPUs and operating systems.
@@ -111,3 +111,6 @@ distributions and otherwise retrieved as part of other software.
September 2002, with the release of curl 7.10 it is released under the MIT September 2002, with the release of curl 7.10 it is released under the MIT
license only. license only.
February 2003, the curl site averages at 20000 visits weekly. At any given
moment, there's an average of 3 people browsing the curl.haxx.se site.

25
docs/HOWTO-RELEASE Normal file
View File

@@ -0,0 +1,25 @@
Steps To Perform When Building a Public Release
* "make distcheck"
* ./maketgz
then upload the 3 curl packages maketgz created
* update these files:
www/_download.html
www/_changes.html
www/_newslog.html
www/Makefile
* commit the web changes
* 'cvs commit'
* 'cvs tag'
* write the release announcement, including:
- changes / bugfixes
- other curl-related news
- contributors
* mail release-announcement to curl-announce and curl-users

View File

@@ -28,11 +28,22 @@ UNIX
You probably need to be root when doing the last command. You probably need to be root when doing the last command.
If you have checked out the sources from the CVS repository, read the
CVS-INFO on how to proceed.
If you want to install curl in a different file hierarchy than /usr/local, If you want to install curl in a different file hierarchy than /usr/local,
you need to specify that already when running configure: you need to specify that already when running configure:
./configure --prefix=/path/to/curl/tree ./configure --prefix=/path/to/curl/tree
If you happen to have write permission in that directory, you can do 'make
install' without being root. An example of this would be to make a local
install in your own home directory:
./configure --prefix=$HOME
make
make install
The configure script always tries to find a working SSL library unless The configure script always tries to find a working SSL library unless
explicitly told not to. If you have OpenSSL installed in the default search explicitly told not to. If you have OpenSSL installed in the default search
path for your compiler/linker, you don't need to do anything special. If path for your compiler/linker, you don't need to do anything special. If
@@ -71,33 +82,6 @@ UNIX
LIBS=-lRSAglue -lrsaref LIBS=-lRSAglue -lrsaref
(as suggested by Doug Kaufman) (as suggested by Doug Kaufman)
KNOWN PROBLEMS (these ones should not happen anymore)
If you happen to have autoconf installed, but a version older than 2.12
you will get into trouble. Then you can still build curl by issuing these
commands (note that this requires curl to be built staticly): (from Ralph
Beckmann)
./configure [...]
cd lib; make; cd ..
cd src; make; cd ..
cp src/curl elsewhere/bin/
As suggested by David West, you can make a faked version of autoconf and
autoheader:
----start of autoconf----
#!/bin/bash
#fake autoconf for building curl
if [ "$1" = "--version" ] then
echo "Autoconf version 2.13"
fi
----end of autoconf----
Then make autoheader a symbolic link to the same script and make sure
they're executable and set to appear in the path *BEFORE* the actual (but
obsolete) autoconf and autoheader scripts.
MORE OPTIONS MORE OPTIONS
To force configure to use the standard cc compiler if both cc and gcc are To force configure to use the standard cc compiler if both cc and gcc are
@@ -416,6 +400,17 @@ CROSS COMPILE
The '--prefix' parameter specifies where cURL will be installed. If The '--prefix' parameter specifies where cURL will be installed. If
'configure' completes successfully, do 'make' and 'make install' as usual. 'configure' completes successfully, do 'make' and 'make install' as usual.
RISC OS
=======
The library can be cross-compiled using gccsdk as follows:
CC=riscos-gcc AR=riscos-ar RANLIB='riscos-ar -s' ./configure \
--host=arm-riscos-aof --without-random --disable-shared
make
where riscos-gcc and riscos-ar are links to the gccsdk tools.
You can then link your program with curl/lib/.libs/libcurl.a
PORTS PORTS
===== =====
This is a probably incomplete list of known hardware and operating systems This is a probably incomplete list of known hardware and operating systems
@@ -435,7 +430,7 @@ PORTS
- MIPS IRIX 6.2, 6.5 - MIPS IRIX 6.2, 6.5
- MIPS Linux - MIPS Linux
- Pocket PC/Win CE 3.0 - Pocket PC/Win CE 3.0
- Power AIX 4.2, 4.3.1, 4.3.2, 5.1 - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1
- PowerPC Darwin 1.0 - PowerPC Darwin 1.0
- PowerPC Linux - PowerPC Linux
- PowerPC Mac OS 9 - PowerPC Mac OS 9
@@ -464,6 +459,7 @@ PORTS
- m68k Linux - m68k Linux
- m68k OpenBSD - m68k OpenBSD
- s390 Linux - s390 Linux
- XScale/PXA250 Linux 2.4
OpenSSL OpenSSL
======= =======

View File

@@ -15,6 +15,8 @@ may have been fixed since this was written!
* configure --disable-http is not fully supported. All other protocols seem * configure --disable-http is not fully supported. All other protocols seem
to work to disable. to work to disable.
* The -m parameter does not work when using telnet with curl on Windows.
* If a HTTP server responds to a HEAD request and includes a body (thus * If a HTTP server responds to a HEAD request and includes a body (thus
violating the RFC2616), curl won't wait to read the response but just stop violating the RFC2616), curl won't wait to read the response but just stop
reading and return back. If a second request (let's assume a GET) is then reading and return back. If a second request (let's assume a GET) is then

View File

@@ -166,13 +166,21 @@ UPLOADING
VERBOSE / DEBUG VERBOSE / DEBUG
If curl fails where it isn't supposed to, if the servers don't let you If curl fails where it isn't supposed to, if the servers don't let you in,
in, if you can't understand the responses: use the -v flag to get VERBOSE if you can't understand the responses: use the -v flag to get verbose
fetching. Curl will output lots of info and all data it sends and fetching. Curl will output lots of info and what it sends and receives in
receives in order to let the user see all client-server interaction. order to let the user see all client-server interaction (but it won't show
you the actual data).
curl -v ftp://ftp.upload.com/ curl -v ftp://ftp.upload.com/
To get even more details and information on what curl does, try using the
--trace or --trace-ascii options with a given file name to log to, like
this:
curl --trace trace.txt www.haxx.se
DETAILED INFORMATION DETAILED INFORMATION
Different protocols provide different ways of getting detailed information Different protocols provide different ways of getting detailed information
@@ -350,6 +358,13 @@ COOKIES
curl -b headers www.example.com curl -b headers www.example.com
While saving headers to a file is a working way to store cookies, it is
however error-prone and not the prefered way to do this. Instead, make curl
save the incoming cookies using the well-known netscape cookie format like
this:
curl -c cookies.txt www.example.com
Note that by specifying -b you enable the "cookie awareness" and with -L Note that by specifying -b you enable the "cookie awareness" and with -L
you can make curl follow a location: (which often is used in combination you can make curl follow a location: (which often is used in combination
with cookies). So that if a site sends cookies and a location, you can with cookies). So that if a site sends cookies and a location, you can
@@ -364,6 +379,10 @@ COOKIES
stored cookies which match the request as it follows the location. The stored cookies which match the request as it follows the location. The
file "empty.txt" may be a non-existant file. file "empty.txt" may be a non-existant file.
Alas, to both read and write cookies from a netscape cookie file, you can
set both -b and -c to use the same file:
curl -b cookies.txt -c cookies.txt www.example.com
PROGRESS METER PROGRESS METER
@@ -413,7 +432,8 @@ SPEED LIMIT
Forcing curl not to transfer data faster than a given rate is also possible, Forcing curl not to transfer data faster than a given rate is also possible,
which might be useful if you're using a limited bandwidth connection and you which might be useful if you're using a limited bandwidth connection and you
don't want your transfer to use all of it. don't want your transfer to use all of it (sometimes referred to as
"bandwith throttle").
Make curl transfer data no faster than 10 kilobytes per second: Make curl transfer data no faster than 10 kilobytes per second:
@@ -427,6 +447,11 @@ SPEED LIMIT
curl -T upload --limit-rate 1M ftp://uploadshereplease.com curl -T upload --limit-rate 1M ftp://uploadshereplease.com
When using the --limit-rate option, the transfer rate is regulated on a
per-second basis, which will cause the total transfer speed to become lower
than the given number. Sometimes of course substantially lower, if your
transfer stalls during periods.
CONFIG FILE CONFIG FILE
Curl automatically tries to read the .curlrc file (or _curlrc file on win32 Curl automatically tries to read the .curlrc file (or _curlrc file on win32

View File

@@ -10,7 +10,8 @@ man_MANS = \
HTMLPAGES = \ HTMLPAGES = \
curl.html \ curl.html \
curl-config.html curl-config.html \
index.html
PDFPAGES = \ PDFPAGES = \
curl.pdf \ curl.pdf \

View File

@@ -82,3 +82,8 @@ that have contributed with non-trivial parts:
- Andreas Damm <andreas-sourceforge@radab.org> - Andreas Damm <andreas-sourceforge@radab.org>
- Jacky Lam <sylam@emsoftltd.com> - Jacky Lam <sylam@emsoftltd.com>
- James Gallagher <jgallagher@gso.uri.edu> - James Gallagher <jgallagher@gso.uri.edu>
- Kjetil Jacobsen <kjetilja@cs.uit.no>
- Markus F.X.J. Oberhumer <markus@oberhumer.com>
- Miklos Nemeth <mnemeth@kfkisystems.com>
- Kevin Roth <kproth@users.sourceforge.net>
- Ralph Mitchell <rmitchell@eds.com>

View File

@@ -15,7 +15,8 @@ TODO
* Introduce an interface to libcurl that allows applications to easier get to * Introduce an interface to libcurl that allows applications to easier get to
know what cookies that are received. Pushing interface that calls a know what cookies that are received. Pushing interface that calls a
callback on each received cookie? Querying interface that asks about callback on each received cookie? Querying interface that asks about
existing cookies? We probably need both. existing cookies? We probably need both. Enable applications to modify
existing cookies as well.
* Make content encoding/decoding internally be made using a filter system. * Make content encoding/decoding internally be made using a filter system.
@@ -23,16 +24,9 @@ TODO
less copy of data and thus a faster operation. less copy of data and thus a faster operation.
[http://curl.haxx.se/dev/no_copy_callbacks.txt] [http://curl.haxx.se/dev/no_copy_callbacks.txt]
* Run-time querying about library characterics. What protocols do this * Add asynchronous name resolving (http://libdenise.sf.net/). This should be
running libcurl support? What is the version number of the running libcurl made to work on most of the supported platforms, or otherwise it isn't
(returning the well-defined version-#define). This could possibly be made really interesting.
by allowing curl_easy_getinfo() work with a NULL pointer for global info,
but perhaps better would be to introduce a new curl_getinfo() (or similar)
function for global info reading.
* Add asynchronous name resolving (http://daniel.haxx.se/resolver/). This
should be made to work on most of the supported platforms, or otherwise it
isn't really interesting.
* Data sharing. Tell which easy handles within a multi handle that should * Data sharing. Tell which easy handles within a multi handle that should
share cookies, connection cache, dns cache, ssl session cache. Full share cookies, connection cache, dns cache, ssl session cache. Full
@@ -51,12 +45,9 @@ TODO
>4GB all over. Bug reports (and source reviews) indicate that it doesn't >4GB all over. Bug reports (and source reviews) indicate that it doesn't
currently work properly. currently work properly.
* Make the built-in progress meter use its own dedicated output stream, and
make it possible to set it. Use stderr by default.
* CURLOPT_MAXFILESIZE. Prevent downloads that are larger than the specified * CURLOPT_MAXFILESIZE. Prevent downloads that are larger than the specified
size. CURLE_FILESIZE_EXCEEDED would then be returned. Gautam Mani size. CURLE_FILESIZE_EXCEEDED would then be returned. Gautam Mani
requested. That is, the download should even begin but be aborted requested. That is, the download should not even begin but be aborted
immediately. immediately.
* Allow the http_proxy (and other) environment variables to contain user and * Allow the http_proxy (and other) environment variables to contain user and
@@ -66,13 +57,15 @@ TODO
LIBCURL - multi interface LIBCURL - multi interface
* Make sure we don't ever loop because of non-blocking sockets return * Make sure we don't ever loop because of non-blocking sockets return
EWOULDBLOCK or similar. This concerns the HTTP request sending (and EWOULDBLOCK or similar. This FTP command sending, the SSL connection etc.
especially regular HTTP POST), the FTP command sending etc.
* Make uploads treated better. We need a way to tell libcurl we have data to * Make transfers treated more carefully. We need a way to tell libcurl we
write, as the current system expects us to upload data each time the socket have data to write, as the current system expects us to upload data each
is writable and there is no way to say that we want to upload data soon time the socket is writable and there is no way to say that we want to
just not right now, without that aborting the upload. upload data soon just not right now, without that aborting the upload. The
opposite situation should be possible as well, that we tell libcurl we're
ready to accept read data. Today libcurl feeds the data as soon as it is
available for reading, no matter what.
DOCUMENTATION DOCUMENTATION
@@ -86,6 +79,9 @@ TODO
receiver will convert the data from the standard form to his own internal receiver will convert the data from the standard form to his own internal
form." form."
* Since USERPWD always override the user and password specified in URLs, we
might need another way to specify user+password for anonymous ftp logins.
* An option to only download remote FTP files if they're newer than the local * An option to only download remote FTP files if they're newer than the local
one is a good idea, and it would fit right into the same syntax as the one is a good idea, and it would fit right into the same syntax as the
already working http dito works. It of course requires that 'MDTM' works, already working http dito works. It of course requires that 'MDTM' works,
@@ -97,17 +93,12 @@ TODO
HTTP HTTP
* Pass a list of host name to libcurl to which we allow the user name and * If the "body" of the POST is < MSS it really aught to be sent along with
password to get sent to. Currently, it only get sent to the host name that the headers. More generally, if the last chunk of the POST body is < MSS,
the first URL uses (to prevent others from being able to read it), but this it should be sent with the previous chunk (which may be the POST headers).
also prevents the authentication info from getting sent when following So long as any one send is larger than MSS (or there is only one send when
locations to legitimate other host names. < MSS :), the Nagle Algorithm will not be a problem on any stack where
Nagle is implemented correctly. (pointed out by Rick Jones)
* "Content-Encoding: compress/gzip/zlib" HTTP 1.1 clearly defines how to get
and decode compressed documents. There is the zlib that is pretty good at
decompressing stuff. This work was started in October 1999 but halted again
since it proved more work than we thought. It is still a good idea to
implement though. This requires the filter system mentioned above.
* Authentication: NTLM. Support for that MS crap called NTLM * Authentication: NTLM. Support for that MS crap called NTLM
authentication. MS proxies and servers sometime require that. Since that authentication. MS proxies and servers sometime require that. Since that
@@ -212,6 +203,9 @@ TODO
TEST SUITE TEST SUITE
* If perl wasn't found by the configure script, don't attempt to run the
tests but explain something nice why it doesn't.
* Extend the test suite to include more protocols. The telnet could just do * Extend the test suite to include more protocols. The telnet could just do
ftp or http operations (for which we have test servers). ftp or http operations (for which we have test servers).
@@ -219,3 +213,10 @@ TODO
fork()s and it should become even more portable. fork()s and it should become even more portable.
* Introduce a test suite that tests libcurl better and more explicitly. * Introduce a test suite that tests libcurl better and more explicitly.
NEXT MAJOR RELEASE
* curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
CURLMcode. These should be changed to be the same.
* curl_formparse() should be removed

View File

@@ -2,7 +2,7 @@
.\" nroff -man curl.1 .\" nroff -man curl.1
.\" Written by Daniel Stenberg .\" Written by Daniel Stenberg
.\" .\"
.TH curl 1 "11 Sep 2002" "Curl 7.10" "Curl Manual" .TH curl 1 "14 Feb 2003" "Curl 7.10.3" "Curl Manual"
.SH NAME .SH NAME
curl \- transfer a URL curl \- transfer a URL
.SH SYNOPSIS .SH SYNOPSIS
@@ -122,6 +122,9 @@ Use "-C -" to tell curl to automatically find out where/how to resume the
transfer. It then uses the given output/input files to figure that out. transfer. It then uses the given output/input files to figure that out.
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 "---create-dirs"
When used in conjunction with the -o option, curl will create the necessary
local directory hierarchy as needed.
.IP "--crlf" .IP "--crlf"
(FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390). (FTP) Convert LF to CRLF in upload. Useful for MVS (OS/390).
@@ -214,14 +217,21 @@ If this option is used several times, the last one will be used.
peer. The file may contain multiple CA certificates. The certificate(s) must peer. The file may contain multiple CA certificates. The certificate(s) must
be in PEM format. be in PEM format.
curl recognizes the environment variable named 'CURL_CA_BUNDLE' if that is
set, and uses the given path as a path to a CA cert bundle. This option
overrides that variable.
The windows version of curl will automatically look for a CA certs file named
\'curl-ca-bundle.crt\', either in the same directory as curl.exe, or in the
Current Working Directory, or in any folder along your PATH.
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>"
(HTTPS) Tells curl to use the specified certificate directory to verify the (HTTPS) 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 the directory must have been
processed using the c_rehash utility supplied with openssl. Certificate directories processed using the c_rehash utility supplied with openssl. Using --capath can
are not supported under Windows (because c_rehash uses symbolink links to allow curl to make https connections much more efficiently than using --cacert
create them). Using --capath can allow curl to make https connections much if the --cacert file contains many CA certificates.
more efficiently than using --cacert if the --cacert 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"
@@ -315,6 +325,8 @@ to be made secure by using the CA certificate bundle installed by
default. This makes all connections considered "insecure" to fail unless default. This makes all connections considered "insecure" to fail unless
-k/--insecure is used. -k/--insecure is used.
This option is ignored if --cacert or --capath is used!
If this option is used twice, the second time will again disable it. If this option is used twice, the second time will again disable it.
.IP "--krb4 <level>" .IP "--krb4 <level>"
(FTP) Enable kerberos4 authentication and use. The level must be entered and (FTP) Enable kerberos4 authentication and use. The level must be entered and
@@ -342,8 +354,8 @@ url = "http://curl.haxx.se/docs/"
This option can be used multiple times. This option can be used multiple times.
.IP "--limit-rate <speed>" .IP "--limit-rate <speed>"
Specify the maximum transfer rate you want curl to use. This feature is useful Specify the maximum transfer rate you want curl to use. This feature is useful
if you have a limited pipe and you'd prefer you have your transfer not use if you have a limited pipe and you'd like your transfer not use your entire
your entire bandwidth. bandwidth.
The given speed is measured in bytes/second, unless a suffix is The given speed is measured in bytes/second, unless a suffix is
appended. Appending 'k' or 'K' will count the number as kilobytes, 'm' or M' appended. Appending 'k' or 'K' will count the number as kilobytes, 'm' or M'
@@ -425,6 +437,8 @@ or use several variables like:
curl http://{site,host}.host[1-5].com -o "#1_#2" curl http://{site,host}.host[1-5].com -o "#1_#2"
You may use this option as many times as you have number of URLs. You may use this option as many times as you have number of URLs.
See also the --create-dirs option to create the local directories dynamically.
.IP "-O/--remote-name" .IP "-O/--remote-name"
Write output to a local file named like the remote file we get. (Only Write output to a local file named like the remote file we get. (Only
the file part of the remote file is used, the path is cut off.) the file part of the remote file is used, the path is cut off.)
@@ -579,9 +593,9 @@ read for untrained humans.
If this option is used several times, the last one will be used. (Added in If this option is used several times, the last one will be used. (Added in
curl 7.9.7) curl 7.9.7)
.IP "-u/--user <user:password>" .IP "-u/--user <user:password>"
Specify user and password to use when fetching. See README.curl for detailed Specify user and password to use when fetching. Read the MANUAL for detailed
examples of how to use this. If no password is specified, curl will examples of how to use this. If no password is specified, curl will ask for it
ask for it interactively. interactively.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "-U/--proxy-user <user:password>" .IP "-U/--proxy-user <user:password>"
@@ -607,6 +621,9 @@ info provided by curl.
Note that if you want to see HTTP headers in the output, \fI-i/--include\fP Note that if you want to see HTTP headers in the output, \fI-i/--include\fP
might be option you're looking for. might be option you're looking for.
If you think this option still doesn't give you enough details, consider using
\fI--trace\fP or \fI--trace-ascii\fP instead.
If this option is used twice, the second will again disable verbose. If this option is used twice, the second will again disable verbose.
.IP "-V/--version" .IP "-V/--version"
Displays the full version of curl, libcurl and other 3rd party libraries Displays the full version of curl, libcurl and other 3rd party libraries
@@ -820,13 +837,15 @@ FTP couldn't set binary. Couldn't change transfer method to binary.
.IP 18 .IP 18
Partial file. Only a part of the file was transfered. Partial file. Only a part of the file was transfered.
.IP 19 .IP 19
FTP couldn't RETR file. The RETR command failed. FTP couldn't download/access the given file, the RETR (or similar) command
failed.
.IP 20 .IP 20
FTP write error. The transfer was reported bad by the server. FTP write error. The transfer was reported bad by the server.
.IP 21 .IP 21
FTP quote error. A quote command returned error from the server. FTP quote error. A quote command returned error from the server.
.IP 22 .IP 22
HTTP not found. The requested page was not found. This return code only HTTP page not retrieved. The requested url was not found or returned another
error with the HTTP error code being 400 or above. This return code only
appears if --fail is used. appears if --fail is used.
.IP 23 .IP 23
Write error. Curl couldn't write data to a local filesystem or similar. Write error. Curl couldn't write data to a local filesystem or similar.

View File

@@ -22,10 +22,13 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/time.h> #include <sys/time.h>
#include <stdlib.h>
#include <curl/curl.h> #include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h> #if (LIBCURL_VERSION_NUM < 0x070907)
#error "too old libcurl version, get the latest!"
#endif
struct data { struct data {
int type; int type;
@@ -34,8 +37,8 @@ struct data {
FILE *file; FILE *file;
} handle; } handle;
/* TODO: We should perhaps document the biggest possible buffer chunk we can /* This is the documented biggest possible buffer chunk we can get from
get from libcurl in one single callback... */ libcurl in one single callback! */
char buffer[CURL_MAX_WRITE_SIZE]; char buffer[CURL_MAX_WRITE_SIZE];
char *readptr; /* read from here */ char *readptr; /* read from here */
@@ -62,6 +65,8 @@ size_t write_callback(char *buffer,
url->readptr += size; url->readptr += size;
url->bytes += size; url->bytes += size;
fprintf(stderr, "callback %d size bytes\n", size);
return size; return size;
} }
@@ -72,6 +77,7 @@ URL_FILE *url_fopen(char *url, char *operation)
URL_FILE *file; URL_FILE *file;
int still_running; int still_running;
(void)operation;
file = (URL_FILE *)malloc(sizeof(URL_FILE)); file = (URL_FILE *)malloc(sizeof(URL_FILE));
if(!file) if(!file)
@@ -134,47 +140,51 @@ size_t url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
} }
} }
if(!still_running) { if(!still_running) {
printf("NO MORE RUNNING AROUND!\n"); printf("DONE RUNNING AROUND!\n");
return 0; return 0;
} }
} }
FD_ZERO(&fdread); do {
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to fail on */ FD_ZERO(&fdread);
timeout.tv_sec = 500; /* 5 minutes */ FD_ZERO(&fdwrite);
timeout.tv_usec = 0; FD_ZERO(&fdexcep);
/* get file descriptors from the transfers */ /* set a suitable timeout to fail on */
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); timeout.tv_sec = 500; /* 5 minutes */
timeout.tv_usec = 0;
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); /* get file descriptors from the transfers */
curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
switch(rc) { rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
case -1:
/* select error */
break;
case 0:
break;
default:
/* timeout or readable/writable sockets */
do {
file->m = curl_multi_perform(multi_handle, &still_running);
if(file->bytes) switch(rc) {
/* we have received data, return that now */ case -1:
break; /* select error */
break;
case 0:
break;
default:
/* timeout or readable/writable sockets */
printf("select() returned %d!\n", rc);
do {
file->m = curl_multi_perform(multi_handle, &still_running);
} while(CURLM_CALL_MULTI_PERFORM == file->m); if(file->bytes)
/* we have received data, return that now */
break;
} while(CURLM_CALL_MULTI_PERFORM == file->m);
if(!still_running) if(!still_running)
printf("NO MORE RUNNING AROUND!\n"); printf("DONE RUNNING AROUND!\n");
break; break;
} }
} while(still_running && (file->bytes <= 0));
} }
else else
printf("(fread) Skip network read\n"); printf("(fread) Skip network read\n");
@@ -204,7 +214,10 @@ int main(int argc, char *argv[])
int nread; int nread;
char buffer[256]; char buffer[256];
handle = url_fopen("http://www.haxx.se", "r"); (void)argc;
(void)argv;
handle = url_fopen("http://curl.haxx.se/", "r");
if(!handle) { if(!handle) {
printf("couldn't url_fopen()\n"); printf("couldn't url_fopen()\n");

View File

@@ -11,6 +11,9 @@
#include <stdio.h> #include <stdio.h>
#include <curl/curl.h> #include <curl/curl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/* /*
* This example shows an FTP upload, with a rename of the file just after * This example shows an FTP upload, with a rename of the file just after

View File

@@ -74,6 +74,10 @@ int main(int argc, char **argv)
* bytes big and contains the remote file. * bytes big and contains the remote file.
* *
* Do something nice with it! * Do something nice with it!
*
* You should be aware of the fact that at this point we might have an
* allocated data block, and nothing has yet deallocated that data. So when
* you're done with it, you should free() it as a nice application.
*/ */
return 0; return 0;

View File

@@ -83,7 +83,8 @@ int main(int argc, char **argv)
default: default:
/* one or more of curl's file descriptors say there's data to read /* one or more of curl's file descriptors say there's data to read
or write */ or write */
curl_multi_perform(multi_handle, &still_running); while(CURLM_CALL_MULTI_PERFORM ==
curl_multi_perform(multi_handle, &still_running));
break; break;
} }
} }

View File

@@ -80,7 +80,8 @@ int main(int argc, char **argv)
case 0: case 0:
default: default:
/* timeout or readable/writable sockets */ /* timeout or readable/writable sockets */
curl_multi_perform(multi_handle, &still_running); while(CURLM_CALL_MULTI_PERFORM ==
curl_multi_perform(multi_handle, &still_running));
break; break;
} }
} }

View File

@@ -74,7 +74,8 @@ int main(int argc, char **argv)
case 0: case 0:
default: default:
/* timeout or readable/writable sockets */ /* timeout or readable/writable sockets */
curl_multi_perform(multi_handle, &still_running); while(CURLM_CALL_MULTI_PERFORM ==
curl_multi_perform(multi_handle, &still_running));
break; break;
} }
} }

View File

@@ -21,7 +21,7 @@
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
written = fwrite(ptr, size, nmemb, (FILE *)stream); int written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written; return written;
} }

View File

@@ -66,7 +66,7 @@ int main(int argc, char **argv)
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
/* what call to write: */ /* what call to write: */
curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://curl.haxx.se"); curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://your.favourite.ssl.site");
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile); curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
while(1) /* do some ugly short cut... */ while(1) /* do some ugly short cut... */

View File

@@ -232,6 +232,7 @@ Multi-threading issues
For SIGPIPE info see the UNIX Socket FAQ at For SIGPIPE info see the UNIX Socket FAQ at
http://www.unixguide.net/network/socketfaq/2.22.shtml http://www.unixguide.net/network/socketfaq/2.22.shtml
Also, note that CURLOPT_DNS_USE_GLOBAL_CACHE is not thread-safe.
When It Doesn't Work When It Doesn't Work
@@ -255,6 +256,9 @@ When It Doesn't Work
possible of your code that uses libcurl, operating system name and version, possible of your code that uses libcurl, operating system name and version,
compiler name and version etc. compiler name and version etc.
If CURLOPT_VERBOSE is not enough, you increase the level of debug data your
application receive by using the CURLOPT_DEBUGFUNCTION.
Getting some in-depth knowledge about the protocols involved is never wrong, Getting some in-depth knowledge about the protocols involved is never wrong,
and if you're trying to do funny things, you might very well understand and if you're trying to do funny things, you might very well understand
libcurl and how to use it better if you study the appropriate RFC documents libcurl and how to use it better if you study the appropriate RFC documents
@@ -293,8 +297,8 @@ Upload Data to a Remote Site
curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, TRUE); curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, TRUE);
A few protocols won't behave properly when uploads are done without any prior A few protocols won't behave properly when uploads are done without any prior
knowledge of the expected file size. HTTP PUT is one example [1]. So, set the knowledge of the expected file size. So, set the upload file size using the
upload file size using the CURLOPT_INFILESIZE like this: CURLOPT_INFILESIZE for all known file sizes like this[1]:
curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE, file_size); curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE, file_size);
@@ -404,7 +408,7 @@ HTTP POSTing
headers = curl_slist_append(headers, "Content-Type: text/xml"); headers = curl_slist_append(headers, "Content-Type: text/xml");
/* post binary data */ /* post binary data */
curl_easy_setopt(easyhandle, CURLOPT_POSTFIELD, binaryptr); curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, binaryptr);
/* set the size of the postfields data */ /* set the size of the postfields data */
curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDSIZE, 23); curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDSIZE, 23);
@@ -726,6 +730,35 @@ Persistancy Is The Way to Happiness
CURLOPT_FORBID_REUSE to TRUE. CURLOPT_FORBID_REUSE to TRUE.
HTTP Headers Used by libcurl
When you use libcurl to do HTTP requeests, it'll pass along a series of
headers automaticly. It might be good for you to know and understand these
ones.
Host
This header is required by HTTP 1.1 and even many 1.0 servers and should
be the name of the server we want to talk to. This includes the port
number if anything but default.
Pragma
"no-cache". Tells a possible proxy to not grap a copy from the cache but
to fetch a fresh one.
Accept:
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*". Cloned from a
browser once a hundred years ago.
Expect:
When doing multi-part formposts, libcurl will set this header to
"100-continue" to ask the server for an "OK" message before it proceeds
with sending the data part of the post.
Customizing Operations Customizing Operations
There is an ongoing development today where more and more protocols are built There is an ongoing development today where more and more protocols are built
@@ -738,101 +771,129 @@ Customizing Operations
libcurl is your friend here too. libcurl is your friend here too.
If just changing the actual HTTP request keyword is what you want, like when CUSTOMREQUEST
GET, HEAD or POST is not good enough for you, CURLOPT_CUSTOMREQUEST is there
for you. It is very simple to use:
curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNRUQUEST"); If just changing the actual HTTP request keyword is what you want, like
when GET, HEAD or POST is not good enough for you, CURLOPT_CUSTOMREQUEST
is there for you. It is very simple to use:
When using the custom request, you change the request keyword of the actual curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNRUQUEST");
request you are performing. Thus, by default you make GET request but you can
also make a POST operation (as described before) and then replace the POST
keyword if you want to. You're the boss.
HTTP-like protocols pass a series of headers to the server when doing the When using the custom request, you change the request keyword of the
request, and you're free to pass any amount of extra headers that you think actual request you are performing. Thus, by default you make GET request
fit. Adding headers are this easy: but you can also make a POST operation (as described before) and then
replace the POST keyword if you want to. You're the boss.
struct curl_slist *headers=NULL; /* init to NULL is important */ Modify Headers
headers = curl_slist_append(headers, "Hey-server-hey: how are you?"); HTTP-like protocols pass a series of headers to the server when doing the
headers = curl_slist_append(headers, "X-silly-content: yes"); request, and you're free to pass any amount of extra headers that you
think fit. Adding headers are this easy:
/* pass our list of custom made headers */ struct curl_slist *headers=NULL; /* init to NULL is important */
curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
curl_easy_perform(easyhandle); /* transfer http */ headers = curl_slist_append(headers, "Hey-server-hey: how are you?");
headers = curl_slist_append(headers, "X-silly-content: yes");
curl_slist_free_all(headers); /* free the header list */ /* pass our list of custom made headers */
curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
... and if you think some of the internally generated headers, such as curl_easy_perform(easyhandle); /* transfer http */
User-Agent:, Accept: or Host: don't contain the data you want them to
contain, you can replace them by simply setting them too:
headers = curl_slist_append(headers, "User-Agent: 007"); curl_slist_free_all(headers); /* free the header list */
headers = curl_slist_append(headers, "Host: munged.host.line");
If you replace an existing header with one with no contents, you will prevent ... and if you think some of the internally generated headers, such as
the header from being sent. Like if you want to completely prevent the Accept: or Host: don't contain the data you want them to contain, you can
"Accept:" header to be sent, you can disable it with code similar to this: replace them by simply setting them too:
headers = curl_slist_append(headers, "Accept:"); headers = curl_slist_append(headers, "Accept: Agent-007");
headers = curl_slist_append(headers, "Host: munged.host.line");
Both replacing and cancelling internal headers should be done with careful Delete Headers
consideration and you should be aware that you may violate the HTTP protocol
when doing so.
There's only one aspect left in the HTTP requests that we haven't yet If you replace an existing header with one with no contents, you will
mentioned how to modify: the version field. All HTTP requests includes the prevent the header from being sent. Like if you want to completely prevent
version number to tell the server which version we support. libcurl speak the "Accept:" header to be sent, you can disable it with code similar to
HTTP 1.1 by default. Some very old servers don't like getting 1.1-requests this:
and when dealing with stubborn old things like that, you can tell libcurl to
use 1.0 instead by doing something like this:
curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURLHTTP_VERSION_1_0); headers = curl_slist_append(headers, "Accept:");
Not all protocols are HTTP-like, and thus the above may not help you when you Both replacing and cancelling internal headers should be done with careful
want to make for example your FTP transfers to behave differently. consideration and you should be aware that you may violate the HTTP
protocol when doing so.
Sending custom commands to a FTP server means that you need to send the Enforcing chunked transfer-encoding
comands exactly as the FTP server expects them (RFC959 is a good guide here),
and you can only use commands that work on the control-connection alone. All
kinds of commands that requires data interchange and thus needs a
data-connection must be left to libcurl's own judgement. Also be aware that
libcurl will do its very best to change directory to the target directory
before doing any transfer, so if you change directory (with CWD or similar)
you might confuse libcurl and then it might not attempt to transfer the file
in the correct remote directory.
A little example that deletes a given file before an operation: By making sure a request uses the custom header "Transfer-Encoding:
chunked" when doing a non-GET HTTP operation, libcurl will switch over to
"chunked" upload, even though the size of the data to upload might be
known. By default, libcurl usually switches over to chunked upload
automaticly if the upload data size is unknown.
headers = curl_slist_append(headers, "DELE file-to-remove"); HTTP Version
/* pass the list of custom commands to the handle */ There's only one aspect left in the HTTP requests that we haven't yet
curl_easy_setopt(easyhandle, CURLOPT_QUOTE, headers); mentioned how to modify: the version field. All HTTP requests includes the
version number to tell the server which version we support. libcurl speak
HTTP 1.1 by default. Some very old servers don't like getting 1.1-requests
and when dealing with stubborn old things like that, you can tell libcurl
to use 1.0 instead by doing something like this:
curl_easy_perform(easyhandle); /* transfer ftp data! */ curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION,
CURLHTTP_VERSION_1_0);
curl_slist_free_all(headers); /* free the header list */ FTP Custom Commands
If you would instead want this operation (or chain of operations) to happen Not all protocols are HTTP-like, and thus the above may not help you when
_after_ the data transfer took place the option to curl_easy_setopt() would you want to make for example your FTP transfers to behave differently.
instead be called CURLOPT_POSTQUOTE and used the exact same way.
The custom FTP command will be issued to the server in the same order they Sending custom commands to a FTP server means that you need to send the
are added to the list, and if a command gets an error code returned back from comands exactly as the FTP server expects them (RFC959 is a good guide
the server, no more commands will be issued and libcurl will bail out with an here), and you can only use commands that work on the control-connection
error code (CURLE_FTP_QUOTE_ERROR). Note that if you use CURLOPT_QUOTE to alone. All kinds of commands that requires data interchange and thus needs
send commands before a transfer, no transfer will actually take place when a a data-connection must be left to libcurl's own judgement. Also be aware
quote command has failed. that libcurl will do its very best to change directory to the target
directory before doing any transfer, so if you change directory (with CWD
or similar) you might confuse libcurl and then it might not attempt to
transfer the file in the correct remote directory.
If you set the CURLOPT_HEADER to true, you will tell libcurl to get A little example that deletes a given file before an operation:
information about the target file and output "headers" about it. The headers
will be in "HTTP-style", looking like they do in HTTP.
The option to enable headers or to run custom FTP commands may be useful to headers = curl_slist_append(headers, "DELE file-to-remove");
combine with CURLOPT_NOBODY. If this option is set, no actual file content
transfer will be performed. /* pass the list of custom commands to the handle */
curl_easy_setopt(easyhandle, CURLOPT_QUOTE, headers);
curl_easy_perform(easyhandle); /* transfer ftp data! */
curl_slist_free_all(headers); /* free the header list */
If you would instead want this operation (or chain of operations) to
happen _after_ the data transfer took place the option to
curl_easy_setopt() would instead be called CURLOPT_POSTQUOTE and used the
exact same way.
The custom FTP command will be issued to the server in the same order they
are added to the list, and if a command gets an error code returned back
from the server, no more commands will be issued and libcurl will bail out
with an error code (CURLE_FTP_QUOTE_ERROR). Note that if you use
CURLOPT_QUOTE to send commands before a transfer, no transfer will
actually take place when a quote command has failed.
If you set the CURLOPT_HEADER to true, you will tell libcurl to get
information about the target file and output "headers" about it. The
headers will be in "HTTP-style", looking like they do in HTTP.
The option to enable headers or to run custom FTP commands may be useful
to combine with CURLOPT_NOBODY. If this option is set, no actual file
content transfer will be performed.
FTP Custom CUSTOMREQUEST
If you do what list the contents of a FTP directory using your own defined
FTP command, CURLOPT_CUSTOMREQUEST will do just that. "NLST" is the
default one for listing directories but you're free to pass in your idea
of a good alternative.
Cookies Without Chocolate Chips Cookies Without Chocolate Chips
@@ -1007,19 +1068,30 @@ SSL, Certificates and Other Tricks
[ seeding, passwords, keys, certificates, ENGINE, ca certs ] [ seeding, passwords, keys, certificates, ENGINE, ca certs ]
Multiple Transfers Using the multi Interface
The easy interface as described in detail in this document is a synchronous
interface that transfers one file at a time and doesn't return until its
done.
The multi interface on the other hand, allows your program to transfer
multiple files in both directions at the same time, without forcing you to
use multiple threads.
[fill in lots of more multi stuff here]
Future Future
[ multi interface, sharing between handles, mutexes, pipelining ] [ sharing between handles, mutexes, pipelining ]
----- -----
Footnotes: Footnotes:
[1] = HTTP PUT without knowing the size prior to transfer is indeed possible, [1] = libcurl 7.10.3 and later have the ability to switch over to chunked
but libcurl does not support the chunked transfers on uploading that is Tranfer-Encoding in cases were HTTP uploads are done with data of an
necessary for this feature to work. We'd gratefully appreciate patches unknown size.
that bring this functionality...
[2] = This happens on Windows machines when libcurl is built and used as a [2] = This happens on Windows machines when libcurl is built and used as a
DLL. However, you can still do this on Windows if you link with a static DLL. However, you can still do this on Windows if you link with a static

View File

@@ -115,8 +115,12 @@ Pass a pointer to a 'char *' to receive the content-type of the downloaded
object. This is the value read from the Content-Type: field. If you get NULL, object. This is the value read from the Content-Type: field. If you get NULL,
it means that the server didn't send a valid Content-Type header or that the it means that the server didn't send a valid Content-Type header or that the
protocol used doesn't support this. (Added in 7.9.4) protocol used doesn't support this. (Added in 7.9.4)
.TP
.B CURLINFO_PRIVATE
Pass a pointer to a 'char *' to receive the pointer to the private data
associated with the curl handle (set with the CURLOPT_PRIVATE option to curl_easy_setopt).
(Added in 7.10.3)
.PP .PP
.SH RETURN VALUE .SH RETURN VALUE
If the operation was successful, CURLE_OK is returned. Otherwise an If the operation was successful, CURLE_OK is returned. Otherwise an
appropriate error code will be returned. appropriate error code will be returned.

View File

@@ -1,7 +1,7 @@
.\" nroff -man [file] .\" nroff -man [file]
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_easy_setopt 3 "13 Nov 2002" "libcurl 7.10" "libcurl Manual" .TH curl_easy_setopt 3 "3 Dec 2002" "libcurl 7.10.3" "libcurl Manual"
.SH NAME .SH NAME
curl_easy_setopt - set options for a curl easy handle curl_easy_setopt - set options for a curl easy handle
.SH SYNOPSIS .SH SYNOPSIS
@@ -70,10 +70,10 @@ Function pointer that should match the following prototype: \fBsize_t
function( void *ptr, size_t size, size_t nmemb, void *stream);\fP This function( void *ptr, size_t size, size_t nmemb, void *stream);\fP This
function gets called by libcurl as soon as there is data reveiced that needs function gets called by libcurl as soon as there is data reveiced that needs
to be saved. The size of the data pointed to by \fIptr\fP is \fIsize\fP to be saved. The size of the data pointed to by \fIptr\fP is \fIsize\fP
multiplied with \fInmemb\fP. Return the number of bytes actually taken care multiplied with \fInmemb\fP, it will not be zero terminated. Return the number
of. If that amount differs from the amount passed to your function, it'll of bytes actually taken care of. If that amount differs from the amount passed
signal an error to the library and it will abort the transfer and return to your function, it'll signal an error to the library and it will abort the
\fICURLE_WRITE_ERROR\fP. transfer and return \fICURLE_WRITE_ERROR\fP.
Set the \fIstream\fP argument with the \fBCURLOPT_FILE\fP option. Set the \fIstream\fP argument with the \fBCURLOPT_FILE\fP option.
@@ -175,6 +175,10 @@ curl_debug_callback (CURL *, curl_infotype, char *, size_t, void *);\fP
This function will receive debug information if CURLOPT_VERBOSE is This function will receive debug information if CURLOPT_VERBOSE is
enabled. The curl_infotype argument specifies what kind of information it enabled. The curl_infotype argument specifies what kind of information it
is. This funtion must return 0. is. This funtion must return 0.
NOTE: the data pointed to by the char * passed to this function WILL NOT be
zero terminated, but will be exactly of the size as told by the size_t
argument.
.TP .TP
.B CURLOPT_DEBUGDATA .B CURLOPT_DEBUGDATA
Pass a pointer to whatever you want passed in to your CURLOPT_DEBUGFUNCTION in Pass a pointer to whatever you want passed in to your CURLOPT_DEBUGFUNCTION in
@@ -311,8 +315,16 @@ user.
.TP .TP
.B CURLOPT_USERPWD .B CURLOPT_USERPWD
Pass a char * as parameter, which should be [user name]:[password] to use for Pass a char * as parameter, which should be [user name]:[password] to use for
the connection. If the password is left out, you will be prompted for it. the connection. If both the colon and password is left out, you will be
\fICURLOPT_PASSWDFUNCTION\fP can be used to set your own prompt function. prompted for it while using a colon with no password will make libcurl use an
empty password. \fICURLOPT_PASSWDFUNCTION\fP can be used to set your own
prompt function.
When using HTTP and CURLOPT_FOLLOWLOCATION, libcurl might perform several
requests to possibly different hosts. libcurl will only send this user and
password information to hosts using the initial host name, so if libcurl
follows locations to other hosts it will not send the user and password to
those. This is enforced to prevent accidental information leakage.
.TP .TP
.B CURLOPT_PROXYUSERPWD .B CURLOPT_PROXYUSERPWD
Pass a char * as parameter, which should be [user name]:[password] to use for Pass a char * as parameter, which should be [user name]:[password] to use for
@@ -337,6 +349,11 @@ new location and follow new Location: headers all the way until no more such
headers are returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number headers are returned. \fICURLOPT_MAXREDIRS\fP can be used to limit the number
of redirects libcurl will follow. of redirects libcurl will follow.
.TP .TP
.B CURLOPT_UNRESTRICTED_AUTH
A non-zero parameter tells the library it can continue to send authentication
(user+password) when following locations, even when hostname changed. Note
that this is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP.
.TP
.B CURLOPT_MAXREDIRS .B CURLOPT_MAXREDIRS
Pass a long. The set number will be the redirection limit. If that many Pass a long. The set number will be the redirection limit. If that many
redirections have been followed, the next redirect will cause an error redirections have been followed, the next redirect will cause an error
@@ -357,9 +374,14 @@ will imply this option.
.TP .TP
.B CURLOPT_POSTFIELDS .B CURLOPT_POSTFIELDS
Pass a char * as parameter, which should be the full data to post in a HTTP Pass a char * as parameter, which should be the full data to post in a HTTP
post operation. This is a normal application/x-www-form-urlencoded kind, which post operation. You need to make sure that the data is formatted the way you
is the most commonly used one by HTML forms. See also the CURLOPT_POST. Since want the server to receive it. libcurl will not convert or encode it for
7.8, using CURLOPT_POSTFIELDS implies CURLOPT_POST. you. Most web servers will assume this data to be url-encoded. Take note.
This POST is a normal application/x-www-form-urlencoded kind (and libcurl will
set that Content-Type by default when this option is used), which is the most
commonly used one by HTML forms. See also the CURLOPT_POST. Using
CURLOPT_POSTFIELDS implies CURLOPT_POST.
\fBNote:\fP to make multipart/formdata posts (aka rfc1867-posts), check out \fBNote:\fP to make multipart/formdata posts (aka rfc1867-posts), check out
the \fICURLOPT_HTTPPOST\fP option. the \fICURLOPT_HTTPPOST\fP option.
@@ -401,11 +423,31 @@ list. If you add a header that is otherwise generated and used by libcurl
internally, your added one will be used instead. If you add a header with no internally, your added one will be used instead. If you add a header with no
contents as in 'Accept:' (no data on the right side of the colon), the contents as in 'Accept:' (no data on the right side of the colon), the
internally used header will get disabled. Thus, using this option you can add internally used header will get disabled. Thus, using this option you can add
new headers, replace internal headers and remove internal headers. new headers, replace internal headers and remove internal headers. The
headers included in the linked list must not be CRLF-terminated, because
curl adds CRLF after each header item. Failure to comply with this will
result in strange bugs because the server will most likely ignore part
of the headers you specified.
\fBNOTE:\fPThe most commonly replaced headers have "shortcuts" in the options \fBNOTE:\fPThe most commonly replaced headers have "shortcuts" in the options
CURLOPT_COOKIE, CURLOPT_USERAGENT and CURLOPT_REFERER. CURLOPT_COOKIE, CURLOPT_USERAGENT and CURLOPT_REFERER.
.TP .TP
.B CURLOPT_HTTP200ALIASES
Pass a pointer to a linked list of aliases to be treated as valid HTTP 200
responses. Some servers respond with a custom header response line. For
example, IceCast servers respond with "ICY 200 OK". By including this string
in your list of aliases, the response will be treated as a valid HTTP header
line such as "HTTP/1.0 200 OK". (Added in 7.10.3)
The linked list should be a fully valid list of struct curl_slist structs, and
be properly filled in. Use \fIcurl_slist_append(3)\fP to create the list and
\fIcurl_slist_free_all(3)\fP to clean up an entire list.
\fBNOTE:\fPThe alias itself is not parsed for any version strings. So if your
alias is "MYHTTP/9.9", Libcurl will not treat the server as responding with
HTTP version 9.9. Instead Libcurl will use the value set by option
\fICURLOPT_HTTP_VERSION\fP.
.TP
.B CURLOPT_COOKIE .B CURLOPT_COOKIE
Pass a pointer to a zero terminated string as parameter. It will be used to Pass a pointer to a zero terminated string as parameter. It will be used to
set a cookie in the http request. The format of the string should be set a cookie in the http request. The format of the string should be
@@ -478,6 +520,9 @@ tells the remote server to connect to our specified IP address. The string may
be a plain IP address, a host name, an network interface name (under Unix) or be a plain IP address, a host name, an network interface name (under Unix) or
just a '-' letter to let the library use your systems default IP just a '-' letter to let the library use your systems default IP
address. Default FTP operations are passive, and thus won't use PORT. address. Default FTP operations are passive, and thus won't use PORT.
You disable PORT again and go back to using the passive version by setting
this option to NULL.
.TP .TP
.B CURLOPT_QUOTE .B CURLOPT_QUOTE
Pass a pointer to a linked list of FTP commands to pass to the server prior to Pass a pointer to a linked list of FTP commands to pass to the server prior to
@@ -712,10 +757,13 @@ Pass a long as parameter. Set what version of SSL to attempt to use, 2 or
servers make this difficult why you at times may have to use this option. servers make this difficult why you at times may have to use this option.
.TP .TP
.B CURLOPT_SSL_VERIFYPEER .B CURLOPT_SSL_VERIFYPEER
Pass a long that is set to a non-zero value to make curl verify the peer's Pass a long that is set to a zero value to stop curl from verifying the peer's
certificate. The certificate to verify against must be specified with the certificate (7.10 starting setting this option to TRUE by default). Alternate
CURLOPT_CAINFO option (Added in 7.4.2) or a certificate directory must be specified certificates to verify against can be specified with the CURLOPT_CAINFO option
with the CURLOPT_CAPATH option (Added in 7.9.8). (Added in 7.4.2) or a certificate directory can be specified with the
CURLOPT_CAPATH option (Added in 7.9.8). As of 7.10, curl installs a default
bundle. CURLOPT_SSL_VERIFYHOST may also need to be set to 1 or 0 if
CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2).
.TP .TP
.B CURLOPT_CAINFO .B 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
@@ -742,7 +790,8 @@ socket. It will be used to seed the random engine for SSL.
.B CURLOPT_SSL_VERIFYHOST .B CURLOPT_SSL_VERIFYHOST
Pass a long. Set if we should verify the Common name from the peer certificate Pass a long. Set if we should verify the Common name from the peer certificate
in the SSL handshake, set 1 to check existence, 2 to ensure that it matches in the SSL handshake, set 1 to check existence, 2 to ensure that it matches
the provided hostname. (Added in 7.8.1) the provided hostname. This is by default set to 2. (Added in 7.8.1, default
changed in 7.10)
.TP .TP
.B CURLOPT_SSL_CIPHER_LIST .B 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
@@ -763,6 +812,13 @@ krb4 awareness. This is a string, 'clear', 'safe', 'confidential' or
will be used. Set the string to NULL to disable kerberos4. The kerberos will be used. Set the string to NULL to disable kerberos4. The kerberos
support only works for FTP. (Added in 7.3) support only works for FTP. (Added in 7.3)
.PP .PP
.SH OTHER OPTIONS
.TP 0.4i
.B CURLOPT_PRIVATE
Pass a char * as parameter, pointing to data that should be associated with
the curl handle. The pointer can be subsequently retrieved using the
CURLINFO_PRIVATE options to curl_easy_getinfo. (Added in 7.10.3)
.PP
.SH RETURN VALUE .SH RETURN VALUE
CURLE_OK (zero) means that the option was set properly, non-zero means an CURLE_OK (zero) means that the option was set properly, non-zero means an
error occurred as \fI<curl/curl.h>\fP defines. See the \fIlibcurl-errors.3\fP error occurred as \fI<curl/curl.h>\fP defines. See the \fIlibcurl-errors.3\fP

View File

@@ -1,6 +1,6 @@
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_multi_info_read 3 "1 March 2002" "libcurl 7.9.5" "libcurl Manual" .TH curl_multi_info_read 3 "27 Feb 2002" "libcurl 7.10.3" "libcurl Manual"
.SH NAME .SH NAME
curl_multi_info_read - read multi stack informationals curl_multi_info_read - read multi stack informationals
.SH SYNOPSIS .SH SYNOPSIS
@@ -10,15 +10,15 @@ CURLMsg *curl_multi_info_read( CURLM *multi_handle,
int *msgs_in_queue); int *msgs_in_queue);
.ad .ad
.SH DESCRIPTION .SH DESCRIPTION
Ask the multi handle if there's any messages/informationals from the Ask the multi handle if there are any messages/informationals from the
individual transfers. Messages include informationals such as an error code individual transfers. Messages may include informationals such as an error
from the transfer or just the fact that a transfer is completed. More details code from the transfer or just the fact that a transfer is completed. More
on these should be written down as well. details on these should be written down as well.
Repeated calls to this function will return a new struct each time, until a Repeated calls to this function will return a new struct each time, until a
special "end of msgs" struct is returned as a signal that there is no more to NULL is returned as a signal that there is no more to get at this point. The
get at this point. The integer pointed to with \fImsgs_in_queue\fP will integer pointed to with \fImsgs_in_queue\fP will contain the number of
contain the number of remaining messages after this function was called. remaining messages after this function was called.
The data the returned pointer points to will not survive calling The data the returned pointer points to will not survive calling
curl_multi_cleanup(). curl_multi_cleanup().
@@ -26,10 +26,19 @@ curl_multi_cleanup().
The 'CURLMsg' struct is very simple and only contain very basic informations. The 'CURLMsg' struct is very simple and only contain very basic informations.
If more involved information is wanted, the particular "easy handle" in If more involved information is wanted, the particular "easy handle" in
present in that struct and can thus be used in subsequent regular present in that struct and can thus be used in subsequent regular
curl_easy_getinfo() calls (or similar). curl_easy_getinfo() calls (or similar):
struct CURLMsg {
CURLMSG msg; /* what this message means */
CURL *easy_handle; /* the handle it concerns */
union {
void *whatever; /* message-specific data */
CURLcode result; /* return code for transfer */
} data;
};
.SH "RETURN VALUE" .SH "RETURN VALUE"
A pointer to a filled-in struct, or NULL if it failed or ran out of A pointer to a filled-in struct, or NULL if it failed or ran out of
structs. It also writes the number of messages left in the queue (after this structs. It also writes the number of messages left in the queue (after this
read) in the integer the second argument points to. read) in the integer the second argument points to.
.SH "SEE ALSO" .SH "SEE ALSO"
.BR curl_multi_cleanup "(3)," curl_multi_init "(3)," curl_multi_perform "(3)" .BR curl_multi_cleanup "(3), " curl_multi_init "(3), " curl_multi_perform "(3)"

View File

@@ -19,6 +19,12 @@ integer-pointer.
.SH "RETURN VALUE" .SH "RETURN VALUE"
CURLMcode type, general libcurl multi interface error code. CURLMcode type, general libcurl multi interface error code.
If you receive \fICURLM_CALL_MULTI_PERFORM\fP, this basicly means that you
should call \fIcurl_multi_perform\fP again, before you select() on more
actions. You don't have to do it immediately, but the return code means that
libcurl may have more data available to return or that there may be more data
to send off before it is "satisfied".
NOTE that this only returns errors etc regarding the whole multi stack. There NOTE that this only returns errors etc regarding the whole multi stack. There
might still have occurred problems on invidual transfers even when this might still have occurred problems on invidual transfers even when this
function returns OK. function returns OK.

View File

@@ -14,6 +14,9 @@ specified easy handle be removed from this multi handle's control.
When the easy handle has been removed from a multi stack, it is again When the easy handle has been removed from a multi stack, it is again
perfectly legal to invoke \fIcurl_easy_perform()\fP on this easy handle. perfectly legal to invoke \fIcurl_easy_perform()\fP on this easy handle.
Removing a handle while being used, will effectively halt all transfers in
progress.
.SH RETURN VALUE .SH RETURN VALUE
CURLMcode type, general libcurl multi interface error code. CURLMcode type, general libcurl multi interface error code.
.SH "SEE ALSO" .SH "SEE ALSO"

View File

@@ -2,7 +2,7 @@
.\" nroff -man [file] .\" nroff -man [file]
.\" $Id$ .\" $Id$
.\" .\"
.TH curl_slist_append 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" .TH curl_slist_append 3 "21 Feb 2003" "libcurl 7.10.4" "libcurl Manual"
.SH NAME .SH NAME
curl_slist_append - add a string to an slist curl_slist_append - add a string to an slist
.SH SYNOPSIS .SH SYNOPSIS
@@ -13,17 +13,26 @@ curl_slist_append - add a string to an slist
.ad .ad
.SH DESCRIPTION .SH DESCRIPTION
curl_slist_append() appends a specified string to a linked list of curl_slist_append() appends a specified string to a linked list of
strings. The existing strings. The existing \fIlist\fP should be passed as the first argument while
.I list the new list is returned from this function. The specified \fIstring\fP has
should be passed as the first argument while the new list is returned from been appended when this function returns.
this function. The specified
.I string The list should be freed again (after usage) with \fBcurl_slist_free_all()\fP.
has been appended when this function returns.
.SH RETURN VALUE .SH RETURN VALUE
A null pointer is returned if anything went wrong, otherwise the new list A null pointer is returned if anything went wrong, otherwise the new list
pointer is returned. pointer is returned.
.SH EXAMPLE
CURL handle;
curl_slist *slist=NULL;
slist = curl_slist_append(slist, "pragma:");
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist);
curl_easy_perform(handle);
curl_slist_free_all(slist); /* free the list again */
.SH "SEE ALSO" .SH "SEE ALSO"
.BR curl_slist_free_all "(3), " .BR curl_slist_free_all "(3), "
.SH BUGS .SH BUGS
Surely there are some, you tell me! None.

View File

@@ -2,7 +2,7 @@
.\" nroff -man [file] .\" nroff -man [file]
.\" $Id$ .\" $Id$
.\" .\"
.TH libcurl-errors 3 "10 April 2002" "libcurl 7.9.6" "libcurl errors" .TH libcurl-errors 3 "18 Dec 2002" "libcurl 7.10.3" "libcurl errors"
.SH NAME .SH NAME
error codes in libcurl error codes in libcurl
.SH DESCRIPTION .SH DESCRIPTION
@@ -104,7 +104,7 @@ After a completed file transfer, the FTP server did not respond a proper
When sending custom "QUOTE" commands to the remote server, one of the commands When sending custom "QUOTE" commands to the remote server, one of the commands
returned an error code that was 400 or higher. returned an error code that was 400 or higher.
.TP .TP
.B CURLE_HTTP_NOT_FOUND (22) .B CURLE_HTTP_RETURNED_ERROR (22)
This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server This is returned if CURLOPT_FAILONERROR is set TRUE and the HTTP server
returns an error code that is >= 400. returns an error code that is >= 400.
.TP .TP

View File

@@ -72,9 +72,9 @@ timeout every now and then, should you want that.
A little note here about the return codes from the multi functions, and A little note here about the return codes from the multi functions, and
especially the \fIcurl_multi_perform\fP: if you receive especially the \fIcurl_multi_perform\fP: if you receive
\fICURLM_CALL_MULTI_PERFORM\fP, this basicly means that you should call \fICURLM_CALL_MULTI_PERFORM\fP, this basicly means that you should call
\fIcurlm_call_multi_perform\fP again, before you select() on more actions. You \fIcurl_multi_perform\fP again, before you select() on more actions. You don't
don't have to do it immediately, but the return code means that libcurl may have to do it immediately, but the return code means that libcurl may have
have more data available to return or that there may be more data to send off more data available to return or that there may be more data to send off
before it is "satisfied". before it is "satisfied".
\fIcurl_multi_perform\fP stores the number of still running transfers in one \fIcurl_multi_perform\fP stores the number of still running transfers in one

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -66,9 +66,9 @@ struct curl_httppost {
char *contents; /* pointer to allocated data contents */ char *contents; /* pointer to allocated data contents */
long contentslength; /* length of contents field */ long contentslength; /* length of contents field */
/* CMC: Added support for buffer uploads */ /* CMC: Added support for buffer uploads */
char *buffer; /* pointer to allocated buffer contents */ char *buffer; /* pointer to allocated buffer contents */
long bufferlength; /* length of buffer field */ long bufferlength; /* length of buffer field */
char *contenttype; /* Content-Type */ char *contenttype; /* Content-Type */
struct curl_slist* contentheader; /* list of extra headers for this form */ struct curl_slist* contentheader; /* list of extra headers for this form */
@@ -96,7 +96,9 @@ typedef int (*curl_progress_callback)(void *clientp,
double ultotal, double ultotal,
double ulnow); double ulnow);
#define CURL_MAX_WRITE_SIZE 20480 /* Tests have proven that 20K is a very bad buffer size for uploads on
Windows, while 16K for some odd reason performed a lot better. */
#define CURL_MAX_WRITE_SIZE 16384
typedef size_t (*curl_write_callback)(char *buffer, typedef size_t (*curl_write_callback)(char *buffer,
size_t size, size_t size,
@@ -160,7 +162,7 @@ typedef enum {
CURLE_FTP_COULDNT_RETR_FILE, /* 19 */ CURLE_FTP_COULDNT_RETR_FILE, /* 19 */
CURLE_FTP_WRITE_ERROR, /* 20 */ CURLE_FTP_WRITE_ERROR, /* 20 */
CURLE_FTP_QUOTE_ERROR, /* 21 */ CURLE_FTP_QUOTE_ERROR, /* 21 */
CURLE_HTTP_NOT_FOUND, /* 22 */ CURLE_HTTP_RETURNED_ERROR, /* 22 */
CURLE_WRITE_ERROR, /* 23 */ CURLE_WRITE_ERROR, /* 23 */
CURLE_MALFORMAT_USER, /* 24 - user name is illegally specified */ CURLE_MALFORMAT_USER, /* 24 - user name is illegally specified */
CURLE_FTP_COULDNT_STOR_FILE, /* 25 - failed FTP upload */ CURLE_FTP_COULDNT_STOR_FILE, /* 25 - failed FTP upload */
@@ -207,6 +209,7 @@ typedef enum {
/* Make a spelling correction for the operation timed-out define */ /* Make a spelling correction for the operation timed-out define */
#define CURLE_OPERATION_TIMEDOUT CURLE_OPERATION_TIMEOUTED #define CURLE_OPERATION_TIMEDOUT CURLE_OPERATION_TIMEOUTED
#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR
typedef enum { typedef enum {
CURLPROXY_HTTP = 0, CURLPROXY_HTTP = 0,
@@ -610,6 +613,16 @@ typedef enum {
the response to be compressed. */ the response to be compressed. */
CINIT(ENCODING, OBJECTPOINT, 102), CINIT(ENCODING, OBJECTPOINT, 102),
/* Set pointer to private data */
CINIT(PRIVATE, OBJECTPOINT, 103),
/* Set aliases for HTTP 200 in the HTTP Response header */
CINIT(HTTP200ALIASES, OBJECTPOINT, 104),
/* Continue to send authentication (user+password) when following locations,
even when hostname changed. This can potentionally send off the name
and password to whatever host the server decides. */
CINIT(UNRESTRICTED_AUTH, LONG, 105),
CURLOPT_LASTENTRY /* the last unused */ CURLOPT_LASTENTRY /* the last unused */
} CURLoption; } CURLoption;
@@ -688,8 +701,6 @@ typedef enum {
*/ */
extern int (curl_strequal)(const char *s1, const char *s2); extern int (curl_strequal)(const char *s1, const char *s2);
extern int (curl_strnequal)(const char *s1, const char *s2, size_t n); extern int (curl_strnequal)(const char *s1, const char *s2, size_t n);
#define strequal(a,b) curl_strequal(a,b)
#define strnequal(a,b,c) curl_strnequal(a,b,c)
/* DEPRECATED function to build formdata */ /* DEPRECATED function to build formdata */
int curl_formparse(char *, struct curl_httppost **, int curl_formparse(char *, struct curl_httppost **,
@@ -803,8 +814,8 @@ CURLcode curl_global_init(long flags);
void curl_global_cleanup(void); void curl_global_cleanup(void);
/* This is the version number */ /* This is the version number */
#define LIBCURL_VERSION "7.10.2" #define LIBCURL_VERSION "7.10.4"
#define LIBCURL_VERSION_NUM 0x070a02 #define LIBCURL_VERSION_NUM 0x070a04
/* linked-list structure for the CURLOPT_QUOTE option (and other) */ /* linked-list structure for the CURLOPT_QUOTE option (and other) */
struct curl_slist { struct curl_slist {
@@ -861,16 +872,13 @@ typedef enum {
CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19, CURLINFO_REDIRECT_TIME = CURLINFO_DOUBLE + 19,
CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20, CURLINFO_REDIRECT_COUNT = CURLINFO_LONG + 20,
CURLINFO_PRIVATE = CURLINFO_STRING + 21,
/* Fill in new entries here! */ /* Fill in new entries here! */
CURLINFO_LASTONE = 21 CURLINFO_LASTONE = 22
} CURLINFO; } CURLINFO;
/* unfortunately, the easy.h and multi.h include files need options and info
stuff before they can be included! */
#include "easy.h" /* nothing in curl is fun without the easy stuff */
#include "multi.h"
typedef enum { typedef enum {
CURLCLOSEPOLICY_NONE, /* first, never use this */ CURLCLOSEPOLICY_NONE, /* first, never use this */
@@ -894,35 +902,61 @@ typedef enum {
* Setup defines, protos etc for the sharing stuff. * Setup defines, protos etc for the sharing stuff.
*/ */
/* Different types of locks that a share can aquire */ /* Different data locks for a single share */
typedef enum { typedef enum {
CURL_LOCK_TYPE_NONE = 0, CURL_LOCK_DATA_NONE = 0,
CURL_LOCK_TYPE_COOKIE = 1<<0, /* CURL_LOCK_DATA_SHARE is used internaly to say that
CURL_LOCK_TYPE_DNS = 1<<1, * the locking is just made to change the internal state of the share
CURL_LOCK_TYPE_SSL_SESSION = 2<<1, * itself.
CURL_LOCK_TYPE_CONNECT = 2<<2, */
CURL_LOCK_TYPE_LAST CURL_LOCK_DATA_SHARE,
} curl_lock_type; CURL_LOCK_DATA_COOKIE,
CURL_LOCK_DATA_DNS,
CURL_LOCK_DATA_SSL_SESSION,
CURL_LOCK_DATA_CONNECT,
CURL_LOCK_DATA_LAST
} curl_lock_data;
typedef void (*curl_lock_function)(CURL *, curl_lock_type, void *); /* Different lock access types */
typedef void (*curl_unlock_function)(CURL *, curl_lock_type, void *); typedef enum {
CURL_LOCK_ACCESS_NONE = 0, /* unspecified action */
CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */
CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */
CURL_LOCK_ACCESS_LAST /* never use */
} curl_lock_access;
typedef struct { typedef void (*curl_lock_function)(CURL *handle,
unsigned int specifier; curl_lock_data data,
unsigned int locked; curl_lock_access access,
unsigned int dirty; void *userptr);
typedef void (*curl_unlock_function)(CURL *handle,
curl_lock_data data,
void *userptr);
curl_lock_function lockfunc; typedef void CURLSH;
curl_unlock_function unlockfunc;
void *clientdata;
} curl_share;
curl_share *curl_share_init (void); typedef enum {
CURLcode curl_share_setopt (curl_share *, curl_lock_type, int); CURLSHE_OK, /* all is fine */
CURLcode curl_share_set_lock_function (curl_share *, curl_lock_function); CURLSHE_BAD_OPTION, /* 1 */
CURLcode curl_share_set_unlock_function (curl_share *, curl_unlock_function); CURLSHE_IN_USE, /* 2 */
CURLcode curl_share_set_lock_data (curl_share *, void *); CURLSHE_INVALID, /* 3 */
CURLcode curl_share_destroy (curl_share *); CURLSHE_LAST /* never use */
} CURLSHcode;
typedef enum {
CURLSHOPT_NONE, /* don't use */
CURLSHOPT_SHARE, /* specify a data type to share */
CURLSHOPT_UNSHARE, /* specify shich data type to stop sharing */
CURLSHOPT_LOCKFUNC, /* pass in a 'curl_lock_function' pointer */
CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */
CURLSHOPT_USERDATA, /* pass in a user data pointer used in the lock/unlock
callback functions */
CURLSHOPT_LAST /* never use */
} CURLSHoption;
CURLSH *curl_share_init(void);
CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);
CURLSHcode curl_share_cleanup(CURLSH *);
/**************************************************************************** /****************************************************************************
* Structures for querying information about the curl library at runtime. * Structures for querying information about the curl library at runtime.
@@ -965,4 +999,9 @@ curl_version_info_data *curl_version_info(CURLversion);
} }
#endif #endif
/* unfortunately, the easy.h and multi.h include files need options and info
stuff before they can be included! */
#include "easy.h" /* nothing in curl is fun without the easy stuff */
#include "multi.h"
#endif /* __CURL_CURL_H */ #endif /* __CURL_CURL_H */

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -1,54 +1,25 @@
/************************************************************************* /***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2003, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://curl.haxx.se/docs/copyright.html.
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
* *
* $Id$ * $Id$
* ***************************************************************************/
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND
* CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER.
*
*************************************************************************
*
* Preliminary documentation
*
* printf conversions:
*
* conversion ::= '%%' | '%' [position] ( number | float | string )
* position ::= digits '$'
* number ::= [number-flags] ( 'd' | 'i' | 'o' | 'x' | 'X' | 'u')
* number-flags ::= 'h' | 'l' | 'L' ...
* float ::= [float-flags] ( 'f' | 'e' | 'E' | 'g' | 'G' )
* string ::= [string-flags] 's'
* string-flags ::= padding | '#'
* digits ::= (digit)+
* digit ::= 0-9
*
* c
* p
* n
*
* qualifiers
*
* - : left adjustment
* + : show sign
* SPACE : padding
* # : alterative
* . : precision
* * : width
* 0 : padding / size
* 1-9 : size
* h : short
* l : long
* ll : longlong
* L : long double
* Z : long / longlong
* q : longlong
*
************************************************************************/
#ifndef H_MPRINTF #ifndef H_MPRINTF
#define H_MPRINTF #define H_MPRINTF

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -44,8 +44,6 @@
o Enable the application to select() on its own file descriptors and curl's o Enable the application to select() on its own file descriptors and curl's
file descriptors simultaneous easily. file descriptors simultaneous easily.
Example sources using this interface is here: ../multi/
*/ */
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
@@ -53,10 +51,15 @@
#else #else
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h>
#endif #endif
#include "curl.h" #include "curl.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef void CURLM; typedef void CURLM;
typedef enum { typedef enum {
@@ -71,7 +74,7 @@ typedef enum {
typedef enum { typedef enum {
CURLMSG_NONE, /* first, not used */ CURLMSG_NONE, /* first, not used */
CURLMSG_DONE, /* This easy handle has completed. 'whatever' points to CURLMSG_DONE, /* This easy handle has completed. 'result' contains
the CURLcode of the transfer */ the CURLcode of the transfer */
CURLMSG_LAST /* last, not used */ CURLMSG_LAST /* last, not used */
} CURLMSG; } CURLMSG;
@@ -187,4 +190,8 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle);
CURLMsg *curl_multi_info_read(CURLM *multi_handle, CURLMsg *curl_multi_info_read(CURLM *multi_handle,
int *msgs_in_queue); int *msgs_in_queue);
#ifdef __cplusplus
} /* end of extern "C" */
#endif
#endif #endif

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -5,4 +5,6 @@ Makefile
.deps .deps
.libs .libs
config.h config.h
stamp-h1 stamp-*
ca-bundle.h
getdate.c

View File

@@ -66,7 +66,7 @@ getpass.c netrc.c telnet.h getinfo.c getinfo.h transfer.c strequal.c \
strequal.h easy.c security.h security.c krb4.c krb4.h memdebug.c \ strequal.h easy.c security.h security.c krb4.c krb4.h memdebug.c \
memdebug.h inet_ntoa_r.h http_chunks.c http_chunks.h strtok.c strtok.h \ memdebug.h inet_ntoa_r.h http_chunks.c http_chunks.h strtok.c strtok.h \
connect.c connect.h llist.c llist.h hash.c hash.h multi.c \ connect.c connect.h llist.c llist.h hash.c hash.h multi.c \
content_encoding.c content_encoding.h content_encoding.c content_encoding.h share.c share.h
noinst_HEADERS = setup.h transfer.h noinst_HEADERS = setup.h transfer.h

View File

@@ -59,7 +59,12 @@ SOURCES = \
easy.c \ easy.c \
strequal.c \ strequal.c \
strtok.c \ strtok.c \
connect.c connect.c \
hash.c \
share.c \
llist.c \
multi.c \
content_encoding.c
OBJECTS = $(SOURCES:.c=.obj) OBJECTS = $(SOURCES:.c=.obj)

View File

@@ -28,4 +28,9 @@
+easy.obj & +easy.obj &
+strequal.obj & +strequal.obj &
+strtok.obj & +strtok.obj &
+connect.obj +connect.obj &
+hash.obj &
+share.obj &
+llist.obj &
+multi.obj &
+content_encoding.obj

View File

@@ -12,8 +12,8 @@ AR = ar
RM = rm -f RM = rm -f
RANLIB = ranlib RANLIB = ranlib
STRIP = strip -g STRIP = strip -g
OPENSSL_PATH = ../../openssl-0.9.6g OPENSSL_PATH = ../../openssl-0.9.7a
ZLIB_PATH = ../../zlib-1.1.3 ZLIB_PATH = ../../zlib-1.1.4
######################################################## ########################################################
## Nothing more to do below this line! ## Nothing more to do below this line!
@@ -22,12 +22,12 @@ INCLUDES = -I. -I.. -I../include -I../src
CFLAGS = -g -O2 -DMINGW32 CFLAGS = -g -O2 -DMINGW32
ifdef SSL ifdef SSL
INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl" INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
CFLAGS += -DUSE_SSLEAY CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H
DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32 -lRSAglue DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32
endif endif
ifdef ZLIB ifdef ZLIB
INCLUDES += -I"$(ZLIB_PATH)" INCLUDES += -I"$(ZLIB_PATH)"
CFLAGS += -DHAVE_ZLIB CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
DLL_LIBS += -L$(ZLIB_PATH) -lz DLL_LIBS += -L$(ZLIB_PATH) -lz
endif endif
COMPILE = $(CC) $(INCLUDES) $(CFLAGS) COMPILE = $(CC) $(INCLUDES) $(CFLAGS)
@@ -42,7 +42,7 @@ libcurl_a_SOURCES = arpa_telnet.h file.c getpass.h netrc.h timeval.c base64.c \
ldap.h ssluse.h escape.c getenv.h mprintf.c telnet.c escape.h getpass.c netrc.c \ ldap.h ssluse.h escape.c getenv.h mprintf.c telnet.c escape.h getpass.c netrc.c \
telnet.h getinfo.c strequal.c strequal.h easy.c security.h \ telnet.h getinfo.c strequal.c strequal.h easy.c security.h \
security.c krb4.h krb4.c memdebug.h memdebug.c inet_ntoa_r.h http_chunks.h http_chunks.c \ security.c krb4.h krb4.c memdebug.h memdebug.c inet_ntoa_r.h http_chunks.h http_chunks.c \
strtok.c connect.c hash.c llist.c multi.c \ strtok.c connect.c hash.c llist.c multi.c share.c share.h\
content_encoding.h content_encoding.c content_encoding.h content_encoding.c
libcurl_a_OBJECTS = file.o timeval.o base64.o hostip.o progress.o \ libcurl_a_OBJECTS = file.o timeval.o base64.o hostip.o progress.o \
@@ -50,7 +50,7 @@ libcurl_a_OBJECTS = file.o timeval.o base64.o hostip.o progress.o \
speedcheck.o getdate.o transfer.o ldap.o ssluse.o version.o \ speedcheck.o getdate.o transfer.o ldap.o ssluse.o version.o \
getenv.o escape.o mprintf.o telnet.o getpass.o netrc.o getinfo.o \ getenv.o escape.o mprintf.o telnet.o getpass.o netrc.o getinfo.o \
strequal.o easy.o security.o krb4.o memdebug.o http_chunks.o \ strequal.o easy.o security.o krb4.o memdebug.o http_chunks.o \
strtok.o connect.o hash.o llist.o multi.o \ strtok.o connect.o hash.o llist.o multi.o share.o \
content_encoding.o content_encoding.o
LIBRARIES = $(libcurl_a_LIBRARIES) LIBRARIES = $(libcurl_a_LIBRARIES)

View File

@@ -116,7 +116,7 @@ CFGSET = TRUE
!IF "$(CFG)" == "debug-dll" !IF "$(CFG)" == "debug-dll"
TARGET =$(LIB_NAME_DEBUG).dll TARGET =$(LIB_NAME_DEBUG).dll
DIROBJ =.\$(CFG) DIROBJ =.\$(CFG)
LNK = $(LNKDLL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" LNK = $(LNKDLL) /DEBUG /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" /PDB:"$(LIB_NAME_DEBUG).pdb"
CC = $(CCDEBUG) CC = $(CCDEBUG)
CFGSET = TRUE CFGSET = TRUE
!ENDIF !ENDIF
@@ -139,7 +139,8 @@ CFGSET = TRUE
!IF "$(CFG)" == "debug-ssl-dll" !IF "$(CFG)" == "debug-ssl-dll"
TARGET =$(LIB_NAME_DEBUG).dll TARGET =$(LIB_NAME_DEBUG).dll
DIROBJ =.\$(CFG) DIROBJ =.\$(CFG)
LNK = $(LNKDLL) $(LFLAGSSSL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)/out32dll
LNK = $(LNKDLL) $(LFLAGSSSL) /DEBUG /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" /PDB:"$(LIB_NAME_DEBUG).pdb"
LINKLIBS = $(LINKLIBS) $(SSLLIBS) LINKLIBS = $(LINKLIBS) $(SSLLIBS)
CC = $(CCDEBUG) $(CFLAGSSSL) CC = $(CCDEBUG) $(CFLAGSSSL)
CFGSET = TRUE CFGSET = TRUE
@@ -199,6 +200,7 @@ X_OBJS= \
$(DIROBJ)\connect.obj \ $(DIROBJ)\connect.obj \
$(DIROBJ)\hash.obj \ $(DIROBJ)\hash.obj \
$(DIROBJ)\llist.obj \ $(DIROBJ)\llist.obj \
$(DIROBJ)\share.obj \
$(DIROBJ)\multi.obj $(DIROBJ)\multi.obj
all : $(TARGET) all : $(TARGET)

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -26,15 +26,15 @@
/* /*
* Telnet option defines. Add more here if in need. * Telnet option defines. Add more here if in need.
*/ */
#define TELOPT_BINARY 0 /* binary 8bit data */ #define CURL_TELOPT_BINARY 0 /* binary 8bit data */
#define TELOPT_SGA 3 /* Supress Go Ahead */ #define CURL_TELOPT_SGA 3 /* Supress Go Ahead */
#define TELOPT_EXOPL 255 /* EXtended OPtions List */ #define CURL_TELOPT_EXOPL 255 /* EXtended OPtions List */
#define TELOPT_TTYPE 24 /* Terminal TYPE */ #define CURL_TELOPT_TTYPE 24 /* Terminal TYPE */
#define TELOPT_XDISPLOC 35 /* X DISPlay LOCation */ #define CURL_TELOPT_XDISPLOC 35 /* X DISPlay LOCation */
#define TELOPT_NEW_ENVIRON 39 /* NEW ENVIRONment variables */ #define CURL_TELOPT_NEW_ENVIRON 39 /* NEW ENVIRONment variables */
#define NEW_ENV_VAR 0 #define CURL_NEW_ENV_VAR 0
#define NEW_ENV_VALUE 1 #define CURL_NEW_ENV_VALUE 1
/* /*
* The telnet options represented as strings * The telnet options represented as strings
@@ -53,27 +53,27 @@ static const char *telnetoptions[]=
"OLD-ENVIRON", "AUTHENTICATION", "ENCRYPT", "NEW-ENVIRON" "OLD-ENVIRON", "AUTHENTICATION", "ENCRYPT", "NEW-ENVIRON"
}; };
#define TELOPT_MAXIMUM TELOPT_NEW_ENVIRON #define CURL_TELOPT_MAXIMUM CURL_TELOPT_NEW_ENVIRON
#define TELOPT_OK(x) ((x) <= TELOPT_MAXIMUM) #define CURL_TELOPT_OK(x) ((x) <= CURL_TELOPT_MAXIMUM)
#define TELOPT(x) telnetoptions[x] #define CURL_TELOPT(x) telnetoptions[x]
#define NTELOPTS 40 #define CURL_NTELOPTS 40
/* /*
* First some defines * First some defines
*/ */
#define xEOF 236 /* End Of File */ #define CURL_xEOF 236 /* End Of File */
#define SE 240 /* Sub negotiation End */ #define CURL_SE 240 /* Sub negotiation End */
#define NOP 241 /* No OPeration */ #define CURL_NOP 241 /* No OPeration */
#define DM 242 /* Data Mark */ #define CURL_DM 242 /* Data Mark */
#define GA 249 /* Go Ahead, reverse the line */ #define CURL_GA 249 /* Go Ahead, reverse the line */
#define SB 250 /* SuBnegotiation */ #define CURL_SB 250 /* SuBnegotiation */
#define WILL 251 /* Our side WILL use this option */ #define CURL_WILL 251 /* Our side WILL use this option */
#define WONT 252 /* Our side WON'T use this option */ #define CURL_WONT 252 /* Our side WON'T use this option */
#define DO 253 /* DO use this option! */ #define CURL_DO 253 /* DO use this option! */
#define DONT 254 /* DON'T use this option! */ #define CURL_DONT 254 /* DON'T use this option! */
#define IAC 255 /* Interpret As Command */ #define CURL_IAC 255 /* Interpret As Command */
/* /*
* Then those numbers represented as strings: * Then those numbers represented as strings:
@@ -86,16 +86,16 @@ static const char *telnetcmds[]=
"WILL", "WONT", "DO", "DONT", "IAC" "WILL", "WONT", "DO", "DONT", "IAC"
}; };
#define TELCMD_MINIMUM xEOF /* the first one */ #define CURL_TELCMD_MINIMUM CURL_xEOF /* the first one */
#define TELCMD_MAXIMUM IAC /* surprise, 255 is the last one! ;-) */ #define CURL_TELCMD_MAXIMUM CURL_IAC /* surprise, 255 is the last one! ;-) */
#define TELQUAL_IS 0 #define CURL_TELQUAL_IS 0
#define TELQUAL_SEND 1 #define CURL_TELQUAL_SEND 1
#define TELQUAL_INFO 2 #define CURL_TELQUAL_INFO 2
#define TELQUAL_NAME 3 #define CURL_TELQUAL_NAME 3
#define TELCMD_OK(x) ( ((unsigned int)(x) >= TELCMD_MINIMUM) && \ #define CURL_TELCMD_OK(x) ( ((unsigned int)(x) >= CURL_TELCMD_MINIMUM) && \
((unsigned int)(x) <= TELCMD_MAXIMUM) ) ((unsigned int)(x) <= CURL_TELCMD_MAXIMUM) )
#define TELCMD(x) telnetcmds[(x)-TELCMD_MINIMUM] #define CURL_TELCMD(x) telnetcmds[(x)-CURL_TELCMD_MINIMUM]
#endif #endif
#endif #endif

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -61,6 +61,8 @@ static void decodeQuantum(unsigned char *dest, char *src)
x = (x << 6) + 62; x = (x << 6) + 62;
else if(src[i] == '/') else if(src[i] == '/')
x = (x << 6) + 63; x = (x << 6) + 63;
else if(src[i] == '=')
x = (x << 6);
} }
dest[2] = (unsigned char)(x & 255); x >>= 8; dest[2] = (unsigned char)(x & 255); x >>= 8;
@@ -78,6 +80,7 @@ static void base64Decode(unsigned char *dest, char *src, int *rawLength)
int length = 0; int length = 0;
int equalsTerm = 0; int equalsTerm = 0;
int i; int i;
int numQuantums;
unsigned char lastQuantum[3]; unsigned char lastQuantum[3];
while((src[length] != '=') && src[length]) while((src[length] != '=') && src[length])
@@ -85,16 +88,18 @@ static void base64Decode(unsigned char *dest, char *src, int *rawLength)
while(src[length+equalsTerm] == '=') while(src[length+equalsTerm] == '=')
equalsTerm++; equalsTerm++;
numQuantums = (length + equalsTerm) / 4;
if(rawLength) if(rawLength)
*rawLength = (length * 3 / 4) - equalsTerm; *rawLength = (numQuantums * 3) - equalsTerm;
for(i = 0; i < length/4 - 1; i++) { for(i = 0; i < numQuantums - 1; i++) {
decodeQuantum(dest, src); decodeQuantum(dest, src);
dest += 3; src += 4; dest += 3; src += 4;
} }
decodeQuantum(lastQuantum, src); decodeQuantum(lastQuantum, src);
for(i = 0; i < 3 - equalsTerm; i++) dest[i] = lastQuantum[i]; for(i = 0; i < 3 - equalsTerm; i++)
dest[i] = lastQuantum[i];
} }
@@ -130,7 +135,7 @@ int Curl_base64_encode(const void *inp, int insize, char **outptr)
while(insize > 0) { while(insize > 0) {
for (i = inputparts = 0; i < 3; i++) { for (i = inputparts = 0; i < 3; i++) {
if(*indata) { if(insize > 0) {
inputparts++; inputparts++;
ibuf[i] = *indata; ibuf[i] = *indata;
indata++; indata++;
@@ -194,20 +199,21 @@ int Curl_base64_decode(const char *str, void *data)
#define TEST_NEED_SUCK #define TEST_NEED_SUCK
void *suck(int *); void *suck(int *);
int main(int argc, char **argv, char **envp) { int main(int argc, char **argv, char **envp)
char *base64; {
int base64Len; char *base64;
unsigned char *data; int base64Len;
int dataLen; unsigned char *data;
int dataLen;
data = (unsigned char *)suck(&dataLen); data = (unsigned char *)suck(&dataLen);
base64Len = Curl_base64_encode(data, dataLen, &base64); base64Len = Curl_base64_encode(data, dataLen, &base64);
fprintf(stderr, "%d\n", base64Len); fprintf(stderr, "%d\n", base64Len);
fprintf(stdout, "%s", base64); fprintf(stdout, "%s", base64);
free(base64); free(data); free(base64); free(data);
return 0; return 0;
} }
#endif #endif
@@ -220,51 +226,43 @@ int main(int argc, char **argv, char **envp) {
#define TEST_NEED_SUCK #define TEST_NEED_SUCK
void *suck(int *); void *suck(int *);
int main(int argc, char **argv, char **envp) { int main(int argc, char **argv, char **envp)
char *base64; {
int base64Len; char *base64;
unsigned char *data; int base64Len;
int dataLen; unsigned char *data;
int dataLen;
base64 = (char *)suck(&base64Len); base64 = (char *)suck(&base64Len);
data = (unsigned char *)malloc(base64Len * 3/4 + 8); data = (unsigned char *)malloc(base64Len * 3/4 + 8);
dataLen = Curl_base64_decode(base64, data); dataLen = Curl_base64_decode(base64, data);
fprintf(stderr, "%d\n", dataLen); fprintf(stderr, "%d\n", dataLen);
fwrite(data,1,dataLen,stdout); fwrite(data,1,dataLen,stdout);
free(base64); free(data);
free(base64); free(data); return 0;
return 0;
} }
#endif #endif
#ifdef TEST_NEED_SUCK #ifdef TEST_NEED_SUCK
/* this function 'sucks' in as much as possible from stdin */ /* this function 'sucks' in as much as possible from stdin */
void *suck(int *lenptr) { void *suck(int *lenptr)
int cursize = 8192; {
unsigned char *buf = NULL; int cursize = 8192;
int lastread; unsigned char *buf = NULL;
int len = 0; int lastread;
int len = 0;
do { do {
cursize *= 2; cursize *= 2;
buf = (unsigned char *)realloc(buf, cursize); buf = (unsigned char *)realloc(buf, cursize);
memset(buf + len, 0, cursize - len); memset(buf + len, 0, cursize - len);
lastread = fread(buf + len, 1, cursize - len, stdin); lastread = fread(buf + len, 1, cursize - len, stdin);
len += lastread; len += lastread;
} while(!feof(stdin)); } while(!feof(stdin));
lenptr[0] = len; lenptr[0] = len;
return (void *)buf; return (void *)buf;
} }
#endif #endif
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -2287,82 +2287,6 @@ Certificate Ingredients:
ec:b9:94:6a:aa:12:4f:1a:dd:f5:77:b5:25:8c:f2:8a:0a:f1: ec:b9:94:6a:aa:12:4f:1a:dd:f5:77:b5:25:8c:f2:8a:0a:f1:
fc:52:5b:58 fc:52:5b:58
TC TrustCenter, Germany, Class 0 CA
===================================
MD5 Fingerprint: 35:85:49:8E:6E:57:FE:BD:97:F1:C9:46:23:3A:B6:7D
PEM Data:
-----BEGIN CERTIFICATE-----
MIIENTCCA56gAwIBAgIBATANBgkqhkiG9w0BAQQFADCBvDELMAkGA1UEBhMCREUx
EDAOBgNVBAgTB0hhbWJ1cmcxEDAOBgNVBAcTB0hhbWJ1cmcxOjA4BgNVBAoTMVRD
IFRydXN0Q2VudGVyIGZvciBTZWN1cml0eSBpbiBEYXRhIE5ldHdvcmtzIEdtYkgx
IjAgBgNVBAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDAgQ0ExKTAnBgkqhkiG9w0B
CQEWGmNlcnRpZmljYXRlQHRydXN0Y2VudGVyLmRlMB4XDTk4MDMwOTEzNTQ0OFoX
DTA1MTIzMTEzNTQ0OFowgbwxCzAJBgNVBAYTAkRFMRAwDgYDVQQIEwdIYW1idXJn
MRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFUQyBUcnVzdENlbnRlciBmb3Ig
U2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVz
dENlbnRlciBDbGFzcyAwIENBMSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0
cnVzdGNlbnRlci5kZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA333mvr/V
8C9tTg7R4I0LfztU6IrisJ8oxYrGubMzJ/UnyhpMVBJrtLJGsx1Ls/QhC0sCLqHC
NJyFoMR4EdvbaycrCSoYTkDMn3EZZ5l0onw/wdiLI8hjO4ohq1zeHvSN3LQYwwVz
9Gq0ofoBCCsBD203W6o4hmc51+Vf+uR+zKMCAwEAAaOCAUMwggE/MEAGCWCGSAGG
+EIBAwQzFjFodHRwczovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL2NoZWNr
LXJldi5jZ2k/MEAGCWCGSAGG+EIBBAQzFjFodHRwczovL3d3dy50cnVzdGNlbnRl
ci5kZS9jZ2ktYmluL2NoZWNrLXJldi5jZ2k/MDwGCWCGSAGG+EIBBwQvFi1odHRw
czovL3d3dy50cnVzdGNlbnRlci5kZS9jZ2ktYmluL1JlbmV3LmNnaT8wPgYJYIZI
AYb4QgEIBDEWL2h0dHA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvZ3VpZGVsaW5lcy9p
bmRleC5odG1sMCgGCWCGSAGG+EIBDQQbFhlUQyBUcnVzdENlbnRlciBDbGFzcyAw
IENBMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQQFAAOBgQBNB39fCTAZ
kqoFR3qUdVQqrs/82AxC4UU4KySVssqHynnEw5eQXmIYxsk4YUxoNdNMFBHrxM2h
qdjFnmgnMgc1RQT4XyGgYB4cAEgEWNLFy65tMm49d5WMhcflrlCddUp7/wsneepN
pFn/7FrqJqU5g6TReM6nqX683SvKEpMDSg==
-----END CERTIFICATE-----
Certificate Ingredients:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 0 CA/Email=certificate@trustcenter.de
Validity
Not Before: Mar 9 13:54:48 1998 GMT
Not After : Dec 31 13:54:48 2005 GMT
Subject: C=DE, ST=Hamburg, L=Hamburg, O=TC TrustCenter for Security in Data Networks GmbH, OU=TC TrustCenter Class 0 CA/Email=certificate@trustcenter.de
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:df:7d:e6:be:bf:d5:f0:2f:6d:4e:0e:d1:e0:8d:
0b:7f:3b:54:e8:8a:e2:b0:9f:28:c5:8a:c6:b9:b3:
33:27:f5:27:ca:1a:4c:54:12:6b:b4:b2:46:b3:1d:
4b:b3:f4:21:0b:4b:02:2e:a1:c2:34:9c:85:a0:c4:
78:11:db:db:6b:27:2b:09:2a:18:4e:40:cc:9f:71:
19:67:99:74:a2:7c:3f:c1:d8:8b:23:c8:63:3b:8a:
21:ab:5c:de:1e:f4:8d:dc:b4:18:c3:05:73:f4:6a:
b4:a1:fa:01:08:2b:01:0f:6d:37:5b:aa:38:86:67:
39:d7:e5:5f:fa:e4:7e:cc:a3
Exponent: 65537 (0x10001)
X509v3 extensions:
Netscape Revocation Url:
https://www.trustcenter.de/cgi-bin/check-rev.cgi?
Netscape CA Revocation Url:
https://www.trustcenter.de/cgi-bin/check-rev.cgi?
Netscape Renewal Url:
https://www.trustcenter.de/cgi-bin/Renew.cgi?
Netscape CA Policy Url:
http://www.trustcenter.de/guidelines/index.html
Netscape Comment:
TC TrustCenter Class 0 CA
Netscape Cert Type:
SSL CA, S/MIME CA, Object Signing CA
Signature Algorithm: md5WithRSAEncryption
4d:07:7f:5f:09:30:19:92:aa:05:47:7a:94:75:54:2a:ae:cf:
fc:d8:0c:42:e1:45:38:2b:24:95:b2:ca:87:ca:79:c4:c3:97:
90:5e:62:18:c6:c9:38:61:4c:68:35:d3:4c:14:11:eb:c4:cd:
a1:a9:d8:c5:9e:68:27:32:07:35:45:04:f8:5f:21:a0:60:1e:
1c:00:48:04:58:d2:c5:cb:ae:6d:32:6e:3d:77:95:8c:85:c7:
e5:ae:50:9d:75:4a:7b:ff:0b:27:79:ea:4d:a4:59:ff:ec:5a:
ea:26:a5:39:83:a4:d1:78:ce:a7:a9:7e:bc:dd:2b:ca:12:93:
03:4a
TC TrustCenter, Germany, Class 1 CA TC TrustCenter, Germany, Class 1 CA
=================================== ===================================
MD5 Fingerprint: 64:3F:F8:3E:52:14:4A:59:BA:93:56:04:0B:23:02:D1 MD5 Fingerprint: 64:3F:F8:3E:52:14:4A:59:BA:93:56:04:0B:23:02:D1

View File

@@ -369,3 +369,13 @@
/* Define if you have the `sigsetjmp' function. */ /* Define if you have the `sigsetjmp' function. */
#define HAVE_SIGSETJMP 1 #define HAVE_SIGSETJMP 1
/* Define to 1 if you have the <setjmp.h> header file. */
#define HAVE_SETJMP_H 1
/*
* This needs to be defined for OpenSSL 0.9.7 and other versions that have the
* ENGINE stuff supported. If an include of "openssl/engine.h" fails, then
* undefine the define below.
*/
#define HAVE_OPENSSL_ENGINE_H 1

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -82,7 +82,7 @@
#endif #endif
static static
int geterrno(void) int ourerrno(void)
{ {
#ifdef WIN32 #ifdef WIN32
return (int)GetLastError(); return (int)GetLastError();
@@ -144,7 +144,11 @@ int Curl_nonblock(int socket, /* operate on this */
} }
/* /*
* Return 0 on fine connect, -1 on error and 1 on timeout. * waitconnect() returns:
* 0 fine connect
* -1 select() error
* 1 select() timeout
* 2 select() returned with an error condition
*/ */
static static
int waitconnect(int sockfd, /* socket */ int waitconnect(int sockfd, /* socket */
@@ -176,10 +180,9 @@ int waitconnect(int sockfd, /* socket */
/* timeout, no connect today */ /* timeout, no connect today */
return 1; return 1;
if(FD_ISSET(sockfd, &errfd)) { if(FD_ISSET(sockfd, &errfd))
/* error condition caught */ /* error condition caught */
return 2; return 2;
}
/* we have a connect! */ /* we have a connect! */
return 0; return 0;
@@ -249,17 +252,26 @@ static CURLcode bindlocal(struct connectdata *conn,
if ( h ) { if ( h ) {
Curl_addrinfo *addr = h->addr; Curl_addrinfo *addr = h->addr;
Curl_resolv_unlock(h); Curl_resolv_unlock(data, h);
/* we don't need it anymore after this function has returned */ /* we don't need it anymore after this function has returned */
memset((char *)&sa, 0, sizeof(sa));
#ifdef ENABLE_IPV6 #ifdef ENABLE_IPV6
memcpy((char *)&sa.sin_addr, addr->ai_addr, addr->ai_addrlen); (void)sa; /* prevent compiler warning */
sa.sin_family = addr->ai_family; if( bind(sockfd, addr->ai_addr, addr->ai_addrlen) >= 0) {
/* we succeeded to bind */
struct sockaddr_in6 add;
size = sizeof(add);
if(getsockname(sockfd, (struct sockaddr *) &add,
(socklen_t *)&size)<0) {
failf(data, "getsockname() failed");
return CURLE_HTTP_PORT_FAILED;
}
}
#else #else
memset((char *)&sa, 0, sizeof(sa));
memcpy((char *)&sa.sin_addr, addr->h_addr, addr->h_length); memcpy((char *)&sa.sin_addr, addr->h_addr, addr->h_length);
sa.sin_family = AF_INET; sa.sin_family = AF_INET;
#endif
sa.sin_addr.s_addr = in; sa.sin_addr.s_addr = in;
sa.sin_port = 0; /* get any port */ sa.sin_port = 0; /* get any port */
@@ -274,6 +286,7 @@ static CURLcode bindlocal(struct connectdata *conn,
return CURLE_HTTP_PORT_FAILED; return CURLE_HTTP_PORT_FAILED;
} }
} }
#endif
else { else {
switch(errno) { switch(errno) {
case EBADF: case EBADF:
@@ -337,7 +350,7 @@ int socketerror(int sockfd)
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR, if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
(void *)&err, &errSize)) (void *)&err, &errSize))
err = geterrno(); err = ourerrno();
return err; return err;
} }
@@ -380,6 +393,11 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OPERATION_TIMEOUTED; return CURLE_OPERATION_TIMEOUTED;
} }
} }
if(conn->bits.tcpconnect) {
/* we are connected already! */
*connected = TRUE;
return CURLE_OK;
}
/* check for connect without timeout as we want to return immediately */ /* check for connect without timeout as we want to return immediately */
rc = waitconnect(sockfd, 0); rc = waitconnect(sockfd, 0);
@@ -392,10 +410,15 @@ CURLcode Curl_is_connected(struct connectdata *conn,
return CURLE_OK; return CURLE_OK;
} }
/* nope, not connected for real */ /* nope, not connected for real */
if(err) failf(data, "Connection failed, socket error: %d", err);
return CURLE_COULDNT_CONNECT; return CURLE_COULDNT_CONNECT;
}
else if(1 != rc) {
int error = ourerrno();
failf(data, "Failed connect to %s:%d, errno: %d",
conn->hostname, conn->port, error);
return CURLE_COULDNT_CONNECT;
} }
/* /*
* If the connection phase is "done" here, we should attempt to connect * If the connection phase is "done" here, we should attempt to connect
* to the "next address" in the Curl_hostaddr structure that we resolved * to the "next address" in the Curl_hostaddr structure that we resolved
@@ -503,7 +526,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen); rc = connect(sockfd, ai->ai_addr, ai->ai_addrlen);
if(-1 == rc) { if(-1 == rc) {
int error=geterrno(); int error=ourerrno();
switch (error) { switch (error) {
case EINPROGRESS: case EINPROGRESS:
@@ -544,6 +567,9 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
failf(data, "socket error: %d", err); failf(data, "socket error: %d", err);
/* we are _not_ connected, it was a false alert, continue please */ /* we are _not_ connected, it was a false alert, continue please */
} }
else if(2 == rc)
/* waitconnect() returned error */
;
else if(data->state.used_interface == Curl_if_multi) { else if(data->state.used_interface == Curl_if_multi) {
/* When running the multi interface, we bail out here */ /* When running the multi interface, we bail out here */
rc = 0; rc = 0;
@@ -619,7 +645,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
sizeof(serv_addr)); sizeof(serv_addr));
if(-1 == rc) { if(-1 == rc) {
int error=geterrno(); int error=ourerrno();
switch (error) { switch (error) {
case EINPROGRESS: case EINPROGRESS:
@@ -646,6 +672,15 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
} }
} }
/* The '1 == rc' comes from the waitconnect(), and not from connect().
We can be sure of this since connect() cannot return 1. */
if((1 == rc) && (data->state.used_interface == Curl_if_multi)) {
/* Timeout when running the multi interface, we return here with a
CURLE_OK return code. */
rc = 0;
break;
}
if(0 == rc) { if(0 == rc) {
int err = socketerror(sockfd); int err = socketerror(sockfd);
if ((0 == err) || (EISCONN == err)) { if ((0 == err) || (EISCONN == err)) {
@@ -658,12 +693,6 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
} }
if(0 != rc) { if(0 != rc) {
if(data->state.used_interface == Curl_if_multi) {
/* When running the multi interface, we bail out here */
rc = 0;
break;
}
/* get a new timeout for next attempt */ /* get a new timeout for next attempt */
after = Curl_tvnow(); after = Curl_tvnow();
timeout_ms -= Curl_tvdiff(after, before); timeout_ms -= Curl_tvdiff(after, before);

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -112,11 +112,3 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
} }
} }
#endif /* HAVE_LIBZ */ #endif /* HAVE_LIBZ */
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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,11 +24,3 @@
CURLcode Curl_unencode_deflate_write(struct SessionHandle *data, CURLcode Curl_unencode_deflate_write(struct SessionHandle *data,
struct Curl_transfer_keeper *k, struct Curl_transfer_keeper *k,
ssize_t nread); ssize_t nread);
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -77,6 +77,7 @@ Example set of cookies:
13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/; secure 13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/; secure
****/ ****/
#include "setup.h" #include "setup.h"
#ifndef CURL_DISABLE_HTTP #ifndef CURL_DISABLE_HTTP
@@ -768,11 +769,3 @@ int main(int argc, char **argv)
#endif #endif
#endif /* CURL_DISABLE_HTTP */ #endif /* CURL_DISABLE_HTTP */
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -31,19 +31,19 @@ RSC=rc.exe
!IF "$(CFG)" == "curllib - Win32 Release" !IF "$(CFG)" == "curllib - Win32 Release"
# PROP BASE Use_MFC 6 # PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0 # PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release" # PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release" # PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir "" # PROP BASE Target_Dir ""
# PROP Use_MFC 6 # PROP Use_MFC 0
# PROP Use_Debug_Libraries 0 # PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release" # PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release" # PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /c # ADD CPP /nologo /MT /W3 /GX /Zi /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /D "_WINDLL" /FR /FD /c
# SUBTRACT CPP /YX # SUBTRACT CPP /YX
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
@@ -70,7 +70,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /GZ /c
# SUBTRACT CPP /WX /YX # SUBTRACT CPP /WX /YX
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -231,11 +231,3 @@ CURLcode Curl_dict(struct connectdata *conn)
return CURLE_OK; return CURLE_OK;
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -233,13 +233,15 @@ CURLcode curl_easy_perform(CURL *curl)
{ {
struct SessionHandle *data = (struct SessionHandle *)curl; struct SessionHandle *data = (struct SessionHandle *)curl;
if (Curl_global_host_cache_use(data) && data->hostcache != Curl_global_host_cache_get()) {
if (data->hostcache) {
Curl_hash_destroy(data->hostcache);
}
data->hostcache = Curl_global_host_cache_get();
}
if (!data->hostcache) { if (!data->hostcache) {
if (Curl_global_host_cache_use(data)) { data->hostcache = Curl_hash_alloc(7, Curl_freednsinfo);
data->hostcache = Curl_global_host_cache_get();
}
else {
data->hostcache = Curl_hash_alloc(7, Curl_freeaddrinfo);
}
} }
return Curl_perform(data); return Curl_perform(data);
@@ -331,11 +333,3 @@ CURL *curl_easy_duphandle(CURL *incurl)
return outcurl; return outcurl;
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -41,6 +41,7 @@ char *curl_escape(const char *string, int length)
{ {
int alloc = (length?length:(int)strlen(string))+1; int alloc = (length?length:(int)strlen(string))+1;
char *ns = malloc(alloc); char *ns = malloc(alloc);
char *testing_ptr = NULL;
unsigned char in; unsigned char in;
int newlen = alloc; int newlen = alloc;
int index=0; int index=0;
@@ -55,9 +56,14 @@ char *curl_escape(const char *string, int length)
newlen += 2; /* the size grows with two, since this'll become a %XX */ newlen += 2; /* the size grows with two, since this'll become a %XX */
if(newlen > alloc) { if(newlen > alloc) {
alloc *= 2; alloc *= 2;
ns = realloc(ns, alloc); testing_ptr = realloc(ns, alloc);
if(!ns) if(!testing_ptr) {
free( ns );
return NULL; return NULL;
}
else {
ns = testing_ptr;
}
} }
sprintf(&ns[index], "%%%02X", in); sprintf(&ns[index], "%%%02X", in);
@@ -81,6 +87,10 @@ char *curl_unescape(const char *string, int length)
int index=0; int index=0;
unsigned int hex; unsigned int hex;
if( !ns ) {
return NULL;
}
while(--alloc > 0) { while(--alloc > 0) {
in = *string; in = *string;
if('%' == in) { if('%' == in) {
@@ -97,18 +107,9 @@ char *curl_unescape(const char *string, int length)
} }
ns[index]=0; /* terminate it */ ns[index]=0; /* terminate it */
return ns; return ns;
} }
void curl_free(void *p) void curl_free(void *p)
{ {
free(p); free(p);
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -211,12 +211,4 @@ CURLcode Curl_file(struct connectdata *conn)
return res; return res;
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/
#endif #endif

View File

@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -1319,7 +1319,7 @@ int Curl_FormReader(char *buffer,
wantedsize = size * nitems; wantedsize = size * nitems;
if(!form->data) if(!form->data)
return -1; /* nothing, error, empty */ return 0; /* nothing, error, empty */
do { do {
@@ -1596,11 +1596,3 @@ int main(int argc, char **argv)
#endif #endif
#endif /* CURL_DISABLE_HTTP */ #endif /* CURL_DISABLE_HTTP */
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

276
lib/ftp.c
View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -173,9 +173,9 @@ static CURLcode AllowServerConnect(struct SessionHandle *data,
* response and extract the relevant return code for the invoking function. * response and extract the relevant return code for the invoking function.
*/ */
int Curl_GetFTPResponse(char *buf, CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
struct connectdata *conn, struct connectdata *conn,
int *ftpcode) int *ftpcode) /* return the ftp-code */
{ {
/* Brand new implementation. /* Brand new implementation.
* We cannot read just one byte per read() and then go back to select() * We cannot read just one byte per read() and then go back to select()
@@ -185,28 +185,21 @@ int Curl_GetFTPResponse(char *buf,
* line in a response or continue reading. */ * line in a response or continue reading. */
int sockfd = conn->firstsocket; int sockfd = conn->firstsocket;
int nread; /* total size read */
int perline; /* count bytes per line */ int perline; /* count bytes per line */
bool keepon=TRUE; bool keepon=TRUE;
ssize_t gotbytes; ssize_t gotbytes;
char *ptr; char *ptr;
int timeout = 3600; /* default timeout in seconds */ int timeout; /* timeout in seconds */
struct timeval interval; struct timeval interval;
fd_set rkeepfd; fd_set rkeepfd;
fd_set readfd; fd_set readfd;
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
char *line_start; char *line_start;
int code=0; /* default "error code" to return */ int code=0; /* default ftp "error code" to return */
char *buf = data->state.buffer;
#define SELECT_OK 0 CURLcode result = CURLE_OK;
#define SELECT_ERROR 1 /* select() problems */
#define SELECT_TIMEOUT 2 /* took too long */
#define SELECT_MEMORY 3 /* no available memory */
#define SELECT_CALLBACK 4 /* aborted by callback */
int error = SELECT_OK;
struct FTP *ftp = conn->proto.ftp; struct FTP *ftp = conn->proto.ftp;
struct timeval now = Curl_tvnow();
if (ftpcode) if (ftpcode)
*ftpcode = 0; /* 0 for errors */ *ftpcode = 0; /* 0 for errors */
@@ -221,20 +214,25 @@ int Curl_GetFTPResponse(char *buf,
ptr=buf; ptr=buf;
line_start = buf; line_start = buf;
nread=0; *nreadp=0;
perline=0; perline=0;
keepon=TRUE; keepon=TRUE;
while((nread<BUFSIZE) && (keepon && !error)) { while((*nreadp<BUFSIZE) && (keepon && !result)) {
/* check and reset timeout value every lap */ /* check and reset timeout value every lap */
if(data->set.timeout) { if(data->set.timeout)
/* if timeout is requested, find out how much remaining time we have */ /* if timeout is requested, find out how much remaining time we have */
timeout = data->set.timeout - /* timeout time */ timeout = data->set.timeout - /* timeout time */
Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */ Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */
if(timeout <=0 ) { else
failf(data, "Transfer aborted due to timeout"); /* Even without a requested timeout, we only wait response_time
return -SELECT_TIMEOUT; /* already too little time */ seconds for the full response to arrive before we bail out */
} timeout = ftp->response_time -
Curl_tvdiff(Curl_tvnow(), now)/1000; /* spent time */
if(timeout <=0 ) {
failf(data, "Transfer aborted due to timeout");
return CURLE_OPERATION_TIMEDOUT; /* already too little time */
} }
if(!ftp->cache) { if(!ftp->cache) {
@@ -244,19 +242,18 @@ int Curl_GetFTPResponse(char *buf,
switch (select (sockfd+1, &readfd, NULL, NULL, &interval)) { switch (select (sockfd+1, &readfd, NULL, NULL, &interval)) {
case -1: /* select() error, stop reading */ case -1: /* select() error, stop reading */
error = SELECT_ERROR; result = CURLE_RECV_ERROR;
failf(data, "Transfer aborted due to select() error"); failf(data, "Transfer aborted due to select() error: %d", errno);
break; break;
case 0: /* timeout */ case 0: /* timeout */
error = SELECT_TIMEOUT; result = CURLE_OPERATION_TIMEDOUT;
failf(data, "Transfer aborted due to timeout"); failf(data, "Transfer aborted due to timeout");
break; break;
default: default:
error = SELECT_OK;
break; break;
} }
} }
if(SELECT_OK == error) { if(CURLE_OK == result) {
/* /*
* This code previously didn't use the kerberos sec_read() code * This code previously didn't use the kerberos sec_read() code
* to read, but when we use Curl_read() it may do so. Do confirm * to read, but when we use Curl_read() it may do so. Do confirm
@@ -272,8 +269,7 @@ int Curl_GetFTPResponse(char *buf,
ftp->cache_size = 0; /* zero the size just in case */ ftp->cache_size = 0; /* zero the size just in case */
} }
else { else {
int res = Curl_read(conn, sockfd, ptr, int res = Curl_read(conn, sockfd, ptr, BUFSIZE-*nreadp, &gotbytes);
BUFSIZE-nread, &gotbytes);
if(res < 0) if(res < 0)
/* EWOULDBLOCK */ /* EWOULDBLOCK */
continue; /* go looping again */ continue; /* go looping again */
@@ -286,7 +282,7 @@ int Curl_GetFTPResponse(char *buf,
; ;
else if(gotbytes <= 0) { else if(gotbytes <= 0) {
keepon = FALSE; keepon = FALSE;
error = SELECT_ERROR; result = CURLE_RECV_ERROR;
failf(data, "Connection aborted"); failf(data, "Connection aborted");
} }
else { else {
@@ -295,7 +291,7 @@ int Curl_GetFTPResponse(char *buf,
* line */ * line */
int i; int i;
nread += gotbytes; *nreadp += gotbytes;
for(i = 0; i < gotbytes; ptr++, i++) { for(i = 0; i < gotbytes; ptr++, i++) {
perline++; perline++;
if(*ptr=='\n') { if(*ptr=='\n') {
@@ -315,7 +311,7 @@ int Curl_GetFTPResponse(char *buf,
result = Curl_client_write(data, CLIENTWRITE_HEADER, result = Curl_client_write(data, CLIENTWRITE_HEADER,
line_start, perline); line_start, perline);
if(result) if(result)
return -SELECT_CALLBACK; return result;
#define lastline(line) (isdigit((int)line[0]) && isdigit((int)line[1]) && \ #define lastline(line) (isdigit((int)line[0]) && isdigit((int)line[1]) && \
isdigit((int)line[2]) && (' ' == line[3])) isdigit((int)line[2]) && (' ' == line[3]))
@@ -350,13 +346,13 @@ int Curl_GetFTPResponse(char *buf,
if(ftp->cache) if(ftp->cache)
memcpy(ftp->cache, line_start, ftp->cache_size); memcpy(ftp->cache, line_start, ftp->cache_size);
else else
return -SELECT_MEMORY; /**BANG**/ return CURLE_OUT_OF_MEMORY; /**BANG**/
} }
} /* there was data */ } /* there was data */
} /* if(no error) */ } /* if(no error) */
} /* while there's buffer left and loop is requested */ } /* while there's buffer left and loop is requested */
if(!error) if(!result)
code = atoi(buf); code = atoi(buf);
#ifdef KRB4 #ifdef KRB4
@@ -378,13 +374,10 @@ int Curl_GetFTPResponse(char *buf,
} }
#endif #endif
if(error)
return -error;
if(ftpcode) if(ftpcode)
*ftpcode=code; /* return the initial number like this */ *ftpcode=code; /* return the initial number like this */
return nread; /* total amount of bytes read */ return result;
} }
/* /*
@@ -394,7 +387,7 @@ int Curl_GetFTPResponse(char *buf,
CURLcode Curl_ftp_connect(struct connectdata *conn) CURLcode Curl_ftp_connect(struct connectdata *conn)
{ {
/* this is FTP and no proxy */ /* this is FTP and no proxy */
int nread; ssize_t nread;
struct SessionHandle *data=conn->data; struct SessionHandle *data=conn->data;
char *buf = data->state.buffer; /* this is our buffer */ char *buf = data->state.buffer; /* this is our buffer */
struct FTP *ftp; struct FTP *ftp;
@@ -417,6 +410,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
/* no need to duplicate them, the data struct won't change */ /* no need to duplicate them, the data struct won't change */
ftp->user = data->state.user; ftp->user = data->state.user;
ftp->passwd = data->state.passwd; ftp->passwd = data->state.passwd;
ftp->response_time = 3600; /* set default response time-out */
if (data->set.tunnel_thru_httpproxy) { if (data->set.tunnel_thru_httpproxy) {
/* We want "seamless" FTP operations through HTTP proxy tunnel */ /* We want "seamless" FTP operations through HTTP proxy tunnel */
@@ -436,9 +430,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
/* The first thing we do is wait for the "220*" line: */ /* The first thing we do is wait for the "220*" line: */
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode != 220) { if(ftpcode != 220) {
failf(data, "This doesn't seem like a nice ftp-server response"); failf(data, "This doesn't seem like a nice ftp-server response");
@@ -467,9 +461,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
FTPSENDF(conn, "USER %s", ftp->user); FTPSENDF(conn, "USER %s", ftp->user);
/* wait for feedback */ /* wait for feedback */
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode == 530) { if(ftpcode == 530) {
/* 530 User ... access denied /* 530 User ... access denied
@@ -481,9 +475,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
/* 331 Password required for ... /* 331 Password required for ...
(the server requires to send the user's password too) */ (the server requires to send the user's password too) */
FTPSENDF(conn, "PASS %s", ftp->passwd); FTPSENDF(conn, "PASS %s", ftp->passwd);
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode == 530) { if(ftpcode == 530) {
/* 530 Login incorrect. /* 530 Login incorrect.
@@ -516,8 +510,11 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
/* we may need to issue a KAUTH here to have access to the files /* we may need to issue a KAUTH here to have access to the files
* do it if user supplied a password * do it if user supplied a password
*/ */
if(data->state.passwd && *data->state.passwd) if(data->state.passwd && *data->state.passwd) {
Curl_krb_kauth(conn); result = Curl_krb_kauth(conn);
if(result)
return result;
}
#endif #endif
} }
else { else {
@@ -529,9 +526,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
FTPSENDF(conn, "PWD", NULL); FTPSENDF(conn, "PWD", NULL);
/* wait for feedback */ /* wait for feedback */
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode == 257) { if(ftpcode == 257) {
char *dir = (char *)malloc(nread+1); char *dir = (char *)malloc(nread+1);
@@ -544,7 +541,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
The directory name can contain any character; embedded double-quotes The directory name can contain any character; embedded double-quotes
should be escaped by double-quotes (the "quote-doubling" convention). should be escaped by double-quotes (the "quote-doubling" convention).
*/ */
if('\"' == *ptr) { if(dir && ('\"' == *ptr)) {
/* it started good */ /* it started good */
ptr++; ptr++;
while(ptr && *ptr) { while(ptr && *ptr) {
@@ -570,6 +567,8 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
} }
else { else {
/* couldn't get the path */ /* couldn't get the path */
free(dir);
infof(data, "Failed to figure out path\n");
} }
} }
@@ -594,7 +593,6 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
struct FTP *ftp = conn->proto.ftp; struct FTP *ftp = conn->proto.ftp;
ssize_t nread; ssize_t nread;
char *buf = data->state.buffer; /* this is our buffer */
int ftpcode; int ftpcode;
CURLcode result=CURLE_OK; CURLcode result=CURLE_OK;
@@ -633,11 +631,24 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
conn->secondarysocket = -1; conn->secondarysocket = -1;
if(!ftp->no_transfer) { if(!ftp->no_transfer) {
/* now let's see what the server says about the transfer we just /* Let's see what the server says about the transfer we just performed,
performed: */ but lower the timeout as sometimes this connection has died while
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); the data has been transfered. This happens when doing through NATs
if(nread < 0) etc that abandon old silent connections.
return CURLE_OPERATION_TIMEOUTED; */
ftp->response_time = 60; /* give it only a minute for now */
result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
ftp->response_time = 3600; /* set this back to one hour waits */
if(!nread && (CURLE_OPERATION_TIMEDOUT == result)) {
failf(data, "control connection looks dead");
return result;
}
if(result)
return result;
if(!ftp->dont_check) { if(!ftp->dont_check) {
/* 226 Transfer complete, 250 Requested file action okay, completed. */ /* 226 Transfer complete, 250 Requested file action okay, completed. */
@@ -680,9 +691,9 @@ CURLcode ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
if (item->data) { if (item->data) {
FTPSENDF(conn, "%s", item->data); FTPSENDF(conn, "%s", item->data);
nread = Curl_GetFTPResponse(conn->data->state.buffer, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if (nread < 0) if (result)
return CURLE_OPERATION_TIMEOUTED; return result;
if (ftpcode >= 400) { if (ftpcode >= 400) {
failf(conn->data, "QUOT string not accepted: %s", item->data); failf(conn->data, "QUOT string not accepted: %s", item->data);
@@ -711,9 +722,9 @@ CURLcode ftp_cwd(struct connectdata *conn, char *path)
CURLcode result; CURLcode result;
FTPSENDF(conn, "CWD %s", path); FTPSENDF(conn, "CWD %s", path);
nread = Curl_GetFTPResponse(conn->data->state.buffer, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if (nread < 0) if (result)
return CURLE_OPERATION_TIMEOUTED; return result;
if (ftpcode != 250) { if (ftpcode != 250) {
failf(conn->data, "Couldn't cd to %s", path); failf(conn->data, "Couldn't cd to %s", path);
@@ -741,26 +752,34 @@ CURLcode ftp_getfiletime(struct connectdata *conn, char *file)
again a grey area as the MDTM is not kosher RFC959 */ again a grey area as the MDTM is not kosher RFC959 */
FTPSENDF(conn, "MDTM %s", file); FTPSENDF(conn, "MDTM %s", file);
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode == 213) { switch(ftpcode) {
/* we got a time. Format should be: "YYYYMMDDHHMMSS[.sss]" where the case 213:
last .sss part is optional and means fractions of a second */ {
int year, month, day, hour, minute, second; /* we got a time. Format should be: "YYYYMMDDHHMMSS[.sss]" where the
if(6 == sscanf(buf+4, "%04d%02d%02d%02d%02d%02d", last .sss part is optional and means fractions of a second */
&year, &month, &day, &hour, &minute, &second)) { int year, month, day, hour, minute, second;
/* we have a time, reformat it */ if(6 == sscanf(buf+4, "%04d%02d%02d%02d%02d%02d",
time_t secs=time(NULL); &year, &month, &day, &hour, &minute, &second)) {
sprintf(buf, "%04d%02d%02d %02d:%02d:%02d", /* we have a time, reformat it */
year, month, day, hour, minute, second); time_t secs=time(NULL);
/* now, convert this into a time() value: */ sprintf(buf, "%04d%02d%02d %02d:%02d:%02d",
conn->data->info.filetime = curl_getdate(buf, &secs); year, month, day, hour, minute, second);
} /* now, convert this into a time() value: */
else { conn->data->info.filetime = curl_getdate(buf, &secs);
infof(conn->data, "unsupported MDTM reply format\n"); }
} }
break;
default:
infof(conn->data, "unsupported MDTM reply format\n");
break;
case 550: /* "No such file or directory" */
failf(conn->data, "Given file does not exist");
result = CURLE_FTP_COULDNT_RETR_FILE;
break;
} }
return result; return result;
} }
@@ -778,14 +797,13 @@ static CURLcode ftp_transfertype(struct connectdata *conn,
struct SessionHandle *data = conn->data; struct SessionHandle *data = conn->data;
int ftpcode; int ftpcode;
ssize_t nread; ssize_t nread;
char *buf=data->state.buffer;
CURLcode result; CURLcode result;
FTPSENDF(conn, "TYPE %s", ascii?"A":"I"); FTPSENDF(conn, "TYPE %s", ascii?"A":"I");
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode != 200) { if(ftpcode != 200) {
failf(data, "Couldn't set %s mode", failf(data, "Couldn't set %s mode",
@@ -814,9 +832,9 @@ CURLcode ftp_getsize(struct connectdata *conn, char *file,
CURLcode result; CURLcode result;
FTPSENDF(conn, "SIZE %s", file); FTPSENDF(conn, "SIZE %s", file);
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode == 213) { if(ftpcode == 213) {
/* get the size from the ascii string: */ /* get the size from the ascii string: */
@@ -975,7 +993,6 @@ CURLcode ftp_use_port(struct connectdata *conn)
struct SessionHandle *data=conn->data; struct SessionHandle *data=conn->data;
int portsock=-1; int portsock=-1;
ssize_t nread; ssize_t nread;
char *buf = data->state.buffer; /* this is our buffer */
int ftpcode; /* receive FTP response codes in this */ int ftpcode; /* receive FTP response codes in this */
CURLcode result; CURLcode result;
@@ -1155,9 +1172,9 @@ CURLcode ftp_use_port(struct connectdata *conn)
return result; return result;
} }
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if (ftpcode != 200) { if (ftpcode != 200) {
failf(data, "Server does not grok %s", *modep); failf(data, "Server does not grok %s", *modep);
@@ -1216,7 +1233,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
if(h) if(h)
/* when we return from here, we can forget about this */ /* when we return from here, we can forget about this */
Curl_resolv_unlock(h); Curl_resolv_unlock(data, h);
if ( h || sa_filled_in) { if ( h || sa_filled_in) {
if( (portsock = socket(AF_INET, SOCK_STREAM, 0)) >= 0 ) { if( (portsock = socket(AF_INET, SOCK_STREAM, 0)) >= 0 ) {
@@ -1301,9 +1318,9 @@ CURLcode ftp_use_port(struct connectdata *conn)
return result; return result;
} }
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode != 200) { if(ftpcode != 200) {
failf(data, "Server does not grok PORT, try without it!"); failf(data, "Server does not grok PORT, try without it!");
@@ -1375,9 +1392,9 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
result = Curl_ftpsendf(conn, "%s", mode[modeoff]); result = Curl_ftpsendf(conn, "%s", mode[modeoff]);
if(result) if(result)
return result; return result;
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if (ftpcode == results[modeoff]) if (ftpcode == results[modeoff])
break; break;
} }
@@ -1480,7 +1497,7 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
&conninfo, &conninfo,
connected); connected);
Curl_resolv_unlock(addr); /* we're done using this address */ Curl_resolv_unlock(data, addr); /* we're done using this address */
/* /*
* When this is used from the multi interface, this might've returned with * When this is used from the multi interface, this might've returned with
@@ -1522,7 +1539,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
ssize_t nread; ssize_t nread;
int ftpcode; /* for ftp status */ int ftpcode; /* for ftp status */
/* the ftp struct is already inited in ftp_connect() */ /* the ftp struct is already inited in Curl_ftp_connect() */
struct FTP *ftp = conn->proto.ftp; struct FTP *ftp = conn->proto.ftp;
long *bytecountp = ftp->bytecountp; long *bytecountp = ftp->bytecountp;
@@ -1582,8 +1599,8 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
readthisamountnow = BUFSIZE; readthisamountnow = BUFSIZE;
actuallyread = actuallyread =
data->set.fread(data->state.buffer, 1, readthisamountnow, conn->fread(data->state.buffer, 1, readthisamountnow,
data->set.in); conn->fread_in);
passed += actuallyread; passed += actuallyread;
if(actuallyread != readthisamountnow) { if(actuallyread != readthisamountnow) {
@@ -1614,7 +1631,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
} }
} }
/* Send everything on data->set.in to the socket */ /* Send everything on data->state.in to the socket */
if(data->set.ftp_append) { if(data->set.ftp_append) {
/* we append onto the file instead of rewriting it */ /* we append onto the file instead of rewriting it */
FTPSENDF(conn, "APPE %s", ftp->file); FTPSENDF(conn, "APPE %s", ftp->file);
@@ -1623,9 +1640,9 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
FTPSENDF(conn, "STOR %s", ftp->file); FTPSENDF(conn, "STOR %s", ftp->file);
} }
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode>=400) { if(ftpcode>=400) {
failf(data, "Failed FTP upload:%s", buf+3); failf(data, "Failed FTP upload:%s", buf+3);
@@ -1799,9 +1816,9 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
FTPSENDF(conn, "REST %d", conn->resume_from); FTPSENDF(conn, "REST %d", conn->resume_from);
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if(ftpcode != 350) { if(ftpcode != 350) {
failf(data, "Couldn't use REST: %s", buf+4); failf(data, "Couldn't use REST: %s", buf+4);
@@ -1812,9 +1829,9 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
FTPSENDF(conn, "RETR %s", ftp->file); FTPSENDF(conn, "RETR %s", ftp->file);
} }
nread = Curl_GetFTPResponse(buf, conn, &ftpcode); result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
if(nread < 0) if(result)
return CURLE_OPERATION_TIMEOUTED; return result;
if((ftpcode == 150) || (ftpcode == 125)) { if((ftpcode == 150) || (ftpcode == 125)) {
@@ -1837,9 +1854,19 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
int size=-1; /* default unknown size */ int size=-1; /* default unknown size */
/*
* It appears that there are FTP-servers that return size 0 for files
* when SIZE is used on the file while being in BINARY mode. To work
* around that (stupid) behavior, we attempt to parse the RETR response
* even if the SIZE returned size zero.
*
* Debugging help from Salvatore Sorrentino on February 26, 2003.
*/
if(!dirlist && if(!dirlist &&
!data->set.ftp_ascii && !data->set.ftp_ascii &&
(-1 == downloadsize)) { (downloadsize < 1)) {
/* /*
* It seems directory listings either don't show the size or very * It seems directory listings either don't show the size or very
* often uses size 0 anyway. ASCII transfers may very well turn out * often uses size 0 anyway. ASCII transfers may very well turn out
@@ -1919,7 +1946,7 @@ CURLcode ftp_perform(struct connectdata *conn,
struct SessionHandle *data=conn->data; struct SessionHandle *data=conn->data;
char *buf = data->state.buffer; /* this is our buffer */ char *buf = data->state.buffer; /* this is our buffer */
/* the ftp struct is already inited in ftp_connect() */ /* the ftp struct is already inited in Curl_ftp_connect() */
struct FTP *ftp = conn->proto.ftp; struct FTP *ftp = conn->proto.ftp;
/* Send any QUOTE strings? */ /* Send any QUOTE strings? */
@@ -1980,7 +2007,7 @@ CURLcode ftp_perform(struct connectdata *conn,
well, we "emulate" a HTTP-style header in our output. */ well, we "emulate" a HTTP-style header in our output. */
#ifdef HAVE_STRFTIME #ifdef HAVE_STRFTIME
if(data->set.get_filetime && data->info.filetime) { if(data->set.get_filetime && (data->info.filetime>=0) ) {
struct tm *tm; struct tm *tm;
#ifdef HAVE_LOCALTIME_R #ifdef HAVE_LOCALTIME_R
struct tm buffer; struct tm buffer;
@@ -2043,6 +2070,7 @@ CURLcode Curl_ftp(struct connectdata *conn)
/* the ftp struct is already inited in ftp_connect() */ /* the ftp struct is already inited in ftp_connect() */
ftp = conn->proto.ftp; ftp = conn->proto.ftp;
conn->size = -1; /* make sure this is unknown at this point */
/* We split the path into dir and file parts *before* we URLdecode /* We split the path into dir and file parts *before* we URLdecode
it */ it */
@@ -2171,12 +2199,4 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
return CURLE_OK; return CURLE_OK;
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/
#endif /* CURL_DISABLE_FTP */ #endif /* CURL_DISABLE_FTP */

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -29,8 +29,8 @@ CURLcode Curl_ftp_done(struct connectdata *conn);
CURLcode Curl_ftp_connect(struct connectdata *conn); CURLcode Curl_ftp_connect(struct connectdata *conn);
CURLcode Curl_ftp_disconnect(struct connectdata *conn); CURLcode Curl_ftp_disconnect(struct connectdata *conn);
CURLcode Curl_ftpsendf(struct connectdata *, const char *fmt, ...); CURLcode Curl_ftpsendf(struct connectdata *, const char *fmt, ...);
int Curl_GetFTPResponse(char *buf, struct connectdata *conn, CURLcode Curl_GetFTPResponse(ssize_t *nread, struct connectdata *conn,
int *ftpcode); int *ftpcode);
CURLcode Curl_ftp_nextconnect(struct connectdata *conn); CURLcode Curl_ftp_nextconnect(struct connectdata *conn);
#endif #endif

View File

@@ -195,7 +195,7 @@ typedef enum _MERIDIAN {
} MERIDIAN; } MERIDIAN;
/* parse results and input string */ /* parse results and input string */
typedef struct _CONTEXT { typedef struct _CURL_CONTEXT {
const char *yyInput; const char *yyInput;
int yyDayOrdinal; int yyDayOrdinal;
int yyDayNumber; int yyDayNumber;
@@ -218,14 +218,14 @@ typedef struct _CONTEXT {
int yyRelMonth; int yyRelMonth;
int yyRelSeconds; int yyRelSeconds;
int yyRelYear; int yyRelYear;
} CONTEXT; } CURL_CONTEXT;
/* enable use of extra argument to yyparse and yylex which can be used to pass /* enable use of extra argument to yyparse and yylex which can be used to pass
** in a user defined value (CONTEXT struct in our case) ** in a user defined value (CURL_CONTEXT struct in our case)
*/ */
#define YYPARSE_PARAM cookie #define YYPARSE_PARAM cookie
#define YYLEX_PARAM cookie #define YYLEX_PARAM cookie
#define context ((CONTEXT *) cookie) #define context ((CURL_CONTEXT *) cookie)
#line 215 "getdate.y" #line 215 "getdate.y"
typedef union { typedef union {
@@ -397,7 +397,7 @@ static const short yycheck[] = { 0,
#define YYPURE 1 #define YYPURE 1
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
#line 3 "/usr/local/share/bison.simple" #line 3 "/usr/lib/bison.simple"
/* This file comes from bison-1.28. */ /* This file comes from bison-1.28. */
/* Skeleton output parser for bison, /* Skeleton output parser for bison,
@@ -611,7 +611,7 @@ __yy_memcpy (char *to, char *from, unsigned int count)
#endif #endif
#endif #endif
#line 217 "/usr/local/share/bison.simple" #line 217 "/usr/lib/bison.simple"
/* The user can define YYPARSE_PARAM as the name of an argument to be passed /* The user can define YYPARSE_PARAM as the name of an argument to be passed
into yyparse. The argument should have type void *. into yyparse. The argument should have type void *.
@@ -1303,7 +1303,7 @@ case 50:
break;} break;}
} }
/* the action file gets copied in in place of this dollarsign */ /* the action file gets copied in in place of this dollarsign */
#line 543 "/usr/local/share/bison.simple" #line 543 "/usr/lib/bison.simple"
yyvsp -= yylen; yyvsp -= yylen;
yyssp -= yylen; yyssp -= yylen;
@@ -1988,7 +1988,7 @@ curl_getdate (const char *p, const time_t *now)
{ {
struct tm tm, tm0, *tmp; struct tm tm, tm0, *tmp;
time_t Start; time_t Start;
CONTEXT cookie; CURL_CONTEXT cookie;
#ifdef HAVE_LOCALTIME_R #ifdef HAVE_LOCALTIME_R
struct tm keeptime; struct tm keeptime;
#endif #endif

View File

@@ -171,7 +171,7 @@ typedef enum _MERIDIAN {
} MERIDIAN; } MERIDIAN;
/* parse results and input string */ /* parse results and input string */
typedef struct _CONTEXT { typedef struct _CURL_CONTEXT {
const char *yyInput; const char *yyInput;
int yyDayOrdinal; int yyDayOrdinal;
int yyDayNumber; int yyDayNumber;
@@ -194,14 +194,14 @@ typedef struct _CONTEXT {
int yyRelMonth; int yyRelMonth;
int yyRelSeconds; int yyRelSeconds;
int yyRelYear; int yyRelYear;
} CONTEXT; } CURL_CONTEXT;
/* enable use of extra argument to yyparse and yylex which can be used to pass /* enable use of extra argument to yyparse and yylex which can be used to pass
** in a user defined value (CONTEXT struct in our case) ** in a user defined value (CURL_CONTEXT struct in our case)
*/ */
#define YYPARSE_PARAM cookie #define YYPARSE_PARAM cookie
#define YYLEX_PARAM cookie #define YYLEX_PARAM cookie
#define context ((CONTEXT *) cookie) #define context ((CURL_CONTEXT *) cookie)
%} %}
/* This grammar has 13 shift/reduce conflicts. */ /* This grammar has 13 shift/reduce conflicts. */
@@ -944,7 +944,7 @@ curl_getdate (const char *p, const time_t *now)
{ {
struct tm tm, tm0, *tmp; struct tm tm, tm0, *tmp;
time_t Start; time_t Start;
CONTEXT cookie; CURL_CONTEXT cookie;
#ifdef HAVE_LOCALTIME_R #ifdef HAVE_LOCALTIME_R
struct tm keeptime; struct tm keeptime;
#endif #endif

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -67,11 +67,3 @@ char *curl_getenv(const char *v)
{ {
return GetEnv(v); return GetEnv(v);
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -158,16 +158,11 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
case CURLINFO_CONTENT_TYPE: case CURLINFO_CONTENT_TYPE:
*param_charp = data->info.contenttype; *param_charp = data->info.contenttype;
break; break;
case CURLINFO_PRIVATE:
*param_charp = data->set.private;
break;
default: default:
return CURLE_BAD_FUNCTION_ARGUMENT; return CURLE_BAD_FUNCTION_ARGUMENT;
} }
return CURLE_OK; return CURLE_OK;
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -224,11 +224,3 @@ char *getpass(const char *prompt)
return getpass_r(prompt, buf, sizeof(buf)); return getpass_r(prompt, buf, sizeof(buf));
} }
#endif #endif
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -35,8 +35,6 @@
#endif #endif
/* {{{ static unsigned long _hash_str (const char *, size_t)
*/
static unsigned long static unsigned long
_hash_str (const char *key, size_t key_length) _hash_str (const char *key, size_t key_length)
{ {
@@ -50,10 +48,7 @@ _hash_str (const char *key, size_t key_length)
return h; return h;
} }
/* }}} */
/* {{{ static void _hash_element_dtor (void *, void *)
*/
static void static void
_hash_element_dtor (void *user, void *element) _hash_element_dtor (void *user, void *element)
{ {
@@ -68,10 +63,7 @@ _hash_element_dtor (void *user, void *element)
free(e); free(e);
} }
/* }}} */
/* {{{ void curl_hash_init (curl_hash *, int, curl_hash_dtor)
*/
void void
Curl_hash_init (curl_hash *h, int slots, curl_hash_dtor dtor) Curl_hash_init (curl_hash *h, int slots, curl_hash_dtor dtor)
{ {
@@ -86,10 +78,7 @@ Curl_hash_init (curl_hash *h, int slots, curl_hash_dtor dtor)
h->table[i] = Curl_llist_alloc((curl_llist_dtor) _hash_element_dtor); h->table[i] = Curl_llist_alloc((curl_llist_dtor) _hash_element_dtor);
} }
} }
/* }}} */
/* {{{ curl_hash *curl_hash_alloc (int, curl_hash_dtor)
*/
curl_hash * curl_hash *
Curl_hash_alloc (int slots, curl_hash_dtor dtor) Curl_hash_alloc (int slots, curl_hash_dtor dtor)
{ {
@@ -103,10 +92,7 @@ Curl_hash_alloc (int slots, curl_hash_dtor dtor)
return h; return h;
} }
/* }}} */
/* {{{ static int _hash_key_compare (char *, size_t, char *, size_t)
*/
static int static int
_hash_key_compare (char *key1, size_t key1_len, char *key2, size_t key2_len) _hash_key_compare (char *key1, size_t key1_len, char *key2, size_t key2_len)
{ {
@@ -118,12 +104,10 @@ _hash_key_compare (char *key1, size_t key1_len, char *key2, size_t key2_len)
return 0; return 0;
} }
/* }}} */
/* {{{ static int _mk_hash_element (curl_hash_element **, char *, size_t, const void *)
*/
static int static int
_mk_hash_element (curl_hash_element **e, char *key, size_t key_len, const void *p) _mk_hash_element (curl_hash_element **e, char *key, size_t key_len,
const void *p)
{ {
*e = (curl_hash_element *) malloc(sizeof(curl_hash_element)); *e = (curl_hash_element *) malloc(sizeof(curl_hash_element));
(*e)->key = strdup(key); (*e)->key = strdup(key);
@@ -131,16 +115,12 @@ _mk_hash_element (curl_hash_element **e, char *key, size_t key_len, const void *
(*e)->ptr = (void *) p; (*e)->ptr = (void *) p;
return 0; return 0;
} }
/* }}} */
#define find_slot(__h, __k, __k_len) (_hash_str(__k, __k_len) % (__h)->slots) #define find_slot(__h, __k, __k_len) (_hash_str(__k, __k_len) % (__h)->slots)
#define FETCH_LIST \ #define FETCH_LIST \
curl_llist *l = h->table[find_slot(h, key, key_len)] curl_llist *l = h->table[find_slot(h, key, key_len)]
/* {{{ int curl_hash_add (curl_hash *, char *, size_t, const void *)
*/
int int
Curl_hash_add (curl_hash *h, char *key, size_t key_len, const void *p) Curl_hash_add (curl_hash *h, char *key, size_t key_len, const void *p)
{ {
@@ -169,10 +149,7 @@ Curl_hash_add (curl_hash *h, char *key, size_t key_len, const void *p)
return 0; return 0;
} }
/* }}} */
/* {{{ int curl_hash_delete (curl_hash *, char *, size_t)
*/
int int
Curl_hash_delete(curl_hash *h, char *key, size_t key_len) Curl_hash_delete(curl_hash *h, char *key, size_t key_len)
{ {
@@ -193,10 +170,7 @@ Curl_hash_delete(curl_hash *h, char *key, size_t key_len)
return 0; return 0;
} }
/* }}} */
/* {{{ int curl_hash_pick (curl_hash *, char *, size_t, void **)
*/
void * void *
Curl_hash_pick(curl_hash *h, char *key, size_t key_len) Curl_hash_pick(curl_hash *h, char *key, size_t key_len)
{ {
@@ -215,10 +189,7 @@ Curl_hash_pick(curl_hash *h, char *key, size_t key_len)
return NULL; return NULL;
} }
/* }}} */
/* {{{ void curl_hash_apply (curl_hash *, void *, void (*)(void *, curl_hash_element *))
*/
void void
Curl_hash_apply(curl_hash *h, void *user, Curl_hash_apply(curl_hash *h, void *user,
void (*cb)(void *user, void *ptr)) void (*cb)(void *user, void *ptr))
@@ -235,10 +206,7 @@ Curl_hash_apply(curl_hash *h, void *user,
} }
} }
} }
/* }}} */
/* {{{ void curl_hash_clean (curl_hash *)
*/
void void
Curl_hash_clean(curl_hash *h) Curl_hash_clean(curl_hash *h)
{ {
@@ -250,11 +218,7 @@ Curl_hash_clean(curl_hash *h)
free(h->table); free(h->table);
} }
/* }}} */
/* {{{ void curl_hash_clean_with_criterium (curl_hash *, void *,
int (*)(void *, void *))
*/
void void
Curl_hash_clean_with_criterium(curl_hash *h, void *user, Curl_hash_clean_with_criterium(curl_hash *h, void *user,
int (*comp)(void *, void *)) int (*comp)(void *, void *))
@@ -277,17 +241,12 @@ Curl_hash_clean_with_criterium(curl_hash *h, void *user,
} }
} }
/* {{{ int curl_hash_count (curl_hash *)
*/
int int
Curl_hash_count(curl_hash *h) Curl_hash_count(curl_hash *h)
{ {
return h->size; return h->size;
} }
/* }}} */
/* {{{ void curl_hash_destroy (curl_hash *)
*/
void void
Curl_hash_destroy(curl_hash *h) Curl_hash_destroy(curl_hash *h)
{ {
@@ -297,12 +256,4 @@ Curl_hash_destroy(curl_hash *h)
Curl_hash_clean(h); Curl_hash_clean(h);
free(h); free(h);
} }
/* }}} */
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -58,11 +58,3 @@ void Curl_hash_clean_with_criterium(curl_hash *h, void *user, int (*comp)(void *
void Curl_hash_destroy(curl_hash *h); void Curl_hash_destroy(curl_hash *h);
#endif #endif
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -64,6 +64,7 @@
#include "sendf.h" #include "sendf.h"
#include "hostip.h" #include "hostip.h"
#include "hash.h" #include "hash.h"
#include "share.h"
#define _MPRINTF_REPLACE /* use our functions only */ #define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h> #include <curl/mprintf.h>
@@ -88,7 +89,7 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
void Curl_global_host_cache_init(void) void Curl_global_host_cache_init(void)
{ {
if (!host_cache_initialized) { if (!host_cache_initialized) {
Curl_hash_init(&hostname_cache, 7, Curl_freeaddrinfo); Curl_hash_init(&hostname_cache, 7, Curl_freednsinfo);
host_cache_initialized = 1; host_cache_initialized = 1;
} }
} }
@@ -211,6 +212,10 @@ void Curl_scan_cache_used(void *user, void *ptr)
#define HOSTCACHE_RETURN(dns) \ #define HOSTCACHE_RETURN(dns) \
{ \ { \
free(entry_id); \ free(entry_id); \
if(data->share) \
{ \
Curl_share_unlock(data, CURL_LOCK_DATA_DNS); \
} \
return dns; \ return dns; \
} }
@@ -246,6 +251,11 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
if (!entry_id) if (!entry_id)
return NULL; return NULL;
if(data->share)
{
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
}
/* See if its already in our dns cache */ /* See if its already in our dns cache */
dns = Curl_hash_pick(data->hostcache, entry_id, entry_len+1); dns = Curl_hash_pick(data->hostcache, entry_id, entry_len+1);
@@ -284,20 +294,41 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
HOSTCACHE_RETURN(dns); HOSTCACHE_RETURN(dns);
} }
void Curl_resolv_unlock(struct SessionHandle *data, struct Curl_dns_entry *dns)
{
if(data->share)
{
Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
}
dns->inuse--;
if(data->share)
{
Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
}
}
/* /*
* This is a wrapper function for freeing name information in a protocol * This is a wrapper function for freeing name information in a protocol
* independent way. This takes care of using the appropriate underlaying * independent way. This takes care of using the appropriate underlaying
* proper function. * function.
*/ */
void Curl_freeaddrinfo(void *freethis) void Curl_freeaddrinfo(Curl_addrinfo *p)
{
#ifdef ENABLE_IPV6
freeaddrinfo(p);
#else
free(p);
#endif
}
/*
* Free a cache dns entry.
*/
void Curl_freednsinfo(void *freethis)
{ {
struct Curl_dns_entry *p = (struct Curl_dns_entry *) freethis; struct Curl_dns_entry *p = (struct Curl_dns_entry *) freethis;
#ifdef ENABLE_IPV6 Curl_freeaddrinfo(p->addr);
freeaddrinfo(p->addr);
#else
free(p->addr);
#endif
free(p); free(p);
} }
@@ -480,7 +511,7 @@ static struct hostent* pack_hostent(char** buf, struct hostent* orig)
} }
#endif #endif
static char *MakeIP(unsigned long num,char *addr, int addr_len) static char *MakeIP(unsigned long num, char *addr, int addr_len)
{ {
#if defined(HAVE_INET_NTOA) || defined(HAVE_INET_NTOA_R) #if defined(HAVE_INET_NTOA) || defined(HAVE_INET_NTOA_R)
struct in_addr in; struct in_addr in;
@@ -563,7 +594,7 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
h->h_addrtype = AF_INET; h->h_addrtype = AF_INET;
h->h_length = sizeof(*addrentry); h->h_length = sizeof(*addrentry);
h->h_name = &buf->h_name[0]; h->h_name = &buf->h_name[0];
MakeIP(ntohl(in), h->h_name, sizeof(buf->h_name)); MakeIP(ntohl(in), (char *)h->h_name, sizeof(buf->h_name));
} }
#if defined(HAVE_GETHOSTBYNAME_R) #if defined(HAVE_GETHOSTBYNAME_R)
else { else {
@@ -623,16 +654,28 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
&h, /* DIFFERENCE */ &h, /* DIFFERENCE */
&h_errnop); &h_errnop);
/* Redhat 8, using glibc 2.2.93 changed the behavior. Now all of a /* Redhat 8, using glibc 2.2.93 changed the behavior. Now all of a
sudden this function seems to be setting EAGAIN if the given buffer sudden this function returns EAGAIN if the given buffer size is too
size is too small. Previous versions are known to return ERANGE for small. Previous versions are known to return ERANGE for the same
the same. */ problem.
This wouldn't be such a big problem if older versions wouldn't
sometimes return EAGAIN on a common failure case. Alas, we can't
assume that EAGAIN *or* ERANGE means ERANGE for any given version of
glibc.
For now, we do that and thus we may call the function repeatedly and
fail for older glibc versions that return EAGAIN, until we run out
of buffer size (step_size grows beyond CURL_NAMELOOKUP_SIZE).
If anyone has a better fix, please tell us!
*/
if((ERANGE == res) || (EAGAIN == res)) { if((ERANGE == res) || (EAGAIN == res)) {
step_size+=200; step_size+=200;
continue; continue;
} }
break; break;
} while(1); } while(step_size <= CURL_NAMELOOKUP_SIZE);
if(!h) /* failure */ if(!h) /* failure */
res=1; res=1;
@@ -653,6 +696,19 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
#ifdef HAVE_GETHOSTBYNAME_R_3 #ifdef HAVE_GETHOSTBYNAME_R_3
/* AIX, Digital Unix, HPUX 10, more? */ /* AIX, Digital Unix, HPUX 10, more? */
/* For AIX 4.3 or later, we don't use gethostbyname_r() at all, because of
the plain fact that it does not return unique full buffers on each
call, but instead several of the pointers in the hostent structs will
point to the same actual data! This have the unfortunate down-side that
our caching system breaks down horribly. Luckily for us though, AIX 4.3
and more recent versions have a completely thread-safe libc where all
the data is stored in thread-specific memory areas making calls to the
plain old gethostbyname() work fine even for multi-threaded programs.
This AIX 4.3 or later detection is all made in the configure script.
Troels Walsted Hansen helped us work this out on March 3rd, 2003. */
if(CURL_NAMELOOKUP_SIZE >= if(CURL_NAMELOOKUP_SIZE >=
(sizeof(struct hostent)+sizeof(struct hostent_data))) (sizeof(struct hostent)+sizeof(struct hostent_data)))
@@ -662,7 +718,8 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
ret = gethostbyname_r(hostname, ret = gethostbyname_r(hostname,
(struct hostent *)buf, (struct hostent *)buf,
(struct hostent_data *)((char *)buf + sizeof(struct hostent))); (struct hostent_data *)((char *)buf +
sizeof(struct hostent)));
else else
ret = -1; /* failure, too smallish buffer size */ ret = -1; /* failure, too smallish buffer size */
@@ -698,12 +755,3 @@ static Curl_addrinfo *my_getaddrinfo(struct SessionHandle *data,
} }
#endif /* end of IPv4-specific code */ #endif /* end of IPv4-specific code */
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -59,13 +59,16 @@ struct Curl_dns_entry *Curl_resolv(struct SessionHandle *data,
int port); int port);
/* unlock a previously resolved dns entry */ /* unlock a previously resolved dns entry */
#define Curl_resolv_unlock(dns) dns->inuse-- void Curl_resolv_unlock(struct SessionHandle *data, struct Curl_dns_entry *dns);
/* for debugging purposes only: */ /* for debugging purposes only: */
void Curl_scan_cache_used(void *user, void *ptr); void Curl_scan_cache_used(void *user, void *ptr);
/* free name info */ /* free name info */
void Curl_freeaddrinfo(void *freethis); void Curl_freeaddrinfo(Curl_addrinfo *freeaddr);
/* free cached name info */
void Curl_freednsinfo(void *freethis);
#ifdef MALLOCDEBUG #ifdef MALLOCDEBUG
void curl_freeaddrinfo(struct addrinfo *freethis, void curl_freeaddrinfo(struct addrinfo *freethis,

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -98,12 +98,65 @@
#include "memdebug.h" #include "memdebug.h"
#endif #endif
/* fread() emulation to provide POST and/or request data */
static int readmoredata(char *buffer,
size_t size,
size_t nitems,
void *userp)
{
struct connectdata *conn = (struct connectdata *)userp;
struct HTTP *http = conn->proto.http;
int fullsize = size * nitems;
if(0 == http->postsize)
/* nothing to return */
return 0;
/* make sure that a HTTP request is never sent away chunked! */
conn->bits.forbidchunk= (http->sending == HTTPSEND_REQUEST)?TRUE:FALSE;
if(http->postsize <= fullsize) {
memcpy(buffer, http->postdata, http->postsize);
fullsize = http->postsize;
if(http->backup.postsize) {
/* move backup data into focus and continue on that */
http->postdata = http->backup.postdata;
http->postsize = http->backup.postsize;
conn->fread = http->backup.fread;
conn->fread_in = http->backup.fread_in;
http->sending++; /* move one step up */
http->backup.postsize=0;
}
else
http->postsize = 0;
return fullsize;
}
memcpy(buffer, http->postdata, fullsize);
http->postdata += fullsize;
http->postsize -= fullsize;
return fullsize;
}
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* /*
* The add_buffer series of functions are used to build one large memory chunk * The add_buffer series of functions are used to build one large memory chunk
* from repeated function invokes. Used so that the entire HTTP request can * from repeated function invokes. Used so that the entire HTTP request can
* be sent in one go. * be sent in one go.
*/ */
struct send_buffer {
char *buffer;
size_t size_max;
size_t size_used;
};
typedef struct send_buffer send_buffer;
static CURLcode static CURLcode
add_buffer(send_buffer *in, const void *inptr, size_t size); add_buffer(send_buffer *in, const void *inptr, size_t size);
@@ -126,44 +179,66 @@ send_buffer *add_buffer_init(void)
* add_buffer_send() sends a buffer and frees all associated memory. * add_buffer_send() sends a buffer and frees all associated memory.
*/ */
static static
CURLcode add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in, CURLcode add_buffer_send(send_buffer *in,
long *bytes_written) int sockfd,
struct connectdata *conn,
long *bytes_written) /* add the number of sent
bytes to this counter */
{ {
ssize_t amount; ssize_t amount;
CURLcode res; CURLcode res;
char *ptr; char *ptr;
int size; int size;
struct HTTP *http = conn->proto.http;
/* The looping below is required since we use non-blocking sockets, but due /* The looping below is required since we use non-blocking sockets, but due
to the circumstances we will just loop and try again and again etc */ to the circumstances we will just loop and try again and again etc */
ptr = in->buffer; ptr = in->buffer;
size = in->size_used; size = in->size_used;
do {
res = Curl_write(conn, sockfd, ptr, size, &amount);
if(CURLE_OK != res) res = Curl_write(conn, sockfd, ptr, size, &amount);
break;
if(CURLE_OK == res) {
if(conn->data->set.verbose) if(conn->data->set.verbose)
/* this data _may_ contain binary stuff */ /* this data _may_ contain binary stuff */
Curl_debug(conn->data, CURLINFO_HEADER_OUT, ptr, amount); Curl_debug(conn->data, CURLINFO_HEADER_OUT, ptr, amount);
*bytes_written += amount;
if(amount != size) { if(amount != size) {
/* The whole request could not be sent in one system call. We must queue
it up and send it later when we get the chance. We must not loop here
and wait until it might work again. */
size -= amount; size -= amount;
ptr += amount; ptr += amount;
/* backup the currently set pointers */
http->backup.fread = conn->fread;
http->backup.fread_in = conn->fread_in;
http->backup.postdata = http->postdata;
http->backup.postsize = http->postsize;
/* set the new pointers for the request-sending */
conn->fread = (curl_read_callback)readmoredata;
conn->fread_in = (void *)conn;
http->postdata = ptr;
http->postsize = size;
http->send_buffer = in;
http->sending = HTTPSEND_REQUEST;
return CURLE_OK;
} }
else http->sending = HTTPSEND_BODY;
break; /* the full buffer was sent, clean up and return */
}
} while(1);
if(in->buffer) if(in->buffer)
free(in->buffer); free(in->buffer);
free(in); free(in);
*bytes_written += amount;
return res; return res;
} }
@@ -223,21 +298,75 @@ CURLcode add_buffer(send_buffer *in, const void *inptr, size_t size)
/* end of the add_buffer functions */ /* end of the add_buffer functions */
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/*
* Curl_compareheader()
*
* Returns TRUE if 'headerline' contains the 'header' with given 'content'.
* Pass headers WITH the colon.
*/
bool
Curl_compareheader(char *headerline, /* line to check */
const char *header, /* header keyword _with_ colon */
const char *content) /* content string to find */
{
/* RFC2616, section 4.2 says: "Each header field consists of a name followed
* by a colon (":") and the field value. Field names are case-insensitive.
* The field value MAY be preceded by any amount of LWS, though a single SP
* is preferred." */
size_t hlen = strlen(header);
size_t clen;
size_t len;
char *start;
char *end;
if(!strnequal(headerline, header, hlen))
return FALSE; /* doesn't start with header */
/* pass the header */
start = &headerline[hlen];
/* pass all white spaces */
while(*start && isspace((int)*start))
start++;
/* find the end of the header line */
end = strchr(start, '\r'); /* lines end with CRLF */
if(!end) {
/* in case there's a non-standard compliant line here */
end = strchr(start, '\n');
if(!end)
/* hm, there's no line ending here, use the zero byte! */
end = strchr(start, '\0');
}
len = end-start; /* length of the content part of the input line */
clen = strlen(content); /* length of the word to find */
/* find the content string in the rest of the line */
for(;len>=clen;len--, start++) {
if(strnequal(start, content, clen))
return TRUE; /* match! */
}
return FALSE; /* no match */
}
/* /*
* This function checks the linked list of custom HTTP headers for a particular * This function checks the linked list of custom HTTP headers for a particular
* header (prefix). * header (prefix).
*/ */
static bool checkheaders(struct SessionHandle *data, const char *thisheader) static char *checkheaders(struct SessionHandle *data, const char *thisheader)
{ {
struct curl_slist *head; struct curl_slist *head;
size_t thislen = strlen(thisheader); size_t thislen = strlen(thisheader);
for(head = data->set.headers; head; head=head->next) { for(head = data->set.headers; head; head=head->next) {
if(strnequal(head->data, thisheader, thislen)) { if(strnequal(head->data, thisheader, thislen))
return TRUE; return head->data;
}
} }
return FALSE; return NULL;
} }
/* /*
@@ -440,6 +569,10 @@ CURLcode Curl_http_connect(struct connectdata *conn)
if(conn->bits.user_passwd && !data->state.this_is_a_follow) { if(conn->bits.user_passwd && !data->state.this_is_a_follow) {
/* Authorization: is requested, this is not a followed location, get the /* Authorization: is requested, this is not a followed location, get the
original host name */ original host name */
if (data->state.auth_host)
/* Free to avoid leaking memory on multiple requests*/
free(data->state.auth_host);
data->state.auth_host = strdup(conn->hostname); data->state.auth_host = strdup(conn->hostname);
} }
@@ -454,13 +587,21 @@ CURLcode Curl_http_done(struct connectdata *conn)
data=conn->data; data=conn->data;
http=conn->proto.http; http=conn->proto.http;
/* set the proper values (possibly modified on POST) */
conn->fread = data->set.fread; /* restore */
conn->fread_in = data->set.in; /* restore */
if(http->send_buffer) {
send_buffer *buff = http->send_buffer;
free(buff->buffer);
free(buff);
}
if(HTTPREQ_POST_FORM == data->set.httpreq) { if(HTTPREQ_POST_FORM == data->set.httpreq) {
conn->bytecount = http->readbytecount + http->writebytecount; conn->bytecount = http->readbytecount + http->writebytecount;
Curl_formclean(http->sendit); /* Now free that whole lot */ Curl_formclean(http->sendit); /* Now free that whole lot */
data->set.fread = http->storefread; /* restore */
data->set.in = http->in; /* restore */
} }
else if(HTTPREQ_PUT == data->set.httpreq) else if(HTTPREQ_PUT == data->set.httpreq)
conn->bytecount = http->readbytecount + http->writebytecount; conn->bytecount = http->readbytecount + http->writebytecount;
@@ -475,7 +616,6 @@ CURLcode Curl_http_done(struct connectdata *conn)
return CURLE_OK; return CURLE_OK;
} }
CURLcode Curl_http(struct connectdata *conn) CURLcode Curl_http(struct connectdata *conn)
{ {
struct SessionHandle *data=conn->data; struct SessionHandle *data=conn->data;
@@ -523,7 +663,8 @@ CURLcode Curl_http(struct connectdata *conn)
host due to a location-follow, we do some weirdo checks here */ host due to a location-follow, we do some weirdo checks here */
if(!data->state.this_is_a_follow || if(!data->state.this_is_a_follow ||
!data->state.auth_host || !data->state.auth_host ||
strequal(data->state.auth_host, conn->hostname)) { curl_strequal(data->state.auth_host, conn->hostname) ||
data->set.http_disable_hostname_check_before_authentication) {
sprintf(data->state.buffer, "%s:%s", sprintf(data->state.buffer, "%s:%s",
data->state.user, data->state.passwd); data->state.user, data->state.passwd);
if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer), if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer),
@@ -547,18 +688,36 @@ CURLcode Curl_http(struct connectdata *conn)
conn->allocptr.cookie = aprintf("Cookie: %s\015\012", data->set.cookie); conn->allocptr.cookie = aprintf("Cookie: %s\015\012", data->set.cookie);
} }
if(!conn->bits.upload_chunky && (data->set.httpreq != HTTPREQ_GET)) {
/* not a chunky transfer but data is to be sent */
char *ptr = checkheaders(data, "Transfer-Encoding:");
if(ptr) {
/* Some kind of TE is requested, check if 'chunked' is chosen */
if(Curl_compareheader(ptr, "Transfer-Encoding:", "chunked"))
/* we have been told explicitly to upload chunky so deal with it! */
conn->bits.upload_chunky = TRUE;
}
}
if(conn->bits.upload_chunky) { if(conn->bits.upload_chunky) {
/* RFC2616 section 4.4:
Messages MUST NOT include both a Content-Length header field and a
non-identity transfer-coding. If the message does include a non-
identity transfer-coding, the Content-Length MUST be ignored. */
if(!checkheaders(data, "Transfer-Encoding:")) { if(!checkheaders(data, "Transfer-Encoding:")) {
te = "Transfer-Encoding: chunked\r\n"; te = "Transfer-Encoding: chunked\r\n";
} }
/* else else {
our header was already added, what to do now? */ /* The "Transfer-Encoding:" header was already added. */
te = "";
}
} }
if(data->cookies) { if(data->cookies) {
co = Curl_cookie_getlist(data->cookies, co = Curl_cookie_getlist(data->cookies,
host, ppath, host, ppath,
(conn->protocol&PROT_HTTPS?TRUE:FALSE)); (bool)(conn->protocol&PROT_HTTPS?TRUE:FALSE));
} }
if (data->change.proxy && *data->change.proxy && if (data->change.proxy && *data->change.proxy &&
!data->set.tunnel_thru_httpproxy && !data->set.tunnel_thru_httpproxy &&
@@ -839,6 +998,9 @@ CURLcode Curl_http(struct connectdata *conn)
headers = headers->next; headers = headers->next;
} }
http->postdata = NULL; /* nothing to post at this point */
Curl_pgrsSetUploadSize(data, 0); /* upload size is 0 atm */
switch(data->set.httpreq) { switch(data->set.httpreq) {
case HTTPREQ_POST_FORM: case HTTPREQ_POST_FORM:
@@ -847,16 +1009,16 @@ CURLcode Curl_http(struct connectdata *conn)
return CURLE_HTTP_POST_ERROR; return CURLE_HTTP_POST_ERROR;
} }
http->storefread = data->set.fread; /* backup */ /* set the read function to read from the generated form data */
http->in = data->set.in; /* backup */ conn->fread = (curl_read_callback)Curl_FormReader;
conn->fread_in = &http->form;
data->set.fread = (curl_read_callback) http->sending = HTTPSEND_BODY;
Curl_FormReader; /* set the read function to read from the
generated form data */
data->set.in = (FILE *)&http->form;
add_bufferf(req_buffer, if(!conn->bits.upload_chunky)
"Content-Length: %d\r\n", http->postsize); /* only add Content-Length if not uploading chunked */
add_bufferf(req_buffer,
"Content-Length: %d\r\n", http->postsize);
if(!checkheaders(data, "Expect:")) { if(!checkheaders(data, "Expect:")) {
/* if not disabled explicitly we add a Expect: 100-continue /* if not disabled explicitly we add a Expect: 100-continue
@@ -896,7 +1058,7 @@ CURLcode Curl_http(struct connectdata *conn)
Curl_pgrsSetUploadSize(data, http->postsize); Curl_pgrsSetUploadSize(data, http->postsize);
/* fire away the whole request to the server */ /* fire away the whole request to the server */
result = add_buffer_send(conn->firstsocket, conn, req_buffer, result = add_buffer_send(req_buffer, conn->firstsocket, conn,
&data->info.request_size); &data->info.request_size);
if(result) if(result)
failf(data, "Failed sending POST request"); failf(data, "Failed sending POST request");
@@ -914,22 +1076,22 @@ CURLcode Curl_http(struct connectdata *conn)
case HTTPREQ_PUT: /* Let's PUT the data to the server! */ case HTTPREQ_PUT: /* Let's PUT the data to the server! */
if(data->set.infilesize>0) { if((data->set.infilesize>0) && !conn->bits.upload_chunky)
/* only add Content-Length if not uploading chunked */
add_bufferf(req_buffer, add_bufferf(req_buffer,
"Content-Length: %d\r\n\r\n", /* file size */ "Content-Length: %d\r\n", /* file size */
data->set.infilesize ); data->set.infilesize );
}
else add_bufferf(req_buffer, "\r\n");
add_bufferf(req_buffer, "\015\012");
/* set the upload size to the progress meter */ /* set the upload size to the progress meter */
Curl_pgrsSetUploadSize(data, data->set.infilesize); Curl_pgrsSetUploadSize(data, data->set.infilesize);
/* this sends the buffer and frees all the buffer resources */ /* this sends the buffer and frees all the buffer resources */
result = add_buffer_send(conn->firstsocket, conn, req_buffer, result = add_buffer_send(req_buffer, conn->firstsocket, conn,
&data->info.request_size); &data->info.request_size);
if(result) if(result)
failf(data, "Faied sending POST request"); failf(data, "Failed sending POST request");
else else
/* prepare for transfer */ /* prepare for transfer */
result = Curl_Transfer(conn, conn->firstsocket, -1, TRUE, result = Curl_Transfer(conn, conn->firstsocket, -1, TRUE,
@@ -943,14 +1105,20 @@ CURLcode Curl_http(struct connectdata *conn)
case HTTPREQ_POST: case HTTPREQ_POST:
/* this is the simple POST, using x-www-form-urlencoded style */ /* this is the simple POST, using x-www-form-urlencoded style */
if(!checkheaders(data, "Content-Length:")) if(!conn->bits.upload_chunky) {
/* we allow replacing this header, although it isn't very wise to /* We only set Content-Length and allow a custom Content-Length if
actually set your own */ we don't upload data chunked, as RFC2616 forbids us to set both
add_bufferf(req_buffer, kinds of headers (Transfer-Encoding: chunked and Content-Length) */
"Content-Length: %d\r\n",
data->set.postfieldsize? if(!checkheaders(data, "Content-Length:"))
data->set.postfieldsize: /* we allow replacing this header, although it isn't very wise to
(data->set.postfields?strlen(data->set.postfields):0) ); actually set your own */
add_bufferf(req_buffer,
"Content-Length: %d\r\n",
data->set.postfieldsize?
data->set.postfieldsize:
(data->set.postfields?strlen(data->set.postfields):0) );
}
if(!checkheaders(data, "Content-Type:")) if(!checkheaders(data, "Content-Type:"))
add_bufferf(req_buffer, add_bufferf(req_buffer,
@@ -958,18 +1126,28 @@ CURLcode Curl_http(struct connectdata *conn)
add_buffer(req_buffer, "\r\n", 2); add_buffer(req_buffer, "\r\n", 2);
/* and here comes the actual data */ /* and here we setup the pointers to the actual data */
if(data->set.postfieldsize && data->set.postfields) { if(data->set.postfields) {
add_buffer(req_buffer, data->set.postfields, if(data->set.postfieldsize)
data->set.postfieldsize); http->postsize = data->set.postfieldsize;
} else
else if(data->set.postfields) http->postsize = strlen(data->set.postfields);
add_bufferf(req_buffer, http->postdata = data->set.postfields;
"%s",
data->set.postfields );
/* issue the request */ http->sending = HTTPSEND_BODY;
result = add_buffer_send(conn->firstsocket, conn, req_buffer,
conn->fread = (curl_read_callback)readmoredata;
conn->fread_in = (void *)conn;
/* set the upload size to the progress meter */
Curl_pgrsSetUploadSize(data, http->postsize);
}
else
/* set the upload size to the progress meter */
Curl_pgrsSetUploadSize(data, data->set.infilesize);
/* issue the request, headers-only */
result = add_buffer_send(req_buffer, conn->firstsocket, conn,
&data->info.request_size); &data->info.request_size);
if(result) if(result)
@@ -978,15 +1156,15 @@ CURLcode Curl_http(struct connectdata *conn)
result = result =
Curl_Transfer(conn, conn->firstsocket, -1, TRUE, Curl_Transfer(conn, conn->firstsocket, -1, TRUE,
&http->readbytecount, &http->readbytecount,
data->set.postfields?-1:conn->firstsocket, conn->firstsocket,
data->set.postfields?NULL:&http->writebytecount); &http->writebytecount);
break; break;
default: default:
add_buffer(req_buffer, "\r\n", 2); add_buffer(req_buffer, "\r\n", 2);
/* issue the request */ /* issue the request */
result = add_buffer_send(conn->firstsocket, conn, req_buffer, result = add_buffer_send(req_buffer, conn->firstsocket, conn,
&data->info.request_size); &data->info.request_size);
if(result) if(result)
@@ -995,7 +1173,8 @@ CURLcode Curl_http(struct connectdata *conn)
/* HTTP GET/HEAD download: */ /* HTTP GET/HEAD download: */
result = Curl_Transfer(conn, conn->firstsocket, -1, TRUE, result = Curl_Transfer(conn, conn->firstsocket, -1, TRUE,
&http->readbytecount, &http->readbytecount,
-1, NULL); /* nothing to upload */ http->postdata?conn->firstsocket:-1,
http->postdata?&http->writebytecount:NULL);
} }
if(result) if(result)
return result; return result;
@@ -1004,13 +1183,4 @@ CURLcode Curl_http(struct connectdata *conn)
return CURLE_OK; return CURLE_OK;
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/
#endif #endif

View File

@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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,6 +24,10 @@
* $Id$ * $Id$
***************************************************************************/ ***************************************************************************/
#ifndef CURL_DISABLE_HTTP #ifndef CURL_DISABLE_HTTP
bool Curl_compareheader(char *headerline, /* line to check */
const char *header, /* header keyword _with_ colon */
const char *content); /* content string to find */
/* ftp can use this as well */ /* ftp can use this as well */
CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
int tunnelsocket, int tunnelsocket,

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -248,12 +248,4 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
} }
return CHUNKE_OK; return CHUNKE_OK;
} }
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/
#endif /* CURL_DISABLE_HTTP */ #endif /* CURL_DISABLE_HTTP */

View File

@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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

View File

@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2002, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2003, 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
@@ -32,7 +32,8 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#if ! defined(WIN32) && ! defined(__BEOS__) && !defined(__CYGWIN32__) #if ! defined(WIN32) && ! defined(__BEOS__) && !defined(__CYGWIN32__) && \
! defined(__riscos__)
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
@@ -124,11 +125,3 @@ char *Curl_if2ip(char *interface, char *buf, int buf_size)
#else #else
#define if2ip(x) NULL #define if2ip(x) NULL
#endif #endif
/*
* local variables:
* eval: (load-file "../curl-mode.el")
* end:
* vim600: fdm=marker
* vim: et sw=2 ts=2 sts=2 tw=78
*/

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