Compare commits

..

179 Commits

Author SHA1 Message Date
Daniel Stenberg
259ac2dd77 7.8 commit 2001-06-07 09:39:29 +00:00
Daniel Stenberg
4ebf001d37 SM's suggested update of the Microsoft and SSL compiling section 2001-06-07 06:21:27 +00:00
Daniel Stenberg
5e326014cd SDavila posted a fix that sets conn->bits.use_range properly when doing
resumed downloads
2001-06-07 05:59:20 +00:00
Daniel Stenberg
0b0bbffa35 Jrn corrected the mingw32 makefile 2001-06-07 05:41:30 +00:00
Daniel Stenberg
2b35432fcc S. Moonesamy updates, strtok.[ch] issues 2001-06-06 14:26:50 +00:00
Daniel Stenberg
ef8a2bc4fc Added note about src/hughelp.c and the new *.cvs file that can be used if
you really can't generate that file.
2001-06-06 09:39:07 +00:00
Daniel Stenberg
96d235d9a3 For people using CVS but with no perl, like all those windows losers. They
can just rename this file and cut off the extension instead...
2001-06-06 09:37:15 +00:00
Daniel Stenberg
eaf51b62b9 corrected the CVS note about not creating a subdirectory... which it does now 2001-06-06 09:33:46 +00:00
Daniel Stenberg
80994a123e MUTE is gone, PHP examples, new CVS structure 2001-06-05 11:48:30 +00:00
Daniel Stenberg
b1cd033c27 made the test-program in the bottom compile/build, remember to link with
strequal.o as well!
2001-06-05 11:27:40 +00:00
Sterling Hughes
268867311e Add documentation for the --vernum attribute 2001-06-01 21:56:58 +00:00
Daniel Stenberg
6840f80d21 CURLOPT_CONNECTTIMEOUT works on win32 these days, S. Moonesamy pointed out 2001-06-01 07:33:38 +00:00
Sterling Hughes
cac6876734 Update the cvs instructions. 2001-06-01 04:46:15 +00:00
Sterling Hughes
753011c8db Test (and revert change from previous test). 2001-06-01 00:02:44 +00:00
Sterling Hughes
2774dc390a testing... testing... 1, 2, 3 2001-05-31 23:56:28 +00:00
Daniel Stenberg
eb4534f735 removed CURLOPT_MUTE, it is not used anymore 2001-05-31 13:55:13 +00:00
Daniel Stenberg
efb957039d MUTE is now considered obsolete 2001-05-31 13:52:59 +00:00
Daniel Stenberg
fe82ddda46 CURLOPT_MUTE and data->bits.mute are history, removed, gone! 2001-05-31 13:50:28 +00:00
Daniel Stenberg
94af496ac4 the global init stuff, strtok.h mess, _REENTRANT fixed 2001-05-31 13:32:55 +00:00
Sterling Hughes
6f17c2f140 add entry for getbinarypageinvar.php 2001-05-31 12:33:38 +00:00
Sterling Hughes
490c00fb30 Change to // comments and add <?php and ?> wrappers 2001-05-31 12:32:04 +00:00
Sterling Hughes
2d0dbd87c3 Update comments and wrap in <?php and ?> 2001-05-31 12:25:49 +00:00
Sterling Hughes
13a5e16f35 update the comment style from '#' to '//' which is the "un-official"
standard PHP comment.  Also wrap the code in <?php and ?> and finally
add getbinarypageinvar.php to Makefile.am and README
2001-05-31 12:14:12 +00:00
Sterling Hughes
3d54ba1b9e Add the getbinarypageinvar.php, which shows how to use the
CURLOPT_BINARYTRANSFER, added in PHP 4.0.6 along with the
CURLOPT_RETURNTRANSFER option.
2001-05-31 11:59:39 +00:00
Sterling Hughes
e051f904f2 Test and substance patch.
This is my first CVS commit :), what it does:

- Makes sure that parts of the cURL library don't get initialized twice
- Makes sure that we only free what we initialize
2001-05-31 11:30:34 +00:00
Daniel Stenberg
f8d94a3849 Added CVS $Id$ keyword for inline version tracking 2001-05-31 08:41:42 +00:00
Daniel Stenberg
ac691cae88 updated to again set the flags of what to init, and now also feature a
set of available flags
2001-05-31 08:35:26 +00:00
Daniel Stenberg
43d0d75688 fixed the dlopen check 2001-05-31 08:24:50 +00:00
Daniel Stenberg
77f34915ce removed _REENTRANT define 2001-05-31 07:03:04 +00:00
Daniel Stenberg
72b8993164 re-generated 2001-05-31 07:02:31 +00:00
Daniel Stenberg
6b9bd96c06 include setup.h _before_ system includes 2001-05-31 07:02:13 +00:00
Daniel Stenberg
6532f737eb if NEED_REENTRANT is set, define _REENTRANT already here since it has to
be defined as many include files as possible (Solaris req)
2001-05-31 07:01:08 +00:00
Daniel Stenberg
928ff54388 includes setup.h, and thus I could remove the _REENTRANT define 2001-05-31 07:00:21 +00:00
Daniel Stenberg
95c94bf658 the CURL_GLOBAL flags are now used to set what parts to init globally 2001-05-31 06:10:25 +00:00
Daniel Stenberg
7f295939d0 went back to the version where the flags argument to curl_global_init()
specify exactly what global parts to init. Thanks to Sterling Hughes really
for arguing wisely.
2001-05-31 06:06:37 +00:00
Daniel Stenberg
aa27db6986 removed the prototype and made it include string.h instead
If your system, such as Solaris 2.7, lacks the strtok_r() prototype in
   string.h, then you'll face a bunch of warnings on all instances
   where strtok_r() is used.

   There's not much we can do about it. Adding a prototype here screws
   everything up on other platforms! :-(
2001-05-31 06:05:32 +00:00
Daniel Stenberg
4ce5fa3ea9 Sterling Hughes suggested we set 'static' before size_t... 2001-05-31 05:55:42 +00:00
Daniel Stenberg
ffa7c13117 libcurl now has MUTE and NOPROGRESS set by default 2001-05-30 12:51:24 +00:00
Daniel Stenberg
fbca7a83fc 7.8-pre2 2001-05-30 11:24:26 +00:00
Daniel Stenberg
870bacd689 include strtok.h to get the prototype 2001-05-30 11:06:56 +00:00
Daniel Stenberg
d9f39cc99b finally fixed the 'ret' compiler warning 2001-05-30 11:06:33 +00:00
Daniel Stenberg
f2e6d235f2 removed python interface, there is one now! ;-) 2001-05-30 10:42:18 +00:00
Daniel Stenberg
baa220c1af -# fix, thread fix, easy.c compile fix and more 2001-05-30 10:34:14 +00:00
Daniel Stenberg
cabef4732d made the automake line re-build from _all_ Makefile.am files in the source tree 2001-05-30 10:29:39 +00:00
Daniel Stenberg
cab90bf98a english fix 2001-05-30 08:01:35 +00:00
Daniel Stenberg
ab449cce73 now uses CURL_GLOBAL_DEFAULT 2001-05-30 08:01:09 +00:00
Daniel Stenberg
b541537c66 curl_global_init() support for CURL_GLOBAL_NOT_SSL 2001-05-30 08:00:29 +00:00
Daniel Stenberg
285e998fae Sterling Hughes's fixes 2001-05-30 07:59:47 +00:00
Cris Bailiff
c503930b8d Added Solaris 'pkgadd' building support to packages collection and autoconf/automake files 2001-05-30 04:31:32 +00:00
Daniel Stenberg
5c6859e537 not used in autoconf version 2.50 2001-05-29 19:28:50 +00:00
Daniel Stenberg
4e376a2f1a check for strtok_r 2001-05-29 19:25:28 +00:00
Daniel Stenberg
edd608aa76 curl_ => Curl_ 2001-05-29 19:20:37 +00:00
Daniel Stenberg
88d536eb3b re-indented to follow "project curl"-style, renamed curl_ prefix to Curl_ 2001-05-29 19:20:21 +00:00
Daniel Stenberg
d567659bf4 strtok() replaced with strtok_r() 2001-05-29 19:17:39 +00:00
Daniel Stenberg
e0558ae541 adjusted for automake 1.4+ 2001-05-29 19:17:19 +00:00
Daniel Stenberg
034f6378da Added strtok.[ch] 2001-05-29 19:17:03 +00:00
Daniel Stenberg
af129c499e we rqeuire autoconf 2.50 now 2001-05-29 19:14:46 +00:00
Daniel Stenberg
8b4809a898 fixed the -# to write to the same as --stderr is set to 2001-05-29 18:30:47 +00:00
Daniel Stenberg
88d14e96ca 3.11 How do I POST with a different Content-Type? 2001-05-29 14:02:20 +00:00
Daniel Stenberg
04d1491a6b clarified the MUTE option 2001-05-29 13:28:03 +00:00
Daniel Stenberg
de16ddd5b4 updated, improved language at a few places 2001-05-29 13:23:41 +00:00
Daniel Stenberg
27751df6ec moved list of authors to the separate THANKS file and added that to the
release archive
2001-05-29 12:09:47 +00:00
Daniel Stenberg
cf02eb11f6 text: added in 7.8 2001-05-29 12:09:15 +00:00
Daniel Stenberg
22b8d387bc beauty fix 2001-05-29 08:27:43 +00:00
Daniel Stenberg
bfd89c8078 global_init() takes that flag argument 2001-05-29 07:20:31 +00:00
Daniel Stenberg
223c48e6b5 7.8-pre1 commit 2001-05-28 21:50:00 +00:00
Daniel Stenberg
7bb7550e23 fixes 2001-05-28 21:49:45 +00:00
Daniel Stenberg
adf00f5b2e added libtool 2001-05-28 21:49:01 +00:00
Daniel Stenberg
0844c4fdb2 major: curl_general_init/cleanup 2001-05-28 21:45:36 +00:00
Daniel Stenberg
38cabc4fdb ftps:// works 2001-05-28 21:45:10 +00:00
Daniel Stenberg
ec340e3e33 adjusted the global_init() call to pass the new flag argument too 2001-05-28 15:31:12 +00:00
Daniel Stenberg
f44f512f24 global_init() takes a flag option now, to tell libcurl what _not_ to init.
it will make it better when the application uses several libs that use
openssl and it also enables us to do the win32 winsock initing in the future
if we want to
2001-05-28 15:30:38 +00:00
Daniel Stenberg
ce0e2cc017 better -v use, passes -I to all perl invokes 2001-05-28 15:26:15 +00:00
Daniel Stenberg
b082832220 added calls to curl_global_*, they aren't really needed for this application
but it shows good manner to always cleanup
2001-05-28 15:06:46 +00:00
Daniel Stenberg
1e5e0f9a26 added 'curl-config --vernum' for hardcore hex version output 2001-05-28 14:58:07 +00:00
Daniel Stenberg
ac3ae8f775 changed the check for command1.txt to test1, so that automatic testing
in 'make distcheck' will work
2001-05-28 14:32:05 +00:00
Daniel Stenberg
a51fd91db2 increased interface age 2001-05-28 14:12:58 +00:00
Daniel Stenberg
d300cf4d84 T. Bharath's comments about SSL cleanup incorporated, and the two new
curl_global_* functions
2001-05-28 14:12:43 +00:00
Daniel Stenberg
a9d0a85842 curl_global_cleanup and curl_global_init added to the family 2001-05-28 14:11:02 +00:00
Daniel Stenberg
81da4fc995 Added more test cases 2001-05-28 12:31:07 +00:00
Daniel Stenberg
b6ca1be1cd test case converted to the new file format 2001-05-28 12:30:21 +00:00
Daniel Stenberg
20d67917c4 test: HTTP over proxy 2001-05-28 11:19:44 +00:00
Daniel Stenberg
915b10052c Removed references to the previous file format, added some tests about
the new format but there's still much more to be said and done
2001-05-23 15:05:43 +00:00
Daniel Stenberg
d3516810a7 adjusted to the new test case formats 2001-05-23 15:02:58 +00:00
Daniel Stenberg
68af9a222e Removed the former files using the old-style test case format, added the
new ones. Many more of the old ones must be "ported" to this new format
to make the test suite complete again.
2001-05-23 15:02:24 +00:00
Daniel Stenberg
58c3bdc1a4 new test case file format 2001-05-23 15:00:48 +00:00
Daniel Stenberg
72dec6cfec Added Andres' comments about field 2 in netscape cookie files 2001-05-23 13:04:19 +00:00
Daniel Stenberg
8dc9f4330c Andrs Garca's netscape cookie file parser fix 2001-05-23 09:26:45 +00:00
Daniel Stenberg
c77f77a1ce general autoconf and automake fixes 2001-05-22 21:17:58 +00:00
Daniel Stenberg
2966ef6661 store httpcode _before_ doing the FAILONERROR check so that getinfo works
afterwards (bug #426442)
2001-05-22 21:09:09 +00:00
Daniel Stenberg
93c53424c8 cleanup commit for new autoconf+automake+libtool versions 2001-05-22 18:16:24 +00:00
Daniel Stenberg
4a2812c5e8 fixes and improvments 2001-05-22 12:05:05 +00:00
Daniel Stenberg
4852a4930c turned newlines into DOS styles 2001-05-21 21:45:11 +00:00
Daniel Stenberg
b555ca5baa made it binary in CVS to maintain DOS newlines and turned those newlines
into the DOS kind!
2001-05-21 21:42:38 +00:00
Daniel Stenberg
4a6eaf1b95 Added text about the test case numbering 2001-05-21 13:40:54 +00:00
Daniel Stenberg
a8bc40fe4e doesn't run ssl tests if libcurl wasn't built with ssl support (and reports
about the libcurl SSL status)
2001-05-21 13:38:38 +00:00
Daniel Stenberg
1b9e26a287 added a lame double-check for libcrypto as otherwise it wouldn't get added
properly! (?) Anyone has any better solution then please step forward!
2001-05-21 13:33:03 +00:00
Daniel Stenberg
9f24645a5b Added test case 400, the first ftps:// one 2001-05-21 13:31:49 +00:00
Daniel Stenberg
441a957d57 ftps test case data 2001-05-21 13:31:05 +00:00
Daniel Stenberg
adc0edc44b slightly "hackish" approach to disable SSL during download if the connection
is a FTPS connection as the data transfer is then done unencrypted!
2001-05-21 13:30:01 +00:00
Daniel Stenberg
4836154cef this should not set a SSL path to LDFLAGS or CPPFLAGS unless it really needs
to
2001-05-18 14:42:41 +00:00
Daniel Stenberg
0058e87ed5 added some, removed some, moved around some. 2001-05-18 12:55:13 +00:00
Daniel Stenberg
23903306a7 nicer OpenSSL header check 2001-05-18 12:36:38 +00:00
Daniel Stenberg
49b9926d5a our internal strlcat() is now named Curl_strlcat() 2001-05-18 12:03:30 +00:00
Daniel Stenberg
6c50d2ee7d strlcat() is now Curl_strlcat() instead to prevent collisions when used with
other libs
2001-05-18 10:02:44 +00:00
Daniel Stenberg
9e8615ae1d strlcpy() turned static 2001-05-18 10:02:12 +00:00
Daniel Stenberg
bb51c20c8b Added #define CURLE_ALREADY_COMPLETE to not break compiles that use that
symbol, but libcurl will not return this ever
2001-05-16 14:45:50 +00:00
Daniel Stenberg
a84af986fd added pointer to the examples/getinmemory.c source code for paragraph
5.2 "How can I receive all data into a large memory chunk?"
2001-05-15 13:09:27 +00:00
Daniel Stenberg
3ab3be1b6e Added getinmemory.c 2001-05-15 13:08:23 +00:00
Daniel Stenberg
3ceb2bcbb9 this might actually compile too... 2001-05-15 13:04:53 +00:00
Daniel Stenberg
2457a31948 an example on how you can use the write callback to receive data in a memory
chunk
2001-05-15 13:03:53 +00:00
Daniel Stenberg
9e1e318691 We need -lpthread for the pthread example 2001-05-15 12:56:38 +00:00
Daniel Stenberg
e1132ecbe6 corrected 2001-05-15 12:55:35 +00:00
Daniel Stenberg
ccb92f1a8a Added Pawel A. Gajda 2001-05-15 11:00:29 +00:00
Daniel Stenberg
8526fa97ce Pawel A. Gajda fixed resumed transfers on persistent connections 2001-05-15 07:21:13 +00:00
Daniel Stenberg
f85c29aad8 Added the first https test: 300 2001-05-14 12:25:04 +00:00
Daniel Stenberg
4677f733b2 pid files fixes, ftp server already-running-but-no-control check 2001-05-14 12:09:47 +00:00
Daniel Stenberg
e82d2dc634 Jun-ichiro itojun Hagino fixed FTP PORT for IPv6-enabled libcurl 2001-05-14 11:29:47 +00:00
Daniel Stenberg
b56f1e5185 added a pointer to the download web page 2001-05-14 07:08:22 +00:00
Daniel Stenberg
c7c942861a Added tons of comments all over 2001-05-12 16:11:14 +00:00
Daniel Stenberg
a50fac0e63 multiple transfer path fixes, location fixes, resume download changes,
ssl peer verify fixes and more
2001-05-12 09:49:04 +00:00
Daniel Stenberg
e0f56897d5 CURLE_ALREADY_COMPLETE is removed
CURLE_SSL_PEER_CERTIFICATE is added
2001-05-12 09:37:51 +00:00
Daniel Stenberg
c7dbde9f3f Uses the Curl_SSLConnect() according to the new return type 2001-05-12 09:30:42 +00:00
Daniel Stenberg
8fd89d6b93 fixed Curl_SSLConnect() to return CURLcode errors, including the new error
code for peer certificate errors
2001-05-12 09:29:56 +00:00
Daniel Stenberg
632e951e14 changed wording to make it more obvious I don't continuously work on this. 2001-05-11 14:07:58 +00:00
Daniel Stenberg
a3a2d200fa two new FTP file transfer resume test cases added 2001-05-11 11:40:52 +00:00
Daniel Stenberg
4c2ca97d6d removed unused #ifdef'ed section 2001-05-11 11:38:42 +00:00
Daniel Stenberg
11f2464a22 when asking for a resumed FTP transfer, even though the entire file has
already been transfered no longer returns error but instead is OK. The
reasoning behind this is of course that no extra actions need to be taken
and it is as if a transfer had been successfully performed.
2001-05-11 11:38:13 +00:00
Daniel Stenberg
291075b12f checkheader() added to check headers+contents instead of the previous
strnequal() approach that really didn't follow the RFC properly
2001-05-11 07:52:58 +00:00
Daniel Stenberg
282939c6fe another multiple FTP transfer fix 2001-05-11 06:40:04 +00:00
Daniel Stenberg
fef1fc0d32 Ingo Wilken's redirect fixes 2001-05-11 06:10:48 +00:00
Daniel Stenberg
dc6da007ad Ingo Wilken's patch to support multiple spaces after "Location:" 2001-05-10 11:29:47 +00:00
Daniel Stenberg
7be8993f94 When re-using a connection, the path pointers were not setup properly so
that multiple FTP transfers were not possible
2001-05-10 09:31:48 +00:00
Daniel Stenberg
bad4c8967b added ftpsserver.pl stunnel.pm 2001-05-10 07:51:29 +00:00
Daniel Stenberg
4dbac041f1 removed some texts like "starting with version XXX" blabla 2001-05-08 12:39:40 +00:00
Daniel Stenberg
dd344b65f2 made clear that the cookie file format understood is Netscape _and_ Mozilla 2001-05-08 12:30:37 +00:00
Daniel Stenberg
5c25c7bbfa when getting a FTP file with NOBODY, we will no longer return error if
SIZE doesn't work, we just don't output any size info!
2001-05-08 12:10:14 +00:00
Daniel Stenberg
a6d9ccf66b Added stunnel.pem 2001-05-07 21:25:37 +00:00
Daniel Stenberg
89ba66e071 corrected the read-callback typecase since FILE * was replaced with void * 2001-05-07 12:38:28 +00:00
Daniel Stenberg
85631150ce fixed 'storefread' to not make a warning 2001-05-07 11:17:18 +00:00
Daniel Stenberg
3654bd1b56 7.7.3 2001-05-07 11:12:03 +00:00
Daniel Stenberg
237edbc9d8 changed FILE * to void * in all callbacks 2001-05-07 10:51:23 +00:00
Daniel Stenberg
4127903183 Added multithread.c 2001-05-04 09:35:55 +00:00
Daniel Stenberg
2ffc20dc7c example using multiple threads to get URLs 2001-05-04 09:35:43 +00:00
Daniel Stenberg
a2a446cb2f updated contributors list 2001-05-04 08:46:11 +00:00
Daniel Stenberg
9304055df5 'FILE *' changed to 'void *' in all callback functions 2001-05-04 07:47:11 +00:00
Daniel Stenberg
53e0c1b1a6 fixed the link to the OS/2 Patch for OpenSSL 2001-05-04 06:17:01 +00:00
Daniel Stenberg
4efa1e8e4c corrected bad use of the CURLOPT_HTTPPOST header 2001-05-03 14:24:37 +00:00
Daniel Stenberg
ecba113125 Cris changes 2001-05-03 11:09:00 +00:00
Daniel Stenberg
350c536f6c Cris Bailiff's fix to disable chunked transfers on re-used persistent
connections.
2001-05-03 10:53:01 +00:00
Daniel Stenberg
a33eb9881c Cris Bailiff's fix to never attempt to get the body of a 304-reply! 2001-05-03 10:45:39 +00:00
Daniel Stenberg
bbe8aa073e buildconf added, Sterling Hughes added that file 2001-05-03 09:13:53 +00:00
Daniel Stenberg
14521b418e useful script to run after updating from CVS 2001-05-03 09:12:53 +00:00
Daniel Stenberg
73982c65d2 fixed the EXTRA_DIST line 2001-05-03 09:10:07 +00:00
Daniel Stenberg
2eb94acb95 When Content-Length:0 is received, we now bail now and return success
directly after all the headers are received!
2001-04-27 18:03:44 +00:00
Daniel Stenberg
6a80fb3482 bugs, fixes and updates 2001-04-27 14:48:04 +00:00
Daniel Stenberg
26d4c80049 clarified and updated 2001-04-27 14:46:17 +00:00
Daniel Stenberg
3974f30ed4 improved treatment of "Content-Length: 0", which is done by having
maxdownload set to -1 when not used
2001-04-27 08:02:10 +00:00
Daniel Stenberg
44c246dbf2 new 2001-04-27 07:58:26 +00:00
Daniel Stenberg
ef07903a51 Curl_GetFTPResponse() is rewritten to read all incoming data in large
chunks, which makes it a lot faster and will make ftps work better...
2001-04-26 10:29:24 +00:00
Daniel Stenberg
a7dc45997f split curl and libcurl into two strings in the initial display 2001-04-26 08:32:12 +00:00
Daniel Stenberg
583c2e2f09 connection re-using didn't work on non-default ports when not using proxy
until now
2001-04-25 21:24:27 +00:00
Daniel Stenberg
90cce2ae3a added some verbose summary output stuff 2001-04-24 21:47:01 +00:00
Daniel Stenberg
775dc07eb5 no name no test 2001-04-24 21:46:37 +00:00
Daniel Stenberg
a652db18bd include debugmem for memory leak detection 2001-04-24 21:41:29 +00:00
Daniel Stenberg
48f3feed59 SSL based tests 2001-04-24 21:11:34 +00:00
Daniel Stenberg
4ddb3fbbf4 new tests, new server invoke system 2001-04-24 21:09:53 +00:00
Daniel Stenberg
cc872ebc19 fixed 2001-04-24 21:09:27 +00:00
Daniel Stenberg
ba46006896 stunnel and diff are added requirements 2001-04-24 21:09:12 +00:00
Daniel Stenberg
0b7e0638a9 on albert chin's comment I remade the fix to set '\0' instead of 0 since
they're chars
2001-04-24 06:12:07 +00:00
Daniel Stenberg
be49b01952 libcurl.5 replaces LIBCURL as main libcurl overview document 2001-04-23 12:37:27 +00:00
Daniel Stenberg
8d0c1d5495 minor rephrasing 2001-04-23 12:36:02 +00:00
Daniel Stenberg
2769a9ab0b form post, not just form 2001-04-23 11:57:50 +00:00
Daniel Stenberg
8ea5b5bbd0 clarified and extended with an example 2001-04-23 11:55:25 +00:00
Daniel Stenberg
0ce49cb7ed Added comment about where to find the HTML versions of the man pages 2001-04-23 11:42:24 +00:00
Daniel Stenberg
d802dfe86a Added curl_mprintf and curl_strequal in the list of "useful functions" 2001-04-23 11:40:53 +00:00
Daniel Stenberg
aabc0c08a1 curl_printf became curl_mprintf 2001-04-23 08:30:22 +00:00
Daniel Stenberg
476addb9c1 curl_printf is curl_mprintf now 2001-04-23 08:29:56 +00:00
Daniel Stenberg
37d7a198d5 Added zero termination, as the OpenSSL version string was written without
it!
2001-04-23 07:54:12 +00:00
386 changed files with 8781 additions and 4017 deletions

269
CHANGES
View File

@@ -6,6 +6,275 @@
History of Changes History of Changes
Version 7.8
Daniel (7 June 2001)
- SDavila provided a resumed download fix.
Version 7.8-pre4
Daniel (1 June 2001)
- Sterling provided some new PHP examples.
- Changed the CVS hierarchy and the older checkout instruction does no longer
work. We moved the entire source code into a CVS module named 'curl'.
Daniel (31 May 2001)
- CURLOPT_MUTE does not exist anymore. It is still present in the include file
to not cause compiler errors for applications using it, but it isn't used
anywhere in the library.
Version 7.8-pre3
Daniel (31 May 2001)
- Once and for all fixed the _REENTRANT mess for Solaris compiles to present
less warnings.
- Sterling Hughes tirelessly points out and corrects my mistakes...! So,
curl_global_init() now lets the argument flags *SET* what parts to
init. CURL_GLOBAL_DEFAULT makes a nice default, CURL_GLOBAL_ALL inits all
known subsystems and CURL_GLOBAL_NONE inits nothing more than absolutely
necessary. Man page updated accordingly.
- Fixed the strtok.h include file as it wouldn't compile on all platforms!
Daniel (30 May 2001)
- Made libcurl by default act as if CURLOPT_MUTE and CURLOPT_NOPROGRESS were
set TRUE. Set them to FALSE to make libcurl more talkative. The *_MUTE
option is subject for complete removal...
Version 7.8-pre2
Daniel (30 May 2001)
- Cris Bailiff wrote a makefile for building Solaris packages.
- Sterling Hughes brought fixes for 'buildconf' (the build-from-CVS tool) and
we discussed and added a few CURL_GLOBAL_* flags in include/curl.h
- Kjetil Jacobsen privately announced his python interface to libcurl,
available at http://pycurl.sourceforge.net/
Daniel (29 May 2001)
- Sterling Hughes fixed a strtok() problem in libcurl. It is not a thread-
safe function. Now configure checks for a thread-safe version, and
lib/strtok.c offers one for the systems that don't come with one included!
- Mettgut Jamalla correctly pointed out that the -# progress bar was written
to stderr even though --stderr redirection was used. This is now corrected.
- I moved out the list of contributors from the curl.1 man page and made a
separate docs/THANKS file. It makes the list easier to find, and made it
easier for me to make a separate web page with that same information.
I really do want all you guys mentioned in there to feel you get the credit
you deserve.
- lib/easy.c didn't compile properly in the 7.8-pre1 due to a silly mistake
Version 7.8-pre1
Daniel (28 May 2001)
- curl-config now supports '--vernum' that outputs a plain hexadecimal version
of the libcurl version number (using 8 bits for each 3 numbers). Version
7.7.4 appears as 070704
- Wrote man pages for curl_global_init and curl_global_cleanup...
- T. Bharath brought news about the usage of the OpenSSL interface that was
not previously taken into consideration and thus caused libcurl to leak
memory. The only somewhat sane approach to fix this dilemma, is adding two
two new functions curl_global_init() and curl_global_cleanup() that should
be called *ONCE* by the application using libcurl. The init should be done
only at startup, no matter how many threads the application is gonna use,
and the cleanup should be called when the application has finished using
libcurl completely.
*** UPGRADE NOTICE ***
If you write applications using libcurl, you really want to use the two
functions mentioned above !!!
I can't say I think this is a very beautiful solution, but as OpenSSL
insists on making lots of stuff on a "global" scope, we're forced to walk
the path they point us to.
- Moving more test cases into the new file format.
Version 7.7.4-pre3
Daniel (23 May 2001)
- Introduced a new file format for storing test cases, and thus I had to
modify all the perl test scripts and more (I added a new one). I have not
"ported" all the old test cases to the new format yet, but it'll come.
The main advantage of this new format is that all test data for each test
case is stored in a single file. It gives a better overview for each test
case and a lot less files.
- Andr<64>s Garc<72>a brought a fix for the netscape/mozilla cookie file parsing
function, as it turns out it doesn't always store the path!
Daniel (22 May 2001)
- As was reported anonymously, when FAILONERROR was used, the httpcode was
not stored properly and thus wasn't possibly to read after a transfer with
the curl_easy_getinfo() function. This is now corrected.
- Installed and made use of the following tool versions:
autoconf 2.50
libtool 1.4
automake 1.4-p1
I wouldn't recommend any developer to try to generate things with older
versions than these. Building from CVS will probably more or less require
at least these versions.
As a result of this, the configure script grew to more than double its
previous size!
Arkadiusz Miskiewicz helped me by pointing out I had to remove my
acinclude.m4 file before I could get it working!
Daniel (21 May 2001)
- I made ftps:// work. Added test case 400 to the release archive, as the
first ftps:// test case. Requires stunnel.
- Also made the test cases that runs ssl tests not run if libcurl isn't built
with ssl support.
Daniel (19 May 2001)
- Made the configure not add any extra -L LDFLAGS or -I CPPFLAGS unless they
are actually needed. Albert Chin's and Domenico Andreoli's suggestions
helped out.
Version 7.7.4-pre2
Daniel (18 May 2001)
- Nicer configure-check for the OpenSSL headers, which then sets the proper
variable to have curl-config be good. (Albert Chin provided the fix)
- For systems that don't have theiw own 'strlcat()' libcurl provides its own.
It was now renamed to prevent collides with other libs. (After discussions
with Sterling Hughes and the implications this had on PHP builds.)
Daniel (17 May 2001)
- Colm Buckley posted a detailed bug report on (the debianized) 7.7.3, that
turned out to be a problem with the debian-built 7.7.3-package that
contained files from the 7.7.2 release!
- I added the CURLE_ALREADY_COMPLETE again, but with a fake value, just to
make programs that use it, not fail when compiling against this version of
libcurl.
Daniel (14 May 2001)
- Pawel A. Gajda fixed a problem with resumed transfers on re-used persistent
connections.
Version 7.7.4-pre1
Daniel (14 May 2001)
- Jun-ichiro itojun Hagino fixed FTP PORT for IPv6-enabled libcurl.
- Added the first HTTPS test to the test suite in the release archive.
Daniel (12 May 2001)
- Jukka Pihl suggested that if (lib)curl is told to verify the peer's
certificate and the peer can't be verified, it should fail and return a
proper error code. I added a brand new error code named
CURLE_SSL_PEER_CERTIFICATE for this purpose.
Daniel (11 May 2001)
- As was discussed with Frederic Lepied a while ago, I now made libcurl not
return error even though no data was transfered on upload/download resume
when the no transfer is needed. The CURLE_ALREADY_COMPLETE error was removed
from the header file to make any implemenator that uses that to be aware of
the fact that it can't be returned anymore!
- Improved general header-parsing to better allow white spaces and more.
- Rodney Simmons proved the fix I did yesterday was bad and I had to post
another one.
- Ingo Wilken patched away two redirect problems more!
Daniel (10 May 2001)
- Cris Bailiff correctly noted that the space-after-header problem with
Location: is present on several other places in the libcurl sources.
- Ingo Wilken patched away a problem libcurl had when following Location:
headers with an extra space after the colon.
- Rodney Simmons found out that multiple FTP transfers did not treat relative
directories correctly.
Daniel (9 May 2001)
- Getting an FTP file with CURLOPT_NOBODY set (or -I from the command line),
makes curl use the non-standard ftp command "SIZE". If it failed, libcurl
returned error. Starting now, it just don't output the file size instead.
Anonymous bug report.
- stunnel.pm was accidentally left out from the release archive, it is now
added (stunnel is needed to run the https-tests in the test suite)
Daniel (7 May 2001)
- Corrected two minor compiler warnings due to the FILE * to void * conversion
that I missed at two places. J<>rn Hartroth brought me patches. Sander Gates
filed a bug report on this.
Version 7.7.3
Daniel (4 May 2001)
- All callback functions now take 'void *' instead of 'FILE *'. This is made
this way to make it more obvious to people that anything can be passed to
them (by using the apropriate option). After discussions with Sterling
Hughes.
Daniel (3 May 2001)
- Cris Bailiff fixed a chunked transfer encoding problem with persistent
connection that made libcurl fail if the persistent connection used mixed
chunked and non-chunked transfers.
- Cris Bailiff fixed a bad treatment of 304-replies, as they would not be
treated as content-length 0 replies but would cause a "hang" until the
server timed-out and closed the connection.
- Brad Burdick found a minor problem in the docs/examples/Makefile.am
Daniel (27 April 2001)
- Updated the INTERALS document again. It was lagging a bit. I think I made it
more easy to follow now as well.
- Brad Burdick found a problem with persistent connections when curl received
a "Content-Length: 0" header.
- Giuseppe D'Ambrosio was first out to report that TELNET doesn't work in curl
compiled/built on win32. It seems to work for unixes though!
- Dave Hamilton reported weird problems with CURL/PHP that I really can't
explain at the moment. I'm hoping on some help from the PHP crew.
Daniel (26 April 2001)
- I rewrote the FTP command response function. I had to do it to make ftps
work, as the OpenSSL read()-function didn't work the same way the normal
unix read() does, but it was also a huge performance boost. Previously the
function read one byte at a time, now it reads very large chunks, and it
makes a notable speed difference.
Daniel (25 April 2001)
- Connection re-use when not using a proxy didn't work properly for
non-default port numbers.
Daniel (24 April 2001)
- I've noticed that FTPS doesn't work. We attempt to use ssl even for the
data transfer, which causes the transfer to 'hang'... We need to fix this.
- Improved the test suite to use 'stunnel' to do HTTPS and FTPS testing on
the alredy written perl servers easily.
Daniel (23 April 2001)
- The OpenSSL version string recently modified didn't zero terminate one
of the generated strings properly, which could lead to a crash or simply
weird version string output!
Version 7.7.2 Version 7.7.2
Daniel (22 April 2001) Daniel (22 April 2001)

View File

@@ -10,24 +10,28 @@ This file is only present in the CVS - never in release archives. It contains
information about other files and things that the CVS repository keeps in its information about other files and things that the CVS repository keeps in its
inner sanctum. inner sanctum.
Use autoconf 2.50 and no earlier. Also, try having automake 1.4 and libtool
1.4 at least.
You will need perl to generate the src/hugehelp.c file. The file
src/hugehelp.c.cvs is a one-shot file that you can rename to src/hugehelp.c if
you really can't generate the true file yourself!
CHANGES.0 contains ancient changes. CHANGES.0 contains ancient changes.
memanalyze.pl is for analyzing the output generated by curl if -DMALLOCDEBUG 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
Makefile.dist is included as the root Makefile in distribution archives Makefile.dist is included as the root Makefile in distribution archives
perl/contrib/ is a subdirectory with various perl scripts perl/contrib/ is a subdirectory with various perl scripts
java is a subdirectory with the Java interface to libcurl java/ is a subdirectory with the Java interface to libcurl
To build after having extracted everything from CVS, do this: To build after having extracted everything from CVS, do this:
automake ./buildconf
aclocal
autoheader
autoconf
./configure ./configure
make make

View File

@@ -6,7 +6,8 @@ AUTOMAKE_OPTIONS = foreign no-dependencies
EXTRA_DIST = \ EXTRA_DIST = \
CHANGES LEGAL maketgz MITX.txt MPL-1.1.txt \ CHANGES LEGAL maketgz MITX.txt MPL-1.1.txt \
config-win32.h reconf packages/README Makefile.dist config-win32.h reconf packages/README Makefile.dist \
curl-config.in libtool
bin_SCRIPTS = curl-config bin_SCRIPTS = curl-config
@@ -47,3 +48,18 @@ rpm:
rpm -ba --clean --rmsource $$RPM_TOPDIR/SPECS/$(RPMDIST).spec ; \ rpm -ba --clean --rmsource $$RPM_TOPDIR/SPECS/$(RPMDIST).spec ; \
mv $$RPM_TOPDIR/RPMS/i386/$(RPMDIST)-*.rpm . ; \ mv $$RPM_TOPDIR/RPMS/i386/$(RPMDIST)-*.rpm . ; \
mv $$RPM_TOPDIR/SRPMS/$(RPMDIST)-*.src.rpm . mv $$RPM_TOPDIR/SRPMS/$(RPMDIST)-*.src.rpm .
#
# Build a Solaris pkkgadd format file
# run 'make pkgadd' once you've done './configure' and 'make' to make a Solaris pkgadd format
# file (which ends up back in this directory).
# The pkgadd file is in 'pkgtrans' format, so to install on Solaris, do
# pkgadd -d ./HAXXcurl-*
#
# gak - libtool requires an absoulte directory, hence the pwd below...
pkgadd:
umask 022 ; \
make install DESTDIR=`/bin/pwd`/packages/Solaris/root ; \
cat LEGAL MITX.txt MPL-1.1.txt > $(srcdir)/packages/Solaris/copyright ; \
cd $(srcdir)/packages/Solaris && $(MAKE) package

16
README
View File

@@ -12,7 +12,7 @@ README
document. document.
libcurl is a library that Curl is using to do its job. It is readily libcurl is a library that Curl is using to do its job. It is readily
available to be used by your software. Read the LIBCURL document to available to be used by your software. Read the libcurl.5 man page to
find out how! find out 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.
@@ -30,19 +30,17 @@ README
To download the very latest source off the CVS server do this: To download the very latest source off the CVS server do this:
cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl login cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl login
(just press enter when asked for password) (just press enter when asked for password)
cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl co . cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl co curl
(now, you'll get all the latest sources downloaded into your current (you'll get a directory named curl created, filled with the source code)
directory. Note that this does NOT create a directory named curl or
anything)
cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl logout cvs -d :pserver:anonymous@cvs.curl.sourceforge.net:/cvsroot/curl logout
(you're off the hook!) (you're off the hook!)
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

View File

@@ -51,3 +51,6 @@
/* Define this to your Entropy Gathering Daemon socket pathname */ /* Define this to your Entropy Gathering Daemon socket pathname */
#undef EGD_SOCKET #undef EGD_SOCKET
/* Define if you have a working OpenSSL installation */
#undef OPENSSL_ENABLED

View File

@@ -1,92 +0,0 @@
#serial 19
dnl By default, many hosts won't let programs access large files;
dnl one must use special compiler options to get large-file access to work.
dnl For more details about this brain damage please see:
dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html
dnl Written by Paul Eggert <eggert@twinsun.com>.
dnl Internal subroutine of AC_SYS_LARGEFILE.
dnl AC_SYS_LARGEFILE_TEST_INCLUDES
AC_DEFUN(AC_SYS_LARGEFILE_TEST_INCLUDES,
[[#include <sys/types.h>
/* Check that off_t can represent 2**63 - 1 correctly.
We can't simply "#define LARGE_OFF_T 9223372036854775807",
since some C++ compilers masquerading as C compilers
incorrectly reject 9223372036854775807. */
# define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
&& LARGE_OFF_T % 2147483647 == 1)
? 1 : -1];
]])
dnl Internal subroutine of AC_SYS_LARGEFILE.
dnl AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE, CACHE-VAR, COMMENT, INCLUDES, FUNCTION-BODY)
AC_DEFUN(AC_SYS_LARGEFILE_MACRO_VALUE,
[AC_CACHE_CHECK([for $1 value needed for large files], $3,
[$3=no
AC_TRY_COMPILE([$5],
[$6],
,
[AC_TRY_COMPILE([#define $1 $2]
[$5]
,
[$6],
[$3=$2])])])
if test "[$]$3" != no; then
AC_DEFINE_UNQUOTED([$1], [$]$3, [$4])
fi])
AC_DEFUN(AC_SYS_LARGEFILE,
[AC_REQUIRE([AC_PROG_CC])
AC_ARG_ENABLE(largefile,
[ --disable-largefile omit support for large files])
if test "$enable_largefile" != no; then
AC_CACHE_CHECK([for special C compiler options needed for large files],
ac_cv_sys_largefile_CC,
[ac_cv_sys_largefile_CC=no
if test "$GCC" != yes; then
# IRIX 6.2 and later do not support large files by default,
# so use the C compiler's -n32 option if that helps.
AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES, , ,
[ac_save_CC="$CC"
CC="$CC -n32"
AC_TRY_COMPILE(AC_SYS_LARGEFILE_TEST_INCLUDES, ,
ac_cv_sys_largefile_CC=' -n32')
CC="$ac_save_CC"])
fi])
if test "$ac_cv_sys_largefile_CC" != no; then
CC="$CC$ac_cv_sys_largefile_CC"
fi
AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64,
ac_cv_sys_file_offset_bits,
[Number of bits in a file offset, on hosts where this is settable.],
AC_SYS_LARGEFILE_TEST_INCLUDES)
AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1,
ac_cv_sys_large_files,
[Define for large files, on AIX-style hosts.],
AC_SYS_LARGEFILE_TEST_INCLUDES)
fi
])
AC_DEFUN(AC_FUNC_FSEEKO,
[AC_SYS_LARGEFILE_MACRO_VALUE(_LARGEFILE_SOURCE, 1,
ac_cv_sys_largefile_source,
[Define to make fseeko visible on some hosts (e.g. glibc 2.2).],
[#include <stdio.h>], [return !fseeko;])
# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
# in glibc 2.1.3, but that breaks too many other things.
# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
AC_CACHE_CHECK([for fseeko], ac_cv_func_fseeko,
[ac_cv_func_fseeko=no
AC_TRY_LINK([#include <stdio.h>],
[return fseeko && fseeko (stdin, 0, 0);],
[ac_cv_func_fseeko=yes])])
if test $ac_cv_func_fseeko != no; then
AC_DEFINE(HAVE_FSEEKO, 1,
[Define if fseeko (and presumably ftello) exists and is declared.])
fi])

13
buildconf Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/sh
die(){
echo "$@"
exit
}
MAKEFILES=`find . -name Makefile.am | sed 's/\.am$//'`
automake $MAKEFILES || die "The command 'automake $MAKEFILES' failed"
aclocal || die "The command 'aclocal' failed"
autoheader || die "The command 'autoheader' failed"
autoconf || die "The command 'autoconf' failed"

654
config.guess vendored
View File

@@ -1,8 +1,10 @@
#! /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 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
#
timestamp='2001-04-20'
# 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
# the Free Software Foundation; either version 2 of the License, or # the Free Software Foundation; either version 2 of the License, or
@@ -30,26 +32,86 @@
# exits with 0. Otherwise, it exits with 1. # exits with 0. Otherwise, it exits with 1.
# #
# The plan is that this can be called by configure scripts if you # The plan is that this can be called by configure scripts if you
# don't specify an explicit system type (host/target name). # don't specify an explicit build system type.
#
# Only a few systems have been added to this list; please add others
# (but try to keep the structure clean).
#
# Use $HOST_CC if defined. $CC may point to a cross-compiler me=`echo "$0" | sed -e 's,.*/,,'`
if test x"$CC_FOR_BUILD" = x; then
if test x"$HOST_CC" != x; then usage="\
CC_FOR_BUILD="$HOST_CC" Usage: $0 [OPTION]
else
if test x"$CC" != x; then Output the configuration name of the system \`$me' is run on.
CC_FOR_BUILD="$CC"
else Operation modes:
CC_FOR_BUILD=cc -h, --help print this help, then exit
fi -t, --time-stamp print date of last modification, then exit
fi -v, --version print version number, then exit
Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
help="
Try \`$me --help' for more information."
# Parse command line
while test $# -gt 0 ; do
case $1 in
--time-stamp | --time* | -t )
echo "$timestamp" ; exit 0 ;;
--version | -v )
echo "$version" ; exit 0 ;;
--help | --h* | -h )
echo "$usage"; exit 0 ;;
-- ) # Stop option processing
shift; break ;;
- ) # Use stdin as input.
break ;;
-* )
echo "$me: invalid option $1$help" >&2
exit 1 ;;
* )
break ;;
esac
done
if test $# != 0; then
echo "$me: too many arguments$help" >&2
exit 1
fi fi
dummy=dummy-$$
trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
# CC_FOR_BUILD -- compiler used by this script.
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
# use `HOST_CC' if defined, but it is deprecated.
case $CC_FOR_BUILD,$HOST_CC,$CC in
,,) echo "int dummy(){}" > $dummy.c
for c in cc gcc c89 ; do
($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1
if test $? = 0 ; then
CC_FOR_BUILD="$c"; break
fi
done
rm -f $dummy.c $dummy.o $dummy.rel
if test x"$CC_FOR_BUILD" = x ; then
CC_FOR_BUILD=no_compiler_found
fi
;;
,,*) CC_FOR_BUILD=$CC ;;
,*,*) CC_FOR_BUILD=$HOST_CC ;;
esac
# 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 8/24/94.) # (ghazi@noc.rutgers.edu 8/24/94.)
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
@@ -58,12 +120,9 @@ fi
UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
dummy=dummy-$$
trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
# Note: order is significant - the case branches are not exclusive. # Note: order is significant - the case branches are not exclusive.
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
@@ -77,7 +136,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# object file format. # object file format.
# Determine the machine/vendor (is the vendor relevant). # Determine the machine/vendor (is the vendor relevant).
case "${UNAME_MACHINE}" in case "${UNAME_MACHINE}" in
amiga) machine=m68k-cbm ;; amiga) machine=m68k-unknown ;;
arm32) machine=arm-unknown ;; arm32) machine=arm-unknown ;;
atari*) machine=m68k-atari ;; atari*) machine=m68k-atari ;;
sun3*) machine=m68k-sun ;; sun3*) machine=m68k-sun ;;
@@ -87,16 +146,24 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
ibmrt|romp-ibm) machine=romp-ibm ;; ibmrt|romp-ibm) machine=romp-ibm ;;
*) machine=${UNAME_MACHINE}-unknown ;; *) machine=${UNAME_MACHINE}-unknown ;;
esac esac
# The Operating System including object format. # The Operating System including object format, if it has switched
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ # to ELF recently, or will in the future.
| grep __ELF__ >/dev/null case "${UNAME_MACHINE}" in
then i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
# Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
# Return netbsd for either. FIX? | grep __ELF__ >/dev/null
os=netbsd then
else # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
os=netbsdelf # Return netbsd for either. FIX?
fi os=netbsd
else
os=netbsdelf
fi
;;
*)
os=netbsd
;;
esac
# The OS release # The OS release
release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
@@ -173,7 +240,7 @@ EOF
echo alpha-dec-winnt3.5 echo alpha-dec-winnt3.5
exit 0 ;; exit 0 ;;
Amiga*:UNIX_System_V:4.0:*) Amiga*:UNIX_System_V:4.0:*)
echo m68k-cbm-sysv4 echo m68k-unknown-sysv4
exit 0;; exit 0;;
amiga:OpenBSD:*:*) amiga:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE} echo m68k-unknown-openbsd${UNAME_RELEASE}
@@ -205,7 +272,7 @@ EOF
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE} echo arm-acorn-riscix${UNAME_RELEASE}
exit 0;; exit 0;;
SR2?01:HI-UX/MPP:*:*) SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
echo hppa1.1-hitachi-hiuxmpp echo hppa1.1-hitachi-hiuxmpp
exit 0;; exit 0;;
Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
@@ -341,10 +408,13 @@ EOF
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy \ $CC_FOR_BUILD $dummy.c -o $dummy \
&& ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
&& rm $dummy.c $dummy && exit 0 && rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy
echo mips-mips-riscos${UNAME_RELEASE} echo mips-mips-riscos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
Motorola:PowerMAX_OS:*:*)
echo powerpc-motorola-powermax
exit 0 ;;
Night_Hawk:Power_UNIX:*:*) Night_Hawk:Power_UNIX:*:*)
echo powerpc-harris-powerunix echo powerpc-harris-powerunix
exit 0 ;; exit 0 ;;
@@ -392,9 +462,17 @@ EOF
????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
i?86:AIX:*:*) i*86:AIX:*:*)
echo i386-ibm-aix echo i386-ibm-aix
exit 0 ;; exit 0 ;;
ia64:AIX:*:*)
if [ -x /usr/bin/oslevel ] ; then
IBM_REV=`/usr/bin/oslevel`
else
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi
echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
exit 0 ;;
*:AIX:2:3) *:AIX:2:3)
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
sed 's/^ //' << EOF >$dummy.c sed 's/^ //' << EOF >$dummy.c
@@ -408,7 +486,7 @@ EOF
exit(0); exit(0);
} }
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy
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
@@ -417,9 +495,9 @@ EOF
echo rs6000-ibm-aix3.2 echo rs6000-ibm-aix3.2
fi fi
exit 0 ;; exit 0 ;;
*:AIX:*:4) *: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 | head -1 | awk '{ print $1 }'`
if /usr/sbin/lsattr -EHl ${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
IBM_ARCH=powerpc IBM_ARCH=powerpc
@@ -427,7 +505,7 @@ EOF
if [ -x /usr/bin/oslevel ] ; then if [ -x /usr/bin/oslevel ] ; then
IBM_REV=`/usr/bin/oslevel` IBM_REV=`/usr/bin/oslevel`
else else
IBM_REV=4.${UNAME_RELEASE} IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi fi
echo ${IBM_ARCH}-ibm-aix${IBM_REV} echo ${IBM_ARCH}-ibm-aix${IBM_REV}
exit 0 ;; exit 0 ;;
@@ -453,10 +531,28 @@ EOF
echo m68k-hp-bsd4.4 echo m68k-hp-bsd4.4
exit 0 ;; exit 0 ;;
9000/[34678]??:HP-UX:*:*) 9000/[34678]??:HP-UX:*:*)
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
case "${UNAME_MACHINE}" in case "${UNAME_MACHINE}" in
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
11.[0-9][0-9])
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`
case "${sc_cpu_version}" in
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
532) # CPU_PA_RISC2_0
case "${sc_kernel_bits}" in
32) HP_ARCH="hppa2.0n" ;;
64) HP_ARCH="hppa2.0w" ;;
esac ;;
esac
fi ;;
esac
if [ "${HP_ARCH}" = "" ]; then
sed 's/^ //' << EOF >$dummy.c sed 's/^ //' << EOF >$dummy.c
#define _HPUX_SOURCE #define _HPUX_SOURCE
@@ -491,11 +587,16 @@ EOF
} }
EOF EOF
(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
rm -f $dummy.c $dummy rm -f $dummy.c $dummy
fi ;;
esac esac
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
echo ${HP_ARCH}-hp-hpux${HPUX_REV} echo ${HP_ARCH}-hp-hpux${HPUX_REV}
exit 0 ;; exit 0 ;;
ia64:HP-UX:*:*)
HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
echo ia64-hp-hpux${HPUX_REV}
exit 0 ;;
3050*:HI-UX:*:*) 3050*:HI-UX:*:*)
sed 's/^ //' << EOF >$dummy.c sed 's/^ //' << EOF >$dummy.c
#include <unistd.h> #include <unistd.h>
@@ -522,7 +623,7 @@ EOF
exit (0); exit (0);
} }
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy
echo unknown-hitachi-hiuxwe2 echo unknown-hitachi-hiuxwe2
exit 0 ;; exit 0 ;;
@@ -541,7 +642,7 @@ EOF
hp8??:OSF1:*:*) hp8??:OSF1:*:*)
echo hppa1.0-hp-osf echo hppa1.0-hp-osf
exit 0 ;; exit 0 ;;
i?86:OSF1:*:*) i*86:OSF1:*:*)
if [ -x /usr/sbin/sysversion ] ; then if [ -x /usr/sbin/sysversion ] ; then
echo ${UNAME_MACHINE}-unknown-osf1mk echo ${UNAME_MACHINE}-unknown-osf1mk
else else
@@ -586,27 +687,28 @@ EOF
CRAY*TS:*:*:*) CRAY*TS:*:*:*)
echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;; exit 0 ;;
CRAY*T3E:*:*:*) CRAY*T3D:*:*:*)
echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;; exit 0 ;;
CRAY*T3E:*:*:*)
echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit 0 ;;
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:*:*:*) CRAY-2:*:*:*)
echo cray2-cray-unicos echo cray2-cray-unicos
exit 0 ;; exit 0 ;;
F300:UNIX_System_V:*:*) F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
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 "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit 0 ;; exit 0 ;;
F301:UNIX_System_V:*:*)
echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
exit 0 ;;
hp300:OpenBSD:*:*) hp300:OpenBSD:*:*)
echo m68k-unknown-openbsd${UNAME_RELEASE} echo m68k-unknown-openbsd${UNAME_RELEASE}
exit 0 ;; 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 ;;
sparc*:BSD/OS:*:*) sparc*:BSD/OS:*:*)
@@ -627,6 +729,9 @@ EOF
i*:MINGW*:*) i*:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32 echo ${UNAME_MACHINE}-pc-mingw32
exit 0 ;; exit 0 ;;
i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32
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
@@ -645,58 +750,41 @@ EOF
*:GNU:*:*) *:GNU:*:*)
echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit 0 ;; exit 0 ;;
*:Linux:*:*) i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix
# The BFD linker knows what the default object file format is, so exit 0 ;;
# first see if it will tell us. cd to the root directory to prevent arm*:Linux:*:*)
# problems with other programs or directories called `ld' in the path. echo ${UNAME_MACHINE}-unknown-linux-gnu
ld_help_string=`cd /; ld --help 2>&1` exit 0 ;;
ld_supported_emulations=`echo $ld_help_string \ ia64:Linux:*:*)
| sed -ne '/supported emulations:/!d echo ${UNAME_MACHINE}-unknown-linux
s/[ ][ ]*/ /g exit 0 ;;
s/.*supported emulations: *// m68*:Linux:*:*)
s/ .*// echo ${UNAME_MACHINE}-unknown-linux-gnu
p'` exit 0 ;;
case "$ld_supported_emulations" in mips:Linux:*:*)
*ia64) cat >$dummy.c <<EOF
echo "${UNAME_MACHINE}-unknown-linux" #ifdef __cplusplus
exit 0 #include <stdio.h> /* for printf() prototype */
;; int main (int argc, char *argv[]) {
i?86linux) #else
echo "${UNAME_MACHINE}-pc-linux-gnuaout" int main (argc, argv) int argc; char *argv[]; {
exit 0 #endif
;; #ifdef __MIPSEB__
elf_i?86) printf ("%s-unknown-linux-gnu\n", argv[1]);
echo "${UNAME_MACHINE}-pc-linux" #endif
exit 0 #ifdef __MIPSEL__
;; printf ("%sel-unknown-linux-gnu\n", argv[1]);
i?86coff) #endif
echo "${UNAME_MACHINE}-pc-linux-gnucoff" return 0;
exit 0 }
;; EOF
sparclinux) $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
echo "${UNAME_MACHINE}-unknown-linux-gnuaout" rm -f $dummy.c $dummy
exit 0 ;;
;; ppc:Linux:*:*)
armlinux) # Determine Lib Version
echo "${UNAME_MACHINE}-unknown-linux-gnuaout" cat >$dummy.c <<EOF
exit 0
;;
elf32arm*)
echo "${UNAME_MACHINE}-unknown-linux-gnuoldld"
exit 0
;;
armelf_linux*)
echo "${UNAME_MACHINE}-unknown-linux-gnu"
exit 0
;;
m68klinux)
echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
exit 0
;;
elf32ppc | elf32ppclinux)
# Determine Lib Version
cat >$dummy.c <<EOF
#include <features.h> #include <features.h>
#if defined(__GLIBC__) #if defined(__GLIBC__)
extern char __libc_version[]; extern char __libc_version[];
@@ -709,123 +797,127 @@ main(argc, argv)
#if defined(__GLIBC__) #if defined(__GLIBC__)
printf("%s %s\n", __libc_version, __libc_release); printf("%s %s\n", __libc_version, __libc_release);
#else #else
printf("unkown\n"); printf("unknown\n");
#endif #endif
return 0; return 0;
} }
EOF EOF
LIBC="" LIBC=""
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
if test "$?" = 0 ; then
./$dummy | grep 1\.99 > /dev/null
if test "$?" = 0 ; then LIBC="libc1" ; fi
fi
rm -f $dummy.c $dummy
echo powerpc-unknown-linux-gnu${LIBC}
exit 0 ;;
alpha:Linux:*:*)
cat <<EOF >$dummy.s
.data
\$Lformat:
.byte 37,100,45,37,120,10,0 # "%d-%x\n"
.text
.globl main
.align 4
.ent main
main:
.frame \$30,16,\$26,0
ldgp \$29,0(\$27)
.prologue 1
.long 0x47e03d80 # implver \$0
lda \$2,-1
.long 0x47e20c21 # amask \$2,\$1
lda \$16,\$Lformat
mov \$0,\$17
not \$1,\$18
jsr \$26,printf
ldgp \$29,0(\$26)
mov 0,\$16
jsr \$26,exit
.end main
EOF
LIBC=""
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
if test "$?" = 0 ; then
case `./$dummy` in
0-0) UNAME_MACHINE="alpha" ;;
1-0) UNAME_MACHINE="alphaev5" ;;
1-1) UNAME_MACHINE="alphaev56" ;;
1-101) UNAME_MACHINE="alphapca56" ;;
2-303) UNAME_MACHINE="alphaev6" ;;
2-307) UNAME_MACHINE="alphaev67" ;;
esac
objdump --private-headers $dummy | \
grep ld.so.1 > /dev/null
if test "$?" = 0 ; then if test "$?" = 0 ; then
./$dummy | grep 1\.99 > /dev/null LIBC="libc1"
if test "$?" = 0 ; then
LIBC="libc1"
fi
fi fi
rm -f $dummy.c $dummy fi
echo powerpc-unknown-linux-gnu${LIBC} rm -f $dummy.s $dummy
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
exit 0 ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
PA7*) echo hppa1.1-unknown-linux-gnu ;;
PA8*) echo hppa2.0-unknown-linux-gnu ;;
*) echo hppa-unknown-linux-gnu ;;
esac
exit 0 ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
echo hppa64-unknown-linux-gnu
exit 0 ;;
s390:Linux:*:* | s390x:Linux:*:*)
echo ${UNAME_MACHINE}-ibm-linux
exit 0 ;;
sh*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;;
sparc:Linux:*:* | sparc64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit 0 ;;
x86_64:Linux:*:*)
echo x86_64-unknown-linux-gnu
exit 0 ;;
i*86:Linux:*:*)
# 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
# problems with other programs or directories called `ld' in the path.
ld_supported_emulations=`cd /; ld --help 2>&1 \
| sed -ne '/supported emulations:/!d
s/[ ][ ]*/ /g
s/.*supported emulations: *//
s/ .*//
p'`
case "$ld_supported_emulations" in
i*86linux)
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
exit 0
;;
elf_i*86)
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
;;
i*86coff)
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
exit 0 exit 0
;; ;;
esac esac
# Either a pre-BFD a.out linker (linux-gnuoldld)
if test "${UNAME_MACHINE}" = "alpha" ; then # or one that does not give us useful --help.
cat <<EOF >$dummy.s # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
.data # If ld does not provide *any* "supported emulations:"
\$Lformat: # that means it is gnuoldld.
.byte 37,100,45,37,120,10,0 # "%d-%x\n" test -z "$ld_supported_emulations" && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
case "${UNAME_MACHINE}" in
.text i*86)
.globl main VENDOR=pc;
.align 4 ;;
.ent main *)
main: VENDOR=unknown;
.frame \$30,16,\$26,0 ;;
ldgp \$29,0(\$27) esac
.prologue 1 # Determine whether the default compiler is a.out or elf
.long 0x47e03d80 # implver \$0 cat >$dummy.c <<EOF
lda \$2,-1
.long 0x47e20c21 # amask \$2,\$1
lda \$16,\$Lformat
mov \$0,\$17
not \$1,\$18
jsr \$26,printf
ldgp \$29,0(\$26)
mov 0,\$16
jsr \$26,exit
.end main
EOF
LIBC=""
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
if test "$?" = 0 ; then
case `./$dummy` in
0-0)
UNAME_MACHINE="alpha"
;;
1-0)
UNAME_MACHINE="alphaev5"
;;
1-1)
UNAME_MACHINE="alphaev56"
;;
1-101)
UNAME_MACHINE="alphapca56"
;;
2-303)
UNAME_MACHINE="alphaev6"
;;
2-307)
UNAME_MACHINE="alphaev67"
;;
esac
objdump --private-headers $dummy | \
grep ld.so.1 > /dev/null
if test "$?" = 0 ; then
LIBC="libc1"
fi
fi
rm -f $dummy.s $dummy
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
elif test "${UNAME_MACHINE}" = "mips" ; then
cat >$dummy.c <<EOF
#ifdef __cplusplus
#include <stdio.h> /* for printf() prototype */
int main (int argc, char *argv[]) {
#else
int main (argc, argv) int argc; char *argv[]; {
#endif
#ifdef __MIPSEB__
printf ("%s-unknown-linux-gnu\n", argv[1]);
#endif
#ifdef __MIPSEL__
printf ("%sel-unknown-linux-gnu\n", argv[1]);
#endif
return 0;
}
EOF
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy
elif test "${UNAME_MACHINE}" = "s390"; then
echo s390-ibm-linux && exit 0
else
# Either a pre-BFD a.out linker (linux-gnuoldld)
# or one that does not give us useful --help.
# GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
# If ld does not provide *any* "supported emulations:"
# that means it is gnuoldld.
echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
case "${UNAME_MACHINE}" in
i?86)
VENDOR=pc;
;;
*)
VENDOR=unknown;
;;
esac
# Determine whether the default compiler is a.out or elf
cat >$dummy.c <<EOF
#include <features.h> #include <features.h>
#ifdef __cplusplus #ifdef __cplusplus
#include <stdio.h> /* for printf() prototype */ #include <stdio.h> /* for printf() prototype */
@@ -849,15 +941,16 @@ EOF
return 0; return 0;
} }
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy
fi ;; test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
;;
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
# are messed up and put the nodename in both sysname and nodename. # are messed up and put the nodename in both sysname and nodename.
i?86:DYNIX/ptx:4*:*) i*86:DYNIX/ptx:4*:*)
echo i386-sequent-sysv4 echo i386-sequent-sysv4
exit 0 ;; exit 0 ;;
i?86:UNIX_SV:4.2MP:2.*) i*86:UNIX_SV:4.2MP:2.*)
# Unixware is an offshoot of SVR4, but it has its own version # Unixware is an offshoot of SVR4, but it has its own version
# number series starting with 2... # number series starting with 2...
# I am not positive that other SVR4 systems won't match this, # I am not positive that other SVR4 systems won't match this,
@@ -865,7 +958,7 @@ EOF
# Use sysv4.2uw... so that sysv4* matches it. # Use sysv4.2uw... so that sysv4* matches it.
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
exit 0 ;; exit 0 ;;
i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
@@ -873,7 +966,7 @@ EOF
echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
fi fi
exit 0 ;; exit 0 ;;
i?86:*:5:7*) i*86:*:5:7*)
# Fixed at (any) Pentium or better # Fixed at (any) Pentium or better
UNAME_MACHINE=i586 UNAME_MACHINE=i586
if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
@@ -882,7 +975,7 @@ EOF
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
fi fi
exit 0 ;; exit 0 ;;
i?86:*:3.2:*) i*86:*:3.2:*)
if test -f /usr/options/cb.name; then if test -f /usr/options/cb.name; then
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
@@ -900,7 +993,7 @@ EOF
echo ${UNAME_MACHINE}-pc-sysv32 echo ${UNAME_MACHINE}-pc-sysv32
fi fi
exit 0 ;; exit 0 ;;
i?86:*DOS:*:*) i*86:*DOS:*:*)
echo ${UNAME_MACHINE}-pc-msdosdjgpp echo ${UNAME_MACHINE}-pc-msdosdjgpp
exit 0 ;; exit 0 ;;
pc:*:*:*) pc:*:*:*)
@@ -928,7 +1021,7 @@ EOF
exit 0 ;; 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]??,*:*: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 | 4850:*: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`
@@ -939,21 +1032,24 @@ EOF
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
&& echo i486-ncr-sysv4 && exit 0 ;; && echo i486-ncr-sysv4 && exit 0 ;;
m68*:LynxOS:2.*:*) m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
echo m68k-unknown-lynxos${UNAME_RELEASE} echo m68k-unknown-lynxos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
mc68030:UNIX_System_V:4.*:*) mc68030:UNIX_System_V:4.*:*)
echo m68k-atari-sysv4 echo m68k-atari-sysv4
exit 0 ;; exit 0 ;;
i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
echo i386-unknown-lynxos${UNAME_RELEASE} echo i386-unknown-lynxos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
TSUNAMI:LynxOS:2.*:*) TSUNAMI:LynxOS:2.*:*)
echo sparc-unknown-lynxos${UNAME_RELEASE} echo sparc-unknown-lynxos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) rs6000:LynxOS:2.*:*)
echo rs6000-unknown-lynxos${UNAME_RELEASE} echo rs6000-unknown-lynxos${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
echo powerpc-unknown-lynxos${UNAME_RELEASE}
exit 0 ;;
SM[BE]S:UNIX_SV:*:*) SM[BE]S:UNIX_SV:*:*)
echo mips-dde-sysv${UNAME_RELEASE} echo mips-dde-sysv${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
@@ -987,7 +1083,7 @@ EOF
mc68*:A/UX:*:*) mc68*:A/UX:*:*)
echo m68k-apple-aux${UNAME_RELEASE} echo m68k-apple-aux${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
news*:NEWS-OS:*:6*) news*:NEWS-OS:6*:*)
echo mips-sony-newsos6 echo mips-sony-newsos6
exit 0 ;; exit 0 ;;
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
@@ -1030,15 +1126,52 @@ EOF
*:QNX:*:4*) *:QNX:*:4*)
echo i386-pc-qnx echo i386-pc-qnx
exit 0 ;; exit 0 ;;
NSR-W:NONSTOP_KERNEL:*:*) NSR-[KW]:NONSTOP_KERNEL:*:*)
echo nsr-tandem-nsk${UNAME_RELEASE} echo nsr-tandem-nsk${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:NonStop-UX:*:*)
echo mips-compaq-nonstopux
exit 0 ;;
BS2000:POSIX*:*:*) BS2000:POSIX*:*:*)
echo bs2000-siemens-sysv echo bs2000-siemens-sysv
exit 0 ;; exit 0 ;;
DS/*:UNIX_System_V:*:*) DS/*:UNIX_System_V:*:*)
echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
exit 0 ;; exit 0 ;;
*:Plan9:*:*)
# "uname -m" is not consistent, so use $cputype instead. 386
# is converted to i386 for consistency with other x86
# operating systems.
if test "$cputype" = "386"; then
UNAME_MACHINE=i386
else
UNAME_MACHINE="$cputype"
fi
echo ${UNAME_MACHINE}-unknown-plan9
exit 0 ;;
i*86:OS/2:*:*)
# If we were able to find `uname', then EMX Unix compatibility
# is probably installed.
echo ${UNAME_MACHINE}-pc-os2-emx
exit 0 ;;
*:TOPS-10:*:*)
echo pdp10-unknown-tops10
exit 0 ;;
*:TENEX:*:*)
echo pdp10-unknown-tenex
exit 0 ;;
KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
echo pdp10-dec-tops20
exit 0 ;;
XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
echo pdp10-xkl-tops20
exit 0 ;;
*:TOPS-20:*:*)
echo pdp10-unknown-tops20
exit 0 ;;
*:ITS:*:*)
echo pdp10-unknown-its
exit 0 ;;
esac esac
#echo '(No uname command or uname output not recognized.)' 1>&2 #echo '(No uname command or uname output not recognized.)' 1>&2
@@ -1130,11 +1263,24 @@ main ()
#endif #endif
#if defined (vax) #if defined (vax)
#if !defined (ultrix) # if !defined (ultrix)
printf ("vax-dec-bsd\n"); exit (0); # include <sys/param.h>
#else # if defined (BSD)
printf ("vax-dec-ultrix\n"); exit (0); # if BSD == 43
#endif printf ("vax-dec-bsd4.3\n"); exit (0);
# else
# if BSD == 199006
printf ("vax-dec-bsd4.3reno\n"); exit (0);
# else
printf ("vax-dec-bsd\n"); exit (0);
# endif
# endif
# else
printf ("vax-dec-bsd\n"); exit (0);
# endif
# else
printf ("vax-dec-ultrix\n"); exit (0);
# endif
#endif #endif
#if defined (alliant) && defined (i860) #if defined (alliant) && defined (i860)
@@ -1145,7 +1291,7 @@ main ()
} }
EOF EOF
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0 $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
rm -f $dummy.c $dummy rm -f $dummy.c $dummy
# Apollos put the system type in the environment. # Apollos put the system type in the environment.
@@ -1178,6 +1324,48 @@ then
esac esac
fi fi
#echo '(Unable to guess system type)' 1>&2 cat >&2 <<EOF
$0: unable to guess system type
This script, last modified $timestamp, has failed to recognize
the operating system you are using. It is advised that you
download the most up to date version of the config scripts from
ftp://ftp.gnu.org/pub/gnu/config/
If the version you run ($0) is already up to date, please
send the following data and any information you think might be
pertinent to <config-patches@gnu.org> in order to provide the needed
information to handle your system.
config.guess timestamp = $timestamp
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`
/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
hostinfo = `(hostinfo) 2>/dev/null`
/bin/universe = `(/bin/universe) 2>/dev/null`
/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
/bin/arch = `(/bin/arch) 2>/dev/null`
/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
UNAME_MACHINE = ${UNAME_MACHINE}
UNAME_RELEASE = ${UNAME_RELEASE}
UNAME_SYSTEM = ${UNAME_SYSTEM}
UNAME_VERSION = ${UNAME_VERSION}
EOF
exit 1 exit 1
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "timestamp='"
# time-stamp-format: "%:y-%02m-%02d"
# time-stamp-end: "'"
# End:

238
config.sub vendored
View File

@@ -1,8 +1,10 @@
#! /bin/sh #! /bin/sh
# Configuration validation subroutine script, version 1.1. # Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
# Free Software Foundation, Inc. # Free Software Foundation, Inc.
#
timestamp='2001-04-20'
# 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
# can handle that machine. It does not imply ALL GNU software can. # can handle that machine. It does not imply ALL GNU software can.
@@ -27,7 +29,6 @@
# 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>.
# Please send patches to <config-patches@gnu.org>. # Please send patches to <config-patches@gnu.org>.
# #
# Configuration subroutine to validate and canonicalize a configuration type. # Configuration subroutine to validate and canonicalize a configuration type.
@@ -50,30 +51,73 @@
# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
# It is wrong to echo any other type of specification. # It is wrong to echo any other type of specification.
if [ x$1 = x ] me=`echo "$0" | sed -e 's,.*/,,'`
then
echo Configuration name missing. 1>&2
echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
echo "or $0 ALIAS" 1>&2
echo where ALIAS is a recognized configuration type. 1>&2
exit 1
fi
# First pass through any local machine types. usage="\
case $1 in Usage: $0 [OPTION] CPU-MFR-OPSYS
*local*) $0 [OPTION] ALIAS
echo $1
exit 0 Canonicalize a configuration name.
;;
*) Operation modes:
;; -h, --help print this help, then exit
-t, --time-stamp print date of last modification, then exit
-v, --version print version number, then exit
Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
help="
Try \`$me --help' for more information."
# Parse command line
while test $# -gt 0 ; do
case $1 in
--time-stamp | --time* | -t )
echo "$timestamp" ; exit 0 ;;
--version | -v )
echo "$version" ; exit 0 ;;
--help | --h* | -h )
echo "$usage"; exit 0 ;;
-- ) # Stop option processing
shift; break ;;
- ) # Use stdin as input.
break ;;
-* )
echo "$me: invalid option $1$help"
exit 1 ;;
*local*)
# First pass through any local machine types.
echo $1
exit 0;;
* )
break ;;
esac
done
case $# in
0) echo "$me: missing argument$help" >&2
exit 1;;
1) ;;
*) echo "$me: too many arguments$help" >&2
exit 1;;
esac esac
# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
# 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*) nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*)
os=-$maybe_os os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;; ;;
@@ -99,7 +143,7 @@ case $os in
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-apple) -apple | -axis)
os= os=
basic_machine=$1 basic_machine=$1
;; ;;
@@ -171,30 +215,40 @@ esac
case $basic_machine in case $basic_machine in
# Recognize the basic CPU types without company name. # Recognize the basic CPU types without company name.
# Some are omitted here because they have special meanings below. # Some are omitted here because they have special meanings below.
tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \
| arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ | arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \
| pyramid | mn10200 | mn10300 | tron | a29k \
| 580 | i960 | h8300 \ | 580 | i960 | h8300 \
| x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \ | x86 | ppcbe | mipsbe | mipsle | shbe | shle \
| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
| hppa64 \ | hppa64 \
| alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
| alphaev6[78] \ | alphaev6[78] \
| we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ | we32k | ns16k | clipper | i370 | sh | sh[34] \
| 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ | powerpc | powerpcle \
| 1750a | dsp16xx | pdp10 | pdp11 \
| mips16 | mips64 | mipsel | mips64el \
| mips64orion | mips64orionel | mipstx39 | mipstx39el \ | mips64orion | mips64orionel | mipstx39 | mipstx39el \
| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
| mips64vr5000 | miprs64vr5000el | mcore \ | mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \
| sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ | sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \
| thumb | d10v | fr30 | avr) | v850 | c4x \
| thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \
| pj | pjl | h8500)
basic_machine=$basic_machine-unknown basic_machine=$basic_machine-unknown
;; ;;
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl) m6811 | m68hc11 | m6812 | m68hc12)
# Motorola 68HC11/12.
basic_machine=$basic_machine-unknown
os=-none
;;
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | w65)
;; ;;
# We use `pc' rather than `unknown' # We use `pc' rather than `unknown'
# because (1) that's what they normally are, and # because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users. # (2) the word "unknown" tends to confuse beginning users.
i[34567]86) i*86 | x86_64)
basic_machine=$basic_machine-pc basic_machine=$basic_machine-pc
;; ;;
# Object if more than one company name word. # Object if more than one company name word.
@@ -204,27 +258,30 @@ case $basic_machine in
;; ;;
# Recognize the basic CPU types with company name. # Recognize the basic CPU types with company name.
# FIXME: clean up the formatting here. # FIXME: clean up the formatting here.
vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ vax-* | tahoe-* | i*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \
| arm-* | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
| power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
| xmp-* | ymp-* \ | xmp-* | ymp-* \
| x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \ | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \
| hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
| hppa2.0n-* | hppa64-* \ | hppa2.0n-* | hppa64-* \
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
| alphaev6[78]-* \ | alphaev6[78]-* \
| we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
| clipper-* | orion-* \ | clipper-* | orion-* \
| sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
| sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ | sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \
| mips16-* | mips64-* | mipsel-* \
| mips64el-* | mips64orion-* | mips64orionel-* \ | mips64el-* | mips64orion-* | mips64orionel-* \
| mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
| mipstx39-* | mipstx39el-* | mcore-* \ | mipstx39-* | mipstx39el-* | mcore-* \
| f301-* | armv*-* | s390-* | sv1-* | t3e-* \ | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \
| [cjt]90-* \
| m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
| thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \ | thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \
| bs2000-*) | bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*)
;; ;;
# Recognize the various machine names and aliases which stand # Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS. # for a CPU type and a company and sometimes even an OS.
@@ -261,14 +318,14 @@ case $basic_machine in
os=-sysv os=-sysv
;; ;;
amiga | amiga-*) amiga | amiga-*)
basic_machine=m68k-cbm basic_machine=m68k-unknown
;; ;;
amigaos | amigados) amigaos | amigados)
basic_machine=m68k-cbm basic_machine=m68k-unknown
os=-amigaos os=-amigaos
;; ;;
amigaunix | amix) amigaunix | amix)
basic_machine=m68k-cbm basic_machine=m68k-unknown
os=-sysv4 os=-sysv4
;; ;;
apollo68) apollo68)
@@ -315,13 +372,16 @@ case $basic_machine in
basic_machine=cray2-cray basic_machine=cray2-cray
os=-unicos os=-unicos
;; ;;
[ctj]90-cray) [cjt]90)
basic_machine=c90-cray basic_machine=${basic_machine}-cray
os=-unicos os=-unicos
;; ;;
crds | unos) crds | unos)
basic_machine=m68k-crds basic_machine=m68k-crds
;; ;;
cris | cris-* | etrax*)
basic_machine=cris-axis
;;
da30 | da30-*) da30 | da30-*)
basic_machine=m68k-da30 basic_machine=m68k-da30
;; ;;
@@ -369,6 +429,10 @@ case $basic_machine in
basic_machine=tron-gmicro basic_machine=tron-gmicro
os=-sysv os=-sysv
;; ;;
go32)
basic_machine=i386-pc
os=-go32
;;
h3050r* | hiux*) h3050r* | hiux*)
basic_machine=hppa1.1-hitachi basic_machine=hppa1.1-hitachi
os=-hiuxwe2 os=-hiuxwe2
@@ -444,19 +508,19 @@ case $basic_machine in
basic_machine=i370-ibm basic_machine=i370-ibm
;; ;;
# I'm not sure what "Sysv32" means. Should this be sysv3.2? # I'm not sure what "Sysv32" means. Should this be sysv3.2?
i[34567]86v32) i*86v32)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv32 os=-sysv32
;; ;;
i[34567]86v4*) i*86v4*)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv4 os=-sysv4
;; ;;
i[34567]86v) i*86v)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv os=-sysv
;; ;;
i[34567]86sol2) i*86sol2)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-solaris2 os=-solaris2
;; ;;
@@ -468,14 +532,6 @@ case $basic_machine in
basic_machine=i386-unknown basic_machine=i386-unknown
os=-vsta os=-vsta
;; ;;
i386-go32 | go32)
basic_machine=i386-unknown
os=-go32
;;
i386-mingw32 | mingw32)
basic_machine=i386-unknown
os=-mingw32
;;
iris | iris4d) iris | iris4d)
basic_machine=mips-sgi basic_machine=mips-sgi
case $os in case $os in
@@ -501,6 +557,10 @@ case $basic_machine in
basic_machine=ns32k-utek basic_machine=ns32k-utek
os=-sysv os=-sysv
;; ;;
mingw32)
basic_machine=i386-pc
os=-mingw32
;;
miniframe) miniframe)
basic_machine=m68000-convergent basic_machine=m68000-convergent
;; ;;
@@ -531,7 +591,7 @@ case $basic_machine in
os=-coff os=-coff
;; ;;
msdos) msdos)
basic_machine=i386-unknown basic_machine=i386-pc
os=-msdos os=-msdos
;; ;;
mvs) mvs)
@@ -595,6 +655,10 @@ case $basic_machine in
basic_machine=i960-intel basic_machine=i960-intel
os=-mon960 os=-mon960
;; ;;
nonstopux)
basic_machine=mips-compaq
os=-nonstopux
;;
np1) np1)
basic_machine=np1-gould basic_machine=np1-gould
;; ;;
@@ -630,28 +694,28 @@ case $basic_machine in
pc532 | pc532-*) pc532 | pc532-*)
basic_machine=ns32k-pc532 basic_machine=ns32k-pc532
;; ;;
pentium | p5 | k5 | k6 | nexen) pentium | p5 | k5 | k6 | nexgen)
basic_machine=i586-pc basic_machine=i586-pc
;; ;;
pentiumpro | p6 | 6x86) pentiumpro | p6 | 6x86 | athlon)
basic_machine=i686-pc basic_machine=i686-pc
;; ;;
pentiumii | pentium2) pentiumii | pentium2)
basic_machine=i786-pc basic_machine=i686-pc
;; ;;
pentium-* | p5-* | k5-* | k6-* | nexen-*) pentium-* | p5-* | k5-* | k6-* | nexgen-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
pentiumpro-* | p6-* | 6x86-*) pentiumpro-* | p6-* | 6x86-* | athlon-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
pentiumii-* | pentium2-*) pentiumii-* | pentium2-*)
basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
pn) pn)
basic_machine=pn-gould basic_machine=pn-gould
;; ;;
power) basic_machine=rs6000-ibm power) basic_machine=power-ibm
;; ;;
ppc) basic_machine=powerpc-unknown ppc) basic_machine=powerpc-unknown
;; ;;
@@ -666,6 +730,10 @@ case $basic_machine in
ps2) ps2)
basic_machine=i386-ibm basic_machine=i386-ibm
;; ;;
pw32)
basic_machine=i586-unknown
os=-pw32
;;
rom68k) rom68k)
basic_machine=m68k-rom68k basic_machine=m68k-rom68k
os=-coff os=-coff
@@ -757,6 +825,10 @@ case $basic_machine in
basic_machine=t3e-cray basic_machine=t3e-cray
os=-unicos os=-unicos
;; ;;
tic54x | c54x*)
basic_machine=tic54x-unknown
os=-coff
;;
tx39) tx39)
basic_machine=mipstx39-unknown basic_machine=mipstx39-unknown
;; ;;
@@ -852,13 +924,20 @@ case $basic_machine in
vax) vax)
basic_machine=vax-dec basic_machine=vax-dec
;; ;;
pdp10)
# there are many clones, so DEC is not a safe bet
basic_machine=pdp10-unknown
;;
pdp11) pdp11)
basic_machine=pdp11-dec basic_machine=pdp11-dec
;; ;;
we32k) we32k)
basic_machine=we32k-att basic_machine=we32k-att
;; ;;
sparc | sparcv9) sh3 | sh4)
basic_machine=sh-unknown
;;
sparc | sparcv9 | sparcv9b)
basic_machine=sparc-sun basic_machine=sparc-sun
;; ;;
cydra) cydra)
@@ -880,6 +959,9 @@ case $basic_machine in
basic_machine=c4x-none basic_machine=c4x-none
os=-coff os=-coff
;; ;;
*-unknown)
# Make sure to match an already-canonicalized machine name.
;;
*) *)
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1 exit 1
@@ -939,12 +1021,13 @@ case $os in
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit*) | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*)
# Remember, each alternative MUST END IN *, to match a version number. # Remember, each alternative MUST END IN *, to match a version number.
;; ;;
-qnx*) -qnx*)
case $basic_machine in case $basic_machine in
x86-* | i[34567]86-*) x86-* | i*86-*)
;; ;;
*) *)
os=-nto$os os=-nto$os
@@ -1000,7 +1083,7 @@ case $os in
-ns2 ) -ns2 )
os=-nextstep2 os=-nextstep2
;; ;;
-nsk) -nsk*)
os=-nsk os=-nsk
;; ;;
# Preserve the version number of sinix5. # Preserve the version number of sinix5.
@@ -1037,7 +1120,7 @@ case $os in
-xenix) -xenix)
os=-xenix os=-xenix
;; ;;
-*mint | -*MiNT) -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
os=-mint os=-mint
;; ;;
-none) -none)
@@ -1071,6 +1154,9 @@ case $basic_machine in
arm*-semi) arm*-semi)
os=-aout os=-aout
;; ;;
pdp10-*)
os=-tops20
;;
pdp11-*) pdp11-*)
os=-none os=-none
;; ;;
@@ -1179,7 +1265,7 @@ case $basic_machine in
*-masscomp) *-masscomp)
os=-rtu os=-rtu
;; ;;
f301-fujitsu) f30[01]-fujitsu | f700-fujitsu)
os=-uxpv os=-uxpv
;; ;;
*-rom68k) *-rom68k)
@@ -1257,7 +1343,7 @@ case $basic_machine in
-mpw* | -macos*) -mpw* | -macos*)
vendor=apple vendor=apple
;; ;;
-*mint | -*MiNT) -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
vendor=atari vendor=atari
;; ;;
esac esac
@@ -1266,3 +1352,11 @@ case $basic_machine in
esac esac
echo $basic_machine$os echo $basic_machine$os
exit 0
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "timestamp='"
# time-stamp-format: "%:y-%02m-%02d"
# time-stamp-end: "'"
# End:

View File

@@ -1,27 +1,45 @@
dnl $Id$ dnl $Id$
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT(lib/urldata.h) AC_INIT
AC_CONFIG_SRCDIR([lib/urldata.h])
AM_CONFIG_HEADER(config.h src/config.h) AM_CONFIG_HEADER(config.h src/config.h)
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)
AM_PROG_LIBTOOL
dnl
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`
AC_SUBST(VERSIONNUM)
dnl Solaris pkgadd support definitions
PKGADD_PKG="HAXXcurl"
PKGADD_NAME="cURL - a client that groks URLs"
PKGADD_VENDOR="curl.haxx.se"
AC_SUBST(PKGADD_PKG)
AC_SUBST(PKGADD_NAME)
AC_SUBST(PKGADD_VENDOR)
dnl dnl
dnl Detect the canonical host and target build environment dnl Detect the canonical host and target build environment
dnl dnl
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
dnl Checks for programs. AC_CANONICAL_HOST
AC_PROG_CC dnl Get system canonical name
AC_DEFINE_UNQUOTED(OS, "${host}")
dnl Check for AIX weirdos dnl Check for AIX weirdos
AC_AIX AC_AIX
dnl Checks for programs.
AC_PROG_CC
dnl check for how to do large files dnl check for how to do large files
AC_SYS_LARGEFILE AC_SYS_LARGEFILE
AM_PROG_LIBTOOL
dnl The install stuff has already been taken care of by the automake stuff dnl The install stuff has already been taken care of by the automake stuff
dnl AC_PROG_INSTALL dnl AC_PROG_INSTALL
AC_PROG_MAKE_SET AC_PROG_MAKE_SET
@@ -400,7 +418,7 @@ dnl ucb lib?
AC_CHECK_FUNC(gethostname, , AC_CHECK_LIB(ucb, gethostname)) AC_CHECK_FUNC(gethostname, , AC_CHECK_LIB(ucb, gethostname))
dnl dl lib? dnl dl lib?
AC_CHECK_FUNC(dlopen, , AC_CHECK_LIB(dl, dlopen)) AC_CHECK_FUNC(dlclose, , AC_CHECK_LIB(dl, dlopen))
dnl ********************************************************************** dnl **********************************************************************
dnl Check for the random seed preferences dnl Check for the random seed preferences
@@ -522,6 +540,7 @@ else
AC_MSG_RESULT(no) 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
dnl ********************************************************************** dnl **********************************************************************
@@ -539,26 +558,36 @@ then
AC_MSG_WARN(SSL/https support disabled) AC_MSG_WARN(SSL/https support disabled)
else else
dnl Check for & handle argument to --with-ssl. dnl Check for and handle argument to --with-ssl.
EXTRA_SSL=
AC_MSG_CHECKING(where to look for SSL) case "$OPT_SSL" in
if test X"$OPT_SSL" = Xoff yes)
then EXTRA_SSL=/usr/local/ssl ;;
AC_MSG_RESULT([defaults (or given in environment)]) *)
else EXTRA_SSL=$OPT_SSL ;;
test X"$OPT_SSL" = Xyes && OPT_SSL=/usr/local/ssl esac
dnl LIBS="$LIBS -L$OPT_SSL/lib"
LDFLAGS="$LDFLAGS -L$OPT_SSL/lib"
CPPFLAGS="$CPPFLAGS -I$OPT_SSL/include/openssl -I$OPT_SSL/include"
AC_MSG_RESULT([$OPT_SSL])
fi
dnl check for crypto libs (part of SSLeay) AC_CHECK_LIB(crypto, CRYPTO_lock,[
AC_CHECK_LIB(crypto, CRYPTO_lock) HAVECRYPTO="yes"
],[
OLDLDFLAGS="$LDFLAGS"
OLDCPPFLAGS="$CPPFLAGS"
LDFLAGS="$LDFLAGS -L$EXTRA_SSL/lib"
CPPFLAGS="$CPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include"
AC_CHECK_LIB(crypto, CRYPTO_add_lock,[
HAVECRYPTO="yes" ], [
LDFLAGS="$OLDLDFLAGS"
CPPFLAGS="$OLDCPPFLAGS"
])
])
if test $ac_cv_lib_crypto_CRYPTO_lock = yes; then
if test "$HAVECRYPTO" = "yes"; then
dnl This is only reasonable to do if crypto actually is there: check for dnl This is only reasonable to do if crypto actually is there: check for
dnl SSL libs NOTE: it is important to do this AFTER the crypto lib dnl SSL libs NOTE: it is important to do this AFTER the crypto lib
AC_CHECK_LIB(crypto, CRYPTO_add_lock)
AC_CHECK_LIB(ssl, SSL_connect) AC_CHECK_LIB(ssl, SSL_connect)
if test "$ac_cv_lib_ssl_SSL_connect" != yes; then if test "$ac_cv_lib_ssl_SSL_connect" != yes; then
@@ -577,35 +606,14 @@ else
fi fi
dnl Check for SSLeay headers dnl Check for SSLeay headers
AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \ AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \
openssl/pem.h openssl/ssl.h openssl/err.h) openssl/pem.h openssl/ssl.h openssl/err.h,
OPENSSL_ENABLED=1)
if test $ac_cv_header_openssl_x509_h = no; then if test $ac_cv_header_openssl_x509_h = no; then
AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h) AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h,
fi OPENSSL_ENABLED=1)
dnl
dnl If all heades are present, we have enabled SSL!
if test "$ac_cv_header_openssl_x509_h" = "yes" &&
test "$ac_cv_header_openssl_rsa_h" = "yes" &&
test "$ac_cv_header_openssl_crypto_h" = "yes" &&
test "$ac_cv_header_openssl_pem_h" = "yes" &&
test "$ac_cv_header_openssl_ssl_h" = "yes" &&
test "$ac_cv_header_openssl_err_h" = "yes"; then
OPENSSL_ENABLED="1";
fi
dnl
dnl Check the alternative headers too
if test "$ac_cv_header_x509_h" = "yes" &&
test "$ac_cv_header_rsa_h" = "yes" &&
test "$ac_cv_header_crypto_h" = "yes" &&
test "$ac_cv_header_pem_h" = "yes" &&
test "$ac_cv_header_ssl_h" = "yes" &&
test "$ac_cv_header_err_h" = "yes"; then
OPENSSL_ENABLED="1";
fi fi
AC_SUBST(OPENSSL_ENABLED) AC_SUBST(OPENSSL_ENABLED)
@@ -761,11 +769,6 @@ if test "$socklen_t" != "yes"; then
AC_CHECK_TYPE(socklen_t, int) AC_CHECK_TYPE(socklen_t, int)
fi fi
dnl Get system canonical name
AC_CANONICAL_HOST
AC_DEFINE_UNQUOTED(OS, "${host}")
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
@@ -774,6 +777,7 @@ AC_CHECK_FUNCS( socket \
select \ select \
strdup \ strdup \
strstr \ strstr \
strtok_r \
strftime \ strftime \
uname \ uname \
strcasecmp \ strcasecmp \
@@ -795,7 +799,8 @@ AC_CHECK_FUNCS( socket \
getpass_r \ getpass_r \
strlcat \ strlcat \
getpwuid \ getpwuid \
geteuid geteuid \
dlopen
) )
dnl removed 'getpass' check on October 26, 2000 dnl removed 'getpass' check on October 26, 2000
@@ -821,7 +826,7 @@ dnl AC_PATH_PROG( RANLIB, ranlib, /usr/bin/ranlib,
dnl $PATH:/usr/bin/:/usr/local/bin ) dnl $PATH:/usr/bin/:/usr/local/bin )
dnl AC_SUBST(RANLIB) dnl AC_SUBST(RANLIB)
AC_OUTPUT( Makefile \ AC_CONFIG_FILES([Makefile \
docs/Makefile \ docs/Makefile \
docs/examples/Makefile \ docs/examples/Makefile \
include/Makefile \ include/Makefile \
@@ -836,10 +841,12 @@ AC_OUTPUT( Makefile \
packages/Linux/RPM/Makefile \ packages/Linux/RPM/Makefile \
packages/Linux/RPM/curl.spec \ packages/Linux/RPM/curl.spec \
packages/Linux/RPM/curl-ssl.spec \ packages/Linux/RPM/curl-ssl.spec \
packages/Solaris/Makefile \
perl/Makefile \ perl/Makefile \
perl/Curl_easy/Makefile \ perl/Curl_easy/Makefile \
php/Makefile \ php/Makefile \
php/examples/Makefile \ php/examples/Makefile \
curl-config curl-config
) ])
AC_OUTPUT

View File

@@ -22,6 +22,7 @@ Available values for OPTION include:
--libs library linking information --libs library linking information
--prefix curl install prefix --prefix curl install prefix
--version output version information --version output version information
--vernum output the version information as a number (hexadecimal)
EOF EOF
exit $1 exit $1
@@ -62,6 +63,11 @@ while test $# -gt 0; do
exit 0 exit 0
;; ;;
--vernum)
echo @VERSIONNUM@
exit 0
;;
--help) --help)
usage 0 usage 0
;; ;;

View File

@@ -1,4 +1,4 @@
Updated: April 22, 2001 (http://curl.haxx.se/docs/faq.shtml) Updated: May 29, 2001 (http://curl.haxx.se/docs/faq.shtml)
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@@ -34,6 +34,7 @@ FAQ
3.8 How do I tell curl to follow HTTP redirects? 3.8 How do I tell curl to follow HTTP redirects?
3.9 How do I use curl in PHP, Perl, Tcl, Ruby or Java? 3.9 How do I use curl in PHP, Perl, Tcl, Ruby or Java?
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?
3.11 How do I POST with a different Content-Type?
4. Running Problems 4. Running Problems
4.1 Problems connecting to SSL servers. 4.1 Problems connecting to SSL servers.
@@ -319,7 +320,7 @@ FAQ
At the time of writing, there are bindings for the five language mentioned At the time of writing, there are bindings for the five language mentioned
above, but chances are there are even more by the time you read this. Or you above, but chances are there are even more by the time you read this. Or you
may be able you write your own wrapper for a not-yet support language! may be able you write your own wrapper for a not-yet supported language!
Find out more about which languages that support curl directly, and how to Find out more about which languages that support curl directly, and how to
install and use them, in the libcurl section of the curl web site: install and use them, in the libcurl section of the curl web site:
@@ -347,6 +348,13 @@ FAQ
Using libcurl or PHP's curl modules is just as fine and you'd just use the Using libcurl or PHP's curl modules is just as fine and you'd just use the
proper library options to do the same. proper library options to do the same.
3.11 How do I POST with a different Content-Type?
You can always replace the internally generated headers with -H/--header.
To make a simple HTTP POST with text/xml as content-type, do something like:
curl -d "datatopost" -H "Content-Type: text/xml" [URL]
4. Running Problems 4. Running Problems
4.1. Problems connecting to SSL servers. 4.1. Problems connecting to SSL servers.
@@ -497,6 +505,8 @@ FAQ
5.2 How can I receive all data into a large memory chunk? 5.2 How can I receive all data into a large memory chunk?
[ See also the examples/getinmemory.c source ]
You are in full control of the callback function that gets called every time You are in full control of the callback function that gets called every time
there is data received from the remote server. You can make that callback do there is data received from the remote server. You can make that callback do
whatever you want. You do not have to write the received data to a file. whatever you want. You do not have to write the received data to a file.

View File

@@ -206,8 +206,14 @@ Win32
Microsoft command line style Microsoft command line style
---------------------------- ----------------------------
Please read the OpenSSL documentation on how to compile and install
the OpenSSL library. This generates the libeay32.dll and ssleay32.dll
files.
Run the 'vcvars32.bat' file to get the proper environment variables Run the 'vcvars32.bat' file to get the proper environment variables
set, then run 'nmake vc-ssl' in the root dir. set. Edit the makefile.vc6 in the lib directory and define
OPENSSL_PATH. Set the location of the OpenSSL library and run 'nmake
vc-ssl' in the root directory.
The vcvars32.bat file is part of the Microsoft development The vcvars32.bat file is part of the Microsoft development
environment. environment.
@@ -237,7 +243,7 @@ IBM OS/2
If you want to build with OpenSSL or OpenLDAP support, you'll need to If you want to build with OpenSSL or OpenLDAP support, you'll need to
download those libraries, too. Dirk Ohme has done some work to port SSL download those libraries, too. Dirk Ohme has done some work to port SSL
libraries under OS/2, but it looks like he doesn't care about emx. You'll libraries under OS/2, but it looks like he doesn't care about emx. You'll
find his patches on: http://come.to/Dirk.Ohme find his patches on: http://come.to/Dirk_Ohme
If during the linking you get an error about _errno being an undefined If during the linking you get an error about _errno being an undefined
symbol referenced from the text segment, you need to add -D__ST_MT_ERRNO__ symbol referenced from the text segment, you need to add -D__ST_MT_ERRNO__

View File

@@ -1,4 +1,4 @@
Updated for curl 7.7 on March 13, 2001 Updated for curl 7.8 on May 29, 2001
_ _ ____ _ _ _ ____ _
___| | | | _ \| | ___| | | | _ \| |
/ __| | | | |_) | | / __| | | | |_) | |
@@ -69,45 +69,96 @@ Library
rather small and easy-to-follow. All the ones prefixed with 'curl_easy' are rather small and easy-to-follow. All the ones prefixed with 'curl_easy' are
put in the lib/easy.c file. put in the lib/easy.c file.
Starting with libcurl 7.8, curl_global_init_() and curl_global_cleanup() were
introduced. They should be called by the application to initialize and clean
up global stuff in the library. As of today, they just do the global SSL
initing if SSL is enabled. libcurl itself has no "global" scope.
All printf()-style functions use the supplied clones in lib/mprintf.c. This All printf()-style functions use the supplied clones in lib/mprintf.c. This
makes sure we stay absolutely platform independent. makes sure we stay absolutely platform independent.
curl_easy_init() allocates an internal struct and makes some initializations. curl_easy_init() allocates an internal struct and makes some initializations.
The returned handle does not revail internals. The returned handle does not reveal internals. This is the 'UrlData' struct
which works as a global "anchor" struct. All connections performed will get
connect-specific data allocated that should be used for things related to
particular connections/requests.
curl_easy_setopt() takes a three arguments, where the option stuff must be curl_easy_setopt() takes three arguments, where the option stuff must be
passed in pairs, the parameter-ID and the parameter-value. The list of passed in pairs: the parameter-ID and the parameter-value. The list of
options is documented in the man page. options is documented in the man page. This function mainly sets things in
the 'UrlData' struct.
curl_easy_perform() does a whole lot of things: curl_easy_perform() does a whole lot of things:
It starts off in the lib/easy.c file by calling curl_transfer(), but the main It starts off in the lib/easy.c file by calling Curl_perform() and the main
work is lib/url.c. The function first analyzes the URL, it separates the work then continues in lib/url.c. The flow continues with a call to
different components and connects to the remote host. This may involve using Curl_connect() to connect to the remote site.
a proxy and/or using SSL. The Curl_gethost() function in lib/hostip.c is used
for looking up host names.
When connected, the proper protocol-specific function is called. The o Curl_connect()
functions are named after the protocols they handle. Curl_ftp(), Curl_http(),
Curl_dict(), etc. They all reside in their respective files (ftp.c, http.c
and dict.c).
The protocol-specific functions of course deal with protocol-specific ... analyzes the URL, it separates the different components and connects to
negotiations and setup. They have access to the Curl_sendf() (from the remote host. This may involve using a proxy and/or using SSL. The
lib/sendf.c) function to send printf-style formatted data to the remote host Curl_gethost() function in lib/hostip.c is used for looking up host names.
and when they're ready to make the actual file transfer they call the
Curl_Transfer() function (in lib/transfer.c) to setup the transfer and
returns. Curl_perform() then calls Transfer() in lib/transfer.c that performs
the entire file transfer. Curl_perform() is what does the main "connect - do
- transfer - done" loop. It loops if there's a Location: to follow.
During transfer, the progress functions in lib/progress.c are called at a When Curl_connect is done, we are connected to the remote site. Then it is
frequent interval (or at the user's choice, a specified callback might get time to tell the server to get a document/file. Curl_do() arranges this.
called). The speedcheck functions in lib/speedcheck.c are also used to verify
that the transfer is as fast as required. This function makes sure there's an allocated and initiated 'connectdata'
struct that is used for this particular connection only (although there may
be several requests performed on the same connect). A bunch of things are
inited/inherited from the UrlData struct.
o Curl_do()
Curl_do() makes sure the proper protocol-specific function is called. The
functions are named after the protocols they handle. Curl_ftp(),
Curl_http(), Curl_dict(), etc. They all reside in their respective files
(ftp.c, http.c and dict.c). HTTPS is handled by Curl_http() and FTPS by
Curl_ftp().
The protocol-specific functions of course deal with protocol-specific
negotiations and setup. They have access to the Curl_sendf() (from
lib/sendf.c) function to send printf-style formatted data to the remote
host and when they're ready to make the actual file transfer they call the
Curl_Transfer() function (in lib/transfer.c) to setup the transfer and
returns.
o Transfer()
Curl_perform() then calls Transfer() in lib/transfer.c that performs
the entire file transfer.
During transfer, the progress functions in lib/progress.c are called at a
frequent interval (or at the user's choice, a specified callback might get
called). The speedcheck functions in lib/speedcheck.c are also used to
verify that the transfer is as fast as required.
o Curl_done()
Called after a transfer is done. This function takes care of everything
that has to be done after a transfer. This function attempts to leave
matters in a state so that Curl_do() should be possible to call again on
the same connection (in a persistent connection case). It might also soon
be closed with Curl_disconnect().
o Curl_disconnect()
When doing normal connections and transfers, no one ever tries to close any
connection so this is not normally called when curl_easy_perform() is
used. This function is only used when we are certain that no more transfers
is going to be made on the connection. It can be also closed by force, or
it can be called to make sure that libcurl doesn't keep too many
connections alive at the same time (there's a default amount of 5 but that
can be changed with the CURLOPT_MAXCONNECTS option).
This function cleans up all resources that are associated with a single
connection.
Curl_perform() is the function that does the main "connect - do - transfer -
done" loop. It loops if there's a Location: to follow.
When completed, the curl_easy_cleanup() should be called to free up used When completed, the curl_easy_cleanup() should be called to free up used
resources. resources. It runs Curl_disconnect() on all open connectons.
A quick roundup on internal function sequences (many of these call A quick roundup on internal function sequences (many of these call
protocol-specific function-pointers): protocol-specific function-pointers):
@@ -204,26 +255,26 @@ Library
Persistent Connections Persistent Connections
====================== ======================
With curl 7.7, we added persistent connection support to libcurl which has The persistent connection support in libcurl requires some considerations on
introduced a somewhat different treatmeant of things inside of libcurl. how to do things inside of the library.
o The 'UrlData' struct returned in the curl_easy_init() call must never o The 'UrlData' struct returned in the curl_easy_init() call must never
hold connection-oriented data. It is meant to hold the root data as well hold connection-oriented data. It is meant to hold the root data as well
as all the options etc that the library-user may choose. as all the options etc that the library-user may choose.
o The 'UrlData' struct holds the cache array of pointers to 'connectdata' o The 'UrlData' struct holds the "connection cache" (an array of pointers to
structs. There's one connectdata struct for each connection that libcurl 'connectdata' structs). There's one connectdata struct allocated for each
knows about. connection that libcurl knows about.
o This also enables the 'curl handle' to be reused on subsequent transfers, o This also enables the 'curl handle' to be reused on subsequent transfers,
something that was illegal in pre-7.7 versions. something that was illegal before libcurl 7.7.
o When we are about to perform a transfer with curl_easy_perform(), we first o When we are about to perform a transfer with curl_easy_perform(), we first
check for an already existing connection in the cache that we can use, check for an already existing connection in the cache that we can use,
otherwise we create a new one and add to the cache. If the cache is full otherwise we create a new one and add to the cache. If the cache is full
already when we add a new connection, we close one of the present ones. We already when we add a new connection, we close one of the present ones. We
select which one to close dependent on the close policy that may have been select which one to close dependent on the close policy that may have been
previously set. previously set.
o When the tranfer operation is complete, we try to leave the connection open. o When the transfer operation is complete, we try to leave the connection
Particular options may tell us not to, and protocols may signal closure on open. Particular options may tell us not to, and protocols may signal
connections and then we don't keep it open of course. closure on connections and then we don't keep it open of course.
o When curl_easy_cleanup() is called, we close all still opened connections. o When curl_easy_cleanup() is called, we close all still opened connections.
You do realize that the curl handle must be re-used in order for the You do realize that the curl handle must be re-used in order for the
@@ -233,10 +284,9 @@ Library Symbols
=============== ===============
All symbols used internally in libcurl must use a 'Curl_' prefix if they're All symbols used internally in libcurl must use a 'Curl_' prefix if they're
used in more than a single file. Single-file symbols must be made used in more than a single file. Single-file symbols must be made static.
static. Public (exported) symbols must use a 'curl_' prefix. (There are Public ("exported") symbols must use a 'curl_' prefix. (There are exceptions,
exceptions, but they are destined to be changed to follow this pattern in the but they are to be changed to follow this pattern in future versions.)
future.)
Return Codes and Informationals Return Codes and Informationals
=============================== ===============================
@@ -257,6 +307,7 @@ Client
====== ======
main() resides in src/main.c together with most of the client code. main() resides in src/main.c together with most of the client code.
src/hugehelp.c is automatically generated by the mkhelp.pl perl script to src/hugehelp.c is automatically generated by the mkhelp.pl perl script to
display the complete "manual" and the src/urlglob.c file holds the functions display the complete "manual" and the src/urlglob.c file holds the functions
used for the URL-"globbing" support. Globbing in the sense that the {} and [] used for the URL-"globbing" support. Globbing in the sense that the {} and []
@@ -272,25 +323,26 @@ Client
curl_easy_getinfo() function to extract useful information from the curl curl_easy_getinfo() function to extract useful information from the curl
session. session.
Recent versions may loop and do all that several times if many URLs were Recent versions may loop and do all this several times if many URLs were
specified on the command line or config file. specified on the command line or config file.
Memory Debugging Memory Debugging
================ ================
The file named lib/memdebug.c contains debug-versions of a few The file lib/memdebug.c contains debug-versions of a few functions. Functions
functions. Functions such as malloc, free, fopen, fclose, etc that somehow such as malloc, free, fopen, fclose, etc that somehow deal with resources
deal with resources that might give us problems if we "leak" them. The that might give us problems if we "leak" them. The functions in the memdebug
functions in the memdebug system do nothing fancy, they do their normal system do nothing fancy, they do their normal function and then log
function and then log information about what they just did. The logged data information about what they just did. The logged data can then be analyzed
can then be analyzed after a complete session, after a complete session,
memanalyze.pl is a perl script present only present in CVS (not part of the memanalyze.pl is the perl script present only present in CVS (not part of the
release archives) that analyzes a log file generated by the memdebug release archives) that analyzes a log file generated by the memdebug
system. It detects if resources are allocated but never freed and other kinds system. It detects if resources are allocated but never freed and other kinds
of errors related to resource management. of errors related to resource management.
Use -DMALLOCDEBUG when compiling to enable memory debugging. Use -DMALLOCDEBUG when compiling to enable memory debugging, this is also
switched on by running configure with --enable-debug.
Test Suite Test Suite
========== ==========

View File

@@ -23,11 +23,13 @@ man_MANS = \
curl_unescape.3 \ curl_unescape.3 \
curl_strequal.3 \ curl_strequal.3 \
curl_strnequal.3 \ curl_strnequal.3 \
curl_printf.3 \ curl_mprintf.3 \
curl_global_init.3 \
curl_global_cleanup.3 \
libcurl.5 libcurl.5
EXTRA_DIST = $(man_MANS) \ EXTRA_DIST = $(man_MANS) \
MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS \ MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS \
LIBCURL README.win32 RESOURCES TODO TheArtOfHttpScripting LIBCURL README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS
SUBDIRS = examples SUBDIRS = examples

View File

@@ -22,3 +22,8 @@ README.win32
in order to extract a separate text file: in order to extract a separate text file:
curl -M >manual.txt curl -M >manual.txt
Download all the libcurl man pages in HTML format using the link on the
bottom of this page:
http://curl.haxx.se/libcurl/c/

71
docs/THANKS Normal file
View File

@@ -0,0 +1,71 @@
This project has been alive for several years. Countless people have provided
feedback that have improved curl. Here follows a (incomplete) list of people
that have contributed with non-trivial parts:
- Daniel Stenberg <daniel@haxx.se>
- Rafael Sagula <sagula@inf.ufrgs.br>
- Sampo Kellomaki <sampo@iki.fi>
- Linas Vepstas <linas@linas.org>
- Bjorn Reese <breese@mail1.stofanet.dk>
- Johan Anderson <johan@homemail.com>
- Kjell Ericson <Kjell.Ericson@haxx.se>
- Troy Engel <tengel@sonic.net>
- Ryan Nelson <ryan@inch.com>
- Bj<42>rn Stenberg <bjorn@haxx.se>
- Angus Mackay <amackay@gus.ml.org>
- Eric Young <eay@cryptsoft.com>
- Simon Dick <simond@totally.irrelevant.org>
- Oren Tirosh <oren@monty.hishome.net>
- Steven G. Johnson <stevenj@alum.mit.edu>
- Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu>
- Andr<64>s Garc<72>a <ornalux@redestb.es>
- Douglas E. Wegscheid <wegscd@whirlpool.com>
- Mark Butler <butlerm@xmission.com>
- Eric Thelin <eric@generation-i.com>
- Marc Boucher <marc@mbsi.ca>
- Greg Onufer <Greg.Onufer@Eng.Sun.COM>
- Doug Kaufman <dkaufman@rahul.net>
- David Eriksson <david@2good.com>
- Ralph Beckmann <rabe@uni-paderborn.de>
- T. Yamada <tai@imasy.or.jp>
- Lars J. Aas <larsa@sim.no>
- J<>rn Hartroth <Joern.Hartroth@computer.org>
- Matthew Clarke <clamat@van.maves.ca>
- Linus Nielsen Feltzing <linus@haxx.se>
- Felix von Leitner <felix@convergence.de>
- Dan Zitter <dzitter@zitter.net>
- Jongki Suwandi <Jongki.Suwandi@eng.sun.com>
- Chris Maltby <chris@aurema.com>
- Ron Zapp <rzapper@yahoo.com>
- Paul Marquis <pmarquis@iname.com>
- Ellis Pritchard <ellis@citria.com>
- Damien Adant <dams@usa.net>
- Chris <cbayliss@csc.come>
- Marco G. Salvagno <mgs@whiz.cjb.net>
- Paul Marquis <pmarquis@iname.com>
- David LeBlanc <dleblanc@qnx.com>
- Rich Gray at Plus Technologies
- Luong Dinh Dung <u8luong@lhsystems.hu>
- Torsten Foertsch <torsten.foertsch@gmx.net>
- Kristian K<>hntopp <kris@koehntopp.de>
- Fred Noz <FNoz@siac.com>
- Caolan McNamara <caolan@csn.ul.ie>
- Albert Chin-A-Young <china@thewrittenword.com>
- Stephen Kick <skick@epicrealm.com>
- Martin Hedenfalk <mhe@stacken.kth.se>
- Richard Prescott
- Jason S. Priebe <priebe@wral-tv.com>
- T. Bharath <TBharath@responsenetworks.com>
- Alexander Kourakos <awk@users.sourceforge.net>
- James Griffiths <griffiths_james@yahoo.com>
- Loic Dachary <loic@senga.org>
- Robert Weaver <robert.weaver@sabre.com>
- Ingo Ralf Blum <ingoralfblum@ingoralfblum.com>
- Jun-ichiro itojun Hagino <itojun@iijlab.net>
- Frederic Lepied <flepied@mandrakesoft.com>
- Georg Horn <horn@koblenz-net.de>
- Cris Bailiff <c.bailiff@awayweb.com>
- Sterling Hughes <sterling@designmultimedia.com>
- S. Moonesamy
- Ingo Wilken <iw@WWW.Ecce-Terram.DE>
- Pawel A. Gajda <mis@k2.net.pl>

View File

@@ -9,16 +9,13 @@ TODO
Things to do in project cURL. Please tell me what you think, contribute and Things to do in project cURL. Please tell me what you think, contribute and
send me patches that improve things! send me patches that improve things!
To do for the next release: To do in a future release (random order):
* Make sure SSL works even when IPv6 is enabled. We just can't connect to
IPv6 sites and use SSL, but we should detect that particular condition
and warn about it.
* Make SSL session ids get used if multiple HTTPS documents from the same * Make SSL session ids get used if multiple HTTPS documents from the same
host is requested. host is requested. Note: is this really prioritized now with the persistent
connections?
To do in a future release (random order): * Suggested on the mailing list: CURLOPT_FTP_MKDIR...!
* Rewrite parts of the test suite. Make a (XML?) format to store all * Rewrite parts of the test suite. Make a (XML?) format to store all
test-data in a single for a single test case. The current system makes far test-data in a single for a single test case. The current system makes far
@@ -30,9 +27,8 @@ To do in a future release (random order):
decrease footprint. '--disable-[protocol]' where protocol is http, ftp, decrease footprint. '--disable-[protocol]' where protocol is http, ftp,
telnet, ldap, dict or file. telnet, ldap, dict or file.
* Extend the test suite to include telnet and https. The telnet could just do * Extend the test suite to include telnet. The telnet could just do ftp or
ftp or http operations (for which we have test servers) and the https would http operations (for which we have test servers).
probably work against/with some of the openssl tools.
* Add a command line option that allows the output file to get the same time * Add a command line option that allows the output file to get the same time
stamp as the remote file. libcurl already is capable of fetching the remote stamp as the remote file. libcurl already is capable of fetching the remote
@@ -46,14 +42,10 @@ To do in a future release (random order):
* Add asynchronous name resolving, as this enables full timeout support for * Add asynchronous name resolving, as this enables full timeout support for
fork() systems. fork() systems.
* Non-blocking connect(), also to make timeouts work on windows.
* Move non-URL related functions that are used by both the lib and the curl * Move non-URL related functions that are used by both the lib and the curl
application to a separate "portability lib". application to a separate "portability lib".
* Add support for other languages than C. C++ (rumours have been heard about * Add libcurl support/interfaces for more languages. C++ wrapper perhaps?
something being worked on in this area) and perl (we have seen the first
versions of this!) comes to mind. Python anyone?
* "Content-Encoding: compress/gzip/zlib" HTTP 1.1 clearly defines how to get * "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 and decode compressed documents. There is the zlib that is pretty good at
@@ -85,8 +77,7 @@ To do in a future release (random order):
* Other proxies * Other proxies
Ftp-kind proxy, Socks5, whatever kind of proxies are there? Ftp-kind proxy, Socks5, whatever kind of proxies are there?
* IPv6 Awareness and support. (This is partly done.) RFC 2428 "FTP * Full IPv6 Awareness and support. (This is partly done.) RFC 2428 "FTP
Extensions for IPv6 and NATs" is interesting. PORT should be replaced with Extensions for IPv6 and NATs" is interesting. PORT should be replaced with
EPRT for IPv6 (done), and EPSV instead of PASV. HTTP proxies are left to EPRT for IPv6 (done), and EPSV instead of PASV.
add support for.

View File

@@ -2,7 +2,7 @@
.\" nroff -man curl-config.1 .\" nroff -man curl-config.1
.\" Written by Daniel Stenberg .\" Written by Daniel Stenberg
.\" .\"
.TH curl-config 1 "18 March 2001" "Curl 7.7.2" "curl-config manual" .TH curl-config 1 "28 May 2001" "Curl 7.8" "curl-config manual"
.SH NAME .SH NAME
curl-config \- Get information about a libcurl installation curl-config \- Get information about a libcurl installation
.SH SYNOPSIS .SH SYNOPSIS
@@ -30,6 +30,11 @@ in $prefix/lib and its header files are installed in $prefix/include and so
on. The prefix is set with "configure --prefix". on. The prefix is set with "configure --prefix".
.IP "--version" .IP "--version"
Outputs version information about the installed libcurl. Outputs version information about the installed libcurl.
.IP "--vernum"
Outputs version information about the installed libcurl, in numerical mode.
This outputs the version number, in hexadecimal, with 8 bits for each part;
major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl
12.13.14 would appear as 0c0d0e...
.SH "EXAMPLES" .SH "EXAMPLES"
What is the path to the curl header files? What is the path to the curl header files?

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 "20 April 2001" "Curl 7.7.2" "Curl Manual" .TH curl 1 "8 May 2001" "Curl 7.7.3" "Curl Manual"
.SH NAME .SH NAME
curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or
HTTPS syntax. HTTPS syntax.
@@ -39,14 +39,14 @@ supported at the moment:
http://www.any.org/archive[1996-1999]/volume[1-4]part{a,b,c,index}.html http://www.any.org/archive[1996-1999]/volume[1-4]part{a,b,c,index}.html
Starting with curl 7.6, you can specify any amount of URLs on the command You can specify any amount of URLs on the command line. They will be fetched
line. They will be fetched in a sequential manner in the specified order. in a sequential manner in the specified order.
Starting with curl 7.7, curl will attempt to re-use connections for multiple Curl will attempt to re-use connections for multiple file transfers, so that
file transfers, so that getting many files from the same server will not do getting many files from the same server will not do multiple connects /
multiple connects/handshakes. This improves speed. Of course this is only done handshakes. This improves speed. Of course this is only done on files
on files specified on a single command line and cannot be used between specified on a single command line and cannot be used between separate curl
separate curl invokes. invokes.
.SH OPTIONS .SH OPTIONS
.IP "-a/--append" .IP "-a/--append"
(FTP) (FTP)
@@ -62,7 +62,7 @@ fail if its not set to "Mozilla/4.0". To encode blanks in the string,
surround the string with single quote marks. This can also be set with the surround the string with single quote marks. This can also be set with the
-H/--header flag of course. -H/--header flag of course.
If this option is used more than once, the last one will be the one to be If this option is set more than once, the last one will be the one that's
used. used.
.IP "-b/--cookie <name=data>" .IP "-b/--cookie <name=data>"
(HTTP) (HTTP)
@@ -72,18 +72,18 @@ The data should be in the format "NAME1=VALUE1; NAME2=VALUE2".
If no '=' letter is used in the line, it is treated as a filename to use to If no '=' letter is used in the line, it is treated as a filename to use to
read previously stored cookie lines from, which should be used in this session read previously stored cookie lines from, which should be used in this session
if they match. Using this method also activates the "cookie parser" which if they match. Using this method also activates the "cookie parser" which will
will make curl record incoming cookies too, which may be handy if you're using make curl record incoming cookies too, which may be handy if you're using this
this in combination with the -L/--location option. The file format of the file in combination with the -L/--location option. The file format of the file to
to read cookies from should be plain HTTP headers or the netscape cookie file read cookies from should be plain HTTP headers or the Netscape/Mozilla cookie
format. file format.
.B NOTE .B NOTE
that the file specified with -b/--cookie is only used as input. No cookies that the file specified with -b/--cookie is only used as input. No cookies
will be stored in the file. To store cookies, save the HTTP headers to a file will be stored in the file. To store cookies, save the HTTP headers to a file
using -D/--dump-header! using -D/--dump-header!
If this option is used more than once, the last one will be the one to be If this option is set more than once, the last one will be the one that's
used. used.
.IP "-B/--use-ascii" .IP "-B/--use-ascii"
Use ASCII transfer when getting an FTP file or LDAP info. For FTP, this can Use ASCII transfer when getting an FTP file or LDAP info. For FTP, this can
@@ -756,76 +756,18 @@ Interface error. A specified outgoing interface could not be used.
Bad password entered. An error was signalled when the password was entered. Bad password entered. An error was signalled when the password was entered.
.IP 47 .IP 47
Too many redirects. When following redirects, curl hit the maximum amount. Too many redirects. When following redirects, curl hit the maximum amount.
.IP 48
Unknown TELNET option specified.
.IP 49
Malformed telnet option.
.IP XX .IP XX
There will appear more error codes here in future releases. The existing ones There will appear more error codes here in future releases. The existing ones
are meant to never change. are meant to never change.
.SH BUGS .SH BUGS
If you do find bugs, mail them to curl-bug@haxx.se. If you do find bugs, mail them to curl-bug@haxx.se.
.SH AUTHORS / CONTRIBUTORS .SH AUTHORS / CONTRIBUTORS
- Daniel Stenberg <Daniel.Stenberg@haxx.se> Daniel Stenberg is the main author, but the whole list of contributors is
- Rafael Sagula <sagula@inf.ufrgs.br> found in the separate THANKS file.
- Sampo Kellomaki <sampo@iki.fi>
- Linas Vepstas <linas@linas.org>
- Bjorn Reese <breese@mail1.stofanet.dk>
- Johan Anderson <johan@homemail.com>
- Kjell Ericson <Kjell.Ericson@haxx.se>
- Troy Engel <tengel@sonic.net>
- Ryan Nelson <ryan@inch.com>
- Bj<42>rn Stenberg <Bjorn.Stenberg@haxx.se>
- Angus Mackay <amackay@gus.ml.org>
- Eric Young <eay@cryptsoft.com>
- Simon Dick <simond@totally.irrelevant.org>
- Oren Tirosh <oren@monty.hishome.net>
- Steven G. Johnson <stevenj@alum.mit.edu>
- Gilbert Ramirez Jr. <gram@verdict.uthscsa.edu>
- Andr<64>s Garc<72>a <ornalux@redestb.es>
- Douglas E. Wegscheid <wegscd@whirlpool.com>
- Mark Butler <butlerm@xmission.com>
- Eric Thelin <eric@generation-i.com>
- Marc Boucher <marc@mbsi.ca>
- Greg Onufer <Greg.Onufer@Eng.Sun.COM>
- Doug Kaufman <dkaufman@rahul.net>
- David Eriksson <david@2good.com>
- Ralph Beckmann <rabe@uni-paderborn.de>
- T. Yamada <tai@imasy.or.jp>
- Lars J. Aas <larsa@sim.no>
- J<>rn Hartroth <Joern.Hartroth@computer.org>
- Matthew Clarke <clamat@van.maves.ca>
- Linus Nielsen Feltzing <linus@haxx.se>
- Felix von Leitner <felix@convergence.de>
- Dan Zitter <dzitter@zitter.net>
- Jongki Suwandi <Jongki.Suwandi@eng.sun.com>
- Chris Maltby <chris@aurema.com>
- Ron Zapp <rzapper@yahoo.com>
- Paul Marquis <pmarquis@iname.com>
- Ellis Pritchard <ellis@citria.com>
- Damien Adant <dams@usa.net>
- Chris <cbayliss@csc.come>
- Marco G. Salvagno <mgs@whiz.cjb.net>
- Paul Marquis <pmarquis@iname.com>
- David LeBlanc <dleblanc@qnx.com>
- Rich Gray at Plus Technologies
- Luong Dinh Dung <u8luong@lhsystems.hu>
- Torsten Foertsch <torsten.foertsch@gmx.net>
- Kristian K<>hntopp <kris@koehntopp.de>
- Fred Noz <FNoz@siac.com>
- Caolan McNamara <caolan@csn.ul.ie>
- Albert Chin-A-Young <china@thewrittenword.com>
- Stephen Kick <skick@epicrealm.com>
- Martin Hedenfalk <mhe@stacken.kth.se>
- Richard Prescott
- Jason S. Priebe <priebe@wral-tv.com>
- T. Bharath <TBharath@responsenetworks.com>
- Alexander Kourakos <awk@users.sourceforge.net>
- James Griffiths <griffiths_james@yahoo.com>
- Loic Dachary <loic@senga.org>
- Robert Weaver <robert.weaver@sabre.com>
- Ingo Ralf Blum <ingoralfblum@ingoralfblum.com>
- Jun-ichiro itojun Hagino <itojun@iijlab.net>
- Frederic Lepied <flepied@mandrakesoft.com>
- Georg Horn <horn@koblenz-net.de>
- Cris Bailiff <c.bailiff@awayweb.com>
.SH WWW .SH WWW
http://curl.haxx.se http://curl.haxx.se
.SH FTP .SH FTP

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_easy_cleanup 3 "5 March 2001" "libcurl 7.7" "libcurl Manual" .TH curl_easy_cleanup 3 "5 March 2001" "libcurl 7.7" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_easy_init 3 "5 March 2001" "libcurl 7.6.1" "libcurl Manual" .TH curl_easy_init 3 "5 March 2001" "libcurl 7.6.1" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_easy_init 3 "5 March 2001" "libcurl 7.7" "libcurl Manual" .TH curl_easy_init 3 "5 March 2001" "libcurl 7.7" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_easy_perform 3 "5 Mar 2001" "libcurl 7.7" "libcurl Manual" .TH curl_easy_perform 3 "5 Mar 2001" "libcurl 7.7" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,8 +1,8 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_easy_setopt 3 "10 April 2001" "libcurl 7.7.2" "libcurl Manual" .TH curl_easy_setopt 3 "1 June 2001" "libcurl 7.8" "libcurl Manual"
.SH NAME .SH NAME
curl_easy_setopt - Set curl easy-session options curl_easy_setopt - Set curl easy-session options
.SH SYNOPSIS .SH SYNOPSIS
@@ -42,54 +42,43 @@ call.
These options are in a bit of random order, but you'll figure it out! These options are in a bit of random order, but you'll figure it out!
.TP 0.8i .TP 0.8i
.B CURLOPT_FILE .B CURLOPT_FILE
Data pointer to pass instead of FILE * to the file write function. Note that Data pointer to pass to file write function. Note that if you specify the
if you specify the
.I CURLOPT_WRITEFUNCTION .I CURLOPT_WRITEFUNCTION
, this is the pointer you'll get as input. , this is the pointer you'll get as input. If you don't use a callback, you
must pass a 'FILE *' as libcurl passes it to fwrite() when writing data.
NOTE: If you're using libcurl as a win32 .DLL, you MUST use a NOTE: If you're using libcurl as a win32 DLL, you MUST use the
.I CURLOPT_WRITEFUNCTION \fICURLOPT_WRITEFUNCTION\fP if you set this option.
if you set the
.I CURLOPT_FILE
option.
.TP .TP
.B CURLOPT_WRITEFUNCTION .B CURLOPT_WRITEFUNCTION
Function pointer that should match the following prototype: Function pointer that should match the following prototype:
.BI "size_t function( void *ptr, size_t size, size_t nmemb, FILE *stream);" .BI "size_t function( void *ptr, size_t size, size_t nmemb, void *stream);"
This function gets called by libcurl as soon as there is received data that This function gets called by libcurl as soon as there is received data that
needs to be written down. The size of the data pointed to by needs to be written down. The size of the data pointed to by \fIptr\fP is
.I ptr \fIsize\fP multiplied with \fInmemb\fP. Return the number of bytes actually
is written or return -1 to signal error to the library (it will cause it to abort
.I size the transfer with CURLE_WRITE_ERROR).
multiplied with
.I nmemb. Set the \fIstream\fP argument with the \fBCURLOPT_FILE\fP option.
Return the number of bytes actually written or return -1 to signal error to the library (it will cause it to abort the transfer).
.TP .TP
.B CURLOPT_INFILE .B CURLOPT_INFILE
Data pointer to pass instead of FILE * to the file read function. Note that if Data pointer to pass to the file read function. Note that if you specify the
you specify the \fICURLOPT_READFUNCTION\fP, this is the pointer you'll get as input. If you
.I CURLOPT_READFUNCTION don't specify a read callback, this must be a valid FILE *.
, this is the pointer you'll get as input.
NOTE: If you're using libcurl as a win32 .DLL, you MUST use a NOTE: If you're using libcurl as a win32 DLL, you MUST use a
.I CURLOPT_READFUNCTION \fICURLOPT_READFUNCTION\fP if you set this option.
if you set the
.I CURLOPT_INFILE
option.
.TP .TP
.B CURLOPT_READFUNCTION .B CURLOPT_READFUNCTION
Function pointer that should match the following prototype: Function pointer that should match the following prototype:
.BI "size_t function( void *ptr, size_t size, size_t nmemb, FILE *stream);" .BI "size_t function( void *ptr, size_t size, size_t nmemb, void *stream);"
This function gets called by libcurl as soon as it needs to read data in order This function gets called by libcurl as soon as it needs to read data in order
to send it to the peer. The data area pointed at by the pointer to send it to the peer. The data area pointed at by the pointer \fIptr\fP may
.I ptr be filled with at most \fIsize\fP multiplied with \fInmemb\fP number of
may be filled with at most bytes. Your function must return the actual number of bytes that you stored in
.I size that memory area. Returning -1 will signal an error to the library and cause
multiplied with it to abort the current transfer immediately (with a CURLE_READ_ERROR return
.I nmemb code).
number of bytes. Your function must return the actual number of bytes that you
stored in that memory area. Returning -1 will signal an error to the library
and cause it to abort the current transfer immediately.
.TP .TP
.B CURLOPT_INFILESIZE .B CURLOPT_INFILESIZE
When uploading a file to a remote site, this option should be used to tell When uploading a file to a remote site, this option should be used to tell
@@ -120,7 +109,8 @@ this means, you probably don't want this tunnel option. (Added in libcurl 7.3)
.TP .TP
.B CURLOPT_VERBOSE .B CURLOPT_VERBOSE
Set the parameter to non-zero to get the library to display a lot of verbose Set the parameter to non-zero to get the library to display a lot of verbose
information about its operations. information about its operations. Very useful for libcurl and/or protocl
debugging and understanding.
.TP .TP
.B CURLOPT_HEADER .B CURLOPT_HEADER
A non-zero parameter tells the library to include the header in the A non-zero parameter tells the library to include the header in the
@@ -188,9 +178,6 @@ similar.
A non-zero parameter tells the library to use HTTP PUT a file. The file to put A non-zero parameter tells the library to use HTTP PUT a file. The file to put
must be set with CURLOPT_INFILE and CURLOPT_INFILESIZE. must be set with CURLOPT_INFILE and CURLOPT_INFILESIZE.
.TP .TP
.B CURLOPT_MUTE
A non-zero parameter tells the library to be completely quiet.
.TP
.B CURLOPT_USERPWD .B CURLOPT_USERPWD
Pass a char * as parameter, which should be [username]:[password] to use for Pass a char * as parameter, which should be [username]:[password] to use for
the connection. If the password is left out, you will be prompted for it. the connection. If the password is left out, you will be prompted for it.
@@ -287,7 +274,8 @@ of HTTP post structs as parameter. The linked list should be a fully valid
list of 'struct HttpPost' structs properly filled in. The best and most list of 'struct HttpPost' structs properly filled in. The best and most
elegant way to do this, is to use elegant way to do this, is to use
.I curl_formparse(3) .I curl_formparse(3)
as documented. as documented. The data in this list must remained intact until you close this
curl handle again with curl_easy_cleanup().
.TP .TP
.B CURLOPT_SSLCERT .B CURLOPT_SSLCERT
Pass a pointer to a zero terminated string as parameter. The string should be Pass a pointer to a zero terminated string as parameter. The string should be
@@ -317,16 +305,15 @@ struct curl_slist structs properly filled in as described for
.I "CURLOPT_QUOTE" .I "CURLOPT_QUOTE"
.TP .TP
.B CURLOPT_WRITEHEADER .B CURLOPT_WRITEHEADER
Pass a FILE * to be used to write the header part of the received data to. The Pass a pointer to be used to write the header part of the received data to. If
headers are guaranteed to be written one-by-one to this file handle and only you don't use a callback to take care of the writing, this must be a FILE
complete lines are written. Parsing headers should be easy enough using *. The headers are guaranteed to be written one-by-one and only complete lines
this. See also the are written. Parsing headers should be easy enough using this. See also the
.I CURLOPT_HEADERFUNCTION \fICURLOPT_HEADERFUNCTION\fP option.
option.
.TP .TP
.B CURLOPT_HEADERFUNCTION .B CURLOPT_HEADERFUNCTION
Function pointer that should match the following prototype: Function pointer that should match the following prototype:
.BI "size_t function( void *ptr, size_t size, size_t nmemb, FILE *stream);" .BI "size_t function( void *ptr, size_t size, size_t nmemb, void *stream);"
This function gets called by libcurl as soon as there is received header data This function gets called by libcurl as soon as there is received header data
that needs to be written down. The function will be called once for each that needs to be written down. The function will be called once for each
header with a complete header line in each invoke. The size of the data header with a complete header line in each invoke. The size of the data
@@ -348,8 +335,9 @@ return code). (Added in libcurl 7.7.2)
.TP .TP
.B CURLOPT_COOKIEFILE .B CURLOPT_COOKIEFILE
Pass a pointer to a zero terminated string as parameter. It should contain the Pass a pointer to a zero terminated string as parameter. It should contain the
name of your file holding cookie data. The cookie data may be in netscape name of your file holding cookie data. The cookie data may be in Netscape /
cookie data format or just regular HTTP-style headers dumped to a file. Mozilla cookie data format or just regular HTTP-style headers dumped to a
file.
.TP .TP
.B CURLOPT_SSLVERSION .B CURLOPT_SSLVERSION
Pass a long as parameter. Set what version of SSL to attempt to use, 2 or Pass a long as parameter. Set what version of SSL to attempt to use, 2 or
@@ -507,7 +495,7 @@ Pass a long. It should contain the maximum time in seconds that you allow the
connection to the server to take. This only limits the connection phase, once connection to the server to take. This only limits the connection phase, once
it has connected, this option is of no more use. Set to zero to disable it has connected, this option is of no more use. Set to zero to disable
connection timeout (it will then only timeout on the system's internal connection timeout (it will then only timeout on the system's internal
timeouts). This option doesn't work in win32 systems. See also the timeouts). See also the
.I CURLOPT_TIMEOUT .I CURLOPT_TIMEOUT
option. option.
.PP .PP

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_escape 3 "22 March 2001" "libcurl 7.7" "libcurl Manual" .TH curl_escape 3 "22 March 2001" "libcurl 7.7" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_formfree 3 "6 April 2001" "libcurl 7.7.1" "libcurl Manual" .TH curl_formfree 3 "6 April 2001" "libcurl 7.7.1" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,27 +1,37 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_formparse 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" .TH curl_formparse 3 "21 May 2001" "libcurl 7.7.4" "libcurl Manual"
.SH NAME .SH NAME
curl_formparse - add a section to a multipart/formdata HTTP POST curl_formparse - add a section to a multipart/formdata HTTP POST
.SH SYNOPSIS .SH SYNOPSIS
.B #include <curl/curl.h> .B #include <curl/curl.h>
.sp .sp
.BI "CURLcode curl_formparse(char *" string, "struct HttpPost **" firstitem, .BI "CURLcode curl_formparse(char * " string, " struct HttpPost ** " firstitem,
.BI "struct HttpPost ** "lastitem ");" .BI "struct HttpPost ** " lastitem ");"
.ad .ad
.SH DESCRIPTION .SH DESCRIPTION
curl_formparse() is used to append sections when building a multipart/formdata curl_formparse() is used to append sections when building a multipart/formdata
HTTP POST. Append one section at a time until you've added all the sections HTTP POST (sometimes refered to as rfc1867-style posts). Append one section at
you want included and then you pass the a time until you've added all the sections you want included and then you pass
.I firstitem the \fIfirstitem\fP pointer as parameter to \fBCURLOPT_HTTPPOST\fP.
pointer as parameter to CURLOPT_HTTPPOST. \fIlastitem\fP is set after each call and on repeated invokes it should be
.I lastitem left as set to allow repeated invokes to find the end of the list in a faster
is set after each call and on repeated invokes it should be left as set to way. \fIstring\fP must be a zero terminated string abiding to the syntax
allow repeated invokes to find the end of the list in a faster way. described in a section below
.I string
must be a zero terminated string following the following syntax. The pointers \fI*firstitem\fP and \fI*lastitem\fP should both be pointing to
NULL in the first call to this function. All list-data will be allocated by
the function itself. You must call \fIcurl_formfree\fP after the form post has
been done to free the resources again.
This function will copy all input data and keep its own version of it
allocated until you call \fIcurl_formfree\fP. When you've passed the pointer
to \fIcurl_easy_setopt\fP, you must not free the list until after you've
called \fIcurl_easy_cleanup\fP for the curl handle.
See example below.
.SH "FORM PARSE STRINGS" .SH "FORM PARSE STRINGS"
The The
.I string .I string
@@ -55,8 +65,21 @@ content-type for all of them in the same way as with a single file.
.PP .PP
.SH RETURN VALUE .SH RETURN VALUE
Returns non-zero if an error occurs. Returns non-zero if an error occurs.
.SH EXAMPLE
HttpPost* post = NULL;
HttpPost* last = NULL;
/* Add an image section */
curl_formparse("picture=@my-face.jpg", &post, &last);
/* Add a normal text section */
curl_formparse("name=FooBar", &post, &last);
/* Set the form info */
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
.SH "SEE ALSO" .SH "SEE ALSO"
.BR curl_easy_setopt "(3) " .BR curl_easy_setopt "(3), "
.BR curl_formfree "(3)
.SH BUGS .SH BUGS
Surely there are some, you tell me! Surely there are some, you tell me!

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_getdate 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" .TH curl_getdate 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_getenv 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" .TH curl_getenv 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -0,0 +1,27 @@
.\" You can view this file with:
.\" nroff -man [file]
.\" $Id$
.\"
.TH curl_global_cleanup 3 "28 May 2001" "libcurl 7.8" "libcurl Manual"
.SH NAME
curl_global_cleanup - Global libcurl cleanup
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_global_cleanup(void);"
.ad
.SH DESCRIPTION
curl_global_cleanup must be called once (no matter how many threads or libcurl
sessions that'll be used) by every application that uses libcurl, after all
uses of libcurl is complete.
This is the opposite of \fIcurl_global_init\fP.
Not calling this function may result in memory leaks.
This function was added in libcurl 7.8.
.SH "SEE ALSO"
.BR curl_global_init "(3), "
.SH BUGS
None?

44
docs/curl_global_init.3 Normal file
View File

@@ -0,0 +1,44 @@
.\" You can view this file with:
.\" nroff -man [file]
.\" $Id$
.\"
.TH curl_global_init 3 "31 May 2001" "libcurl 7.8" "libcurl Manual"
.SH NAME
curl_global_init - Global libcurl initialisation
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_global_init(long " flags ");"
.ad
.SH DESCRIPTION
This function should be called once (no matter how many threads or libcurl
sessions that'll be used) by every application that uses libcurl.
If this function hasn't been invoked when \fIcurl_easy_init\fP is called, it
will be done automatically by libcurl.
The flags option is a bit pattern that tells libcurl exact what features to
init, as described below. Set the desired bits by ORing the values together.
You must however \fBalways\fP use the \fIcurl_global_cleanup\fP function, as
that cannot be called automatically for you by libcurl.
This function was added in libcurl 7.8.
.SH FLAGS
.TP 5
.B CURL_GLOBAL_ALL
Initialise everyting possible. This sets all known bits.
.TP
.B CURL_GLOBAL_SSL
Initialise SSL
.TP
.B CURL_GLOBAL_NOTHING
Initialise nothing extra. This sets no bit.
.SH RETURN VALUE
If this function returns non-zero, something went wrong and you cannot use the
other curl functions.
.SH "SEE ALSO"
.BR curl_global_cleanup "(3), "
.SH BUGS
None.

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_printf 3 "20 April 2001" "libcurl 7.7.2" "libcurl Manual" .TH curl_printf 3 "20 April 2001" "libcurl 7.7.2" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_slist_append 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" .TH curl_slist_append 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_slist_free_all 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" .TH curl_slist_free_all 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_strequal 3 "20 April 2001" "libcurl 7.7.2" "libcurl Manual" .TH curl_strequal 3 "20 April 2001" "libcurl 7.7.2" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_unescape 3 "22 March 2001" "libcurl 7.7" "libcurl Manual" .TH curl_unescape 3 "22 March 2001" "libcurl 7.7" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -1,6 +1,6 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man [file] .\" nroff -man [file]
.\" Written by daniel@haxx.se .\" $Id$
.\" .\"
.TH curl_version 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" .TH curl_version 3 "5 March 2001" "libcurl 7.0" "libcurl Manual"
.SH NAME .SH NAME

View File

@@ -4,9 +4,9 @@
AUTOMAKE_OPTIONS = foreign no-dependencies AUTOMAKE_OPTIONS = foreign no-dependencies
EXTRA_DIST = EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit.c \
README curlgtk.c sepheaders.c simple.c postit.c \ win32sockets.c persistant.c ftpget.c Makefile.example \
win32sockets.c persistant.c ftpget.c Makefile.example multithread.c getinmemory.c
all: all:
@echo "done" @echo "done"

View File

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

View File

@@ -0,0 +1,80 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* $Id$
*
* Example source code to show how the callback function can be used to
* download data into a chunk of memory instead of storing it in a file.
*
* This exact source code has not been verified to work.
*/
/* to make this work under windows, use the win32-functions from the
win32socket.c file as well */
#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
struct MemoryStruct {
char *memory;
size_t size;
};
size_t
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
{
register int realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)data;
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
if (mem->memory) {
memcpy(&(mem->memory[mem->size]), ptr, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
}
return realsize;
}
int main(int argc, char **argv)
{
CURL *curl_handle;
struct MemoryStruct chunk;
chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
chunk.size = 0; /* no data at this point */
/* init the curl session */
curl_handle = curl_easy_init();
/* specify URL to get */
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://cool.haxx.se/");
/* send all data to this function */
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
/* we pass our 'chunk' struct to the callback function */
curl_easy_setopt(curl_handle, CURLOPT_FILE, (void *)&chunk);
/* get it! */
curl_easy_perform(curl_handle);
/* cleanup curl stuff */
curl_easy_cleanup(curl_handle);
/*
* Now, our chunk.memory points to a memory block that is chunk.size
* bytes big and contains the remote file.
*
* Do something nice with it!
*/
return 0;
}

View File

@@ -0,0 +1,70 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* $Id$
*/
/* A multi-threaded example that uses pthreads extensively to fetch
* X remote files at once */
#include <stdio.h>
#include <pthread.h>
#include <curl/curl.h>
/* silly list of test-URLs */
char *urls[]= {
"http://curl.haxx.se/",
"ftp://cool.haxx.se/",
"http://www.contactor.se/",
"www.haxx.se"
};
void *pull_one_url(void *url)
{
CURL *curl;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
return NULL;
}
/*
int pthread_create(pthread_t *new_thread_ID,
const pthread_attr_t *attr,
void * (*start_func)(void *), void *arg);
*/
int main(int argc, char **argv)
{
pthread_t tid[4];
int i;
int error;
for(i=0; i< 4; i++) {
error = pthread_create(&tid[i],
NULL, /* default attributes please */
pull_one_url,
urls[i]);
if(0 != error)
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
else
fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);
}
/* now wait for all threads to terminate */
for(i=0; i< 4; i++) {
error = pthread_join(tid[i], NULL);
fprintf(stderr, "Thread %d terminated\n", i);
}
return 0;
}

View File

@@ -19,9 +19,9 @@
#include <curl/types.h> #include <curl/types.h>
#include <curl/easy.h> #include <curl/easy.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{ {
written = fwrite(ptr,size,nmemb,outfile); written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written; return written;
} }

View File

@@ -1,8 +1,8 @@
.\" You can view this file with: .\" You can view this file with:
.\" nroff -man libcurl.5 .\" nroff -man [file]
.\" Written by Daniel Stenberg .\" $Id$
.\" .\"
.TH libcurl 5 "20 April 2001" "libcurl 7.7.2" "libcurl overview" .TH libcurl 5 "28 May 2001" "libcurl 7.8" "libcurl overview"
.SH NAME .SH NAME
libcurl \- client-side URL transfers libcurl \- client-side URL transfers
.SH DESCRIPTION .SH DESCRIPTION
@@ -12,30 +12,30 @@ specific man pages for each function mentioned in here.
libcurl can also be used directly from within your Java, PHP, Perl, Ruby or libcurl can also be used directly from within your Java, PHP, Perl, Ruby or
Tcl programs as well, look elsewhere for documentation on this! Tcl programs as well, look elsewhere for documentation on this!
When using libcurl's easy interface, you init your session and get a handle, All applications that use libcurl should call \fIcurl_global_init()\fP exactly
which you use as input to the following interface functions you use. Use once before any libcurl function can be used. After all usage of libcurl is
.B curl_easy_init() complete, it \fBmust\fP call \fIcurl_global_cleanup()\fP. In between those two
calls, you can use libcurl as described below.
When using libcurl you init your session and get a handle, which you use as
input to the following interface functions you use. Use \fIcurl_easy_init()\fP
to get the handle. to get the handle.
You continue by setting all the options you want in the upcoming transfer, You continue by setting all the options you want in the upcoming transfer,
most important among them is the URL itself (you can't transfer anything most important among them is the URL itself (you can't transfer anything
without a specified URL as you may have figured out yourself). You might want without a specified URL as you may have figured out yourself). You might want
to set some callbacks as well that will be called from the library when data to set some callbacks as well that will be called from the library when data
is available etc. is available etc. \fIcurl_easy_setopt()\fP is there for this.
.B curl_easy_setopt()
is there for this.
When all is setup, you tell libcurl to perform the transfer using When all is setup, you tell libcurl to perform the transfer using
.B curl_easy_perform(). \fIcurl_easy_perform()\fP. It will then do the entire operation and won't
It will then do the entire operation and won't return until it is done return until it is done (successfully or not).
(successfully or not).
After the transfer has been made, you can set new options and make another After the transfer has been made, you can set new options and make another
transfer, or if you're done, cleanup the session by calling transfer, or if you're done, cleanup the session by calling
.B curl_easy_cleanup(). \fIcurl_easy_cleanup()\fP. If you want persistant connections, you don't
If you want persistant connections, you don't cleanup immediately, but instead cleanup immediately, but instead run ahead and perform other transfers using
run ahead and perform other transfers using the same handle. See the chapter the same handle. See the chapter below for Persistant Connections.
below for Persistant Connections.
There is also a series of other helpful functions to use. They are: There is also a series of other helpful functions to use. They are:
@@ -64,6 +64,12 @@ builds a linked list
.TP .TP
.B curl_slist_free_all() .B curl_slist_free_all()
frees a whole curl_slist frees a whole curl_slist
.TP
.B curl_mprintf()
portable printf() functions
.TP
.B curl_strequal()
portable case insensitive string comparisons
.RE .RE
.SH "LINKING WITH LIBCURL" .SH "LINKING WITH LIBCURL"
@@ -120,5 +126,5 @@ Note that the options set with curl_easy_setopt() will be used in on every
repeat curl_easy_perform() call repeat curl_easy_perform() call
.SH "COMPATIBILITY WITH OLDER LIBCURLS" .SH "COMPATIBILITY WITH OLDER LIBCURLS"
Repeated curl_easy_perform() calls on the same handle were not supported in Repeated curl_easy_perform() calls on the same handle were not supported in
pre-7.7 versions, and caused confusion and defined behaviour. pre-7.7 versions, and caused confusion and undefined behaviour.

View File

@@ -76,12 +76,12 @@ typedef int (*curl_progress_callback)(void *clientp,
typedef size_t (*curl_write_callback)(char *buffer, typedef size_t (*curl_write_callback)(char *buffer,
size_t size, size_t size,
size_t nitems, size_t nitems,
FILE *outstream); void *outstream);
typedef size_t (*curl_read_callback)(char *buffer, typedef size_t (*curl_read_callback)(char *buffer,
size_t size, size_t size,
size_t nitems, size_t nitems,
FILE *instream); void *instream);
typedef int (*curl_passwd_callback)(void *clientp, typedef int (*curl_passwd_callback)(void *clientp,
char *prompt, char *prompt,
@@ -146,11 +146,17 @@ typedef enum {
CURLE_TOO_MANY_REDIRECTS , /* 47 - catch endless re-direct loops */ CURLE_TOO_MANY_REDIRECTS , /* 47 - catch endless re-direct loops */
CURLE_UNKNOWN_TELNET_OPTION, /* 48 - User specified an unknown option */ CURLE_UNKNOWN_TELNET_OPTION, /* 48 - User specified an unknown option */
CURLE_TELNET_OPTION_SYNTAX , /* 49 - Malformed telnet option */ CURLE_TELNET_OPTION_SYNTAX , /* 49 - Malformed telnet option */
CURLE_ALREADY_COMPLETE, /* 50 - file to dowload is already complete */ CURLE_OBSOLETE, /* 50 - removed after 7.7.3 */
CURLE_SSL_PEER_CERTIFICATE, /* 51 - peer's certificate wasn't ok */
CURL_LAST /* never use! */ CURL_LAST /* never use! */
} CURLcode; } CURLcode;
/* this was the error code 50 in 7.7.3 and a few earlier versions, this
is no longer used by libcurl but is instead #defined here only to not
make programs break */
#define CURLE_ALREADY_COMPLETE 99999
/* This is just to make older programs not break: */ /* This is just to make older programs not break: */
#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE #define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE
@@ -173,7 +179,7 @@ typedef enum {
typedef enum { typedef enum {
CINIT(NOTHING, LONG, 0), /********* the first one is unused ************/ CINIT(NOTHING, LONG, 0), /********* the first one is unused ************/
/* This is the FILE * the regular output should be written to. */ /* This is the FILE * or void * the regular output should be written to. */
CINIT(FILE, OBJECTPOINT, 1), CINIT(FILE, OBJECTPOINT, 1),
/* The full URL to get/put */ /* The full URL to get/put */
@@ -276,7 +282,8 @@ typedef enum {
/* send linked-list of QUOTE commands */ /* send linked-list of QUOTE commands */
CINIT(QUOTE, OBJECTPOINT, 28), CINIT(QUOTE, OBJECTPOINT, 28),
/* send FILE * to store headers to */ /* send FILE * or void * to store headers to, if you use a callback it
is simply passed to the callback unmodified */
CINIT(WRITEHEADER, OBJECTPOINT, 29), CINIT(WRITEHEADER, OBJECTPOINT, 29),
#ifdef MULTIDOC #ifdef MULTIDOC
@@ -344,7 +351,8 @@ typedef enum {
CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */ CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */
CINIT(PUT, LONG, 54), /* PUT the input file */ CINIT(PUT, LONG, 54), /* PUT the input file */
CINIT(MUTE, LONG, 55), /* force NOPROGRESS */
CINIT(MUTE, LONG, 55), /* OBSOLETE OPTION, removed in 7.8 */
/* Function that will be called instead of the internal progress display /* Function that will be called instead of the internal progress display
* function. This function should be defined as the curl_progress_callback * function. This function should be defined as the curl_progress_callback
@@ -485,9 +493,19 @@ char *curl_version(void);
char *curl_escape(char *string, int length); char *curl_escape(char *string, int length);
char *curl_unescape(char *string, int length); char *curl_unescape(char *string, int length);
/* curl_global_init() should be invoked exactly once for each application that
uses libcurl */
CURLcode curl_global_init(long flags);
/* curl_global_cleanup() should be invoked exactly once for each application
that uses libcurl */
void curl_global_cleanup(void);
/* This is the version number */ /* This is the version number */
#define LIBCURL_VERSION "7.7.2" #define LIBCURL_VERSION "7.8"
#define LIBCURL_VERSION_NUM 0x070702 #define LIBCURL_VERSION_NUM 0x070800
/* 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 {
@@ -556,6 +574,10 @@ typedef enum {
CURLCLOSEPOLICY_LAST /* last, never use this */ CURLCLOSEPOLICY_LAST /* last, never use this */
} curl_closepolicy; } curl_closepolicy;
#define CURL_GLOBAL_SSL (1<<0)
#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL)
#define CURL_GLOBAL_NOTHING 0
#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@@ -6,7 +6,9 @@
Java Interface Java Interface
This is very much work in progress and it does not work. This is not a complete implementation of a libcurl interface. I've made the
core work and it needs additional code to be added to get the rest of the
stuff supported.
The interface is not set yet, bring your suggestions! The interface is not set yet, bring your suggestions!

View File

@@ -16,7 +16,7 @@ lib_LTLIBRARIES = libcurl.la
INCLUDES = -I$(top_srcdir)/include INCLUDES = -I$(top_srcdir)/include
libcurl_la_LDFLAGS = -version-info 2:0:0 libcurl_la_LDFLAGS = -version-info 2:0:1
# This flag accepts an argument of the form current[:revision[:age]]. So, # This flag accepts an argument of the form current[:revision[:age]]. So,
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
# 1. # 1.
@@ -59,7 +59,7 @@ escape.c mprintf.c telnet.c \
escape.h getpass.c netrc.c telnet.h \ escape.h getpass.c netrc.c telnet.h \
getinfo.c transfer.c strequal.c strequal.h easy.c \ getinfo.c transfer.c strequal.c strequal.h easy.c \
security.h security.c krb4.c krb4.h memdebug.c memdebug.h inet_ntoa_r.h \ security.h security.c krb4.c krb4.h memdebug.c memdebug.h inet_ntoa_r.h \
http_chunks.c http_chunks.h http_chunks.c http_chunks.h strtok.c strtok.h
noinst_HEADERS = setup.h transfer.h noinst_HEADERS = setup.h transfer.h

View File

@@ -33,13 +33,15 @@ libcurl_a_SOURCES = arpa_telnet.h file.c getpass.h netrc.h timeval.c base64.c \
urldata.h transfer.c getdate.h ldap.c ssluse.c version.c transfer.h getenv.c \ urldata.h transfer.c getdate.h ldap.c ssluse.c version.c transfer.h getenv.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
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 \
formdata.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.o \ formdata.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.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
LIBRARIES = $(libcurl_a_LIBRARIES) LIBRARIES = $(libcurl_a_LIBRARIES)
SOURCES = $(libcurl_a_SOURCES) SOURCES = $(libcurl_a_SOURCES)

View File

@@ -60,7 +60,8 @@ RELEASE_OBJS= \
getinfor.obj \ getinfor.obj \
versionr.obj \ versionr.obj \
easyr.obj \ easyr.obj \
strequalr.obj strequalr.obj \
strtokr.obj
DEBUG_OBJS= \ DEBUG_OBJS= \
base64d.obj \ base64d.obj \
@@ -91,7 +92,8 @@ DEBUG_OBJS= \
getinfod.obj \ getinfod.obj \
versiond.obj \ versiond.obj \
easyd.obj \ easyd.obj \
strequald.obj strequald.obj \
strtokd.obj
RELEASE_SSL_OBJS= \ RELEASE_SSL_OBJS= \
base64rs.obj \ base64rs.obj \
@@ -122,7 +124,8 @@ RELEASE_SSL_OBJS= \
getinfors.obj \ getinfors.obj \
versionrs.obj \ versionrs.obj \
easyrs.obj \ easyrs.obj \
strequalrs.obj strequalrs.obj \
strtokd.obj
LINK_OBJS= \ LINK_OBJS= \
base64.obj \ base64.obj \
@@ -153,7 +156,8 @@ LINK_OBJS= \
getinfo.obj \ getinfo.obj \
version.obj \ version.obj \
easy.obj \ easy.obj \
strequal.obj strequal.obj \
strtok.obj
all : release all : release
@@ -225,6 +229,8 @@ easyr.obj: easy.c
$(CCR) $(CFLAGS) easy.c $(CCR) $(CFLAGS) easy.c
strequalr.obj: strequal.c strequalr.obj: strequal.c
$(CCR) $(CFLAGS) strequal.c $(CCR) $(CFLAGS) strequal.c
strtokr.obj:strtok.c
$(CCR) $(CFLAGS) strtok.c
## Debug ## Debug
base64d.obj: base64.c base64d.obj: base64.c
@@ -285,7 +291,8 @@ easyd.obj: easy.c
$(CCD) $(CFLAGS) easy.c $(CCD) $(CFLAGS) easy.c
strequald.obj: strequal.c strequald.obj: strequal.c
$(CCD) $(CFLAGS) strequal.c $(CCD) $(CFLAGS) strequal.c
strtokd.obj:strtok.c
$(CCR) $(CFLAGS) strtok.c
## Release SSL ## Release SSL
base64rs.obj: base64.c base64rs.obj: base64.c
@@ -346,6 +353,8 @@ easyrs.obj: easy.c
$(CCRS) $(CFLAGS) easy.c $(CCRS) $(CFLAGS) easy.c
strequalrs.obj: strequal.c strequalrs.obj: strequal.c
$(CCRS) $(CFLAGS) strequal.c $(CCRS) $(CFLAGS) strequal.c
strtokrs.obj:strtok.c
$(CCR) $(CFLAGS) strtok.c
clean: clean:

View File

@@ -86,6 +86,7 @@ Example set of cookies:
#include "cookie.h" #include "cookie.h"
#include "getdate.h" #include "getdate.h"
#include "strequal.h" #include "strequal.h"
#include "strtok.h"
/* The last #include file should be: */ /* The last #include file should be: */
#ifdef MALLOCDEBUG #ifdef MALLOCDEBUG
@@ -199,6 +200,7 @@ Curl_cookie_add(struct CookieInfo *c,
/* This line is NOT a HTTP header style line, we do offer support for /* This line is NOT a HTTP header style line, we do offer support for
reading the odd netscape cookies-file format here */ reading the odd netscape cookies-file format here */
char *firstptr; char *firstptr;
char *tok_buf;
int fields; int fields;
if(lineptr[0]=='#') { if(lineptr[0]=='#') {
@@ -214,7 +216,7 @@ Curl_cookie_add(struct CookieInfo *c,
if(ptr) if(ptr)
*ptr=0; /* clear it */ *ptr=0; /* clear it */
firstptr=strtok(lineptr, "\t"); /* first tokenize it on the TAB */ firstptr=strtok_r(lineptr, "\t", &tok_buf); /* first tokenize it on the TAB */
/* Here's a quick check to eliminate normal HTTP-headers from this */ /* Here's a quick check to eliminate normal HTTP-headers from this */
if(!firstptr || strchr(firstptr, ':')) { if(!firstptr || strchr(firstptr, ':')) {
@@ -224,17 +226,38 @@ Curl_cookie_add(struct CookieInfo *c,
/* Now loop through the fields and init the struct we already have /* Now loop through the fields and init the struct we already have
allocated */ allocated */
for(ptr=firstptr, fields=0; ptr; ptr=strtok(NULL, "\t"), fields++) { for(ptr=firstptr, fields=0; ptr; ptr=strtok_r(NULL, "\t", &tok_buf), fields++) {
switch(fields) { switch(fields) {
case 0: case 0:
co->domain = strdup(ptr); co->domain = strdup(ptr);
break; break;
case 1: case 1:
/* what _is_ this field for? */ /* This field got its explanation on the 23rd of May 2001 by
Andr<64>s Garc<72>a:
flag: A TRUE/FALSE value indicating if all machines within a given
domain can access the variable. This value is set automatically by
the browser, depending on the value you set for the domain.
As far as I can see, it is set to true when the cookie says
.domain.com and to false when the domain is complete www.domain.com
We don't currently take advantage of this knowledge.
*/
break; break;
case 2: case 2:
co->path = strdup(ptr); /* It turns out, that sometimes the file format allows the path
break; field to remain not filled in, we try to detect this and work
around it! Andr<64>s Garc<72>a made us aware of this... */
if (strcmp("TRUE", ptr) && strcmp("FALSE", ptr)) {
/* only if the path doesn't look like a boolean option! */
co->path = strdup(ptr);
break;
}
/* this doesn't look like a path, make one up! */
co->path = strdup("/");
fields++; /* add a field and fall down to secure */
/* FALLTHROUGH */
case 3: case 3:
co->secure = strequal(ptr, "TRUE"); co->secure = strequal(ptr, "TRUE");
break; break;

View File

@@ -209,6 +209,10 @@ SOURCE=.\strequal.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\strtok.c
# End Source File
# Begin Source File
SOURCE=.\telnet.c SOURCE=.\telnet.c
# End Source File # End Source File
# Begin Source File # Begin Source File
@@ -341,6 +345,10 @@ SOURCE=.\strequal.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\strtok.h
# End Source File
# Begin Source File
SOURCE=.\telnet.h SOURCE=.\telnet.h
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@@ -73,16 +73,43 @@
#include "urldata.h" #include "urldata.h"
#include <curl/curl.h> #include <curl/curl.h>
#include "transfer.h" #include "transfer.h"
#include <curl/types.h> #include "ssluse.h"
#define _MPRINTF_REPLACE /* use our functions only */ #define _MPRINTF_REPLACE /* use our functions only */
#include <curl/mprintf.h> #include <curl/mprintf.h>
/* true globals */
static unsigned int initialized = 0;
static long init_flags = 0;
CURLcode curl_global_init(long flags)
{
if(flags & CURL_GLOBAL_SSL)
Curl_SSL_init();
initialized = 1;
init_flags = flags;
return CURLE_OK;
}
void curl_global_cleanup(void)
{
if (init_flags & CURL_GLOBAL_SSL)
Curl_SSL_cleanup();
initialized = 0;
}
CURL *curl_easy_init(void) CURL *curl_easy_init(void)
{ {
CURLcode res; CURLcode res;
struct UrlData *data; struct UrlData *data;
/* Make sure we inited the global SSL stuff */
if (!initialized)
curl_global_init(CURL_GLOBAL_DEFAULT);
/* We use curl_open() with undefined URL so far */ /* We use curl_open() with undefined URL so far */
res = Curl_open((CURL **)&data, NULL); res = Curl_open((CURL **)&data, NULL);
if(res != CURLE_OK) if(res != CURLE_OK)

View File

@@ -634,11 +634,16 @@ int main(int argc, char **argv)
form=Curl_getFormData(httppost, &size); form=Curl_getFormData(httppost, &size);
FormInit(&formread, form); Curl_FormInit(&formread, form);
while(nread = FormReader(buffer, 1, sizeof(buffer), (FILE *)&formread)) { do {
nread = Curl_FormReader(buffer, 1, sizeof(buffer),
(FILE *)&formread);
if(-1 == nread)
break;
fwrite(buffer, nread, 1, stderr); fwrite(buffer, nread, 1, stderr);
} } while(1);
fprintf(stderr, "size: %d\n", size); fprintf(stderr, "size: %d\n", size);

269
lib/ftp.c
View File

@@ -147,6 +147,165 @@ static CURLcode AllowServerConnect(struct UrlData *data,
#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]))
int Curl_GetFTPResponse(int sockfd,
char *buf,
struct connectdata *conn,
int *ftpcode)
{
/* Brand new implementation.
* We cannot read just one byte per read() and then go back to select()
* as it seems that the OpenSSL read() stuff doesn't grok that properly.
*
* Alas, read as much as possible, split up into lines, use the ending
* line in a response or continue reading.
*/
int nread; /* total size read */
int perline; /* count bytes per line */
bool keepon=TRUE;
ssize_t gotbytes;
char *ptr;
int timeout = 3600; /* default timeout in seconds */
struct timeval interval;
fd_set rkeepfd;
fd_set readfd;
struct UrlData *data = conn->data;
char *line_start;
int code;
#define SELECT_OK 0
#define SELECT_ERROR 1
#define SELECT_TIMEOUT 2
int error = SELECT_OK;
if(ftpcode)
*ftpcode=0; /* 0 for errors */
if(data->timeout) {
/* if timeout is requested, find out how much remaining time we have */
timeout = data->timeout - /* timeout time */
(Curl_tvlong(Curl_tvnow()) - Curl_tvlong(conn->now)); /* spent time */
if(timeout <=0 ) {
failf(data, "Transfer aborted due to timeout");
return -SELECT_TIMEOUT; /* already too little time */
}
}
FD_ZERO (&readfd); /* clear it */
FD_SET (sockfd, &readfd); /* read socket */
/* get this in a backup variable to be able to restore it on each lap in the
select() loop */
rkeepfd = readfd;
ptr=buf;
line_start = buf;
nread=0;
perline=0;
keepon=TRUE;
while((nread<BUFSIZE) && (keepon && !error)) {
readfd = rkeepfd; /* set every lap */
interval.tv_sec = timeout;
interval.tv_usec = 0;
switch (select (sockfd+1, &readfd, NULL, NULL, &interval)) {
case -1: /* select() error, stop reading */
error = SELECT_ERROR;
failf(data, "Transfer aborted due to select() error");
break;
case 0: /* timeout */
error = SELECT_TIMEOUT;
failf(data, "Transfer aborted due to timeout");
break;
default:
/*
* 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
* that this is still ok and then remove this comment!
*/
if(CURLE_OK != Curl_read(conn, sockfd, ptr, BUFSIZE-nread, &gotbytes))
keepon = FALSE;
else if(gotbytes <= 0) {
keepon = FALSE;
error = SELECT_ERROR;
failf(data, "Connection aborted");
}
else {
/* we got a whole chunk of data, which can be anything from one
* byte to a set of lines and possible just a piece of the last
* line */
int i;
nread += gotbytes;
for(i=0; i< gotbytes; ptr++, i++) {
perline++;
if(*ptr=='\n') {
/* a newline is CRLF in ftp-talk, so the CR is ignored as
the line isn't really terminated until the LF comes */
/* output debug output if that is requested */
if(data->bits.verbose) {
fputs("< ", data->err);
fwrite(line_start, 1, perline, data->err);
/* no need to output LF here, it is part of the data */
}
if(perline>3 && lastline(line_start)) {
/* This is the end of the last line, copy the last
* line to the start of the buffer and zero terminate,
* for old times sake (and krb4)! */
char *moo;
int i;
for(moo=line_start, i=0; moo<ptr; moo++, i++)
buf[i] = *moo;
moo[i]=0; /* zero terminate */
keepon=FALSE;
break;
}
perline=0; /* line starts over here */
line_start = ptr+1;
}
}
}
break;
} /* switch */
} /* while there's buffer left and loop is requested */
if(!error)
code = atoi(buf);
#if KRB4
/* handle the security-oriented responses 6xx ***/
/* FIXME: some errorchecking perhaps... ***/
switch(code) {
case 631:
sec_read_msg(conn, buf, prot_safe);
break;
case 632:
sec_read_msg(conn, buf, prot_private);
break;
case 633:
sec_read_msg(conn, buf, prot_confidential);
break;
default:
/* normal ftp stuff we pass through! */
break;
}
#endif
if(error)
return -error;
if(ftpcode)
*ftpcode=code; /* return the initial number like this */
return nread; /* total amount of bytes read */
}
#if 0
/* /*
* We allow the ftpcode pointer to be NULL if no reply integer is wanted * We allow the ftpcode pointer to be NULL if no reply integer is wanted
*/ */
@@ -157,6 +316,7 @@ int Curl_GetFTPResponse(int sockfd, char *buf,
{ {
int nread; int nread;
ssize_t keepon=TRUE; ssize_t keepon=TRUE;
size_t got;
char *ptr; char *ptr;
int timeout = 3600; /* in seconds */ int timeout = 3600; /* in seconds */
struct timeval interval; struct timeval interval;
@@ -260,6 +420,7 @@ int Curl_GetFTPResponse(int sockfd, char *buf,
return nread; return nread;
} }
#endif
/* -- who are we? -- */ /* -- who are we? -- */
char *Curl_getmyhost(char *buf, int buf_size) char *Curl_getmyhost(char *buf, int buf_size)
@@ -320,8 +481,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
if(conn->protocol & PROT_FTPS) { if(conn->protocol & PROT_FTPS) {
/* FTPS is simply ftp with SSL for the control channel */ /* FTPS is simply ftp with SSL for the control channel */
/* now, perform the SSL initialization for this socket */ /* now, perform the SSL initialization for this socket */
if(Curl_SSLConnect(conn)) result = Curl_SSLConnect(conn);
return CURLE_SSL_CONNECT_ERROR; if(result)
return result;
} }
@@ -494,11 +656,14 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
failf(data, "Received only partial file"); failf(data, "Received only partial file");
return CURLE_PARTIAL_FILE; return CURLE_PARTIAL_FILE;
} }
else if(!data->bits.no_body && (0 == *ftp->bytecountp)) { else if(!conn->bits.resume_done &&
!data->bits.no_body &&
(0 == *ftp->bytecountp)) {
failf(data, "No data was received!"); failf(data, "No data was received!");
return CURLE_FTP_COULDNT_RETR_FILE; return CURLE_FTP_COULDNT_RETR_FILE;
} }
} }
#ifdef KRB4 #ifdef KRB4
sec_fflush_fd(conn, conn->secondarysocket); sec_fflush_fd(conn, conn->secondarysocket);
#endif #endif
@@ -506,7 +671,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
sclose(conn->secondarysocket); sclose(conn->secondarysocket);
conn->secondarysocket = -1; conn->secondarysocket = -1;
if(!data->bits.no_body) { if(!data->bits.no_body && !conn->bits.resume_done) {
/* now let's see what the server says about the transfer we /* now let's see what the server says about the transfer we
just performed: */ just performed: */
nread = Curl_GetFTPResponse(conn->firstsocket, buf, conn, &ftpcode); nread = Curl_GetFTPResponse(conn->firstsocket, buf, conn, &ftpcode);
@@ -520,6 +685,8 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
} }
} }
conn->bits.resume_done = FALSE; /* clean this for next connection */
/* Send any post-transfer QUOTE strings? */ /* Send any post-transfer QUOTE strings? */
if(data->postquote) { if(data->postquote) {
qitem = data->postquote; qitem = data->postquote;
@@ -687,35 +854,34 @@ CURLcode _ftp(struct connectdata *conn)
if(nread < 0) if(nread < 0)
return CURLE_OPERATION_TIMEOUTED; return CURLE_OPERATION_TIMEOUTED;
if(ftpcode != 213) { if(ftpcode == 213) {
failf(data, "Couldn't get file size: %s", buf+4);
return CURLE_FTP_COULDNT_GET_SIZE;
}
/* get the size from the ascii string: */
filesize = atoi(buf+4);
sprintf(buf, "Content-Length: %d\r\n", filesize); /* get the size from the ascii string: */
result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0); filesize = atoi(buf+4);
if(result)
return result;
#ifdef HAVE_STRFTIME sprintf(buf, "Content-Length: %d\r\n", filesize);
if(data->bits.get_filetime && data->progress.filetime) {
struct tm *tm;
#ifdef HAVE_LOCALTIME_R
struct tm buffer;
tm = (struct tm *)localtime_r(&data->progress.filetime, &buffer);
#else
tm = localtime(&data->progress.filetime);
#endif
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
strftime(buf, BUFSIZE-1, "Last-Modified: %a, %d %b %Y %H:%M:%S %Z\r\n",
tm);
result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0); result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0);
if(result) if(result)
return result; return result;
}
#ifdef HAVE_STRFTIME
if(data->bits.get_filetime && data->progress.filetime) {
struct tm *tm;
#ifdef HAVE_LOCALTIME_R
struct tm buffer;
tm = (struct tm *)localtime_r(&data->progress.filetime, &buffer);
#else
tm = localtime(&data->progress.filetime);
#endif #endif
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
strftime(buf, BUFSIZE-1, "Last-Modified: %a, %d %b %Y %H:%M:%S %Z\r\n",
tm);
result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0);
if(result)
return result;
}
#endif
}
return CURLE_OK; return CURLE_OK;
} }
@@ -734,8 +900,8 @@ CURLcode _ftp(struct connectdata *conn)
#else #else
const int niflags = NI_NUMERICHOST | NI_NUMERICSERV; const int niflags = NI_NUMERICHOST | NI_NUMERICSERV;
#endif #endif
char *ap; unsigned char *ap;
char *pp; unsigned char *pp;
int alen, plen; int alen, plen;
char portmsgbuf[4096], tmp[4096]; char portmsgbuf[4096], tmp[4096];
@@ -802,17 +968,17 @@ CURLcode _ftp(struct connectdata *conn)
switch (sa->sa_family) { switch (sa->sa_family) {
case AF_INET: case AF_INET:
ap = (char *)&((struct sockaddr_in *)&ss)->sin_addr; ap = (unsigned char *)&((struct sockaddr_in *)&ss)->sin_addr;
alen = sizeof(((struct sockaddr_in *)&ss)->sin_addr); alen = sizeof(((struct sockaddr_in *)&ss)->sin_addr);
pp = (char *)&((struct sockaddr_in *)&ss)->sin_port; pp = (unsigned char *)&((struct sockaddr_in *)&ss)->sin_port;
plen = sizeof(((struct sockaddr_in *)&ss)->sin_port); plen = sizeof(((struct sockaddr_in *)&ss)->sin_port);
lprtaf = 4; lprtaf = 4;
eprtaf = 1; eprtaf = 1;
break; break;
case AF_INET6: case AF_INET6:
ap = (char *)&((struct sockaddr_in6 *)&ss)->sin6_addr; ap = (unsigned char *)&((struct sockaddr_in6 *)&ss)->sin6_addr;
alen = sizeof(((struct sockaddr_in6 *)&ss)->sin6_addr); alen = sizeof(((struct sockaddr_in6 *)&ss)->sin6_addr);
pp = (char *)&((struct sockaddr_in6 *)&ss)->sin6_port; pp = (unsigned char *)&((struct sockaddr_in6 *)&ss)->sin6_port;
plen = sizeof(((struct sockaddr_in6 *)&ss)->sin6_port); plen = sizeof(((struct sockaddr_in6 *)&ss)->sin6_port);
lprtaf = 6; lprtaf = 6;
eprtaf = 2; eprtaf = 2;
@@ -837,7 +1003,8 @@ CURLcode _ftp(struct connectdata *conn)
} }
ftpsendf(conn->firstsocket, conn, "%s |%d|%s|%s|", *modep, eprtaf, ftpsendf(conn->firstsocket, conn, "%s |%d|%s|%s|", *modep, eprtaf,
portmsgbuf, tmp); portmsgbuf, tmp);
} else if (strcmp(*modep, "LPRT") == 0 || strcmp(*modep, "PORT") == 0) { } else if (strcmp(*modep, "LPRT") == 0 ||
strcmp(*modep, "PORT") == 0) {
int i; int i;
if (strcmp(*modep, "LPRT") == 0 && lprtaf < 0) if (strcmp(*modep, "LPRT") == 0 && lprtaf < 0)
@@ -849,7 +1016,7 @@ CURLcode _ftp(struct connectdata *conn)
if (strcmp(*modep, "LPRT") == 0) { if (strcmp(*modep, "LPRT") == 0) {
snprintf(tmp, sizeof(tmp), "%d,%d", lprtaf, alen); snprintf(tmp, sizeof(tmp), "%d,%d", lprtaf, alen);
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) { if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
goto again; continue;
} }
} }
for (i = 0; i < alen; i++) { for (i = 0; i < alen; i++) {
@@ -858,18 +1025,18 @@ CURLcode _ftp(struct connectdata *conn)
else else
snprintf(tmp, sizeof(tmp), "%u", ap[i]); snprintf(tmp, sizeof(tmp), "%u", ap[i]);
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) { if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
goto again; continue;
} }
} }
if (strcmp(*modep, "LPRT") == 0) { if (strcmp(*modep, "LPRT") == 0) {
snprintf(tmp, sizeof(tmp), ",%d", plen); snprintf(tmp, sizeof(tmp), ",%d", plen);
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf))
goto again; continue;
} }
for (i = 0; i < plen; i++) { for (i = 0; i < plen; i++) {
snprintf(tmp, sizeof(tmp), ",%u", pp[i]); snprintf(tmp, sizeof(tmp), ",%u", pp[i]);
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) { if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
goto again; continue;
} }
} }
ftpsendf(conn->firstsocket, conn, "%s %s", *modep, portmsgbuf); ftpsendf(conn->firstsocket, conn, "%s %s", *modep, portmsgbuf);
@@ -1005,6 +1172,7 @@ again:;
} }
else { /* we use the PASV command */ else { /* we use the PASV command */
#if 0 #if 0
/* no support for IPv6 passive mode yet */
char *mode[] = { "EPSV", "LPSV", "PASV", NULL }; char *mode[] = { "EPSV", "LPSV", "PASV", NULL };
int results[] = { 229, 228, 227, 0 }; int results[] = { 229, 228, 227, 0 };
#else #else
@@ -1338,8 +1506,17 @@ again:;
data->infilesize -= conn->resume_from; data->infilesize -= conn->resume_from;
if(data->infilesize <= 0) { if(data->infilesize <= 0) {
failf(data, "File already completely uploaded\n"); infof(data, "File already completely uploaded\n");
return CURLE_FTP_COULDNT_STOR_FILE;
/* no data to transfer */
result=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
/* Set resume done so that we won't get any error in
* Curl_ftp_done() because we didn't transfer the amount of bytes
* that the local file file obviously is */
conn->bits.resume_done = TRUE;
return CURLE_OK;
} }
} }
/* we've passed, proceed as normal */ /* we've passed, proceed as normal */
@@ -1516,8 +1693,16 @@ again:;
} }
if (downloadsize == 0) { if (downloadsize == 0) {
failf(data, "File already complete"); /* no data to transfer */
return CURLE_ALREADY_COMPLETE; result=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
infof(data, "File already completely downloaded\n");
/* Set resume done so that we won't get any error in Curl_ftp_done()
* because we didn't transfer the amount of bytes that the remote
* file obviously is */
conn->bits.resume_done = TRUE;
return CURLE_OK;
} }
/* Set resume file transfer offset */ /* Set resume file transfer offset */

View File

@@ -32,18 +32,14 @@
** This code is in the public domain and has no copyright. ** This code is in the public domain and has no copyright.
*/ */
#include "setup.h"
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include "config.h" # include "config.h"
# ifdef HAVE_ALLOCA_H # ifdef HAVE_ALLOCA_H
# include <alloca.h> # include <alloca.h>
# endif # endif
# ifdef NEED_REENTRANT
# define _REENTRANT /* Necessary to use in Solaris, since the silly guys at
Sun made the localtime_r() prototype dependent on it
(or _POSIX_C_SOURCE or _POSIX_PTHREAD_SEMANTICS) */
# endif
# ifdef HAVE_TIME_H # ifdef HAVE_TIME_H
# include <time.h> # include <time.h>
# endif # endif
@@ -227,7 +223,7 @@ static int yyRelSeconds;
static int yyRelYear; static int yyRelYear;
#line 210 "getdate.y" #line 206 "getdate.y"
typedef union { typedef union {
int Number; int Number;
enum _MERIDIAN Meridian; enum _MERIDIAN Meridian;
@@ -310,11 +306,11 @@ static const short yyrhs[] = { -1,
#if YYDEBUG != 0 #if YYDEBUG != 0
static const short yyrline[] = { 0, static const short yyrline[] = { 0,
226, 227, 230, 233, 236, 239, 242, 245, 248, 254, 222, 223, 226, 229, 232, 235, 238, 241, 244, 250,
260, 269, 275, 287, 290, 293, 299, 303, 307, 313, 256, 265, 271, 283, 286, 289, 295, 299, 303, 309,
317, 335, 341, 347, 351, 356, 360, 367, 375, 378, 313, 331, 337, 343, 347, 352, 356, 363, 371, 374,
381, 384, 387, 390, 393, 396, 399, 402, 405, 408, 377, 380, 383, 386, 389, 392, 395, 398, 401, 404,
411, 414, 417, 420, 423, 426, 429, 434, 467, 471 407, 410, 413, 416, 419, 422, 425, 430, 463, 467
}; };
#endif #endif
@@ -395,7 +391,7 @@ static const short yycheck[] = { 0,
56 56
}; };
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ /* -*-C-*- Note some compilers choke on comments on `#line' lines. */
#line 3 "/usr/lib/bison.simple" #line 3 "/usr/local/share/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,
@@ -609,7 +605,7 @@ __yy_memcpy (char *to, char *from, unsigned int count)
#endif #endif
#endif #endif
#line 217 "/usr/lib/bison.simple" #line 217 "/usr/local/share/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 *.
@@ -938,37 +934,37 @@ yyreduce:
switch (yyn) { switch (yyn) {
case 3: case 3:
#line 230 "getdate.y" #line 226 "getdate.y"
{ {
yyHaveTime++; yyHaveTime++;
; ;
break;} break;}
case 4: case 4:
#line 233 "getdate.y" #line 229 "getdate.y"
{ {
yyHaveZone++; yyHaveZone++;
; ;
break;} break;}
case 5: case 5:
#line 236 "getdate.y" #line 232 "getdate.y"
{ {
yyHaveDate++; yyHaveDate++;
; ;
break;} break;}
case 6: case 6:
#line 239 "getdate.y" #line 235 "getdate.y"
{ {
yyHaveDay++; yyHaveDay++;
; ;
break;} break;}
case 7: case 7:
#line 242 "getdate.y" #line 238 "getdate.y"
{ {
yyHaveRel++; yyHaveRel++;
; ;
break;} break;}
case 9: case 9:
#line 248 "getdate.y" #line 244 "getdate.y"
{ {
yyHour = yyvsp[-1].Number; yyHour = yyvsp[-1].Number;
yyMinutes = 0; yyMinutes = 0;
@@ -977,7 +973,7 @@ case 9:
; ;
break;} break;}
case 10: case 10:
#line 254 "getdate.y" #line 250 "getdate.y"
{ {
yyHour = yyvsp[-3].Number; yyHour = yyvsp[-3].Number;
yyMinutes = yyvsp[-1].Number; yyMinutes = yyvsp[-1].Number;
@@ -986,7 +982,7 @@ case 10:
; ;
break;} break;}
case 11: case 11:
#line 260 "getdate.y" #line 256 "getdate.y"
{ {
yyHour = yyvsp[-3].Number; yyHour = yyvsp[-3].Number;
yyMinutes = yyvsp[-1].Number; yyMinutes = yyvsp[-1].Number;
@@ -998,7 +994,7 @@ case 11:
; ;
break;} break;}
case 12: case 12:
#line 269 "getdate.y" #line 265 "getdate.y"
{ {
yyHour = yyvsp[-5].Number; yyHour = yyvsp[-5].Number;
yyMinutes = yyvsp[-3].Number; yyMinutes = yyvsp[-3].Number;
@@ -1007,7 +1003,7 @@ case 12:
; ;
break;} break;}
case 13: case 13:
#line 275 "getdate.y" #line 271 "getdate.y"
{ {
yyHour = yyvsp[-5].Number; yyHour = yyvsp[-5].Number;
yyMinutes = yyvsp[-3].Number; yyMinutes = yyvsp[-3].Number;
@@ -1020,53 +1016,53 @@ case 13:
; ;
break;} break;}
case 14: case 14:
#line 287 "getdate.y" #line 283 "getdate.y"
{ {
yyTimezone = yyvsp[0].Number; yyTimezone = yyvsp[0].Number;
; ;
break;} break;}
case 15: case 15:
#line 290 "getdate.y" #line 286 "getdate.y"
{ {
yyTimezone = yyvsp[0].Number - 60; yyTimezone = yyvsp[0].Number - 60;
; ;
break;} break;}
case 16: case 16:
#line 294 "getdate.y" #line 290 "getdate.y"
{ {
yyTimezone = yyvsp[-1].Number - 60; yyTimezone = yyvsp[-1].Number - 60;
; ;
break;} break;}
case 17: case 17:
#line 299 "getdate.y" #line 295 "getdate.y"
{ {
yyDayOrdinal = 1; yyDayOrdinal = 1;
yyDayNumber = yyvsp[0].Number; yyDayNumber = yyvsp[0].Number;
; ;
break;} break;}
case 18: case 18:
#line 303 "getdate.y" #line 299 "getdate.y"
{ {
yyDayOrdinal = 1; yyDayOrdinal = 1;
yyDayNumber = yyvsp[-1].Number; yyDayNumber = yyvsp[-1].Number;
; ;
break;} break;}
case 19: case 19:
#line 307 "getdate.y" #line 303 "getdate.y"
{ {
yyDayOrdinal = yyvsp[-1].Number; yyDayOrdinal = yyvsp[-1].Number;
yyDayNumber = yyvsp[0].Number; yyDayNumber = yyvsp[0].Number;
; ;
break;} break;}
case 20: case 20:
#line 313 "getdate.y" #line 309 "getdate.y"
{ {
yyMonth = yyvsp[-2].Number; yyMonth = yyvsp[-2].Number;
yyDay = yyvsp[0].Number; yyDay = yyvsp[0].Number;
; ;
break;} break;}
case 21: case 21:
#line 317 "getdate.y" #line 313 "getdate.y"
{ {
/* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY. /* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.
The goal in recognizing YYYY/MM/DD is solely to support legacy The goal in recognizing YYYY/MM/DD is solely to support legacy
@@ -1087,7 +1083,7 @@ case 21:
; ;
break;} break;}
case 22: case 22:
#line 335 "getdate.y" #line 331 "getdate.y"
{ {
/* ISO 8601 format. yyyy-mm-dd. */ /* ISO 8601 format. yyyy-mm-dd. */
yyYear = yyvsp[-2].Number; yyYear = yyvsp[-2].Number;
@@ -1096,7 +1092,7 @@ case 22:
; ;
break;} break;}
case 23: case 23:
#line 341 "getdate.y" #line 337 "getdate.y"
{ {
/* e.g. 17-JUN-1992. */ /* e.g. 17-JUN-1992. */
yyDay = yyvsp[-2].Number; yyDay = yyvsp[-2].Number;
@@ -1105,14 +1101,14 @@ case 23:
; ;
break;} break;}
case 24: case 24:
#line 347 "getdate.y" #line 343 "getdate.y"
{ {
yyMonth = yyvsp[-1].Number; yyMonth = yyvsp[-1].Number;
yyDay = yyvsp[0].Number; yyDay = yyvsp[0].Number;
; ;
break;} break;}
case 25: case 25:
#line 351 "getdate.y" #line 347 "getdate.y"
{ {
yyMonth = yyvsp[-3].Number; yyMonth = yyvsp[-3].Number;
yyDay = yyvsp[-2].Number; yyDay = yyvsp[-2].Number;
@@ -1120,14 +1116,14 @@ case 25:
; ;
break;} break;}
case 26: case 26:
#line 356 "getdate.y" #line 352 "getdate.y"
{ {
yyMonth = yyvsp[0].Number; yyMonth = yyvsp[0].Number;
yyDay = yyvsp[-1].Number; yyDay = yyvsp[-1].Number;
; ;
break;} break;}
case 27: case 27:
#line 360 "getdate.y" #line 356 "getdate.y"
{ {
yyMonth = yyvsp[-1].Number; yyMonth = yyvsp[-1].Number;
yyDay = yyvsp[-2].Number; yyDay = yyvsp[-2].Number;
@@ -1135,7 +1131,7 @@ case 27:
; ;
break;} break;}
case 28: case 28:
#line 367 "getdate.y" #line 363 "getdate.y"
{ {
yyRelSeconds = -yyRelSeconds; yyRelSeconds = -yyRelSeconds;
yyRelMinutes = -yyRelMinutes; yyRelMinutes = -yyRelMinutes;
@@ -1146,115 +1142,115 @@ case 28:
; ;
break;} break;}
case 30: case 30:
#line 378 "getdate.y" #line 374 "getdate.y"
{ {
yyRelYear += yyvsp[-1].Number * yyvsp[0].Number; yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 31: case 31:
#line 381 "getdate.y" #line 377 "getdate.y"
{ {
yyRelYear += yyvsp[-1].Number * yyvsp[0].Number; yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 32: case 32:
#line 384 "getdate.y" #line 380 "getdate.y"
{ {
yyRelYear += yyvsp[0].Number; yyRelYear += yyvsp[0].Number;
; ;
break;} break;}
case 33: case 33:
#line 387 "getdate.y" #line 383 "getdate.y"
{ {
yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number; yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 34: case 34:
#line 390 "getdate.y" #line 386 "getdate.y"
{ {
yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number; yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 35: case 35:
#line 393 "getdate.y" #line 389 "getdate.y"
{ {
yyRelMonth += yyvsp[0].Number; yyRelMonth += yyvsp[0].Number;
; ;
break;} break;}
case 36: case 36:
#line 396 "getdate.y" #line 392 "getdate.y"
{ {
yyRelDay += yyvsp[-1].Number * yyvsp[0].Number; yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 37: case 37:
#line 399 "getdate.y" #line 395 "getdate.y"
{ {
yyRelDay += yyvsp[-1].Number * yyvsp[0].Number; yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 38: case 38:
#line 402 "getdate.y" #line 398 "getdate.y"
{ {
yyRelDay += yyvsp[0].Number; yyRelDay += yyvsp[0].Number;
; ;
break;} break;}
case 39: case 39:
#line 405 "getdate.y" #line 401 "getdate.y"
{ {
yyRelHour += yyvsp[-1].Number * yyvsp[0].Number; yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 40: case 40:
#line 408 "getdate.y" #line 404 "getdate.y"
{ {
yyRelHour += yyvsp[-1].Number * yyvsp[0].Number; yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 41: case 41:
#line 411 "getdate.y" #line 407 "getdate.y"
{ {
yyRelHour += yyvsp[0].Number; yyRelHour += yyvsp[0].Number;
; ;
break;} break;}
case 42: case 42:
#line 414 "getdate.y" #line 410 "getdate.y"
{ {
yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number; yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 43: case 43:
#line 417 "getdate.y" #line 413 "getdate.y"
{ {
yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number; yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 44: case 44:
#line 420 "getdate.y" #line 416 "getdate.y"
{ {
yyRelMinutes += yyvsp[0].Number; yyRelMinutes += yyvsp[0].Number;
; ;
break;} break;}
case 45: case 45:
#line 423 "getdate.y" #line 419 "getdate.y"
{ {
yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number; yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 46: case 46:
#line 426 "getdate.y" #line 422 "getdate.y"
{ {
yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number; yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
; ;
break;} break;}
case 47: case 47:
#line 429 "getdate.y" #line 425 "getdate.y"
{ {
yyRelSeconds += yyvsp[0].Number; yyRelSeconds += yyvsp[0].Number;
; ;
break;} break;}
case 48: case 48:
#line 435 "getdate.y" #line 431 "getdate.y"
{ {
if (yyHaveTime && yyHaveDate && !yyHaveRel) if (yyHaveTime && yyHaveDate && !yyHaveRel)
yyYear = yyvsp[0].Number; yyYear = yyvsp[0].Number;
@@ -1287,20 +1283,20 @@ case 48:
; ;
break;} break;}
case 49: case 49:
#line 468 "getdate.y" #line 464 "getdate.y"
{ {
yyval.Meridian = MER24; yyval.Meridian = MER24;
; ;
break;} break;}
case 50: case 50:
#line 472 "getdate.y" #line 468 "getdate.y"
{ {
yyval.Meridian = yyvsp[0].Meridian; yyval.Meridian = yyvsp[0].Meridian;
; ;
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/lib/bison.simple" #line 543 "/usr/local/share/bison.simple"
yyvsp -= yylen; yyvsp -= yylen;
yyssp -= yylen; yyssp -= yylen;
@@ -1520,7 +1516,7 @@ yyerrhandle:
} }
return 1; return 1;
} }
#line 477 "getdate.y" #line 473 "getdate.y"
/* Include this file down here because bison inserts code above which /* Include this file down here because bison inserts code above which

View File

@@ -8,18 +8,14 @@
** This code is in the public domain and has no copyright. ** This code is in the public domain and has no copyright.
*/ */
#include "setup.h"
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include "config.h" # include "config.h"
# ifdef HAVE_ALLOCA_H # ifdef HAVE_ALLOCA_H
# include <alloca.h> # include <alloca.h>
# endif # endif
# ifdef NEED_REENTRANT
# define _REENTRANT /* Necessary to use in Solaris, since the silly guys at
Sun made the localtime_r() prototype dependent on it
(or _POSIX_C_SOURCE or _POSIX_PTHREAD_SEMANTICS) */
# endif
# ifdef HAVE_TIME_H # ifdef HAVE_TIME_H
# include <time.h> # include <time.h>
# endif # endif

View File

@@ -123,7 +123,6 @@ struct hostent *Curl_gethost(struct UrlData *data,
int ret; /* this variable is unused on several platforms but used on some */ int ret; /* this variable is unused on several platforms but used on some */
#define CURL_NAMELOOKUP_SIZE 9000 #define CURL_NAMELOOKUP_SIZE 9000
/* Allocate enough memory to hold the full name information structs and /* Allocate enough memory to hold the full name information structs and
* everything. OSF1 is known to require at least 8872 bytes. The buffer * everything. OSF1 is known to require at least 8872 bytes. The buffer
* required for storing all possible aliases and IP numbers is according to * required for storing all possible aliases and IP numbers is according to
@@ -133,6 +132,8 @@ struct hostent *Curl_gethost(struct UrlData *data,
return NULL; /* major failure */ return NULL; /* major failure */
*bufp = buf; *bufp = buf;
ret = 0; /* to prevent the compiler warning */
if ( (in=inet_addr(hostname)) != INADDR_NONE ) { if ( (in=inet_addr(hostname)) != INADDR_NONE ) {
struct in_addr *addrentry; struct in_addr *addrentry;

View File

@@ -34,13 +34,6 @@
#include <errno.h> #include <errno.h>
#ifdef NEED_REENTRANT
#define _REENTRANT /* Necessary to use in Solaris, since the silly guys at Sun
made the localtime_r() prototype dependent on it (or
_POSIX_C_SOURCE or _POSIX_PTHREAD_SEMANTICS). */
#endif
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
#include <winsock.h> #include <winsock.h>
#include <time.h> #include <time.h>
@@ -336,8 +329,9 @@ CURLcode Curl_http_connect(struct connectdata *conn)
} }
/* now, perform the SSL initialization for this socket */ /* now, perform the SSL initialization for this socket */
if(Curl_SSLConnect(conn)) result = Curl_SSLConnect(conn);
return CURLE_SSL_CONNECT_ERROR; if(result)
return result;
} }
if(conn->bits.user_passwd && !data->bits.this_is_a_follow) { if(conn->bits.user_passwd && !data->bits.this_is_a_follow) {
@@ -718,8 +712,7 @@ CURLcode Curl_http(struct connectdata *conn)
http->storefread = data->fread; /* backup */ http->storefread = data->fread; /* backup */
http->in = data->in; /* backup */ http->in = data->in; /* backup */
data->fread = data->fread = (curl_read_callback)
(size_t (*)(char *, size_t, size_t, FILE *))
Curl_FormReader; /* set the read function to read from the Curl_FormReader; /* set the read function to read from the
generated form data */ generated form data */
data->in = (FILE *)&http->form; data->in = (FILE *)&http->form;

View File

@@ -34,10 +34,6 @@
#if ! defined(WIN32) && ! defined(__BEOS__) && !defined(__CYGWIN32__) #if ! defined(WIN32) && ! defined(__BEOS__) && !defined(__CYGWIN32__)
#ifdef NEED_REENTRANT
#define _REENTRANT
#endif
#ifdef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif

View File

@@ -81,8 +81,8 @@ struct krb4_data {
}; };
#ifndef HAVE_STRLCPY #ifndef HAVE_STRLCPY
/* if it ever goes non-static, make it Curl_ prefixed! */
size_t static size_t
strlcpy (char *dst, const char *src, size_t dst_sz) strlcpy (char *dst, const char *src, size_t dst_sz)
{ {
size_t n; size_t n;

View File

@@ -13,20 +13,23 @@ EXPORTS
curl_easy_perform @ 4 ; curl_easy_perform @ 4 ;
curl_easy_setopt @ 5 ; curl_easy_setopt @ 5 ;
curl_escape @ 6 ; curl_escape @ 6 ;
curl_formparse @ 7 ; curl_unescape @ 7;
curl_formfree @ 8 ; curl_formparse @ 8 ;
curl_getdate @ 9 ; curl_formfree @ 9 ;
curl_getenv @ 10 ; curl_getdate @ 10 ;
curl_slist_append @ 11 ; curl_getenv @ 11 ;
curl_slist_free_all @ 12 ; curl_global_cleanup @ 12 ;
curl_unescape @ 13 ; curl_global_init @ 13 ;
curl_version @ 14 ; curl_slist_append @ 14 ;
curl_maprintf @ 15 ; curl_slist_free_all @ 15 ;
curl_mfprintf @ 16 ; curl_unescape @ 16 ;
curl_mprintf @ 17 ; curl_version @ 17 ;
curl_msprintf @ 18 ; curl_maprintf @ 18 ;
curl_msnprintf @ 19 ; curl_mfprintf @ 19 ;
curl_mvfprintf @ 20 ; curl_mprintf @ 20 ;
curl_strequal @ 21 ; curl_msprintf @ 21 ;
curl_strnequal @ 22 ; curl_msnprintf @ 22 ;
curl_mvfprintf @ 23 ;
curl_strequal @ 24 ;
curl_strnequal @ 25 ;

View File

@@ -41,6 +41,7 @@
#include <curl/curl.h> #include <curl/curl.h>
#include "strequal.h" #include "strequal.h"
#include "strtok.h"
/* The last #include file should be: */ /* The last #include file should be: */
#ifdef MALLOCDEBUG #ifdef MALLOCDEBUG
@@ -111,8 +112,9 @@ int Curl_parsenetrc(char *host,
file = fopen(netrcbuffer, "r"); file = fopen(netrcbuffer, "r");
if(file) { if(file) {
char *tok; char *tok;
char *tok_buf;
while(fgets(netrcbuffer, sizeof(netrcbuffer), file)) { while(fgets(netrcbuffer, sizeof(netrcbuffer), file)) {
tok=strtok(netrcbuffer, " \t\n"); tok=strtok_r(netrcbuffer, " \t\n", &tok_buf);
while(tok) { while(tok) {
switch(state) { switch(state) {
case NOTHING: case NOTHING:
@@ -163,7 +165,7 @@ int Curl_parsenetrc(char *host,
} }
break; break;
} /* switch (state) */ } /* switch (state) */
tok = strtok(NULL, " \t\n"); tok = strtok_r(NULL, " \t\n", &tok_buf);
} /* while (tok) */ } /* while (tok) */
} /* while fgets() */ } /* while fgets() */

View File

@@ -142,11 +142,6 @@ void Curl_failf(struct UrlData *data, char *fmt, ...)
va_start(ap, fmt); va_start(ap, fmt);
if(data->errorbuffer) if(data->errorbuffer)
vsnprintf(data->errorbuffer, CURL_ERROR_SIZE, fmt, ap); vsnprintf(data->errorbuffer, CURL_ERROR_SIZE, fmt, ap);
else if(!data->bits.mute) {
/* no errorbuffer receives this, write to data->err instead */
vfprintf(data->err, fmt, ap);
fprintf(data->err, "\n");
}
va_end(ap); va_end(ap);
} }

View File

@@ -44,6 +44,14 @@
typedef char bool; typedef char bool;
#endif /* (rabe) */ #endif /* (rabe) */
#ifdef NEED_REENTRANT
/* Solaris machines needs _REENTRANT set for a few function prototypes and
things to appear in the #include files. We need to #define it before all
#include files */
#define _REENTRANT
#endif
#include <stdio.h> #include <stdio.h>
#ifndef OS #ifndef OS
#ifdef WIN32 #ifdef WIN32

View File

@@ -37,6 +37,11 @@
#ifdef USE_SSLEAY #ifdef USE_SSLEAY
#include <openssl/rand.h> #include <openssl/rand.h>
/* The last #include file should be: */
#ifdef MALLOCDEBUG
#include "memdebug.h"
#endif
static char global_passwd[64]; static char global_passwd[64];
static int passwd_callback(char *buf, int num, int verify static int passwd_callback(char *buf, int num, int verify
@@ -230,10 +235,54 @@ int cert_verify_callback(int ok, X509_STORE_CTX *ctx)
#endif #endif
#ifdef USE_SSLEAY
/* "global" init done? */
static int init_ssl=0;
#endif
/* Global init */
void Curl_SSL_init(void)
{
#ifdef USE_SSLEAY
/* make sure this is only done once */
if(0 != init_ssl)
return;
init_ssl++; /* never again */
/* Lets get nice error messages */
SSL_load_error_strings();
/* Setup all the global SSL stuff */
SSLeay_add_ssl_algorithms();
#endif
}
/* Global cleanup */
void Curl_SSL_cleanup(void)
{
#ifdef USE_SSLEAY
if(init_ssl) {
/* only cleanup if we did a previous init */
/* Free the SSL error strings */
ERR_free_strings();
/* EVP_cleanup() removes all ciphers and digests from the
table. */
EVP_cleanup();
}
#endif
}
/* ====================================================== */ /* ====================================================== */
int CURLcode
Curl_SSLConnect(struct connectdata *conn) Curl_SSLConnect(struct connectdata *conn)
{ {
CURLcode retcode = CURLE_OK;
#ifdef USE_SSLEAY #ifdef USE_SSLEAY
struct UrlData *data = conn->data; struct UrlData *data = conn->data;
int err; int err;
@@ -243,15 +292,9 @@ Curl_SSLConnect(struct connectdata *conn)
/* mark this is being ssl enabled from here on out. */ /* mark this is being ssl enabled from here on out. */
conn->ssl.use = TRUE; conn->ssl.use = TRUE;
/* Lets get nice error messages */
SSL_load_error_strings();
/* Make funny stuff to get random input */ /* Make funny stuff to get random input */
random_the_seed(conn); random_the_seed(conn);
/* Setup all the global SSL stuff */
SSLeay_add_ssl_algorithms();
switch(data->ssl.version) { switch(data->ssl.version) {
default: default:
req_method = SSLv23_client_method(); req_method = SSLv23_client_method();
@@ -268,13 +311,13 @@ Curl_SSLConnect(struct connectdata *conn)
if(!conn->ssl.ctx) { if(!conn->ssl.ctx) {
failf(data, "SSL: couldn't create a context!"); failf(data, "SSL: couldn't create a context!");
return 1; return CURLE_OUT_OF_MEMORY;
} }
if(data->cert) { if(data->cert) {
if (!cert_stuff(conn, data->cert, data->cert)) { if (!cert_stuff(conn, data->cert, data->cert)) {
failf(data, "couldn't use certificate!\n"); failf(data, "couldn't use certificate!\n");
return 2; return CURLE_SSL_CONNECT_ERROR;
} }
} }
@@ -287,7 +330,7 @@ Curl_SSLConnect(struct connectdata *conn)
data->ssl.CAfile, data->ssl.CAfile,
data->ssl.CApath)) { data->ssl.CApath)) {
failf(data,"error setting cerficate verify locations\n"); failf(data,"error setting cerficate verify locations\n");
return 2; return CURLE_SSL_CONNECT_ERROR;
} }
} }
else else
@@ -307,7 +350,7 @@ Curl_SSLConnect(struct connectdata *conn)
if (-1 == err) { if (-1 == err) {
err = ERR_get_error(); err = ERR_get_error();
failf(data, "SSL: %s", ERR_error_string(err, NULL)); failf(data, "SSL: %s", ERR_error_string(err, NULL));
return 10; return CURLE_SSL_CONNECT_ERROR;
} }
/* Informational message */ /* Informational message */
@@ -323,7 +366,7 @@ Curl_SSLConnect(struct connectdata *conn)
conn->ssl.server_cert = SSL_get_peer_certificate (conn->ssl.handle); conn->ssl.server_cert = SSL_get_peer_certificate (conn->ssl.handle);
if(!conn->ssl.server_cert) { if(!conn->ssl.server_cert) {
failf(data, "SSL: couldn't get peer certificate!"); failf(data, "SSL: couldn't get peer certificate!");
return 3; return CURLE_SSL_PEER_CERTIFICATE;
} }
infof (data, "Server certificate:\n"); infof (data, "Server certificate:\n");
@@ -331,7 +374,7 @@ Curl_SSLConnect(struct connectdata *conn)
NULL, 0); NULL, 0);
if(!str) { if(!str) {
failf(data, "SSL: couldn't get X509-subject!"); failf(data, "SSL: couldn't get X509-subject!");
return 4; return CURLE_SSL_CONNECT_ERROR;
} }
infof(data, "\t subject: %s\n", str); infof(data, "\t subject: %s\n", str);
CRYPTO_free(str); CRYPTO_free(str);
@@ -340,7 +383,7 @@ Curl_SSLConnect(struct connectdata *conn)
NULL, 0); NULL, 0);
if(!str) { if(!str) {
failf(data, "SSL: couldn't get X509-issuer name!"); failf(data, "SSL: couldn't get X509-issuer name!");
return 5; return CURLE_SSL_CONNECT_ERROR;
} }
infof(data, "\t issuer: %s\n", str); infof(data, "\t issuer: %s\n", str);
CRYPTO_free(str); CRYPTO_free(str);
@@ -350,7 +393,9 @@ Curl_SSLConnect(struct connectdata *conn)
if(data->ssl.verifypeer) { if(data->ssl.verifypeer) {
data->ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle); data->ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle);
infof(data, "Verify result: %d\n", data->ssl.certverifyresult); failf(data, "SSL certificate verify result: %d\n",
data->ssl.certverifyresult);
retcode = CURLE_SSL_PEER_CERTIFICATE;
} }
else else
data->ssl.certverifyresult=0; data->ssl.certverifyresult=0;
@@ -360,5 +405,5 @@ Curl_SSLConnect(struct connectdata *conn)
/* this is for "-ansi -Wall -pedantic" to stop complaining! (rabe) */ /* this is for "-ansi -Wall -pedantic" to stop complaining! (rabe) */
(void) conn; (void) conn;
#endif #endif
return 0; return retcode;
} }

View File

@@ -23,5 +23,9 @@
* $Id$ * $Id$
*****************************************************************************/ *****************************************************************************/
#include "urldata.h" #include "urldata.h"
int Curl_SSLConnect(struct connectdata *conn); CURLcode Curl_SSLConnect(struct connectdata *conn);
/* Global SSL init */
void Curl_SSL_init(void);
/* Global SSL cleanup */
void Curl_SSL_cleanup(void);
#endif #endif

View File

@@ -80,7 +80,7 @@ int curl_strnequal(const char *first, const char *second, size_t max)
* *
* *
*/ */
size_t strlcat(char *dst, const char *src, size_t siz) size_t Curl_strlcat(char *dst, const char *src, size_t siz)
{ {
char *d = dst; char *d = dst;
const char *s = src; const char *s = src;

View File

@@ -33,7 +33,8 @@ int curl_strnequal(const char *first, const char *second, size_t max);
#define strnequal(a,b,c) curl_strnequal(a,b,c) #define strnequal(a,b,c) curl_strnequal(a,b,c)
#ifndef HAVE_STRLCAT #ifndef HAVE_STRLCAT
size_t strlcat(char *dst, const char *src, size_t siz); #define strlcat(x,y,z) Curl_strlcat(x,y,z)
size_t Curl_strlcat(char *dst, const char *src, size_t siz);
#endif #endif
#endif #endif

128
lib/strtok.c Normal file
View File

@@ -0,0 +1,128 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* In order to be useful for every potential user, 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.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
* $Id$
*****************************************************************************/
#include "setup.h"
#ifndef HAVE_STRTOK_R
/*
* Copyright (c) 1998 Softweyr LLC. All rights reserved.
*
* strtok_r, from Berkeley strtok
* Oct 13, 1998 by Wes Peters <wes@softweyr.com>
*
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notices, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notices, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
*
* This product includes software developed by Softweyr LLC, the
* University of California, Berkeley, and its contributors.
*
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY SOFTWEYR LLC, THE REGENTS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTWEYR LLC, THE
* REGENTS, OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stddef.h>
char *
Curl_strtok_r(char *s, const char *delim, char **last)
{
char *spanp;
int c, sc;
char *tok;
if (s == NULL && (s = *last) == NULL) {
return NULL;
}
/*
* Skip (span) leading delimiters (s += strspn(s, delim), sort of).
*/
cont:
c = *s++;
for (spanp = (char *)delim; (sc = *spanp++) != 0; ) {
if (c == sc) {
goto cont;
}
}
if (c == 0) { /* no non-delimiter characters */
*last = NULL;
return NULL;
}
tok = s - 1;
/*
* Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
* Note that delim must have one NUL; we stop if we see that, too.
*/
for (;;) {
c = *s++;
spanp = (char *)delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0) {
s = NULL;
}
else {
char *w = s - 1;
*w = '\0';
}
*last = s;
return tok;
}
}
while (sc != 0);
}
/* NOTREACHED */
}
#endif

38
lib/strtok.h Normal file
View File

@@ -0,0 +1,38 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* In order to be useful for every potential user, 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.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
* $Id$
*****************************************************************************/
#ifndef _CURL_STRTOK_R_H
#define _CURL_STRTOK_R_H
#include "setup.h"
#include <stddef.h>
#ifndef HAVE_STRTOK_R
char *Curl_strtok_r(char *s, const char *delim, char **last);
#define strtok_r Curl_strtok_r
#else
#include <string.h>
#endif
#endif

View File

@@ -103,8 +103,74 @@
#define min(a, b) ((a) < (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b))
#endif #endif
/* Parts of this function was written by the friendly Mark Butler /*
<butlerm@xmission.com>. */ * compareheader()
*
* Returns TRUE if 'headerline' contains the 'header' with given 'content'.
* Pass headers WITH the colon.
*/
static bool
compareheader(char *headerline, /* line to check */
char *header, /* header keyword _with_ colon */
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, return false and bail out! */
return FALSE;
}
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 */
}
/*
* Transfer()
*
* This function is what performs the actual transfer. It is capable of
* doing both ways simultaneously.
* The transfer must already have been setup by a call to Curl_Transfer().
*
* Note that headers are created in a preallocated buffer of a default size.
* That buffer can be enlarged on demand, but it is never shrinken again.
*
* Parts of this function was once written by the friendly Mark Butler
* <butlerm@xmission.com>.
*/
CURLcode static CURLcode static
Transfer(struct connectdata *c_conn) Transfer(struct connectdata *c_conn)
@@ -262,6 +328,10 @@ Transfer(struct connectdata *c_conn)
/* copy what is remaining into headerbuff */ /* copy what is remaining into headerbuff */
int str_length = (int)strlen(str); int str_length = (int)strlen(str);
/*
* We enlarge the header buffer if it seems to be too
* smallish
*/
if (hbuflen + (int)str_length >= data->headersize) { if (hbuflen + (int)str_length >= data->headersize) {
char *newbuff; char *newbuff;
long newsize=MAX((hbuflen+str_length)*3/2, long newsize=MAX((hbuflen+str_length)*3/2,
@@ -284,6 +354,12 @@ Transfer(struct connectdata *c_conn)
str = end_ptr + 1; /* move just past new line */ str = end_ptr + 1; /* move just past new line */
/*
* We're about to copy a chunk of data to the end of the
* already received header. We make sure that the full string
* fit in the allocated header buffer, or else we enlarge
* it.
*/
if (hbuflen + (str - str_start) >= data->headersize) { if (hbuflen + (str - str_start) >= data->headersize) {
char *newbuff; char *newbuff;
long newsize=MAX((hbuflen+(str-str_start))*3/2, long newsize=MAX((hbuflen+(str-str_start))*3/2,
@@ -307,23 +383,17 @@ Transfer(struct connectdata *c_conn)
p = data->headerbuff; p = data->headerbuff;
/* we now have a full line that p points to */ /****
if (('\n' == *p) || ('\r' == *p)) { * We now have a FULL header line that p points to
/* Zero-length line means end of header! */ *****/
#if 0
if (-1 != conn->size) /* if known */
conn->size += bytecount; /* we append the already read
size */
#endif
if (('\n' == *p) || ('\r' == *p)) {
/* Zero-length header line means end of headers! */
if ('\r' == *p) if ('\r' == *p)
p++; /* pass the \r byte */ p++; /* pass the \r byte */
if ('\n' == *p) if ('\n' == *p)
p++; /* pass the \n byte */ p++; /* pass the \n byte */
#if 0 /* headers are not included in the size */
Curl_pgrsSetDownloadSize(data, conn->size);
#endif
if(100 == httpcode) { if(100 == httpcode) {
/* /*
@@ -354,13 +424,29 @@ Transfer(struct connectdata *c_conn)
if(!header) { if(!header) {
/* /*
* end-of-headers. * really end-of-headers.
* *
* If we requested a "no body", this is a good time to get * If we requested a "no body", this is a good time to get
* out and return home. * out and return home.
*/ */
if(data->bits.no_body) if(data->bits.no_body)
return CURLE_OK; return CURLE_OK;
if(!conn->bits.close) {
/* If this is not the last request before a close, we must
set the maximum download size to the size of the
expected document or else, we won't know when to stop
reading! */
if(-1 != conn->size)
conn->maxdownload = conn->size;
/* If max download size is *zero* (nothing) we already
have nothing and can safely return ok now! */
if(0 == conn->maxdownload)
return CURLE_OK;
/* What to do if the size is *not* known? */
}
break; /* exit header line loop */ break; /* exit header line loop */
} }
@@ -371,11 +457,18 @@ Transfer(struct connectdata *c_conn)
continue; continue;
} }
/*
* Checks for special headers coming up.
*/
if (!headerline++) { if (!headerline++) {
/* This is the first header, it MUST be the error code line /* This is the first header, it MUST be the error code line
or else we consiser this to be the body right away! */ or else we consiser this to be the body right away! */
if (2 == sscanf (p, " HTTP/1.%d %3d", &httpversion, if (2 == sscanf (p, " HTTP/1.%d %3d", &httpversion,
&httpcode)) { &httpcode)) {
data->progress.httpcode = httpcode;
data->progress.httpversion = httpversion;
/* 404 -> URL not found! */ /* 404 -> URL not found! */
if ( if (
( ((data->bits.http_follow_location) && ( ((data->bits.http_follow_location) &&
@@ -390,13 +483,21 @@ Transfer(struct connectdata *c_conn)
failf (data, "The requested file was not found"); failf (data, "The requested file was not found");
return CURLE_HTTP_NOT_FOUND; return CURLE_HTTP_NOT_FOUND;
} }
data->progress.httpcode = httpcode;
data->progress.httpversion = httpversion;
if(httpversion == 0) if(httpversion == 0)
/* Default action for HTTP/1.0 must be to close, unless /* Default action for HTTP/1.0 must be to close, unless
we get one of those fancy headers that tell us the we get one of those fancy headers that tell us the
server keeps it open for us! */ server keeps it open for us! */
conn->bits.close = TRUE; conn->bits.close = TRUE;
if (httpcode == 304)
/* (quote from RFC2616, section 10.3.5):
* The 304 response MUST NOT contain a
* message-body, and thus is always
* terminated by the first empty line
* after the header fields.
*/
conn->size=0;
} }
else { else {
header = FALSE; /* this is not a header line */ header = FALSE; /* this is not a header line */
@@ -404,15 +505,14 @@ Transfer(struct connectdata *c_conn)
} }
} }
/* check for Content-Length: header lines to get size */ /* check for Content-Length: header lines to get size */
if (strnequal("Content-Length", p, 14) && if (strnequal("Content-Length:", p, 15) &&
sscanf (p+14, ": %ld", &contentlength)) { sscanf (p+15, " %ld", &contentlength)) {
conn->size = contentlength; conn->size = contentlength;
Curl_pgrsSetDownloadSize(data, contentlength); Curl_pgrsSetDownloadSize(data, contentlength);
} }
else if((httpversion == 0) && else if((httpversion == 0) &&
conn->bits.httpproxy && conn->bits.httpproxy &&
strnequal("Proxy-Connection: keep-alive", p, compareheader(p, "Proxy-Connection:", "keep-alive")) {
strlen("Proxy-Connection: keep-alive"))) {
/* /*
* When a HTTP/1.0 reply comes when using a proxy, the * When a HTTP/1.0 reply comes when using a proxy, the
* 'Proxy-Connection: keep-alive' line tells us the * 'Proxy-Connection: keep-alive' line tells us the
@@ -423,8 +523,7 @@ Transfer(struct connectdata *c_conn)
infof(data, "HTTP/1.0 proxy connection set to keep alive!\n"); infof(data, "HTTP/1.0 proxy connection set to keep alive!\n");
} }
else if((httpversion == 0) && else if((httpversion == 0) &&
strnequal("Connection: keep-alive", p, compareheader(p, "Connection:", "keep-alive")) {
strlen("Connection: keep-alive"))) {
/* /*
* A HTTP/1.0 reply with the 'Connection: keep-alive' line * A HTTP/1.0 reply with the 'Connection: keep-alive' line
* tells us the connection will be kept alive for our * tells us the connection will be kept alive for our
@@ -434,8 +533,7 @@ Transfer(struct connectdata *c_conn)
conn->bits.close = FALSE; /* don't close when done */ conn->bits.close = FALSE; /* don't close when done */
infof(data, "HTTP/1.0 connection set to keep alive!\n"); infof(data, "HTTP/1.0 connection set to keep alive!\n");
} }
else if (strnequal("Connection: close", p, else if (compareheader(p, "Connection:", "close")) {
strlen("Connection: close"))) {
/* /*
* [RFC 2616, section 8.1.2.1] * [RFC 2616, section 8.1.2.1]
* "Connection: close" is HTTP/1.1 language and means that * "Connection: close" is HTTP/1.1 language and means that
@@ -444,8 +542,7 @@ Transfer(struct connectdata *c_conn)
*/ */
conn->bits.close = TRUE; /* close when done */ conn->bits.close = TRUE; /* close when done */
} }
else if (strnequal("Transfer-Encoding: chunked", p, else if (compareheader(p, "Transfer-Encoding:", "chunked")) {
strlen("Transfer-Encoding: chunked"))) {
/* /*
* [RFC 2616, section 3.6.1] A 'chunked' transfer encoding * [RFC 2616, section 3.6.1] A 'chunked' transfer encoding
* means that the server will send a series of "chunks". Each * means that the server will send a series of "chunks". Each
@@ -459,9 +556,9 @@ Transfer(struct connectdata *c_conn)
/* init our chunky engine */ /* init our chunky engine */
Curl_httpchunk_init(conn); Curl_httpchunk_init(conn);
} }
else if (strnequal("Content-Range", p, 13)) { else if (strnequal("Content-Range:", p, 14)) {
if (sscanf (p+13, ": bytes %d-", &offset) || if (sscanf (p+14, " bytes %d-", &offset) ||
sscanf (p+13, ": bytes: %d-", &offset)) { sscanf (p+14, " bytes: %d-", &offset)) {
/* This second format was added August 1st 2000 by Igor /* This second format was added August 1st 2000 by Igor
Khristophorov since Sun's webserver JavaWebServer/1.1.1 Khristophorov since Sun's webserver JavaWebServer/1.1.1
obviously sends the header this way! :-( */ obviously sends the header this way! :-( */
@@ -472,7 +569,7 @@ Transfer(struct connectdata *c_conn)
} }
} }
else if(data->cookies && else if(data->cookies &&
strnequal("Set-Cookie: ", p, 11)) { strnequal("Set-Cookie:", p, 11)) {
Curl_cookie_add(data->cookies, TRUE, &p[12]); Curl_cookie_add(data->cookies, TRUE, &p[12]);
} }
else if(strnequal("Last-Modified:", p, else if(strnequal("Last-Modified:", p,
@@ -485,14 +582,20 @@ Transfer(struct connectdata *c_conn)
} }
else if ((httpcode >= 300 && httpcode < 400) && else if ((httpcode >= 300 && httpcode < 400) &&
(data->bits.http_follow_location) && (data->bits.http_follow_location) &&
strnequal("Location: ", p, 10)) { strnequal("Location:", p, 9)) {
/* this is the URL that the server advices us to get instead */ /* this is the URL that the server advices us to get instead */
char *ptr; char *ptr;
char *start=p; char *start=p;
char backup; char backup;
start += 10; /* pass "Location: " */ start += 9; /* pass "Location:" */
/* Skip spaces and tabs. We do this to support multiple
white spaces after the "Location:" keyword. */
while(*start && isspace((int)*start ))
start++;
ptr = start; /* start scanning here */ ptr = start; /* start scanning here */
/* scan through the string to find the end */ /* scan through the string to find the end */
while(*ptr && !isspace((int)*ptr)) while(*ptr && !isspace((int)*ptr))
ptr++; ptr++;
@@ -502,6 +605,10 @@ Transfer(struct connectdata *c_conn)
*ptr = backup; /* restore ending letter */ *ptr = backup; /* restore ending letter */
} }
/*
* End of header-checks. Write them to the client.
*/
writetype = CLIENTWRITE_HEADER; writetype = CLIENTWRITE_HEADER;
if (data->bits.http_include_header) if (data->bits.http_include_header)
writetype |= CLIENTWRITE_BODY; writetype |= CLIENTWRITE_BODY;
@@ -583,16 +690,6 @@ Transfer(struct connectdata *c_conn)
} /* two valid time strings */ } /* two valid time strings */
} /* we have a time condition */ } /* we have a time condition */
if(!conn->bits.close) {
/* If this is not the last request before a close, we must
set the maximum download size to the size of the expected
document or else, we won't know when to stop reading! */
if(-1 != conn->size)
conn->maxdownload = conn->size;
/* What to do if the size is *not* known? */
}
} /* this is HTTP */ } /* this is HTTP */
} /* this is the first time we write a body part */ } /* this is the first time we write a body part */
bodywrites++; bodywrites++;
@@ -622,7 +719,7 @@ Transfer(struct connectdata *c_conn)
/* If it returned OK, we just keep going */ /* If it returned OK, we just keep going */
} }
if(conn->maxdownload && if((-1 != conn->maxdownload) &&
(bytecount + nread >= conn->maxdownload)) { (bytecount + nread >= conn->maxdownload)) {
nread = conn->maxdownload - bytecount; nread = conn->maxdownload - bytecount;
if((signed int)nread < 0 ) /* this should be unusual */ if((signed int)nread < 0 ) /* this should be unusual */
@@ -634,7 +731,7 @@ Transfer(struct connectdata *c_conn)
Curl_pgrsSetDownloadCounter(data, (double)bytecount); Curl_pgrsSetDownloadCounter(data, (double)bytecount);
if(! conn->bits.chunk) { if(!conn->bits.chunk && nread) {
/* If this is chunky transfer, it was already written */ /* If this is chunky transfer, it was already written */
urg = Curl_client_write(data, CLIENTWRITE_BODY, str, nread); urg = Curl_client_write(data, CLIENTWRITE_BODY, str, nread);
if(urg) if(urg)
@@ -719,6 +816,12 @@ Transfer(struct connectdata *c_conn)
} }
} }
} }
/*
* The tranfer has been performed. Just make some general checks before
* returning.
*/
if(!(data->bits.no_body) && contentlength && if(!(data->bits.no_body) && contentlength &&
(bytecount != contentlength)) { (bytecount != contentlength)) {
failf(data, "transfer closed with %d bytes remaining to read", failf(data, "transfer closed with %d bytes remaining to read",
@@ -764,7 +867,14 @@ CURLcode Curl_perform(CURL *curl)
if(res == CURLE_OK) { if(res == CURLE_OK) {
res = Curl_do(conn); res = Curl_do(conn);
if(res == CURLE_OK) { if(res == CURLE_OK) {
if(conn->protocol&PROT_FTPS)
/* FTPS, disable ssl while transfering data */
conn->ssl.use = FALSE;
res = Transfer(conn); /* now fetch that URL please */ res = Transfer(conn); /* now fetch that URL please */
if(conn->protocol&PROT_FTPS)
/* FTPS, enable ssl again after havving transferred data */
conn->ssl.use = TRUE;
if(res == CURLE_OK) { if(res == CURLE_OK) {
/* /*
* We must duplicate the new URL here as the connection data * We must duplicate the new URL here as the connection data
@@ -888,6 +998,7 @@ CURLcode Curl_perform(CURL *curl)
/* TBD: set the URL with curl_setopt() */ /* TBD: set the URL with curl_setopt() */
data->url = newurl; data->url = newurl;
newurl = NULL; /* don't free! */
data->bits.urlstringalloc = TRUE; /* the URL is allocated */ data->bits.urlstringalloc = TRUE; /* the URL is allocated */
@@ -967,7 +1078,6 @@ CURLcode Curl_perform(CURL *curl)
return res; return res;
} }
CURLcode CURLcode
Curl_Transfer(struct connectdata *c_conn, /* connection data */ Curl_Transfer(struct connectdata *c_conn, /* connection data */
int sockfd, /* socket to read from or -1 */ int sockfd, /* socket to read from or -1 */

View File

@@ -35,11 +35,4 @@ Curl_Transfer (struct connectdata *data,
the same we read from. -1 disables */ the same we read from. -1 disables */
long *writebytecountp /* return number of bytes written */ long *writebytecountp /* return number of bytes written */
); );
#ifdef _OLDCURL
/* "hackish" define to make sources compile without too much human editing.
Don't use "Tranfer()" anymore! */
#define Transfer(a,b,c,d,e,f,g) Curl_Transfer(a,b,c,d,e,f,g)
#endif
#endif #endif

View File

@@ -91,6 +91,7 @@
#include "cookie.h" #include "cookie.h"
#include "strequal.h" #include "strequal.h"
#include "escape.h" #include "escape.h"
#include "strtok.h"
/* And now for the protocols */ /* And now for the protocols */
#include "ftp.h" #include "ftp.h"
@@ -216,10 +217,10 @@ CURLcode Curl_open(CURL **curl, char *url)
data->err = stderr; /* default stderr to stderr */ data->err = stderr; /* default stderr to stderr */
/* use fwrite as default function to store output */ /* use fwrite as default function to store output */
data->fwrite = (size_t (*)(char *, size_t, size_t, FILE *))fwrite; data->fwrite = (curl_write_callback)fwrite;
/* use fread as default function to read input */ /* use fread as default function to read input */
data->fread = (size_t (*)(char *, size_t, size_t, FILE *))fread; data->fread = (curl_read_callback)fread;
/* set the default passwd function */ /* set the default passwd function */
data->fpasswd = my_getpass; data->fpasswd = my_getpass;
@@ -230,6 +231,10 @@ CURLcode Curl_open(CURL **curl, char *url)
data->httpreq = HTTPREQ_GET; /* Default HTTP request */ data->httpreq = HTTPREQ_GET; /* Default HTTP request */
/* make libcurl quiet by default: */
data->bits.hide_progress = TRUE; /* CURLOPT_NOPROGRESS changes these */
data->progress.flags |= PGRS_HIDE;
/* create an array with connection data struct pointers */ /* create an array with connection data struct pointers */
data->numconnects = 5; /* hard-coded right now */ data->numconnects = 5; /* hard-coded right now */
data->connects = (struct connectdata **) data->connects = (struct connectdata **)
@@ -362,6 +367,8 @@ CURLcode Curl_setopt(CURL *curl, CURLoption option, ...)
data->bits.hide_progress = va_arg(param, long)?TRUE:FALSE; data->bits.hide_progress = va_arg(param, long)?TRUE:FALSE;
if(data->bits.hide_progress) if(data->bits.hide_progress)
data->progress.flags |= PGRS_HIDE; data->progress.flags |= PGRS_HIDE;
else
data->progress.flags &= ~PGRS_HIDE;
break; break;
case CURLOPT_NOBODY: case CURLOPT_NOBODY:
/* /*
@@ -431,12 +438,15 @@ CURLcode Curl_setopt(CURL *curl, CURLoption option, ...)
if(data->bits.http_put) if(data->bits.http_put)
data->httpreq = HTTPREQ_PUT; data->httpreq = HTTPREQ_PUT;
break; break;
#if 0
/* obsolete stuff, kept here a while for informational purposes */
case CURLOPT_MUTE: case CURLOPT_MUTE:
/* /*
* Stay absolutely quiet. * Stay absolutely quiet.
*/ */
data->bits.mute = va_arg(param, long)?TRUE:FALSE; data->bits.mute = va_arg(param, long)?TRUE:FALSE;
break; break;
#endif
case CURLOPT_TIMECONDITION: case CURLOPT_TIMECONDITION:
/* /*
* Set HTTP time condition. This must be one of the defines in the * Set HTTP time condition. This must be one of the defines in the
@@ -833,6 +843,17 @@ CURLcode Curl_disconnect(struct connectdata *conn)
#ifdef USE_SSLEAY #ifdef USE_SSLEAY
if (conn->ssl.use) { if (conn->ssl.use) {
/*
ERR_remove_state() frees the error queue associated with
thread pid. If pid == 0, the current thread will have its
error queue removed.
Since error queue data structures are allocated
automatically for new threads, they must be freed when
threads are terminated in oder to avoid memory leaks.
*/
ERR_remove_state(0);
if(conn->ssl.handle) { if(conn->ssl.handle) {
(void)SSL_shutdown(conn->ssl.handle); (void)SSL_shutdown(conn->ssl.handle);
SSL_set_connect_state(conn->ssl.handle); SSL_set_connect_state(conn->ssl.handle);
@@ -930,7 +951,7 @@ ConnectionExists(struct UrlData *data,
if(strequal(needle->protostr, check->protostr) && if(strequal(needle->protostr, check->protostr) &&
strequal(needle->name, check->name) && strequal(needle->name, check->name) &&
(needle->port == check->port) ) { (needle->remote_port == check->remote_port) ) {
bool dead; bool dead;
if(strequal(needle->protostr, "FTP")) { if(strequal(needle->protostr, "FTP")) {
/* This is FTP, verify that we're using the same name and /* This is FTP, verify that we're using the same name and
@@ -1364,6 +1385,9 @@ static CURLcode Connect(struct UrlData *data,
conn->bits.user_passwd = data->userpwd?1:0; conn->bits.user_passwd = data->userpwd?1:0;
conn->bits.proxy_user_passwd = data->proxyuserpwd?1:0; conn->bits.proxy_user_passwd = data->proxyuserpwd?1:0;
/* maxdownload must be -1 on init, as 0 is a valid value! */
conn->maxdownload = -1; /* might have been used previously! */
/* Store creation time to help future close decision making */ /* Store creation time to help future close decision making */
conn->created = Curl_tvnow(); conn->created = Curl_tvnow();
@@ -1546,6 +1570,7 @@ static CURLcode Connect(struct UrlData *data,
* checked if the lowercase versions don't exist. * checked if the lowercase versions don't exist.
*/ */
char *no_proxy=NULL; char *no_proxy=NULL;
char *no_proxy_tok_buf;
char *proxy=NULL; char *proxy=NULL;
char proxy_env[128]; char proxy_env[128];
@@ -1557,7 +1582,7 @@ static CURLcode Connect(struct UrlData *data,
/* NO_PROXY wasn't specified or it wasn't just an asterisk */ /* NO_PROXY wasn't specified or it wasn't just an asterisk */
char *nope; char *nope;
nope=no_proxy?strtok(no_proxy, ", "):NULL; nope=no_proxy?strtok_r(no_proxy, ", ", &no_proxy_tok_buf):NULL;
while(nope) { while(nope) {
if(strlen(nope) <= strlen(conn->name)) { if(strlen(nope) <= strlen(conn->name)) {
char *checkn= char *checkn=
@@ -1567,7 +1592,7 @@ static CURLcode Connect(struct UrlData *data,
break; break;
} }
} }
nope=strtok(NULL, ", "); nope=strtok_r(NULL, ", ", &no_proxy_tok_buf);
} }
if(!nope) { if(!nope) {
/* It was not listed as without proxy */ /* It was not listed as without proxy */
@@ -2016,24 +2041,46 @@ static CURLcode Connect(struct UrlData *data,
*/ */
struct connectdata *old_conn = conn; struct connectdata *old_conn = conn;
char *path = old_conn->path; /* setup the current path pointer properly */ char *path = old_conn->path; /* setup the current path pointer properly */
char *ppath = old_conn->ppath; /* this is the modified path pointer */
if(old_conn->proxyhost) if(old_conn->proxyhost)
free(old_conn->proxyhost); free(old_conn->proxyhost);
conn = conn_temp; /* use this connection from now on */ conn = conn_temp; /* use this connection from now on */
free(conn->path); /* free the previous path pointer */
/* we need these pointers if we speak over a proxy */ /* we need these pointers if we speak over a proxy */
conn->name = conn->gname; conn->name = conn->gname;
conn->hostname = old_conn->gname; conn->hostname = old_conn->gname;
conn->path = path; /* use this one */ free(conn->path); /* free the previously allocated path pointer */
conn->ppath = path; /* set this too */
/* 'path' points to the allocated data, 'ppath' may have been advanced
to point somewhere within the 'path' area. */
conn->path = path;
conn->ppath = ppath;
/* re-use init */ /* re-use init */
conn->maxdownload = 0; /* might have been used previously! */
conn->bits.reuse = TRUE; /* yes, we're re-using here */ conn->bits.reuse = TRUE; /* yes, we're re-using here */
conn->bits.chunk = FALSE; /* always assume not chunked unless told
otherwise */
conn->maxdownload = -1; /* might have been used previously! */
free(old_conn); /* we don't need this anymore */ free(old_conn); /* we don't need this anymore */
/*
* If we're doing a resumed transfer, we need to setup our stuff
* properly.
*/
conn->resume_from = data->set_resume_from;
if (conn->resume_from) {
snprintf(resumerange, sizeof(resumerange), "%d-", conn->resume_from);
if (conn->bits.rangestringalloc == TRUE)
free(conn->range);
/* tell ourselves to fetch this range */
conn->range = strdup(resumerange);
conn->bits.use_range = TRUE; /* enable range download */
conn->bits.rangestringalloc = TRUE; /* mark range string allocated */
}
*in_connect = conn; /* return this instead! */ *in_connect = conn; /* return this instead! */
infof(data, "Re-using existing connection! (#%d)\n", conn->connectindex); infof(data, "Re-using existing connection! (#%d)\n", conn->connectindex);
@@ -2223,6 +2270,12 @@ CURLcode Curl_done(struct connectdata *conn)
conn->bits.rangestringalloc = FALSE; conn->bits.rangestringalloc = FALSE;
} }
/* Cleanup possible redirect junk */
if(conn->newurl) {
free(conn->newurl);
conn->newurl = NULL;
}
/* this calls the protocol-specific function pointer previously set */ /* this calls the protocol-specific function pointer previously set */
if(conn->curl_done) if(conn->curl_done)
result = conn->curl_done(conn); result = conn->curl_done(conn);

View File

@@ -148,7 +148,7 @@ struct HTTP {
/* For FORM posting */ /* For FORM posting */
struct Form form; struct Form form;
size_t (*storefread)(char *, size_t , size_t , FILE *); curl_read_callback storefread;
FILE *in; FILE *in;
struct Curl_chunker chunk; struct Curl_chunker chunk;
@@ -188,6 +188,9 @@ struct ConnectBits {
bool use_range; bool use_range;
bool rangestringalloc; /* the range string is malloc()'ed */ bool rangestringalloc; /* the range string is malloc()'ed */
bool resume_done; /* nothing was transfered, resumed transfer already
complete */
}; };
/* /*
@@ -398,7 +401,6 @@ struct Configbits {
bool http_set_referer; bool http_set_referer;
bool http_auto_referer; /* set "correct" referer when following location: */ bool http_auto_referer; /* set "correct" referer when following location: */
bool httpproxy; bool httpproxy;
bool mute;
bool no_body; bool no_body;
bool set_port; bool set_port;
bool set_range; bool set_range;
@@ -456,9 +458,10 @@ struct UrlData {
long header_size; /* size of read header(s) in bytes */ long header_size; /* size of read header(s) in bytes */
long request_size; /* the amount of bytes sent in the request(s) */ long request_size; /* the amount of bytes sent in the request(s) */
FILE *out; /* the fetched file goes here */ void *out; /* the fetched file goes here */
FILE *in; /* the uploaded file is read from here */ void *in; /* the uploaded file is read from here */
FILE *writeheader; /* write the header to this is non-NULL */ void *writeheader; /* write the header to this is non-NULL */
char *url; /* what to get */ char *url; /* what to get */
char *freethis; /* if non-NULL, an allocated string for the URL */ char *freethis; /* if non-NULL, an allocated string for the URL */
long use_port; /* which port to use (when not using default) */ long use_port; /* which port to use (when not using default) */

View File

@@ -41,11 +41,12 @@ char *curl_version(void)
#if (SSLEAY_VERSION_NUMBER >= 0x906000) #if (SSLEAY_VERSION_NUMBER >= 0x906000)
{ {
char sub[2]; char sub[2];
sub[1]='\0';
if(SSLEAY_VERSION_NUMBER&0xff0) { if(SSLEAY_VERSION_NUMBER&0xff0) {
sub[0]=((SSLEAY_VERSION_NUMBER>>4)&0xff) + 'a' -1; sub[0]=((SSLEAY_VERSION_NUMBER>>4)&0xff) + 'a' -1;
} }
else else
sub[0]=0; sub[0]='\0';
sprintf(ptr, " (OpenSSL %lx.%lx.%lx%s)", sprintf(ptr, " (OpenSSL %lx.%lx.%lx%s)",
(SSLEAY_VERSION_NUMBER>>28)&0xf, (SSLEAY_VERSION_NUMBER>>28)&0xf,
@@ -63,11 +64,12 @@ char *curl_version(void)
#else #else
{ {
char sub[2]; char sub[2];
sub[1]='\0';
if(SSLEAY_VERSION_NUMBER&0x0f) { if(SSLEAY_VERSION_NUMBER&0x0f) {
sub[0]=(SSLEAY_VERSION_NUMBER&0x0f) + 'a' -1; sub[0]=(SSLEAY_VERSION_NUMBER&0x0f) + 'a' -1;
} }
else else
sub[0]=0; sub[0]='\0';
sprintf(ptr, " (SSL %x.%x.%x%s)", sprintf(ptr, " (SSL %x.%x.%x%s)",
(SSLEAY_VERSION_NUMBER>>12)&0xff, (SSLEAY_VERSION_NUMBER>>12)&0xff,

2466
ltmain.sh

File diff suppressed because it is too large Load Diff

View File

@@ -73,7 +73,7 @@ if { findprog automake >/dev/null 2>/dev/null; } then
echo "- Could not find or run automake, I hope you know what you're doing!" echo "- Could not find or run automake, I hope you know what you're doing!"
else else
echo "Runs automake --include-deps" echo "Runs automake --include-deps"
automake --include-deps automake --include-deps Makefile
fi fi
############################################################################ ############################################################################

View File

@@ -12,12 +12,21 @@ do {
} }
} while (shift @ARGV); } while (shift @ARGV);
my $maxmem;
sub newtotal {
my ($newtot)=@_;
# count a max here
if($newtot > $maxmem) {
$maxmem= $newtot;
}
}
while(<STDIN>) { while(<STDIN>) {
chomp $_; chomp $_;
$line = $_; $line = $_;
if($verbose) {
print "IN: $line\n";
}
if($line =~ /^MEM ([^:]*):(\d*) (.*)/) { if($line =~ /^MEM ([^:]*):(\d*) (.*)/) {
# generic match for the filename+linenumber # generic match for the filename+linenumber
$source = $1; $source = $1;
@@ -34,17 +43,39 @@ while(<STDIN>) {
print "FREE ERROR: Previously freed at: ".$getmem{$addr}."\n"; print "FREE ERROR: Previously freed at: ".$getmem{$addr}."\n";
} }
else { else {
if(0 && $verbose) {
print "malloc at ".$getmem{$addr}." is freed again at $source:$linenum\n";
}
$totalmem -= $sizeataddr{$addr}; $totalmem -= $sizeataddr{$addr};
newtotal($totalmem);
$frees++;
$sizeataddr{$addr}=-1; # set -1 to mark as freed $sizeataddr{$addr}=-1; # set -1 to mark as freed
$getmem{$addr}="$source:$linenum"; $getmem{$addr}="$source:$linenum";
} }
} }
elsif($function =~ /malloc\((\d*)\) = 0x([0-9a-f]*)/) { elsif($function =~ /malloc\((\d*)\) = 0x([0-9a-f]*)/) {
$size = $1; $size = $1;
$addr = $2; $addr = $2;
if($sizeataddr{$addr}>0) {
# this means weeeeeirdo
print "Fucked up debug compile, rebuild curl now\n";
}
$sizeataddr{$addr}=$size; $sizeataddr{$addr}=$size;
$totalmem += $size; $totalmem += $size;
if(0 && $verbose) {
print "malloc($size) at $source:$linenum\n";
}
newtotal($totalmem);
$mallocs++;
$getmem{$addr}="$source:$linenum"; $getmem{$addr}="$source:$linenum";
} }
elsif($function =~ /realloc\(0x([0-9a-f]*), (\d*)\) = 0x([0-9a-f]*)/) { elsif($function =~ /realloc\(0x([0-9a-f]*), (\d*)\) = 0x([0-9a-f]*)/) {
@@ -58,6 +89,9 @@ while(<STDIN>) {
$totalmem += $newsize; $totalmem += $newsize;
$sizeataddr{$newaddr}=$newsize; $sizeataddr{$newaddr}=$newsize;
newtotal($totalmem);
$reallocs++;
$getmem{$oldaddr}=""; $getmem{$oldaddr}="";
$getmem{$newaddr}="$source:$linenum"; $getmem{$newaddr}="$source:$linenum";
} }
@@ -71,6 +105,9 @@ while(<STDIN>) {
$sizeataddr{$addr}=$size; $sizeataddr{$addr}=$size;
$totalmem += $size; $totalmem += $size;
newtotal($totalmem);
$strdups++;
} }
else { else {
print "Not recognized input line: $function\n"; print "Not recognized input line: $function\n";
@@ -134,9 +171,6 @@ while(<STDIN>) {
else { else {
print "Not recognized prefix line: $line\n"; print "Not recognized prefix line: $line\n";
} }
if($verbose) {
print "TOTAL: $totalmem\n";
}
} }
if($totalmem) { if($totalmem) {
@@ -168,3 +202,12 @@ if($fopens) {
} }
} }
} }
if($verbose) {
print "Mallocs: $mallocs\n",
"Reallocs: $reallocs\n",
"Strdups: $strdups\n",
"Frees: $frees\n";
print "Maximum allocated: $maxmem\n";
}

View File

@@ -1,3 +1,3 @@
SUBDIRS = Win32 Linux SUBDIRS = Win32 Linux Solaris
EXTRA_DIST = README EXTRA_DIST = README

View File

@@ -0,0 +1,39 @@
#
# $Id$
#
PKGADD_PKG="@PKGADD_PKG@"
PKGADD_NAME="@PACKAGE@-@VERSION@ - @PKGADD_NAME@"
PKGADD_VENDOR="@PKGADD_VENDOR@"
PKGADD_ARCH="@host_cpu@"
PKGADD_DESC="@PACKAGE@-@VERSION@ - @PKGADD_NAME@"
PKGADD_CLASSES=none
PKGADD_BASEDIR=/
PKGADD_FILE=${PKGADD_PKG}-@PACKAGE@-@VERSION@-@host@.pkg
package:
if [ ! -f release ]; then echo 0 > release; fi
if [ `find root -newer release -print|wc -l` -gt 0 ]; then expr `cat release` + 1 > release; fi
echo PKG=${PKGADD_PKG} > pkginfo
echo NAME=${PKGADD_NAME} >> pkginfo
echo VENDOR=${PKGADD_VENDOR} >> pkginfo
echo ARCH=${PKGADD_ARCH} >> pkginfo
echo DESC=${PKGADD_DESC} >> pkginfo
echo CLASSES=${PKGADD_CLASSES} >> pkginfo
echo BASEDIR=${PKGADD_BASEDIR} >> pkginfo
echo CATEGORY=application >> pkginfo
echo VERSION=`cat ./release` >> pkginfo
echo > prototype
for subdir in opt var etc usr; \
do if [ -d root/$$subdir ]; then \
pkgproto root/$$subdir=$$subdir >> prototype;\
fi; done
for file in pkginfo preinstall postinstall copyright; \
do if [ -f $$file ]; then \
echo "i $$file=$$file" >> prototype; \
fi; done
rm -rf ./tmp
mkdir ./tmp
pkgmk -o -d ./tmp
pkgtrans -so ./tmp ${top_srcdir}/../${PKGADD_FILE} ${PKGADD_PKG}

View File

@@ -2,6 +2,9 @@ Author: J
DESCRIPTION DESCRIPTION
(If you're only looking for precompiled win32 binaries, go visit
http://curl.haxx.se/download.html)
Packaging of the curl binaries for Win32 should at this point in time be based Packaging of the curl binaries for Win32 should at this point in time be based
on the InfoZip (zip/unzip) archiver family as the de-facto standard for on the InfoZip (zip/unzip) archiver family as the de-facto standard for
Windows archives. A package should contain the main binary curl.exe along with Windows archives. A package should contain the main binary curl.exe along with

View File

@@ -1 +1,2 @@
EXTRA_DIST = README getpageinvar.php simpleget.php simplepost.php EXTRA_DIST = README getpageinvar.php getbinarypageinvar.php simpleget.php \
simplepost.php

View File

@@ -6,6 +6,9 @@
PHP program examples PHP program examples
getbinarypageinvar.php
- Fetch a single URL containing binary data and return it into a variable
getpageinvar.php getpageinvar.php
- Fetch a single URL and return in a variable - Fetch a single URL and return in a variable

View File

@@ -0,0 +1,25 @@
<?php
// Allocate a new cURL handle
$ch = curl_init("http://www.designmultimedia.com/intro.jpg");
if (! $ch) {
die( "Cannot allocate a new PHP-CURL handle" );
}
// We'll be returning this transfer, and the data is binary
// so we don't want to NULL terminate
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
// Grab the jpg and save the contents in the $data variable
$data = curl_exec($ch);
// close the connection
curl_close($ch);
// Set the header to type image/jpeg, since that's what we're
// displaying
header("Content-type: image/jpeg");
// Output the image
print( $data );
?>

View File

@@ -1,10 +1,12 @@
# <?php
# The PHP curl module supports the received page to be returned in a variable //
# if told. // The PHP curl module supports the received page to be returned in a variable
# // if told.
//
$ch = curl_init(); $ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.myurl.com/"); curl_setopt($ch, CURLOPT_URL,"http://www.myurl.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result=curl_exec ($ch); $result=curl_exec ($ch);
curl_close ($ch); curl_close ($ch);
?>

View File

@@ -1,6 +1,7 @@
# <?php
# A very simple example that gets a HTTP page. //
# // A very simple example that gets a HTTP page.
//
$ch = curl_init(); $ch = curl_init();
@@ -10,4 +11,4 @@ curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_exec ($ch); curl_exec ($ch);
curl_close ($ch); curl_close ($ch);
?>

View File

@@ -1,6 +1,7 @@
# <?php
# A very simple PHP example that sends a HTTP POST to a remote site //
# // A very simple PHP example that sends a HTTP POST to a remote site
//
$ch = curl_init(); $ch = curl_init();
@@ -10,3 +11,4 @@ curl_setopt($ch, CURLOPT_POSTFIELDS, "postvar1=value1&postvar2=value2&postvar3=v
curl_exec ($ch); curl_exec ($ch);
curl_close ($ch); curl_close ($ch);
?>

8
reconf
View File

@@ -9,7 +9,7 @@ die(){
echo "$@" ; exit echo "$@" ; exit
} }
aclocal -I . || die "ahhhhh" aclocal -I . || die "The command 'aclocal -I .' failed"
autoheader || die "ahhhhh" autoheader || die "The command 'autoheader' failed"
automake || die "ahhhhh" automake || die "The command 'automake' failed"
autoconf || die "ahhhhh" autoconf || die "The command 'autoconf' failed"

View File

@@ -27,7 +27,7 @@ CLEANFILES = hugehelp.c
NROFF=@NROFF@ NROFF=@NROFF@
EXTRA_DIST = mkhelp.pl config-win32.h \ EXTRA_DIST = mkhelp.pl config-win32.h \
Makefile.vc6 Makefile.b32 Makefile.m32 Makefile.vc6 Makefile.b32 Makefile.m32 config.h.in
AUTOMAKE_OPTIONS = foreign no-dependencies AUTOMAKE_OPTIONS = foreign no-dependencies

View File

@@ -1,7 +1,4 @@
/* src/config.h. Generated automatically by configure. */ /* src/config-win32.h. manually created to look like a config.h. */
/* Define if you have the strcasecmp function. */
/*#define HAVE_STRCASECMP 1*/
/* Define if you have the stricmp function. */ /* Define if you have the stricmp function. */
#define HAVE_STRICMP 1 #define HAVE_STRICMP 1

View File

@@ -1,7 +1,4 @@
/* src/config.h. Generated automatically by configure. */ /* src/config.h. Generated automatically by configure. */
/* Define if you have the strcasecmp function. */
#undef HAVE_STRCASECMP
/* Define cpu-machine-OS */ /* Define cpu-machine-OS */
#undef OS #undef OS

2039
src/hugehelp.c.cvs Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -179,6 +179,7 @@ static CURLcode win32_init(void) { return CURLE_OK; }
*/ */
CURLcode main_init(void) CURLcode main_init(void)
{ {
curl_global_init(CURL_GLOBAL_DEFAULT);
return win32_init(); return win32_init();
} }
@@ -189,6 +190,7 @@ CURLcode main_init(void)
void main_free(void) void main_free(void)
{ {
win32_cleanup(); win32_cleanup();
curl_global_cleanup();
} }
int SetHTTPrequest(HttpReq req, HttpReq *store) int SetHTTPrequest(HttpReq req, HttpReq *store)
@@ -1268,7 +1270,7 @@ struct OutStruct {
struct Configurable *config; struct Configurable *config;
}; };
int my_fwrite(void *buffer, size_t size, size_t nmemb, FILE *stream) int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{ {
struct OutStruct *out=(struct OutStruct *)stream; struct OutStruct *out=(struct OutStruct *)stream;
if(out && !out->stream) { if(out && !out->stream) {
@@ -1291,6 +1293,7 @@ struct ProgressData {
size_t prev; size_t prev;
size_t point; size_t point;
int width; int width;
FILE *out; /* where to write everything to */
}; };
int myprogress (void *clientp, int myprogress (void *clientp,
@@ -1320,7 +1323,7 @@ int myprogress (void *clientp,
int prevblock = bar->prev / 1024; int prevblock = bar->prev / 1024;
int thisblock = bar->point / 1024; int thisblock = bar->point / 1024;
while ( thisblock > prevblock ) { while ( thisblock > prevblock ) {
fprintf( stderr, "#" ); fprintf( bar->out, "#" );
prevblock++; prevblock++;
} }
} }
@@ -1336,14 +1339,16 @@ int myprogress (void *clientp,
line[i] = '\0'; line[i] = '\0';
sprintf( format, "%%-%ds %%5.1f%%%%", barwidth ); sprintf( format, "%%-%ds %%5.1f%%%%", barwidth );
sprintf( outline, format, line, percent ); sprintf( outline, format, line, percent );
fprintf( stderr, "\r%s", outline ); fprintf( bar->out, "\r%s", outline );
} }
bar->prev = bar->point; bar->prev = bar->point;
return 0; return 0;
} }
void progressbarinit(struct ProgressData *bar) static
void progressbarinit(struct ProgressData *bar,
struct Configurable *config)
{ {
#ifdef __EMX__ #ifdef __EMX__
/* 20000318 mgs */ /* 20000318 mgs */
@@ -1377,6 +1382,7 @@ void progressbarinit(struct ProgressData *bar)
bar->width = scr_size[0] - 1; bar->width = scr_size[0] - 1;
#endif #endif
bar->out = config->errors;
} }
void free_config_fields(struct Configurable *config) void free_config_fields(struct Configurable *config)
@@ -1458,7 +1464,7 @@ operate(struct Configurable *config, int argc, char *argv[])
curl_memdebug("memdump"); curl_memdebug("memdump");
#endif #endif
main_init(); /* inits winsock crap for windows */ main_init(); /* inits */
config->showerror=TRUE; config->showerror=TRUE;
config->conf=CONF_DEFAULT; config->conf=CONF_DEFAULT;
@@ -1830,7 +1836,7 @@ operate(struct Configurable *config, int argc, char *argv[])
!(config->conf&(CONF_NOPROGRESS|CONF_MUTE))) { !(config->conf&(CONF_NOPROGRESS|CONF_MUTE))) {
/* we want the alternative style, then we have to implement it /* we want the alternative style, then we have to implement it
ourselves! */ ourselves! */
progressbarinit(&progressbar); progressbarinit(&progressbar, config);
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, myprogress); curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, myprogress);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &progressbar); curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &progressbar);
} }
@@ -1901,7 +1907,7 @@ operate(struct Configurable *config, int argc, char *argv[])
/* cleanup the curl handle! */ /* cleanup the curl handle! */
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
main_free(); /* cleanup the winsock stuff for windows */ main_free(); /* cleanup */
return res; return res;
} }

View File

@@ -1,3 +1,3 @@
#define CURL_NAME "curl" #define CURL_NAME "curl"
#define CURL_VERSION "7.7.2" #define CURL_VERSION "7.8"
#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") " #define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "

View File

@@ -1,7 +1,10 @@
EXTRA_DIST = ftpserver.pl httpserver.pl runtests.pl EXTRA_DIST = ftpserver.pl httpserver.pl runtests.pl ftpsserver.pl stunnel.pm \
getpart.pm
SUBDIRS = data SUBDIRS = data
PERLFLAGS = -I$(srcdir)
all: all:
install: install:
@@ -10,11 +13,11 @@ curl:
test: test:
$(MAKE) -C data test $(MAKE) -C data test
srcdir=$(srcdir) $(PERL) $(srcdir)/runtests.pl srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl
quiet-test: quiet-test:
$(MAKE) -C data test $(MAKE) -C data test
srcdir=$(srcdir) $(PERL) $(srcdir)/runtests.pl -s -a srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl -s -a
clean: clean:
rm -rf log rm -rf log

View File

@@ -8,6 +8,8 @@ The cURL Test Suite
Requires: Requires:
perl (and a unix-style shell) perl (and a unix-style shell)
diff (when a test fail, a diff is shown)
stunnel (for HTTPS and FTPS tests)
Run: Run:
'make test'. This invokes the 'runtests.pl' perl script. Edit the top 'make test'. This invokes the 'runtests.pl' perl script. Edit the top
@@ -49,41 +51,30 @@ Logs:
in the runtests.pl script) in the runtests.pl script)
Data: Data:
All test-data are put in the data/ subdirctory. All test-data are put in the data/ subdirctory. Each test is stored in the
file named according to the test number.
For each tests there exist a few files, all with their own separate and The test case file format is simply a way to store different sections within
special purpose. Replace N with the test number: the same physical file. The different sections are to be described here
within shortly.
nameN.txt: test description as displayed when run
commandN.txt: command line options for this test TEST CASE NUMBERS
protN.txt: the full dump of the protocol communication that curl is So far, I've used this system:
expected to use when performing this test
replyN.txt: the full dump the server should reply to curl for this test. 1 - 99 HTTP
If the final result that curl should've got is not in this 100 - 199 FTP
file, you can instead name the file replyN0001.txt. This 200 - 299 FILE
enables you to fiddle more. ;-) Alas, the server sends the 300 - 399 HTTPS
replyN.txt file but checks the result after the test against 400 - 499 FTPS
the *0001.txt file.
stdoutN.txt: if this file is present, curl's stdout is compared against ... if we run out of test numbers for a particular protocol, then we need
this file to see that they're identical. If this is present, to fix it.
curl will not be run with -o but instead all output is compared
against this file!
errorN.txt: if this file is present, it should contain the error number
curl is supposed to return when this test is run.
uploadN.txt: if this file is present, it should contain the same data as
the log/upload.N does, after a curl upload has been performed.
ftpdN.txt: this file may contain instructions how to modify the behaviour
of the ftp server. It uses a simple syntax that is left to
describe here!
TODO: TODO:
* Port old test cases to the new file format
* Make httpserver.pl work when we PUT without Content-Length: * Make httpserver.pl work when we PUT without Content-Length:
* Add persistant connection support and test cases * Add persistant connection support and test cases

View File

@@ -2,70 +2,9 @@ all:
install: install:
test: test:
[ -f command1.txt ] || ln -s $(srcdir)/*.txt . [ -f test1 ] || ln -s $(srcdir)/test* .
EXTRA_DIST = command1.txt error113.txt name17.txt prot8.txt \ EXTRA_DIST = \
command10.txt error114.txt name18.txt prot9.txt \ test1 test11 test14 test3 test400 test7 \
command100.txt error115.txt name19.txt reply1.txt \ test10 test12 test2 test300 test5 test8 \
command101.txt error116.txt name2.txt reply10.txt \ test100 test13 test200 test4 test6 test9
command102.txt error117.txt name20.txt reply100.txt \
command103.txt error118.txt name200.txt reply101.txt \
command104.txt error119.txt name201.txt reply102.txt \
command105.txt error19.txt name21.txt reply103.txt \
command106.txt error20.txt name22.txt reply104.txt \
command107.txt error201.txt name23.txt reply105.txt \
command108.txt error21.txt name24.txt reply106.txt \
command109.txt error23.txt name25.txt reply11.txt \
command11.txt error24.txt name3.txt reply110.txt \
command110.txt error25.txt name4.txt reply110001.txt \
command111.txt ftpd113.txt name5.txt reply110002.txt \
command112.txt ftpd114.txt name6.txt reply12.txt \
command113.txt ftpd115.txt name7.txt reply13.txt \
command114.txt ftpd116.txt name8.txt reply14.txt \
command115.txt ftpd117.txt name9.txt reply15.txt \
command116.txt ftpd118.txt prot1.txt reply16.txt \
command117.txt name1.txt prot10.txt reply17.txt \
command118.txt name10.txt prot100.txt reply2.txt \
command119.txt name100.txt prot101.txt reply200.txt \
command12.txt name101.txt prot102.txt reply22.txt \
command13.txt name102.txt prot103.txt reply24.txt \
command14.txt name103.txt prot104.txt reply25.txt \
command15.txt name104.txt prot105.txt reply3.txt \
command16.txt name105.txt prot106.txt reply4.txt \
command17.txt name106.txt prot107.txt reply5.txt \
command18.txt name107.txt prot108.txt reply6.txt \
command19.txt name108.txt prot109.txt reply7.txt \
command2.txt name109.txt prot11.txt reply8.txt \
command20.txt name11.txt prot110.txt reply9.txt \
command200.txt name110.txt prot112.txt stdin17.txt \
command201.txt name111.txt prot12.txt stdout107.txt \
command21.txt name112.txt prot13.txt stdout108.txt \
command22.txt name113.txt prot14.txt stdout109.txt \
command23.txt name114.txt prot15.txt stdout110.txt \
command24.txt name115.txt prot16.txt stdout112.txt \
command25.txt name116.txt prot17.txt stdout15.txt \
command3.txt name117.txt prot18.txt stdout18.txt \
command4.txt name118.txt prot2.txt upload107.txt \
command5.txt name119.txt prot22.txt upload108.txt \
command6.txt name12.txt prot3.txt upload109.txt \
command7.txt name13.txt prot4.txt upload112.txt \
command8.txt name14.txt prot5.txt \
command9.txt name15.txt prot6.txt \
error111.txt name16.txt prot7.txt \
command26.txt prot26.txt command27.txt prot27.txt \
name26.txt reply26.txt name27.txt stdout27.txt \
command28.txt name28.txt prot28.txt reply28.txt \
command120.txt name120.txt prot120.txt reply120.txt \
command121.txt name121.txt prot121.txt reply121.txt \
command29.txt error30.txt name30.txt prot30.txt reply30.txt \
command30.txt name29.txt prot29.txt reply29.txt \
command31.txt name32.txt reply31.txt reply32.txt \
command32.txt prot31.txt reply310001.txt reply320001.txt \
name31.txt prot32.txt reply310002.txt reply320002.txt \
command33.txt extra33.txt name33.txt prot33.txt reply33.txt \
command34.txt prot34.txt reply340001.txt name34.txt reply34.txt \
command35.txt name35.txt prot35.txt reply35.txt \
command36.txt error36.txt name36.txt reply36.txt \
command37.txt name37.txt prot37.txt reply37.txt \
command38.txt prot38.txt reply380001.txt name38.txt reply38.txt \
command39.txt prot39.txt reply390001.txt name39.txt reply39.txt reply390002.txt

View File

@@ -1 +0,0 @@
http://%HOSTIP:%HOSTPORT/1

View File

@@ -1,3 +0,0 @@
http://%HOSTIP:%HOSTPORT/we/want/10 -T data/command10.txt

View File

@@ -1 +0,0 @@
ftp://%HOSTIP:%FTPPORT/

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