Compare commits
290 Commits
curl-7_12_
...
curl-7_12_
Author | SHA1 | Date | |
---|---|---|---|
![]() |
23cf63f550 | ||
![]() |
13ee90bbd4 | ||
![]() |
754d6c3abd | ||
![]() |
c6f6e81238 | ||
![]() |
7803a1a28a | ||
![]() |
3d647b9a98 | ||
![]() |
090a7f38be | ||
![]() |
8ad47a13e5 | ||
![]() |
497cc6bfaf | ||
![]() |
d5be114c07 | ||
![]() |
6e43a4ccce | ||
![]() |
a07dcfd850 | ||
![]() |
321511a5be | ||
![]() |
c5297b9fd9 | ||
![]() |
7e00076586 | ||
![]() |
9a8ba19b73 | ||
![]() |
41e776f9db | ||
![]() |
5c2d4a6bdd | ||
![]() |
83b709401c | ||
![]() |
3590fffeae | ||
![]() |
5e2e87cc8d | ||
![]() |
b1bdba7db5 | ||
![]() |
e3d342df96 | ||
![]() |
ff54a74b4d | ||
![]() |
ccf65be0a4 | ||
![]() |
7dfef13224 | ||
![]() |
0b85e53af2 | ||
![]() |
26cfb21c00 | ||
![]() |
b7acdbcb4c | ||
![]() |
6e1e9caa32 | ||
![]() |
f71725de6e | ||
![]() |
26fe6da93b | ||
![]() |
8d4ac69175 | ||
![]() |
4f5a6a33b4 | ||
![]() |
ec8ee4404b | ||
![]() |
e47b5d4e6c | ||
![]() |
494c40fd98 | ||
![]() |
d3b414724b | ||
![]() |
38181fbc74 | ||
![]() |
8847e61fca | ||
![]() |
95b84adb9b | ||
![]() |
b34d161703 | ||
![]() |
d88b3d3d5d | ||
![]() |
f2fb9039bd | ||
![]() |
a28b32aa45 | ||
![]() |
1ba47e7af9 | ||
![]() |
9359498b06 | ||
![]() |
553082e24a | ||
![]() |
dc28a9c0c1 | ||
![]() |
1faef62d59 | ||
![]() |
0d0d5e7ee3 | ||
![]() |
4f567d0f81 | ||
![]() |
f23d923fd3 | ||
![]() |
10d6d8b2ae | ||
![]() |
358e08b95d | ||
![]() |
e181eda253 | ||
![]() |
7d3f5d7ac1 | ||
![]() |
37c7a695a2 | ||
![]() |
07f107ae20 | ||
![]() |
5c14b3be6d | ||
![]() |
1dc15ec1bc | ||
![]() |
6a9ed44088 | ||
![]() |
bdb0620529 | ||
![]() |
be9ea07e87 | ||
![]() |
4cf14e9f85 | ||
![]() |
d02b2c4308 | ||
![]() |
1687a9eb94 | ||
![]() |
344c6a3725 | ||
![]() |
f966dad306 | ||
![]() |
887f41c062 | ||
![]() |
4b1350e467 | ||
![]() |
22a0c57746 | ||
![]() |
fec571f5b0 | ||
![]() |
976285ccbc | ||
![]() |
9b3b7ad22e | ||
![]() |
1b8ac7c6b5 | ||
![]() |
bd2db87237 | ||
![]() |
df3ca59116 | ||
![]() |
3ca4509ae9 | ||
![]() |
d531926246 | ||
![]() |
357fdb60b6 | ||
![]() |
b6f855cb9b | ||
![]() |
b6646310e8 | ||
![]() |
070da3c08f | ||
![]() |
6b7f6369ec | ||
![]() |
309e3ce4f9 | ||
![]() |
8a4eb8ed45 | ||
![]() |
eee70dcf8e | ||
![]() |
c0c885a1f3 | ||
![]() |
a7488672bf | ||
![]() |
c1312cab1f | ||
![]() |
8c833d375a | ||
![]() |
18f14ae23d | ||
![]() |
98adcdd466 | ||
![]() |
a2bd47c567 | ||
![]() |
7b3c308eb0 | ||
![]() |
1be1d3cfb8 | ||
![]() |
b970469df9 | ||
![]() |
80a324386b | ||
![]() |
163518778c | ||
![]() |
7fd1ce4dc3 | ||
![]() |
c78ee11c41 | ||
![]() |
4435e3b269 | ||
![]() |
b96a0dba90 | ||
![]() |
30dfc00a54 | ||
![]() |
fe5979cfdb | ||
![]() |
a1f7987ad8 | ||
![]() |
ac269a8f68 | ||
![]() |
35944744f8 | ||
![]() |
4b1c0bd1e7 | ||
![]() |
b7ff86fa2b | ||
![]() |
2c27e4ee76 | ||
![]() |
6ac9e67bd7 | ||
![]() |
8726a6b6ed | ||
![]() |
2f26069a41 | ||
![]() |
d6c155ff47 | ||
![]() |
15360e5e51 | ||
![]() |
e587a56fc0 | ||
![]() |
113531432a | ||
![]() |
bfa74c2649 | ||
![]() |
6bb215f56c | ||
![]() |
8b37844e5f | ||
![]() |
1445e62312 | ||
![]() |
4781ff88fd | ||
![]() |
c28e15c682 | ||
![]() |
fe0585ec91 | ||
![]() |
18c0b49f3d | ||
![]() |
5d69c956ee | ||
![]() |
93aa22ea08 | ||
![]() |
b7c6bc20be | ||
![]() |
9bb4a95e08 | ||
![]() |
0966ddafaa | ||
![]() |
c073625fb9 | ||
![]() |
85dd4bfb8d | ||
![]() |
5ae34aa8e1 | ||
![]() |
0eb8414750 | ||
![]() |
09717d3fc8 | ||
![]() |
81a3246a56 | ||
![]() |
4c8fbe9abf | ||
![]() |
c0d448f778 | ||
![]() |
16e9a9eaef | ||
![]() |
0d7446c134 | ||
![]() |
a4752673bb | ||
![]() |
9a0d5c4ed8 | ||
![]() |
d85bc18178 | ||
![]() |
f0e66d8c76 | ||
![]() |
af114358c8 | ||
![]() |
ffe17a8197 | ||
![]() |
2459e1e268 | ||
![]() |
a34a4af36a | ||
![]() |
bf51f05a50 | ||
![]() |
5d94ff5974 | ||
![]() |
0d4ddfa743 | ||
![]() |
56c9899832 | ||
![]() |
7b3fba1ad5 | ||
![]() |
700e3b685a | ||
![]() |
3e1caa6185 | ||
![]() |
50eafb7668 | ||
![]() |
25559ac02e | ||
![]() |
51a87fa652 | ||
![]() |
b2dad0342f | ||
![]() |
a5abce7982 | ||
![]() |
de3f22b288 | ||
![]() |
be5cc378c8 | ||
![]() |
4afc4aed73 | ||
![]() |
a4e1ac7952 | ||
![]() |
f84d2b4d36 | ||
![]() |
b4c7876e4b | ||
![]() |
4207ef3d27 | ||
![]() |
b3572269a4 | ||
![]() |
097d449cc1 | ||
![]() |
7f44713487 | ||
![]() |
b7a6b78e0c | ||
![]() |
855a9eff76 | ||
![]() |
8e34e75100 | ||
![]() |
4be60ac155 | ||
![]() |
5ec4501b9d | ||
![]() |
e80f566a14 | ||
![]() |
1729918777 | ||
![]() |
cef290c6b4 | ||
![]() |
539e34b5df | ||
![]() |
765683403f | ||
![]() |
cca9fca894 | ||
![]() |
2b403db811 | ||
![]() |
03e7b7c95f | ||
![]() |
1a05a90f1c | ||
![]() |
dcea109bb5 | ||
![]() |
d46a573bbe | ||
![]() |
7d0d19708a | ||
![]() |
09f14efade | ||
![]() |
87753cda49 | ||
![]() |
66f6f43056 | ||
![]() |
86f059dcfb | ||
![]() |
5931d43a36 | ||
![]() |
8475a0df2f | ||
![]() |
ccc4c9c02c | ||
![]() |
16edb15600 | ||
![]() |
9e7534a46e | ||
![]() |
737dddaec0 | ||
![]() |
b5c90c9b05 | ||
![]() |
c3ecd552f5 | ||
![]() |
56f0227c92 | ||
![]() |
dcb5a4df01 | ||
![]() |
fd64213c2f | ||
![]() |
fc2c06754c | ||
![]() |
7ec200f4d1 | ||
![]() |
e53f139925 | ||
![]() |
61599ceb7b | ||
![]() |
6f8e3f106a | ||
![]() |
8fd676f73e | ||
![]() |
98a8103a3b | ||
![]() |
94043b1150 | ||
![]() |
1b02ad5e8a | ||
![]() |
4897587615 | ||
![]() |
8e2f57c82e | ||
![]() |
c3323b1902 | ||
![]() |
59c063dfd3 | ||
![]() |
8c16696f47 | ||
![]() |
f68950db67 | ||
![]() |
710e370c34 | ||
![]() |
7bb6d76d14 | ||
![]() |
2467f814a8 | ||
![]() |
a654ef9ee6 | ||
![]() |
c1688733c1 | ||
![]() |
cd73a733c7 | ||
![]() |
8ef8e949bd | ||
![]() |
49111a63e6 | ||
![]() |
ee4ecf5155 | ||
![]() |
3478253e5a | ||
![]() |
6ddc59dadf | ||
![]() |
dc8688b8dc | ||
![]() |
865e495188 | ||
![]() |
d3c0ed007e | ||
![]() |
0dc79376e7 | ||
![]() |
3ccbed1022 | ||
![]() |
377e43fbb9 | ||
![]() |
1f2b042b95 | ||
![]() |
fd49ba6c18 | ||
![]() |
facfa19cdd | ||
![]() |
3347ced899 | ||
![]() |
592686bee9 | ||
![]() |
f471a293ea | ||
![]() |
c688166066 | ||
![]() |
5dcd2710d4 | ||
![]() |
16d8383625 | ||
![]() |
6b49fd7483 | ||
![]() |
f10985fc50 | ||
![]() |
edeac97773 | ||
![]() |
40498ffdd0 | ||
![]() |
fd884a3cd2 | ||
![]() |
1887629c5c | ||
![]() |
d3be5b2725 | ||
![]() |
2e973684c0 | ||
![]() |
ab909fc4c2 | ||
![]() |
4cd5220d27 | ||
![]() |
24d47a6e07 | ||
![]() |
8a66584db4 | ||
![]() |
186f433e40 | ||
![]() |
736a40fec9 | ||
![]() |
4245400ae4 | ||
![]() |
629bba6b35 | ||
![]() |
f6f2a9e4be | ||
![]() |
8bfcae65ef | ||
![]() |
96cf615e9d | ||
![]() |
e9b3e1d031 | ||
![]() |
7167cde020 | ||
![]() |
2a80a4c521 | ||
![]() |
83f11b1c9b | ||
![]() |
a00e7f0f5e | ||
![]() |
e1607f5705 | ||
![]() |
cce931f27d | ||
![]() |
34089c93bb | ||
![]() |
beb61ef429 | ||
![]() |
72aff74798 | ||
![]() |
8e715af480 | ||
![]() |
2730842559 | ||
![]() |
cac269cf91 | ||
![]() |
249036ada0 | ||
![]() |
18d80b9e8f | ||
![]() |
b2d8e0b476 | ||
![]() |
225a652021 | ||
![]() |
38b1d96750 | ||
![]() |
2f069ad3e2 | ||
![]() |
a3dbe03e80 | ||
![]() |
f4bef25b5e | ||
![]() |
ebf7d22503 | ||
![]() |
9296d9deb8 | ||
![]() |
7b95a25adc | ||
![]() |
82d6cfa7fc | ||
![]() |
48750d5fc7 |
333
CHANGES
333
CHANGES
@@ -6,6 +6,337 @@
|
|||||||
|
|
||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
|
|
||||||
|
Version 7.12.3 (20 December 2004)
|
||||||
|
|
||||||
|
Daniel (19 December 2004)
|
||||||
|
- I investigated our PKCS12 build problem on Solaris 2.7 with OpenSSL 0.9.7e,
|
||||||
|
and it turned out to be the fault of the zlib 1.1.4 headers doing a typedef
|
||||||
|
named 'free_func' and the OpenSSL headers have a prototype that uses
|
||||||
|
'free_func' in one of its arguments. This is why the compile errors out.
|
||||||
|
|
||||||
|
In other words, we need to include the openssl/pkcs12.h header before the
|
||||||
|
zlib.h header and it builds fine. The configure script now checks for this
|
||||||
|
file and it then gets included early in lib/urldata.h.
|
||||||
|
|
||||||
|
Daniel (18 December 2004)
|
||||||
|
- Samuel Listopad added support for PKCS12 formatted certificates.
|
||||||
|
|
||||||
|
- Samuel Listopad fixed -E to support "C:/path" (with forward slash) as well.
|
||||||
|
|
||||||
|
Daniel (16 December 2004)
|
||||||
|
- Gisle found and fixed a problem in the directory re-use for FTP.
|
||||||
|
|
||||||
|
I added test case 215 and 216 to better verify the functionality.
|
||||||
|
|
||||||
|
- Dinar in bug report #1086121, found a file handle leak when a multipart
|
||||||
|
formpost (including a file upload part) was aborted before the whole file
|
||||||
|
was sent.
|
||||||
|
|
||||||
|
Daniel (15 December 2004)
|
||||||
|
- Tom Lee found out that globbing of strings with backslashes didn't work as
|
||||||
|
you'd expect. Backslashes are such a central part of windows file names that
|
||||||
|
forcing backslashes to have to be escaped with backslashes is a bit too
|
||||||
|
awkward to users. Starting now, you only need to escape globbing characters
|
||||||
|
such as the five letters: "[]{},". Added test case 214 to verify this.
|
||||||
|
|
||||||
|
Daniel (14 December 2004)
|
||||||
|
- Harshal Pradhan patched a HTTP persistent connection flaw: if the user name
|
||||||
|
and/or password were modified between two requests on a persistent
|
||||||
|
connection, the second request were still made with the first setup!
|
||||||
|
|
||||||
|
I added test case 519 to verify the fix.
|
||||||
|
|
||||||
|
Daniel (13 December 2004)
|
||||||
|
- Gisle added CURLINFO_SSL_ENGINES to curl_easy_getinfo() to allow an app
|
||||||
|
to list all available crypto ENGINES.
|
||||||
|
|
||||||
|
- Gisle fixed bug report #1083542, which pointed out a problem with resuming
|
||||||
|
large file (>4GB) file:// transfers on windows.
|
||||||
|
|
||||||
|
Daniel (11 December 2004)
|
||||||
|
- Made the test suite HTTP server (sws) capable of using IPv6, and then
|
||||||
|
extended the test environment to support that and also added three test
|
||||||
|
cases (240, 241, 242) that run tests using IPv6. Test 242 uses a URL that
|
||||||
|
didn't work before the 10 dec fix by Kai Sommerfeld.
|
||||||
|
|
||||||
|
- Made a failed file:// resume output an error message
|
||||||
|
|
||||||
|
- Corrected the CURLE_BAD_DOWNLOAD_RESUME error message in lib/strerror.c
|
||||||
|
|
||||||
|
- Dan Fandrich:
|
||||||
|
|
||||||
|
simplified and consolidated the SSL checks in configure and the usage of the
|
||||||
|
defines in lib/setup.h
|
||||||
|
|
||||||
|
provided a first libcurl.pc.in file for pkg-config (but the result is not
|
||||||
|
installed anywhere at this point)
|
||||||
|
|
||||||
|
extended the cross compile section in the docs/INSTALL file
|
||||||
|
|
||||||
|
Daniel (10 December 2004)
|
||||||
|
- When providing user name in the URL and a IPv6-style IP-address (like in
|
||||||
|
"ftp://user@[::1]/tmp"), the URL parser didn't get the host extracted
|
||||||
|
properly. Reported and fixed by Kai Sommerfeld.
|
||||||
|
|
||||||
|
Daniel (9 December 2004)
|
||||||
|
- Ton Voon provided a configure fix that should fix the notorious (mostly
|
||||||
|
reported on Solaris) problem where the size_t check fails due to the SSL
|
||||||
|
libs being found in a dir not searched through by the run-time linker.
|
||||||
|
patch-tracker entry #1081707.
|
||||||
|
|
||||||
|
- Bryan Henderson pointed out in bug report #1081788 that the curl-config
|
||||||
|
--vernum output wasn't zero prefixed properly (as claimed in documentation).
|
||||||
|
This is fixed in maketgz now.
|
||||||
|
|
||||||
|
Daniel (8 December 2004)
|
||||||
|
- Matt Veenstra updated the mach-O framework files for Mac OS X.
|
||||||
|
|
||||||
|
- Rene Bernhardt found and fixed a buffer overrun in the NTLM code, where
|
||||||
|
libcurl always and unconditionally overwrote a stack-based array with 3 zero
|
||||||
|
bytes. This is not an exploitable buffer overflow. No need to get alarmed.
|
||||||
|
|
||||||
|
Daniel (7 December 2004)
|
||||||
|
- Fixed so that the final error message is sent to the verbose info "stream"
|
||||||
|
even if no errorbuffer is set.
|
||||||
|
|
||||||
|
Daniel (6 December 2004)
|
||||||
|
- Dan Fandrich added the --disable-cookies option to configure to build
|
||||||
|
libcurl without cookie support. This is mainly useful if you want to build a
|
||||||
|
minimalistic libcurl with no cookies support at all. Like for embedded
|
||||||
|
systems or similar.
|
||||||
|
|
||||||
|
- Richard Atterer fixed libcurl's way of dealing with the EPSV
|
||||||
|
response. Previously, libcurl would re-resolve the host name with the new
|
||||||
|
port number and attempt to connect to that, while it should use the IP from
|
||||||
|
the control channel. This bug made it hard to EPSV from an FTP server with
|
||||||
|
multiple IP addresses!
|
||||||
|
|
||||||
|
Daniel (3 December 2004)
|
||||||
|
- Bug report #1078066: when a chunked transfer was pre-maturely closed exactly
|
||||||
|
at a chunk boundary it was not considered an error and thus went unnoticed.
|
||||||
|
Fixed by Maurice Barnum.
|
||||||
|
|
||||||
|
Added test case 207 to verify.
|
||||||
|
|
||||||
|
Daniel (2 December 2004)
|
||||||
|
- Fixed the CONNECT loop to default timeout to 3600 seconds.
|
||||||
|
|
||||||
|
Added test case 206 that makes CONNECT with Digest.
|
||||||
|
|
||||||
|
Fixed a flaw that prepended "(nil)" to the initial CONNECT rqeuest's user-
|
||||||
|
agent field.
|
||||||
|
|
||||||
|
Daniel (30 November 2004)
|
||||||
|
- Dan Fandrich's fix for libz 1.1 and "extra field" usage in a gzip stream
|
||||||
|
|
||||||
|
- Dan also helped me with input data to create three more test cases for the
|
||||||
|
--compressed option.
|
||||||
|
|
||||||
|
Daniel (29 November 2004)
|
||||||
|
- I improved the test suite to enable binary contents in the tests (by proving
|
||||||
|
it base64 encoded), like for testing decompress etc. Added test 220 and 221
|
||||||
|
for this purpose. Tests can now also depend on libz to run.
|
||||||
|
|
||||||
|
- As reported by Reinout van Schouwen in Mandrake's bug tracker bug 12285
|
||||||
|
(http://qa.mandrakesoft.com/show_bug.cgi?id=12285), when connecting to an
|
||||||
|
IPv6 host with FTP, --disable-epsv (or --disable-eprt) effectively disables
|
||||||
|
the ability to transfer a file. Now, when connected to an FTP server with
|
||||||
|
IPv6, these FTP commands can't be disabled even if asked to with the
|
||||||
|
available libcurl options.
|
||||||
|
|
||||||
|
Daniel (26 November 2004)
|
||||||
|
- As reported in Mandrake's bug tracker bug 12289
|
||||||
|
(http://qa.mandrakesoft.com/show_bug.cgi?id=12289), curl would print a
|
||||||
|
newline to "finish" the progress meter after each redirect and not only
|
||||||
|
after a completed transfer.
|
||||||
|
|
||||||
|
Daniel (25 November 2004)
|
||||||
|
- FTP improvements:
|
||||||
|
|
||||||
|
If EPSV, EPRT or LPRT is tried and doesn't work, it will not be retried on
|
||||||
|
the same server again even if a following request is made using a persistent
|
||||||
|
connection.
|
||||||
|
|
||||||
|
If a second request is made to a server, requesting a file from the same
|
||||||
|
directory as the previous request operated on, libcurl will no longer make
|
||||||
|
that long series of CWD commands just to end up on the same spot. Note that
|
||||||
|
this is only for *exactly* the same dir. There is still room for improvements
|
||||||
|
to optimize the CWD-sending when the dirs are only slightly different.
|
||||||
|
|
||||||
|
Added test 210, 211 and 212 to verify these changes. Had to improve the
|
||||||
|
test script too and added a new primitive to the test file format.
|
||||||
|
|
||||||
|
Daniel (24 November 2004)
|
||||||
|
- Andr<64>s Garc<72>a fixed the configure script to detect select properly when run
|
||||||
|
with Msys/Mingw on Windows.
|
||||||
|
|
||||||
|
Daniel (22 November 2004)
|
||||||
|
- Made HTTP PUT and POST requests no longer use HEAD when doing multi-pass
|
||||||
|
auth negotiation (NTLM, Digest and Negotiate), but instead use the request
|
||||||
|
keyword "properly". Details in lib/README.httpauth. This also introduces
|
||||||
|
CURLOPT_IOCTLFUNCTION and CURLOPT_IOCTLDATA, to be used by apps that use the
|
||||||
|
"any" auth alternative as then libcurl may need to send the PUT/POST data
|
||||||
|
more than once and thus may need to ask the app to "rewind" the read data
|
||||||
|
stream to start.
|
||||||
|
|
||||||
|
See also the new example using this: docs/examples/anyauthput.c
|
||||||
|
|
||||||
|
- David Phillips enhanced test 518. I made it depend on a "feature" so that
|
||||||
|
systems without getrlimit() won't attempt to test 518. configure now checks
|
||||||
|
for getrlimit() and setrlimit() for this test case.
|
||||||
|
|
||||||
|
Daniel (18 November 2004)
|
||||||
|
- David Phillips fixed libcurl to not crash anymore when more than FD_SETSIZE
|
||||||
|
file descriptors are in use. Test case 518 added to verify.
|
||||||
|
|
||||||
|
Daniel (15 November 2004)
|
||||||
|
- To test my fix for the CURLINFO_REDIRECT_TIME bug, I added time_redirect and
|
||||||
|
num_redirects support to the -w writeout option for the command line tool.
|
||||||
|
|
||||||
|
- Wojciech Zwiefka found out that CURLINFO_REDIRECT_TIME didn't work as
|
||||||
|
documented.
|
||||||
|
|
||||||
|
Daniel (12 November 2004)
|
||||||
|
- Gisle Vanem modigied the MSVC and Netware makefiles to build without
|
||||||
|
libcurl.def
|
||||||
|
|
||||||
|
- Dan Fandrich added the --disable-crypto-auth option to configure to allow
|
||||||
|
libcurl to build without Digest support. (I figure it should also explicitly
|
||||||
|
disable Negotiate and NTLM.)
|
||||||
|
|
||||||
|
- *** Modified Behaviour Alert ***
|
||||||
|
|
||||||
|
Setting CURLOPT_POSTFIELDS to NULL will no longer do a GET.
|
||||||
|
|
||||||
|
Setting CURLOPT_POSTFIELDS to "" will send a zero byte POST and setting
|
||||||
|
CURLOPT_POSTFIELDS to NULL and CURLOPT_POSTFIELDSIZE to zero will also make
|
||||||
|
a zero byte POST. Added test case 515 to verify this.
|
||||||
|
|
||||||
|
Setting CURLOPT_HTTPPOST to NULL makes a zero byte post. Added test case 516
|
||||||
|
to verify this.
|
||||||
|
|
||||||
|
CURLOPT_POSTFIELDSIZE must now be set to -1 to signal "we don't know".
|
||||||
|
Setting it to zero simply says this is a zero byte POST.
|
||||||
|
|
||||||
|
When providing POST data with a read callback, setting the size up front
|
||||||
|
is now made with CURLOPT_POSTFIELDSIZE and not with CURLOPT_INFILESIZE.
|
||||||
|
|
||||||
|
Daniel (11 November 2004)
|
||||||
|
- Dan Fandrich added --disable-verbose to the configure script to allow builds
|
||||||
|
without verbose strings in the code, to save some 12KB space. Makes sense
|
||||||
|
only for systems with very little memory resources.
|
||||||
|
|
||||||
|
- Jeff Phillips found out that a date string with a year beyond 2038 could
|
||||||
|
crash the new date parser on systems with 32bit time_t. We now check for
|
||||||
|
this case and deal with it.
|
||||||
|
|
||||||
|
Daniel (10 November 2004)
|
||||||
|
- I installed Heimdal on my Debian box (using the debian package) and noticed
|
||||||
|
that configure --with-gssapi failed to create a nice build. Fixed now.
|
||||||
|
|
||||||
|
Daniel (9 November 2004)
|
||||||
|
- Gisle Vanem marked all external function calls with CURL_EXTERN so that now
|
||||||
|
the Windows, Netware and other builds no longer need libcurl.def or similar
|
||||||
|
files.
|
||||||
|
|
||||||
|
Daniel (8 November 2004)
|
||||||
|
- Made the configure script check for tld.h if libidn was detected, since
|
||||||
|
libidn 0.3.X didn't have such a header and we don't work with anything
|
||||||
|
before libidn 0.4.1 anyway! Suse 9.1 apparently ships with a 0.3.X version
|
||||||
|
of libidn which makes the curl 7.12.2 build fail. Jean-Philippe
|
||||||
|
Barrette-LaPierre helped pointing this out.
|
||||||
|
|
||||||
|
- Ian Gulliver reported in debian bug report #278691: if curl is invoked in an
|
||||||
|
environment where stderr is closed the -v output will still be sent to file
|
||||||
|
descriptor 2 which then might be the network socket handle! Now we have a
|
||||||
|
weird hack instead that attempts to make sure that file descriptor 2 is
|
||||||
|
opened (with a call to pipe()) before libcurl is called to do the transfer.
|
||||||
|
configure now checks for pipe() and systems without pipe don't get the weird
|
||||||
|
hack done.
|
||||||
|
|
||||||
|
Daniel (5 November 2004)
|
||||||
|
- Tim Sneddon made libcurl send no more than 64K in a single first chunk when
|
||||||
|
doing a huge POST on VMS, as this is a system limitation. Default on general
|
||||||
|
systems is 100K.
|
||||||
|
|
||||||
|
Daniel (4 November 2004)
|
||||||
|
- Andres Garcia made it build on mingw againa, my --retry code broke the build.
|
||||||
|
|
||||||
|
Daniel (2 November 2004)
|
||||||
|
- Added --retry-max-time that allows a maximum time that may not have been
|
||||||
|
reached for a retry to be made. If not set there is no maximum time, only
|
||||||
|
the amount of retries set with --retry.
|
||||||
|
|
||||||
|
- Paul Nolan provided a patch to make libcurl build nicely on Windows CE.
|
||||||
|
|
||||||
|
Daniel (1 November 2004)
|
||||||
|
- When cross-compiling, the configure script no longer attempts to use
|
||||||
|
pkg-config on the build host in order to detect OpenSSL compiler options.
|
||||||
|
|
||||||
|
Daniel (27 October 2004)
|
||||||
|
- Dan Fandrich:
|
||||||
|
|
||||||
|
An improvement to the gzip handling of libcurl. There were two problems with
|
||||||
|
the old version: it was possible for a malicious gzip file to cause libcurl
|
||||||
|
to leak memory, as a buffer was malloced to hold the header and never freed
|
||||||
|
if the header ended with no file contents. The second problem is that the
|
||||||
|
64 KiB decompression buffer was allocated on the stack, which caused
|
||||||
|
unexpectedly high stack usage and overflowed the stack on some systems
|
||||||
|
(someone complained about that in the mailing list about a year ago).
|
||||||
|
|
||||||
|
Both problems are fixed by this patch. The first one is fixed when a recent
|
||||||
|
(1.2) version of zlib is used, as it takes care of gzip header parsing
|
||||||
|
itself. A check for the version number is done at run-time and libcurl uses
|
||||||
|
that feature if it's present. I've created a define OLD_ZLIB_SUPPORT that
|
||||||
|
can be commented out to save some code space if libcurl is guaranteed to be
|
||||||
|
using a 1.2 version of zlib.
|
||||||
|
|
||||||
|
The second problem is solved by dynamically allocating the memory buffer
|
||||||
|
instead of storing it on the stack. The allocation/free is done for every
|
||||||
|
incoming packet, which is suboptimal, but should be dwarfed by the actual
|
||||||
|
decompression computation.
|
||||||
|
|
||||||
|
I've also factored out some common code between deflate and gzip to reduce
|
||||||
|
the code footprint somewhat. I've tested the gzip code on a few test files
|
||||||
|
and I tried deflate using the freshmeat.net server, and it all looks OK. I
|
||||||
|
didn't try running it with valgrind, however.
|
||||||
|
|
||||||
|
- Added a --retry option to curl that takes a numerical option for the number
|
||||||
|
of times the operation should be retried. It is retried if a transient error
|
||||||
|
is detected or if a timeout occurred. By default, it will first wait one
|
||||||
|
second between the retries and then double the delay time between each retry
|
||||||
|
until the delay time is ten minutes which then will be the delay time
|
||||||
|
between all forthcoming retries. You can set a static delay time with
|
||||||
|
"--retry-delay [num]" where [num] is the number of seconds to wait between
|
||||||
|
each retry.
|
||||||
|
|
||||||
|
Daniel (25 October 2004)
|
||||||
|
- Tomas Pospisek filed bug report #1053287 that proved -C - and --fail on a
|
||||||
|
file that was already completely downloaded caused an error, while it
|
||||||
|
doesn't if you don't use --fail! I added test case 194 to verify the fix.
|
||||||
|
Grrr. CURLOPT_FAILONERROR is now added to the list stuff to remove in
|
||||||
|
libcurl v8 due to all the kludges needed to support it.
|
||||||
|
|
||||||
|
- Mohun Biswas found out that formposting a zero-byte file didn't work very
|
||||||
|
good. I fixed.
|
||||||
|
|
||||||
|
Daniel (19 October 2004)
|
||||||
|
- Alexander Krasnostavsky made it possible to make FTP 3rd party transfers
|
||||||
|
with both source and destination being the same host. It can be useful if
|
||||||
|
you want to move a file on a server or similar.
|
||||||
|
|
||||||
|
- Guillaume Arluison added CURLINFO_NUM_CONNECTS to allow an app to figure
|
||||||
|
out how many new connects a previous transfer required.
|
||||||
|
|
||||||
|
I added %{num_connects} to the curl tool and added test case 192 and 193
|
||||||
|
to verify the new code.
|
||||||
|
|
||||||
|
Daniel (18 October 2004)
|
||||||
|
- Peter Wullinger pointed out that curl should call setlocale() properly to
|
||||||
|
initiate the specific language operations, to make the IDN stuff work
|
||||||
|
better.
|
||||||
|
|
||||||
Version 7.12.2 (18 October 2004)
|
Version 7.12.2 (18 October 2004)
|
||||||
|
|
||||||
Daniel (16 October 2004)
|
Daniel (16 October 2004)
|
||||||
@@ -31,7 +362,7 @@ Daniel (11 October 2004)
|
|||||||
send() on other systems. Alan Pinstein verified the fix.
|
send() on other systems. Alan Pinstein verified the fix.
|
||||||
|
|
||||||
Daniel (10 October 2004)
|
Daniel (10 October 2004)
|
||||||
- Systems with 64bit longs no longeruse strtoll() or our strtoll- replacement
|
- Systems with 64bit longs no longer use strtoll() or our strtoll- replacement
|
||||||
to parse 64 bit numbers. strtol() works fine. Added a configure check to
|
to parse 64 bit numbers. strtol() works fine. Added a configure check to
|
||||||
detect if [constant]LL works and if so, use that in the strtoll replacement
|
detect if [constant]LL works and if so, use that in the strtoll replacement
|
||||||
code to work around compiler warnings reported by Andy Cedilnik.
|
code to work around compiler warnings reported by Andy Cedilnik.
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
AUTOMAKE_OPTIONS = foreign
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist curl-config.in \
|
EXTRA_DIST = CHANGES COPYING maketgz reconf Makefile.dist curl-config.in \
|
||||||
curl-style.el sample.emacs RELEASE-NOTES buildconf buildconf.bat
|
curl-style.el sample.emacs RELEASE-NOTES buildconf buildconf.bat libcurl.pc.in
|
||||||
|
|
||||||
bin_SCRIPTS = curl-config
|
bin_SCRIPTS = curl-config
|
||||||
|
|
||||||
|
@@ -54,16 +54,16 @@ borland-clean:
|
|||||||
make -f Makefile.b32 clean
|
make -f Makefile.b32 clean
|
||||||
|
|
||||||
mingw32:
|
mingw32:
|
||||||
cd lib & make -f Makefile.m32 ZLIB=1
|
$(MAKE) -C lib -f Makefile.m32 ZLIB=1
|
||||||
cd src & make -f Makefile.m32 ZLIB=1
|
$(MAKE) -C src -f Makefile.m32 ZLIB=1
|
||||||
|
|
||||||
mingw32-ssl:
|
mingw32-ssl:
|
||||||
cd lib & make -f Makefile.m32 SSL=1 ZLIB=1
|
$(MAKE) -C lib -f Makefile.m32 SSL=1 ZLIB=1
|
||||||
cd src & make -f Makefile.m32 SSL=1 ZLIB=1
|
$(MAKE) -C src -f Makefile.m32 SSL=1 ZLIB=1
|
||||||
|
|
||||||
mingw32-clean:
|
mingw32-clean:
|
||||||
cd lib & make -f Makefile.m32 clean
|
$(MAKE) -C lib -f Makefile.m32 clean
|
||||||
cd src & make -f Makefile.m32 clean
|
$(MAKE) -C src -f Makefile.m32 clean
|
||||||
|
|
||||||
vc:
|
vc:
|
||||||
cd lib
|
cd lib
|
||||||
@@ -102,8 +102,8 @@ vc-libcurl-ssl-dll:
|
|||||||
nmake /f Makefile.vc6
|
nmake /f Makefile.vc6
|
||||||
|
|
||||||
djgpp:
|
djgpp:
|
||||||
make -C lib -f Makefile.dj
|
$(MAKE) -C lib -f Makefile.dj
|
||||||
make -C src -f Makefile.dj
|
$(MAKE) -C src -f Makefile.dj
|
||||||
|
|
||||||
cygwin:
|
cygwin:
|
||||||
./configure
|
./configure
|
||||||
|
133
RELEASE-NOTES
133
RELEASE-NOTES
@@ -1,84 +1,81 @@
|
|||||||
Curl and libcurl 7.12.2
|
Curl and libcurl 7.12.3
|
||||||
|
|
||||||
Public curl release number: 83
|
Public curl release number: 84
|
||||||
Releases counted from the very beginning: 110
|
Releases counted from the very beginning: 111
|
||||||
Available command line options: 96
|
Available command line options: 100
|
||||||
Available curl_easy_setopt() options: 121
|
Available curl_easy_setopt() options: 123
|
||||||
Number of public functions in libcurl: 36
|
Number of public functions in libcurl: 46
|
||||||
Amount of public web site mirrors: 13
|
Amount of public web site mirrors: 14
|
||||||
Number of known libcurl bindings: 27
|
Number of known libcurl bindings: 29
|
||||||
|
|
||||||
This release includes the following changes:
|
This release includes the following changes:
|
||||||
|
|
||||||
o the IDN code now verifies that only TLD-legitmate letters are used in the
|
o PKCS12 certificate support added
|
||||||
name or a warning is displayed (when verbose is enabled)
|
o added CURLINFO_SSL_ENGINES (and "--engine list")
|
||||||
o provides error texts for IDN errors
|
o new configure options: --disable-cookies, --disable-crypto-auth and
|
||||||
o file upload parts in formposts now get their directory names cut off
|
--disable-verbose
|
||||||
o added CURLINFO_OS_ERRNO
|
o persistent ftp request improvements
|
||||||
o added CURLOPT_FTPSSLAUTH to allow ftp connects to attempt "AUTH TLS" instead
|
o CURLOPT_IOCTLFUNCTION and CURLOPT_IOCTLDATA added. If your app uses HTTP
|
||||||
before "AUTH SSL"
|
Digest, NTLM or Negotiate authentication, you will most likely want to use
|
||||||
o curl_getdate() completely rewritten: may affect rare curl -z use cases
|
these
|
||||||
|
o -w time_redirect and num_redirects
|
||||||
|
o no longer uses libcurl.def for building on Windows, OS/2 and Netware
|
||||||
|
o builds on Windows CE
|
||||||
|
o request retrying, --retry and family added
|
||||||
|
o FTP 3rd party transfers with source and dest on the same host now works
|
||||||
|
o added CURLINFO_NUM_CONNECTS
|
||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
o CURLOPT_FTP_CREATE_MISSING_DIRS works for third party transfers
|
o curl -E on windows accepts "c:/path" with forward-slash
|
||||||
o memory leak for cookies received with max-age set
|
o several improvements for large file support on windows
|
||||||
o potential memory leaks in the window name resolver
|
o file handle leak in aborted multipart formpost file upload
|
||||||
o URLs with ?-letters in the user name or password fields
|
o -T upload multiple files with backslashes in file names
|
||||||
o libcurl error message is now provided when send() fails
|
o modified credentials between two requests on a persistent http connection
|
||||||
o no more SIGPIPE on Mac OS X and other SO_NOSIGPIPE-supporting platforms
|
o large file file:// resumes on Windows
|
||||||
o HTTP resume was refused if redirected
|
o URLs with username and IPv6 numerical addresses
|
||||||
o configure's gethostbyname check when both nsl and socket libs are required
|
o configure works better with SSL libs in a "non-standard ld.so dir"
|
||||||
o configure --with-libidn now checks the given path before defaults
|
o curl-config --vernum zero prefixed
|
||||||
o a race condition sometimes resulting in CURLE_COULDNT_RESOLVE_HOST in the
|
o bad memory access in the NTLM code
|
||||||
windows threaded name resolver code
|
o EPSV on multi-homed servers now works correctly
|
||||||
o isspace() invokes with negative values in the cookie code
|
o chunked-encoded transfers could get closed pre-maturely without error
|
||||||
o a case of read-already-freed-data when CURLOPT_VERBOSE is used and a (very)
|
o proxy CONNECT now default timeouts after 3600 seconds
|
||||||
persistent connection
|
o disabling EPSV or EPRT is ignored when connecting to an IPv6 FTP server
|
||||||
o now includes descriptive error messages for IDN errors
|
o no extra progress meter newline output after each Location: followed
|
||||||
o more forgivning PASS response code check for better working with proftpd
|
o HTTP PUT/POST with Digest, NTLM or Negotiate no longer uses HEAD
|
||||||
o curl/multi.h works better included in winsock-using apps
|
o works with or gracefully bails out when exceeding FD_SETSIZE file
|
||||||
o curl_easy_reset() no longer enables the progress meter
|
descriptors
|
||||||
o build fix for SSL disabled curl with SSL Engine support present
|
o CURLINFO_REDIRECT_TIME works
|
||||||
o configure --with-ssl=PATH now ignores pkg-config path info
|
o building with gssapi libs and hdeaders in the default dirs
|
||||||
o CURLOPT_SSLENGINE can be set to NULL even if no engine support is available
|
o curl_getdate() parsing of dates later than year 2037 with 32 bit time_t
|
||||||
o LDAP crash when more than one record was received
|
o curl -v when stderr is closed wrote debug messages to the network socket
|
||||||
o connect failures properly stores an error message in the errorbuffer
|
o build failure with libidn 0.3.X or older
|
||||||
o Rare Location:-following problem with bad original URL
|
o huge POSTs on VMS
|
||||||
o -F can now add Content-Type on non-file sections
|
o configure no longer uses pkg-config on cross-compiles
|
||||||
o double Host: header when following Location: with replaced Host:
|
o potential gzip decompress memory leak
|
||||||
o curl_multi_add_handle() return code
|
o "-C - --fail" on a HTTP page already downloaded
|
||||||
o "Proxy-Connection: close" is now understood and properly dealt with
|
o formposting a zero byte file
|
||||||
o curl_getdate() crash
|
o use setlocale() for better IDN functionality by default
|
||||||
o downloading empty files now calls the write callback properly
|
|
||||||
o no reverse DNS lookups for ip-only addresses with ipv6-enabled libcurl
|
|
||||||
o file handler leak when getting an empty file:// URL
|
|
||||||
o libcurl works better multi-threaded on AIX (when built with xlc)
|
|
||||||
o cookies over proxy didn't match the path properly
|
|
||||||
o MSVC makefile fixes to build better
|
|
||||||
o FTP response 530 on 'PASS' now sends back a better error message
|
|
||||||
|
|
||||||
Other curl-related news since the previous public release:
|
Other curl-related news since the previous public release:
|
||||||
|
|
||||||
o AdacURL version 7.12.1 http://www.almroth.com/adacurl/index.html
|
o pycurl 7.12.2: http://pycurl.sf.net/
|
||||||
o pycurl version 7.12.1 http://pycurl.sourceforge.net/
|
o TclCurl 0.12.2: http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
||||||
o tclcurl version 0.12.1
|
o libcurl.NET 1.2: http://www.seasideresearch.com/downloads.html
|
||||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/
|
o RCurl 0.5.1: http://www.omegahat.org/RCurl/
|
||||||
o libcurl.NET was announce: http://www.seasideresearch.com/downloads.html
|
o libcurl.mono 1.0:
|
||||||
o Get your fresh Mozilla-extracted ca cert bundle here:
|
http://forge.novell.com/modules/xfmod/project/?libcurl-mono
|
||||||
http://curl.haxx.se/docs/caextract.html
|
o new German curl mirror: http://curl.kgt.org/
|
||||||
o New web mirror in Taiwan: http://curl.cs.pu.edu.tw/
|
|
||||||
|
|
||||||
This release would not have looked like this without help, code, reports and
|
This release would not have looked like this without help, code, reports and
|
||||||
advice from friends like these:
|
advice from friends like these:
|
||||||
|
|
||||||
Casey O'Donnell, Roland Krikava, Alex, Alexander Krasnostavsky, Kjetil
|
Peter Wullinger, Guillaume Arluison, Alexander Krasnostavsky, Mohun Biswas,
|
||||||
Jacobsen, Ling Thio, Roman Koifman, Harshal Pradhan, Jonas Forsman, David
|
Tomas Pospisek, Gisle Vanem, Dan Fandrich, Paul Nolan, Andres Garcia, Tim
|
||||||
Tarendash, Daniel at touchtunes, Bertrand Demiddelaer, Andreas Rieke,
|
Sneddon, Ian Gulliver, Jean-Philippe Barrette-LaPierre, Jeff Phillips,
|
||||||
Jean-Claude Chauve, Dan Fandrich, Peter Sylvester, "Mekonikum", Jean-Philippe
|
Wojciech Zwiefka, David Phillips, Reinout van Schouwen, Maurice Barnum,
|
||||||
Barrette-LaPierre, G<>nter Knauf, Larry Campbell, Fedor Karpelevitch,
|
Richard Atterer, Rene Bernhardt, Matt Veenstra, Bryan Henderson, Ton Voon,
|
||||||
Aleksandar Milivojevic, Gisle Vanem, Chris "Bob Bob", Chih-Chung Chang, Andy
|
Kai Sommerfeld, David Byron, Harshal Pradhan, Tom Lee, Dinar, Jean-Marc
|
||||||
Cedilnik, Alan Pinstein, Eric Vergnaud, Traian Nicolescu, runekl at
|
Ranger, Samuel Listopad
|
||||||
opoint.com
|
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
@@ -1,11 +1,8 @@
|
|||||||
Issues not sorted in any particular order.
|
Issues not sorted in any particular order.
|
||||||
|
|
||||||
To get fixed in 7.12.2 (planned release: mid October 2004)
|
|
||||||
======================
|
|
||||||
|
|
||||||
To get fixed in 7.12.3 (planned release: December 2004)
|
To get fixed in 7.12.3 (planned release: December 2004)
|
||||||
======================
|
======================
|
||||||
|
|
||||||
47 - Peter Sylvester's patch for SRP on the TLS layer
|
47 - Peter Sylvester's patch for SRP on the TLS layer
|
||||||
|
Awaits OpenSSL support for this, no need to support this in libcurl before
|
||||||
48 - MSVC Makefile improvements by Samuel D<>az Garc<72>a
|
there's an OpenSSL release that does it.
|
||||||
|
@@ -690,10 +690,15 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS],
|
|||||||
fi
|
fi
|
||||||
else dnl $ICC = yes
|
else dnl $ICC = yes
|
||||||
dnl this is a set of options we believe *ALL* gcc versions support:
|
dnl this is a set of options we believe *ALL* gcc versions support:
|
||||||
WARN="-W -Wall -Wwrite-strings -pedantic -Wno-long-long -Wpointer-arith -Wnested-externs -Winline -Wmissing-declarations -Wmissing-prototypes -Wsign-compare"
|
WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
|
||||||
|
|
||||||
dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
|
dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
|
||||||
|
|
||||||
|
if test "$gccnum" -ge "207"; then
|
||||||
|
dnl gcc 2.7 or later (well, they don't work on 2.2.2)
|
||||||
|
WARN="$WARN -Wno-long-long -Wmissing-declarations -Wsign-compare"
|
||||||
|
fi
|
||||||
|
|
||||||
if test "$gccnum" -gt "295"; then
|
if test "$gccnum" -gt "295"; then
|
||||||
dnl only if the compiler is newer than 2.95 since we got lots of
|
dnl only if the compiler is newer than 2.95 since we got lots of
|
||||||
dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
|
dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
|
||||||
|
@@ -20,3 +20,4 @@ stamp-h1
|
|||||||
depcomp
|
depcomp
|
||||||
libcares.la
|
libcares.la
|
||||||
missing
|
missing
|
||||||
|
ares_version.h.dist
|
||||||
|
11
ares/CHANGES
11
ares/CHANGES
@@ -1,5 +1,16 @@
|
|||||||
Changelog for the c-ares project
|
Changelog for the c-ares project
|
||||||
|
|
||||||
|
* November 7
|
||||||
|
|
||||||
|
- Fixed the VC project and makefile to use ares_cancel and ares_version
|
||||||
|
|
||||||
|
* October 24
|
||||||
|
|
||||||
|
- The released ares_version.h from 1.2.1 says 1.2.0 due to a maketgz flaw.
|
||||||
|
This is now fixed.
|
||||||
|
|
||||||
|
Version 1.2.1 (October 20, 2004)
|
||||||
|
|
||||||
* September 29
|
* September 29
|
||||||
|
|
||||||
- Henrik Stoerner fix: got a report that Tru64 Unix (the unix from Digital
|
- Henrik Stoerner fix: got a report that Tru64 Unix (the unix from Digital
|
||||||
|
@@ -55,3 +55,12 @@ libcares_la_SOURCES = $(CSOURCES) $(HHEADERS)
|
|||||||
libcares_ladir = $(includedir)
|
libcares_ladir = $(includedir)
|
||||||
# what headers to install on 'make install':
|
# what headers to install on 'make install':
|
||||||
libcares_la_HEADERS = ares.h ares_version.h
|
libcares_la_HEADERS = ares.h ares_version.h
|
||||||
|
|
||||||
|
# Make files named *.dist replace the file without .dist extension
|
||||||
|
dist-hook:
|
||||||
|
find $(distdir) -name "*.dist" -exec rm {} \;
|
||||||
|
(distit=`find $(srcdir) -name "*.dist"`; \
|
||||||
|
for file in $$distit; do \
|
||||||
|
strip=`echo $$file | sed -e s/^$(srcdir)// -e s/\.dist//`; \
|
||||||
|
cp $$file $(distdir)$$strip; \
|
||||||
|
done)
|
||||||
|
@@ -37,6 +37,10 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ARES_SUCCESS 0
|
#define ARES_SUCCESS 0
|
||||||
|
|
||||||
/* Server error codes (ARES_ENODATA indicates no relevant answer) */
|
/* Server error codes (ARES_ENODATA indicates no relevant answer) */
|
||||||
@@ -140,4 +144,8 @@ void ares_free_hostent(struct hostent *host);
|
|||||||
const char *ares_strerror(int code);
|
const char *ares_strerror(int code);
|
||||||
void ares_free_errmem(char *mem);
|
void ares_free_errmem(char *mem);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* ARES__H */
|
#endif /* ARES__H */
|
||||||
|
@@ -33,5 +33,7 @@ might have been stored in their arguments.
|
|||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR ares_init (3)
|
.BR ares_init (3)
|
||||||
.BR ares_destroy (3)
|
.BR ares_destroy (3)
|
||||||
|
.SH NOTES
|
||||||
|
This function is not compatible with ares.
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Dirk Manske
|
Dirk Manske
|
||||||
|
@@ -14,14 +14,14 @@
|
|||||||
.\" this software for any purpose. It is provided "as is"
|
.\" this software for any purpose. It is provided "as is"
|
||||||
.\" without express or implied warranty.
|
.\" without express or implied warranty.
|
||||||
.\"
|
.\"
|
||||||
.TH ARES_DESTROY 3 "23 July 1998"
|
.TH ARES_DESTROY 3 "7 December 2004"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ares_destroy \- Destroy a resolver channel
|
ares_destroy \- Destroy a resolver channel
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.nf
|
.nf
|
||||||
.B #include <ares.h>
|
.B #include <ares.h>
|
||||||
.PP
|
.PP
|
||||||
.B int ares_destroy(ares_channel \fIchannel\fP)
|
.B void ares_destroy(ares_channel \fIchannel\fP)
|
||||||
.fi
|
.fi
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
The
|
The
|
||||||
|
@@ -26,7 +26,8 @@
|
|||||||
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
||||||
{
|
{
|
||||||
struct server_state *server;
|
struct server_state *server;
|
||||||
int i, nfds;
|
ares_socket_t nfds;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* No queries, no file descriptors. */
|
/* No queries, no file descriptors. */
|
||||||
if (!channel->queries)
|
if (!channel->queries)
|
||||||
@@ -51,5 +52,5 @@ int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
|||||||
nfds = server->tcp_socket + 1;
|
nfds = server->tcp_socket + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nfds;
|
return (int)nfds;
|
||||||
}
|
}
|
||||||
|
@@ -149,7 +149,7 @@ static int file_lookup(struct in_addr *addr, struct hostent **host)
|
|||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
|
||||||
char PATH_HOSTS[MAX_PATH];
|
char PATH_HOSTS[MAX_PATH];
|
||||||
if (IsNT) {
|
if (IS_NT()) {
|
||||||
char tmp[MAX_PATH];
|
char tmp[MAX_PATH];
|
||||||
HKEY hkeyHosts;
|
HKEY hkeyHosts;
|
||||||
|
|
||||||
|
@@ -221,7 +221,7 @@ static int file_lookup(const char *name, struct hostent **host)
|
|||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
char PATH_HOSTS[MAX_PATH];
|
char PATH_HOSTS[MAX_PATH];
|
||||||
if (IsNT) {
|
if (IS_NT()) {
|
||||||
char tmp[MAX_PATH];
|
char tmp[MAX_PATH];
|
||||||
HKEY hkeyHosts;
|
HKEY hkeyHosts;
|
||||||
|
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
.\" this software for any purpose. It is provided "as is"
|
.\" this software for any purpose. It is provided "as is"
|
||||||
.\" without express or implied warranty.
|
.\" without express or implied warranty.
|
||||||
.\"
|
.\"
|
||||||
.TH ARES_INIT 3 "21 July 1998"
|
.TH ARES_INIT 3 "7 December 2004"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ares_init, ares_init_options \- Initialize a resolver channel
|
ares_init, ares_init_options \- Initialize a resolver channel
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -25,31 +25,20 @@ ares_init, ares_init_options \- Initialize a resolver channel
|
|||||||
.B int ares_init_options(ares_channel *\fIchannel\fP,
|
.B int ares_init_options(ares_channel *\fIchannel\fP,
|
||||||
.B struct ares_options *\fIoptions\fP, int \fIoptmask\fP)
|
.B struct ares_options *\fIoptions\fP, int \fIoptmask\fP)
|
||||||
.PP
|
.PP
|
||||||
.B cc file.c -lares
|
.B cc file.c -lcares
|
||||||
.fi
|
.fi
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
The
|
The \fBares_init\fP function initializes a communications channel for name
|
||||||
.B ares_init
|
service lookups. If it returns successfully, \fBares_init\fP will set the
|
||||||
function initializes a communications channel for name service
|
variable pointed to by \fIchannel\fP to a handle used to identify the name
|
||||||
lookups. If it returns successfully,
|
service channel. The caller should invoke
|
||||||
.B ares_init
|
|
||||||
will set the variable pointed to by
|
|
||||||
.I channel
|
|
||||||
to a handle used to identify the name service channel. The caller
|
|
||||||
should invoke
|
|
||||||
.BR ares_destroy (3)
|
.BR ares_destroy (3)
|
||||||
on the handle when the channel is no longer needed.
|
on the handle when the channel is no longer needed.
|
||||||
.PP
|
.PP
|
||||||
The
|
The \fBares_init_options\fP function also initializes a name service channel,
|
||||||
.B ares_init_options
|
with additional options useful for applications requiring more control over
|
||||||
function also initializes a name service channel, with additional
|
name service configuration. The \fIoptmask\fP parameter specifies which fields
|
||||||
options useful for applications requiring more control over name
|
in the structure pointed to by \fIoptions\fP are set, as follows:
|
||||||
service configuration. The
|
|
||||||
.I optmask
|
|
||||||
parameter specifies which fields in the structure pointed to by
|
|
||||||
.I options
|
|
||||||
are set, as follows:
|
|
||||||
.PP
|
|
||||||
.TP 18
|
.TP 18
|
||||||
.B ARES_OPT_FLAGS
|
.B ARES_OPT_FLAGS
|
||||||
.B int \fIflags\fP;
|
.B int \fIflags\fP;
|
||||||
@@ -127,9 +116,11 @@ If a truncated response to a UDP query is received, do not fall back
|
|||||||
to TCP; simply continue on with the truncated response.
|
to TCP; simply continue on with the truncated response.
|
||||||
.TP 23
|
.TP 23
|
||||||
.B ARES_FLAG_NORECURSE
|
.B ARES_FLAG_NORECURSE
|
||||||
Do not set the "recursion desired" bit on outgoing queries, so that
|
Do not set the "recursion desired" bit on outgoing queries, so that the name
|
||||||
the name server being contacted will not try to fetch the answer from
|
server being contacted will not try to fetch the answer from other servers if
|
||||||
other servers if it doesn't know the answer locally.
|
it doesn't know the answer locally. Be aware that ares will not do the
|
||||||
|
recursion for you. Recursion must be handled by the application calling ares
|
||||||
|
if \fIARES_FLAG_NORECURSE\fP is set.
|
||||||
.TP 23
|
.TP 23
|
||||||
.B ARES_FLAG_STAYOPEN
|
.B ARES_FLAG_STAYOPEN
|
||||||
Do not close communciations sockets when the number of active queries
|
Do not close communciations sockets when the number of active queries
|
||||||
|
@@ -305,7 +305,8 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
{
|
{
|
||||||
FIXED_INFO *fi = alloca (sizeof(*fi));
|
FIXED_INFO *fi = alloca (sizeof(*fi));
|
||||||
DWORD size = sizeof (*fi);
|
DWORD size = sizeof (*fi);
|
||||||
DWORD (WINAPI *GetNetworkParams) (FIXED_INFO*, DWORD*); /* available only on Win-98/2000+ */
|
typedef DWORD (WINAPI* get_net_param_func) (FIXED_INFO*, DWORD*);
|
||||||
|
get_net_param_func GetNetworkParams; /* available only on Win-98/2000+ */
|
||||||
HMODULE handle;
|
HMODULE handle;
|
||||||
IP_ADDR_STRING *ipAddr;
|
IP_ADDR_STRING *ipAddr;
|
||||||
int i, count = 0;
|
int i, count = 0;
|
||||||
@@ -321,7 +322,7 @@ static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
|||||||
if (!handle)
|
if (!handle)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
(void*)GetNetworkParams = GetProcAddress (handle, "GetNetworkParams");
|
GetNetworkParams = (get_net_param_func) GetProcAddress (handle, "GetNetworkParams");
|
||||||
if (!GetNetworkParams)
|
if (!GetNetworkParams)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
@@ -375,7 +376,7 @@ quit:
|
|||||||
static int init_by_resolv_conf(ares_channel channel)
|
static int init_by_resolv_conf(ares_channel channel)
|
||||||
{
|
{
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
int status, nservers = 0, nsort = 0;
|
int status = -1, nservers = 0, nsort = 0;
|
||||||
struct server_state *servers = NULL;
|
struct server_state *servers = NULL;
|
||||||
struct apattern *sortlist = NULL;
|
struct apattern *sortlist = NULL;
|
||||||
|
|
||||||
@@ -421,7 +422,7 @@ DhcpNameServer
|
|||||||
goto okay;
|
goto okay;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsNT)
|
if (IS_NT())
|
||||||
{
|
{
|
||||||
if (RegOpenKeyEx(
|
if (RegOpenKeyEx(
|
||||||
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
||||||
|
@@ -41,7 +41,7 @@
|
|||||||
|
|
||||||
#if defined(WIN32) && !defined(WATT32)
|
#if defined(WIN32) && !defined(WATT32)
|
||||||
|
|
||||||
#define IsNT ((int)GetVersion()>0)
|
#define IS_NT() ((int)GetVersion() > 0)
|
||||||
#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
|
#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
|
||||||
#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
|
#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
|
||||||
#define NAMESERVER "NameServer"
|
#define NAMESERVER "NameServer"
|
||||||
@@ -164,5 +164,9 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize);
|
|||||||
libcurl lowlevel code from within library is ugly and only works when
|
libcurl lowlevel code from within library is ugly and only works when
|
||||||
c-ares is built and linked with a similarly debug-build libcurl, but we do
|
c-ares is built and linked with a similarly debug-build libcurl, but we do
|
||||||
this anyway for convenience. */
|
this anyway for convenience. */
|
||||||
|
#ifndef CURL_EXTERN
|
||||||
|
/* ugly hack to make this compile */
|
||||||
|
#define CURL_EXTERN
|
||||||
|
#endif
|
||||||
#include "../lib/memdebug.h"
|
#include "../lib/memdebug.h"
|
||||||
#endif
|
#endif
|
||||||
|
@@ -30,7 +30,8 @@ function gets the description of the ares library error code
|
|||||||
.IR code ,
|
.IR code ,
|
||||||
returning the result as a NUL-terminated C string.
|
returning the result as a NUL-terminated C string.
|
||||||
.SH NOTES
|
.SH NOTES
|
||||||
This function is not compatible with ares.
|
This function is not compatible with ares, it takes a different set of
|
||||||
|
arguments.
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Greg Hudson, MIT Information Systems
|
Greg Hudson, MIT Information Systems
|
||||||
.br
|
.br
|
||||||
|
@@ -41,7 +41,7 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
|||||||
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
dnl Checks for standard header files, to make memdebug.h inclusions bettter
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
|
|
||||||
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I../include"
|
CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include"
|
||||||
CFLAGS="$CFLAGS -g"
|
CFLAGS="$CFLAGS -g"
|
||||||
|
|
||||||
dnl set compiler "debug" options to become more picky, and remove
|
dnl set compiler "debug" options to become more picky, and remove
|
||||||
|
21
ares/maketgz
21
ares/maketgz
@@ -12,6 +12,27 @@ if(!-f "ares.h") {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my ($major, $minor, $patch)=split(/\./, $version);
|
||||||
|
|
||||||
|
$major += 0;
|
||||||
|
$minor += 0;
|
||||||
|
$patch += 0;
|
||||||
|
|
||||||
|
open(VER, "<ares_version.h") ||
|
||||||
|
die "can't open ares_version.h";
|
||||||
|
open(NEWV, ">ares_version.h.dist");
|
||||||
|
while(<VER>) {
|
||||||
|
$_ =~ s/^\#define ARES_VERSION_MAJOR .*/\#define ARES_VERSION_MAJOR $major/;
|
||||||
|
$_ =~ s/^\#define ARES_VERSION_MINOR .*/\#define ARES_VERSION_MINOR $minor/;
|
||||||
|
$_ =~ s/^\#define ARES_VERSION_PATCH .*/\#define ARES_VERSION_PATCH $patch/;
|
||||||
|
$_ =~ s/^\#define ARES_VERSION_STR .*/\#define ARES_VERSION_STR \"$version\"/;
|
||||||
|
|
||||||
|
print NEWV $_;
|
||||||
|
}
|
||||||
|
close(VER);
|
||||||
|
close(NEWV);
|
||||||
|
print "ares_version.h.dist created\n";
|
||||||
|
|
||||||
if(!-f "configure") {
|
if(!-f "configure") {
|
||||||
print "running buildconf\n";
|
print "running buildconf\n";
|
||||||
`./buildconf`;
|
`./buildconf`;
|
||||||
|
@@ -153,6 +153,14 @@ SOURCE=..\..\ares_search.c
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_cancel.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_version.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_send.c
|
SOURCE=..\..\ares_send.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
@@ -181,6 +189,10 @@ SOURCE=..\..\ares_dns.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_version.h
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\..\ares_private.h
|
SOURCE=..\..\ares_private.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@@ -92,6 +92,8 @@ LIB32_OBJS= \
|
|||||||
"$(INTDIR)\ares_process.obj" \
|
"$(INTDIR)\ares_process.obj" \
|
||||||
"$(INTDIR)\ares_query.obj" \
|
"$(INTDIR)\ares_query.obj" \
|
||||||
"$(INTDIR)\ares_search.obj" \
|
"$(INTDIR)\ares_search.obj" \
|
||||||
|
"$(INTDIR)\ares_cancel.obj" \
|
||||||
|
"$(INTDIR)\ares_version.obj" \
|
||||||
"$(INTDIR)\ares_send.obj" \
|
"$(INTDIR)\ares_send.obj" \
|
||||||
"$(INTDIR)\ares_strerror.obj" \
|
"$(INTDIR)\ares_strerror.obj" \
|
||||||
"$(INTDIR)\ares_timeout.obj" \
|
"$(INTDIR)\ares_timeout.obj" \
|
||||||
@@ -131,6 +133,8 @@ CLEAN :
|
|||||||
-@erase "$(INTDIR)\ares_process.obj"
|
-@erase "$(INTDIR)\ares_process.obj"
|
||||||
-@erase "$(INTDIR)\ares_query.obj"
|
-@erase "$(INTDIR)\ares_query.obj"
|
||||||
-@erase "$(INTDIR)\ares_search.obj"
|
-@erase "$(INTDIR)\ares_search.obj"
|
||||||
|
-@erase "$(INTDIR)\ares_cancel.obj"
|
||||||
|
-@erase "$(INTDIR)\ares_version.obj"
|
||||||
-@erase "$(INTDIR)\ares_send.obj"
|
-@erase "$(INTDIR)\ares_send.obj"
|
||||||
-@erase "$(INTDIR)\ares_strerror.obj"
|
-@erase "$(INTDIR)\ares_strerror.obj"
|
||||||
-@erase "$(INTDIR)\ares_timeout.obj"
|
-@erase "$(INTDIR)\ares_timeout.obj"
|
||||||
@@ -322,6 +326,18 @@ SOURCE=..\..\ares_search.c
|
|||||||
$(CPP) $(CPP_PROJ) $(SOURCE)
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_version.c
|
||||||
|
|
||||||
|
"$(INTDIR)\ares_version.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
|
SOURCE=..\..\ares_cancel.c
|
||||||
|
|
||||||
|
"$(INTDIR)\ares_cancel.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
|
$(CPP) $(CPP_PROJ) $(SOURCE)
|
||||||
|
|
||||||
|
|
||||||
SOURCE=..\..\ares_send.c
|
SOURCE=..\..\ares_send.c
|
||||||
|
|
||||||
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
"$(INTDIR)\ares_send.obj" : $(SOURCE) "$(INTDIR)"
|
||||||
|
@@ -39,28 +39,34 @@ ares_strcasecmp(const char *a, const char *b)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Number of micro-seconds between the beginning of the Windows epoch
|
||||||
|
* (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970).
|
||||||
|
*/
|
||||||
|
#if defined(_MSC_VER) || defined(__WATCOMC__)
|
||||||
|
#define EPOCH_FILETIME 11644473600000000Ui64
|
||||||
|
#else
|
||||||
|
#define EPOCH_FILETIME 11644473600000000ULL
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
ares_gettimeofday(struct timeval *tv, struct timezone *tz)
|
ares_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||||
{
|
{
|
||||||
FILETIME ft;
|
FILETIME ft;
|
||||||
LARGE_INTEGER li;
|
LARGE_INTEGER li;
|
||||||
__int64 t;
|
__int64 t;
|
||||||
static int tzflag;
|
|
||||||
|
|
||||||
if (tv)
|
if (tv)
|
||||||
{
|
{
|
||||||
GetSystemTimeAsFileTime(&ft);
|
GetSystemTimeAsFileTime(&ft);
|
||||||
li.LowPart = ft.dwLowDateTime;
|
li.LowPart = ft.dwLowDateTime;
|
||||||
li.HighPart = ft.dwHighDateTime;
|
li.HighPart = ft.dwHighDateTime;
|
||||||
t = li.QuadPart; /* In 100-nanosecond intervals */
|
t = li.QuadPart / 10; /* In micro-second intervals */
|
||||||
#if 0
|
t -= EPOCH_FILETIME; /* Offset to the Epoch time */
|
||||||
t -= EPOCHFILETIME; /* Offset to the Epoch time */
|
|
||||||
#endif
|
|
||||||
t /= 10; /* In microseconds */
|
|
||||||
tv->tv_sec = (long)(t / 1000000);
|
tv->tv_sec = (long)(t / 1000000);
|
||||||
tv->tv_usec = (long)(t % 1000000);
|
tv->tv_usec = (long)(t % 1000000);
|
||||||
}
|
}
|
||||||
|
(void) tz;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
236
configure.ac
236
configure.ac
@@ -55,7 +55,7 @@ AC_SUBST(PKGADD_NAME)
|
|||||||
AC_SUBST(PKGADD_VENDOR)
|
AC_SUBST(PKGADD_VENDOR)
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
dnl initialize all the info variables to 'no'
|
dnl initialize all the info variables
|
||||||
curl_ssl_msg="no (--with-ssl)"
|
curl_ssl_msg="no (--with-ssl)"
|
||||||
curl_zlib_msg="no (--with-zlib)"
|
curl_zlib_msg="no (--with-zlib)"
|
||||||
curl_krb4_msg="no (--with-krb4*)"
|
curl_krb4_msg="no (--with-krb4*)"
|
||||||
@@ -65,6 +65,7 @@ dnl initialize all the info variables to 'no'
|
|||||||
curl_ipv6_msg="no (--enable-ipv6)"
|
curl_ipv6_msg="no (--enable-ipv6)"
|
||||||
curl_idn_msg="no (--with-libidn)"
|
curl_idn_msg="no (--with-libidn)"
|
||||||
curl_manual_msg="no (--enable-manual)"
|
curl_manual_msg="no (--enable-manual)"
|
||||||
|
curl_verbose_msg="enabled (--disable-verbose)"
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
dnl Detect the canonical host and target build environment
|
dnl Detect the canonical host and target build environment
|
||||||
@@ -432,35 +433,6 @@ AC_HELP_STRING([--disable-nonblocking],[Disable non-blocking socket detection]),
|
|||||||
CURL_CHECK_NONBLOCKING_SOCKET
|
CURL_CHECK_NONBLOCKING_SOCKET
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl **********************************************************************
|
|
||||||
dnl Check for the random seed preferences
|
|
||||||
dnl **********************************************************************
|
|
||||||
|
|
||||||
AC_ARG_WITH(egd-socket,
|
|
||||||
AC_HELP_STRING([--with-egd-socket=FILE],
|
|
||||||
[Entropy Gathering Daemon socket pathname]),
|
|
||||||
[ EGD_SOCKET="$withval" ]
|
|
||||||
)
|
|
||||||
if test -n "$EGD_SOCKET" ; then
|
|
||||||
AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET",
|
|
||||||
[your Entropy Gathering Daemon socket pathname] )
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl Check for user-specified random device
|
|
||||||
AC_ARG_WITH(random,
|
|
||||||
AC_HELP_STRING([--with-random=FILE],[read randomness from FILE (default=/dev/urandom)]),
|
|
||||||
[ RANDOM_FILE="$withval" ],
|
|
||||||
[
|
|
||||||
dnl Check for random device
|
|
||||||
AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
|
|
||||||
]
|
|
||||||
)
|
|
||||||
if test -n "$RANDOM_FILE" ; then
|
|
||||||
AC_SUBST(RANDOM_FILE)
|
|
||||||
AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
|
|
||||||
[a suitable file to read random data from])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check if the operating system allows programs to write to their own argv[]
|
dnl Check if the operating system allows programs to write to their own argv[]
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -647,7 +619,7 @@ if test x"$want_gss" = xyes; then
|
|||||||
if test -z "$GSSAPI_INCS"; then
|
if test -z "$GSSAPI_INCS"; then
|
||||||
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
||||||
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
|
GSSAPI_INCS=`$GSSAPI_ROOT/bin/krb5-config --cflags gssapi`
|
||||||
else
|
elif test "$GSSAPI_ROOT" != "yes"; then
|
||||||
GSSAPI_INCS="-I$GSSAPI_ROOT/include"
|
GSSAPI_INCS="-I$GSSAPI_ROOT/include"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -657,8 +629,10 @@ if test x"$want_gss" = xyes; then
|
|||||||
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
if test -f "$GSSAPI_ROOT/bin/krb5-config"; then
|
||||||
gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
|
gss_ldflags=`$GSSAPI_ROOT/bin/krb5-config --libs gssapi`
|
||||||
LDFLAGS="$LDFLAGS $gss_ldflags"
|
LDFLAGS="$LDFLAGS $gss_ldflags"
|
||||||
else
|
elif test "$GSSAPI_ROOT" != "yes"; then
|
||||||
LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff -lgssapi"
|
LDFLAGS="$LDFLAGS -L$GSSAPI_ROOT/lib$libsuff -lgssapi"
|
||||||
|
else
|
||||||
|
LDFLAGS="$LDFLAGS -lgssapi"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR"
|
LDFLAGS="$LDFLAGS $GSSAPI_LIB_DIR"
|
||||||
@@ -669,16 +643,20 @@ if test x"$want_gss" = xyes; then
|
|||||||
|
|
||||||
curl_gss_msg="enabled"
|
curl_gss_msg="enabled"
|
||||||
|
|
||||||
if test -n "$GSSAPI_INCS"; then
|
AC_CHECK_HEADER(gssapi.h,
|
||||||
# cut off the preceding -I from the include path
|
[
|
||||||
GSSAPI_INCS=`echo $GSSAPI_INCS | sed -e s/^-I//g`
|
dnl found in the given dirs
|
||||||
fi
|
|
||||||
|
|
||||||
if test -f "$GSSAPI_INCS/gssapi.h"; then
|
|
||||||
AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries])
|
AC_DEFINE(HAVE_GSSHEIMDAL, 1, [if you have the Heimdal gssapi libraries])
|
||||||
else
|
],
|
||||||
|
[
|
||||||
|
dnl not found, check in gssapi/ subdir
|
||||||
|
AC_CHECK_HEADER(gssapi/gssapi.h,
|
||||||
|
dnl found
|
||||||
AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries])
|
AC_DEFINE(HAVE_GSSMIT, 1, [if you have the MIT gssapi libraries])
|
||||||
fi
|
)
|
||||||
|
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
@@ -710,11 +688,17 @@ else
|
|||||||
case "$OPT_SSL" in
|
case "$OPT_SSL" in
|
||||||
yes)
|
yes)
|
||||||
dnl --with-ssl (without path) used
|
dnl --with-ssl (without path) used
|
||||||
|
if test x$cross_compiling != xyes; then
|
||||||
|
dnl only do pkg-config magic when not cross-compiling
|
||||||
PKGTEST="yes"
|
PKGTEST="yes"
|
||||||
|
fi
|
||||||
EXTRA_SSL=/usr/local/ssl ;;
|
EXTRA_SSL=/usr/local/ssl ;;
|
||||||
off)
|
off)
|
||||||
dnl no --with-ssl option given, just check default places
|
dnl no --with-ssl option given, just check default places
|
||||||
|
if test x$cross_compiling != xyes; then
|
||||||
|
dnl only do pkg-config magic when not cross-compiling
|
||||||
PKGTEST="yes"
|
PKGTEST="yes"
|
||||||
|
fi
|
||||||
EXTRA_SSL= ;;
|
EXTRA_SSL= ;;
|
||||||
*)
|
*)
|
||||||
dnl check the given --with-ssl spot
|
dnl check the given --with-ssl spot
|
||||||
@@ -768,7 +752,10 @@ else
|
|||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
if test "$HAVECRYPTO" = "yes"; then
|
if test X"$HAVECRYPTO" != X"yes"; then
|
||||||
|
AC_MSG_WARN([crypto lib was not found; SSL will be disabled])
|
||||||
|
|
||||||
|
else
|
||||||
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
|
||||||
|
|
||||||
@@ -802,27 +789,48 @@ else
|
|||||||
else
|
else
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
dnl Check for SSLeay headers
|
dnl Have the libraries--check for SSLeay/OpenSSL 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,
|
||||||
curl_ssl_msg="enabled"
|
curl_ssl_msg="enabled"
|
||||||
OPENSSL_ENABLED=1)
|
OPENSSL_ENABLED=1
|
||||||
|
AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use]))
|
||||||
|
|
||||||
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,
|
||||||
curl_ssl_msg="enabled"
|
curl_ssl_msg="enabled"
|
||||||
OPENSSL_ENABLED=1)
|
OPENSSL_ENABLED=1)
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test X"$OPENSSL_ENABLED" = X"1"; then
|
||||||
|
AC_DEFINE(USE_SSLEAY, 1, [if SSL is enabled])
|
||||||
|
|
||||||
|
dnl is there a pkcs12.h header present?
|
||||||
|
AC_CHECK_HEADERS(openssl/pkcs12.h)
|
||||||
|
fi
|
||||||
|
USE_SSLEAY="$OPENSSL_ENABLED"
|
||||||
|
AC_SUBST(USE_SSLEAY)
|
||||||
|
|
||||||
|
if test X"$OPT_SSL" != Xoff &&
|
||||||
|
test "$OPENSSL_ENABLED" != "1"; then
|
||||||
|
AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
dnl **********************************************************************
|
||||||
|
dnl Check for the CA bundle
|
||||||
|
dnl **********************************************************************
|
||||||
|
|
||||||
|
if test X"$OPENSSL_ENABLED" = X"1"; then
|
||||||
dnl If the ENGINE library seems to be around, check for the OpenSSL engine
|
dnl If the ENGINE library seems to be around, check for the OpenSSL engine
|
||||||
dnl header, it is kind of "separated" from the main SSL check
|
dnl header, it is kind of "separated" from the main SSL check
|
||||||
AC_CHECK_FUNC(ENGINE_init, [ AC_CHECK_HEADERS(openssl/engine.h) ])
|
AC_CHECK_FUNC(ENGINE_init, [ AC_CHECK_HEADERS(openssl/engine.h) ])
|
||||||
|
|
||||||
AC_SUBST(OPENSSL_ENABLED)
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([CA cert bundle install path])
|
AC_MSG_CHECKING([CA cert bundle install path])
|
||||||
|
|
||||||
AC_ARG_WITH(ca-bundle,
|
AC_ARG_WITH(ca-bundle,
|
||||||
@@ -856,15 +864,50 @@ AC_HELP_STRING([--without-ca-bundle], [Don't install the CA bundle]),
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test X"$OPT_SSL" != Xoff &&
|
if test "$OPENSSL_ENABLED" = "1"; then
|
||||||
test "$OPENSSL_ENABLED" != "1"; then
|
dnl when the ssl shared libs were found in a path that the run-time linker
|
||||||
AC_MSG_ERROR([OpenSSL libs and/or directories were not found where specified!])
|
dnl doesn't search through, we need to add it to LD_LIBRARY_PATH to
|
||||||
|
dnl prevent further configure tests to fail due to this
|
||||||
|
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$EXTRA_SSL/lib$libsuff"
|
||||||
|
export LD_LIBRARY_PATH
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AM_CONDITIONAL(CABUNDLE, test x$ca != xno)
|
AM_CONDITIONAL(CABUNDLE, test x$ca != xno)
|
||||||
|
|
||||||
|
dnl **********************************************************************
|
||||||
|
dnl Check for the random seed preferences
|
||||||
|
dnl **********************************************************************
|
||||||
|
|
||||||
|
if test X"$OPENSSL_ENABLED" = X"1"; then
|
||||||
|
AC_ARG_WITH(egd-socket,
|
||||||
|
AC_HELP_STRING([--with-egd-socket=FILE],
|
||||||
|
[Entropy Gathering Daemon socket pathname]),
|
||||||
|
[ EGD_SOCKET="$withval" ]
|
||||||
|
)
|
||||||
|
if test -n "$EGD_SOCKET" ; then
|
||||||
|
AC_DEFINE_UNQUOTED(EGD_SOCKET, "$EGD_SOCKET",
|
||||||
|
[your Entropy Gathering Daemon socket pathname] )
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Check for user-specified random device
|
||||||
|
AC_ARG_WITH(random,
|
||||||
|
AC_HELP_STRING([--with-random=FILE],
|
||||||
|
[read randomness from FILE (default=/dev/urandom)]),
|
||||||
|
[ RANDOM_FILE="$withval" ],
|
||||||
|
[
|
||||||
|
dnl Check for random device
|
||||||
|
AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
|
||||||
|
]
|
||||||
|
)
|
||||||
|
if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then
|
||||||
|
AC_SUBST(RANDOM_FILE)
|
||||||
|
AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
|
||||||
|
[a suitable file to read random data from])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
dnl Check for the presence of ZLIB libraries and headers
|
dnl Check for the presence of ZLIB libraries and headers
|
||||||
dnl **********************************************************************
|
dnl **********************************************************************
|
||||||
@@ -956,7 +999,9 @@ case "$LIBIDN" in
|
|||||||
|
|
||||||
idn=""
|
idn=""
|
||||||
dnl if there is a given path, check that FIRST
|
dnl if there is a given path, check that FIRST
|
||||||
|
if test -n "$LIBIDN"; then
|
||||||
if test "x$LIBIDN" != "xyes"; then
|
if test "x$LIBIDN" != "xyes"; then
|
||||||
|
AC_MSG_WARN([moo moo $LIBIDN])
|
||||||
oldLDFLAGS=$LDFLAGS
|
oldLDFLAGS=$LDFLAGS
|
||||||
oldCPPFLAGS=$CPPFLAGS
|
oldCPPFLAGS=$CPPFLAGS
|
||||||
LDFLAGS="$LDFLAGS -L$LIBIDN/lib"
|
LDFLAGS="$LDFLAGS -L$LIBIDN/lib"
|
||||||
@@ -967,9 +1012,11 @@ case "$LIBIDN" in
|
|||||||
LDFLAGS=$oldLDFLAGS
|
LDFLAGS=$oldLDFLAGS
|
||||||
CPPFLAGS=$oldCPPFLAGS)
|
CPPFLAGS=$oldCPPFLAGS)
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$idn" != "xyes"; then
|
if test "x$idn" != "xyes"; then
|
||||||
dnl check with default paths
|
dnl check with default paths
|
||||||
|
idn="yes"
|
||||||
AC_CHECK_LIB(idn, idna_to_ascii_lz, ,
|
AC_CHECK_LIB(idn, idna_to_ascii_lz, ,
|
||||||
idn="")
|
idn="")
|
||||||
fi
|
fi
|
||||||
@@ -978,7 +1025,7 @@ case "$LIBIDN" in
|
|||||||
curl_idn_msg="enabled"
|
curl_idn_msg="enabled"
|
||||||
dnl different versions of libidn have different setups of these:
|
dnl different versions of libidn have different setups of these:
|
||||||
AC_CHECK_FUNCS( idn_free idna_strerror tld_strerror)
|
AC_CHECK_FUNCS( idn_free idna_strerror tld_strerror)
|
||||||
AC_CHECK_HEADERS( idn-free.h )
|
AC_CHECK_HEADERS( idn-free.h tld.h )
|
||||||
fi
|
fi
|
||||||
|
|
||||||
;;
|
;;
|
||||||
@@ -1114,13 +1161,16 @@ AC_CHECK_HEADERS(
|
|||||||
dlfcn.h \
|
dlfcn.h \
|
||||||
alloca.h \
|
alloca.h \
|
||||||
winsock.h \
|
winsock.h \
|
||||||
|
winsock2.h \
|
||||||
time.h \
|
time.h \
|
||||||
io.h \
|
io.h \
|
||||||
pwd.h \
|
pwd.h \
|
||||||
utime.h \
|
utime.h \
|
||||||
sys/utime.h \
|
sys/utime.h \
|
||||||
sys/poll.h \
|
sys/poll.h \
|
||||||
|
sys/resource.h \
|
||||||
libgen.h \
|
libgen.h \
|
||||||
|
locale.h \
|
||||||
setjmp.h,
|
setjmp.h,
|
||||||
dnl to do if not found
|
dnl to do if not found
|
||||||
[],
|
[],
|
||||||
@@ -1157,6 +1207,7 @@ AC_CHECK_SIZEOF(curl_off_t, ,[
|
|||||||
])
|
])
|
||||||
AC_CHECK_SIZEOF(size_t)
|
AC_CHECK_SIZEOF(size_t)
|
||||||
AC_CHECK_SIZEOF(long)
|
AC_CHECK_SIZEOF(long)
|
||||||
|
AC_CHECK_SIZEOF(time_t)
|
||||||
|
|
||||||
AC_CHECK_TYPE(long long,
|
AC_CHECK_TYPE(long long,
|
||||||
[AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])]
|
[AC_DEFINE(HAVE_LONGLONG, 1, [if your compiler supports long long])]
|
||||||
@@ -1217,7 +1268,12 @@ AC_CHECK_FUNCS( strtoll \
|
|||||||
utime \
|
utime \
|
||||||
sigsetjmp \
|
sigsetjmp \
|
||||||
basename \
|
basename \
|
||||||
poll,
|
setlocale \
|
||||||
|
ftruncate \
|
||||||
|
pipe \
|
||||||
|
poll \
|
||||||
|
getrlimit \
|
||||||
|
setrlimit,
|
||||||
dnl if found
|
dnl if found
|
||||||
[],
|
[],
|
||||||
dnl if not found, $ac_func is the name we check for
|
dnl if not found, $ac_func is the name we check for
|
||||||
@@ -1234,6 +1290,20 @@ dnl if not found, $ac_func is the name we check for
|
|||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dnl For some reason, the check above doesn't properly detect select() with
|
||||||
|
dnl Msys/Mingw
|
||||||
|
if test "$ac_cv_func_select" != "yes"; then
|
||||||
|
AC_MSG_CHECKING([for select in ws2_32])
|
||||||
|
AC_TRY_LINK([#include <winsock2.h>],
|
||||||
|
[select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);],
|
||||||
|
[ dnl worked!
|
||||||
|
AC_MSG_RESULT([yes])
|
||||||
|
HAVE_SELECT="1"
|
||||||
|
AC_DEFINE_UNQUOTED(HAVE_SELECT,1)],
|
||||||
|
[AC_MSG_ERROR(You can't compile without a select)]
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
dnl sigsetjmp() might be a macro and no function so if it isn't found already
|
||||||
dnl we make an extra check here!
|
dnl we make an extra check here!
|
||||||
if test "$ac_cv_func_sigsetjmp" != "yes"; then
|
if test "$ac_cv_func_sigsetjmp" != "yes"; then
|
||||||
@@ -1405,6 +1475,26 @@ int main(void)
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dnl ************************************************************
|
||||||
|
dnl disable verbose text strings
|
||||||
|
dnl
|
||||||
|
AC_MSG_CHECKING([whether to enable verbose strings])
|
||||||
|
AC_ARG_ENABLE(verbose,
|
||||||
|
AC_HELP_STRING([--enable-verbose],[Enable verbose strings])
|
||||||
|
AC_HELP_STRING([--disable-verbose],[Disable verbose strings]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
no)
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
AC_DEFINE(CURL_DISABLE_VERBOSE_STRINGS, 1, [to disable verbose strings])
|
||||||
|
AC_SUBST(CURL_DISABLE_VERBOSE_STRINGS)
|
||||||
|
curl_verbose_msg="no"
|
||||||
|
;;
|
||||||
|
*) AC_MSG_RESULT(yes)
|
||||||
|
;;
|
||||||
|
esac ],
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
)
|
||||||
|
|
||||||
dnl ************************************************************
|
dnl ************************************************************
|
||||||
dnl lame option to switch on debug options
|
dnl lame option to switch on debug options
|
||||||
dnl
|
dnl
|
||||||
@@ -1430,6 +1520,44 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]),
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dnl ************************************************************
|
||||||
|
dnl disable cryptographic authentication
|
||||||
|
dnl
|
||||||
|
AC_MSG_CHECKING([whether to enable cryptographic authentication methods])
|
||||||
|
AC_ARG_ENABLE(crypto-auth,
|
||||||
|
AC_HELP_STRING([--enable-crypto-auth],[Enable cryptographic authentication])
|
||||||
|
AC_HELP_STRING([--disable-crypto-auth],[Disable cryptographic authentication]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
no)
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
AC_DEFINE(CURL_DISABLE_CRYPTO_AUTH, 1, [to disable cryptographic authentication])
|
||||||
|
AC_SUBST(CURL_DISABLE_CRYPTO_AUTH)
|
||||||
|
;;
|
||||||
|
*) AC_MSG_RESULT(yes)
|
||||||
|
;;
|
||||||
|
esac ],
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl ************************************************************
|
||||||
|
dnl disable cookies support
|
||||||
|
dnl
|
||||||
|
AC_MSG_CHECKING([whether to enable support for cookies])
|
||||||
|
AC_ARG_ENABLE(cookies,
|
||||||
|
AC_HELP_STRING([--enable-cookies],[Enable cookies support])
|
||||||
|
AC_HELP_STRING([--disable-cookies],[Disable cookies support]),
|
||||||
|
[ case "$enableval" in
|
||||||
|
no)
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
AC_DEFINE(CURL_DISABLE_COOKIES, 1, [to disable cookies support])
|
||||||
|
AC_SUBST(CURL_DISABLE_COOKIES)
|
||||||
|
;;
|
||||||
|
*) AC_MSG_RESULT(yes)
|
||||||
|
;;
|
||||||
|
esac ],
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
)
|
||||||
|
|
||||||
AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes)
|
AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes)
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile \
|
AC_CONFIG_FILES([Makefile \
|
||||||
@@ -1456,7 +1584,8 @@ AC_CONFIG_FILES([Makefile \
|
|||||||
packages/EPM/curl.list \
|
packages/EPM/curl.list \
|
||||||
packages/EPM/Makefile \
|
packages/EPM/Makefile \
|
||||||
packages/vms/Makefile \
|
packages/vms/Makefile \
|
||||||
curl-config
|
curl-config \
|
||||||
|
libcurl.pc
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
@@ -1470,10 +1599,11 @@ AC_MSG_NOTICE([Configured to build curl/libcurl:
|
|||||||
zlib support: ${curl_zlib_msg}
|
zlib support: ${curl_zlib_msg}
|
||||||
krb4 support: ${curl_krb4_msg}
|
krb4 support: ${curl_krb4_msg}
|
||||||
GSSAPI support: ${curl_gss_msg}
|
GSSAPI support: ${curl_gss_msg}
|
||||||
SNPEGO support: ${curl_spnego_msg}
|
SPNEGO support: ${curl_spnego_msg}
|
||||||
c-ares support: ${curl_ares_msg}
|
c-ares support: ${curl_ares_msg}
|
||||||
ipv6 support: ${curl_ipv6_msg}
|
ipv6 support: ${curl_ipv6_msg}
|
||||||
IDN support: ${curl_idn_msg}
|
IDN support: ${curl_idn_msg}
|
||||||
Build libcurl: Shared=${enable_shared}, Static=${enable_static}
|
Build libcurl: Shared=${enable_shared}, Static=${enable_static}
|
||||||
Built-in manual: ${curl_manual_msg}
|
Built-in manual: ${curl_manual_msg}
|
||||||
|
Verbose errors: ${curl_verbose_msg}
|
||||||
])
|
])
|
||||||
|
@@ -45,19 +45,19 @@ while test $# -gt 0; do
|
|||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--ca)
|
--ca)
|
||||||
echo @CURL_CA_BUNDLE@
|
echo "@CURL_CA_BUNDLE@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--cc)
|
--cc)
|
||||||
echo @CC@
|
echo "@CC@"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--prefix)
|
--prefix)
|
||||||
echo $prefix
|
echo "$prefix"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--feature)
|
--feature)
|
||||||
if test "@OPENSSL_ENABLED@" = "1"; then
|
if test "@USE_SSLEAY@" = "1"; then
|
||||||
echo "SSL"
|
echo "SSL"
|
||||||
fi
|
fi
|
||||||
if test "@KRB4_ENABLED@" = "1"; then
|
if test "@KRB4_ENABLED@" = "1"; then
|
||||||
|
@@ -76,6 +76,16 @@ Lua
|
|||||||
Written by Steve Dekorte
|
Written by Steve Dekorte
|
||||||
http://curl.haxx.se/libcurl/lua/
|
http://curl.haxx.se/libcurl/lua/
|
||||||
|
|
||||||
|
.NET
|
||||||
|
|
||||||
|
Written by Jeffrey Phillips
|
||||||
|
http://www.seasideresearch.com/downloads.html
|
||||||
|
|
||||||
|
Mono
|
||||||
|
|
||||||
|
Written by Jeffrey Phillips
|
||||||
|
http://forge.novell.com/modules/xfmod/project/?libcurl-mono
|
||||||
|
|
||||||
Object-Pascal
|
Object-Pascal
|
||||||
|
|
||||||
Free Pascal, Delphi and Kylix binding written by Christophe Espern.
|
Free Pascal, Delphi and Kylix binding written by Christophe Espern.
|
||||||
@@ -108,9 +118,14 @@ PostgreSQL
|
|||||||
|
|
||||||
Python
|
Python
|
||||||
|
|
||||||
Written by Kjetil Jacobsen
|
PycURL is written by Kjetil Jacobsen
|
||||||
http://pycurl.sourceforge.net/
|
http://pycurl.sourceforge.net/
|
||||||
|
|
||||||
|
R
|
||||||
|
|
||||||
|
RCurl is written by Duncan Temple Lang
|
||||||
|
http://www.omegahat.org/RCurl/
|
||||||
|
|
||||||
Rexx
|
Rexx
|
||||||
|
|
||||||
Written Mark Hessling
|
Written Mark Hessling
|
||||||
@@ -128,7 +143,7 @@ Scheme
|
|||||||
|
|
||||||
Tcl
|
Tcl
|
||||||
|
|
||||||
Written by Andr<64>s Garc<72>a
|
Tclcurl is written by Andr<64>s Garc<72>a
|
||||||
http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html
|
http://personal1.iddeo.es/andresgarci/tclcurl/english/docs.html
|
||||||
|
|
||||||
Q
|
Q
|
||||||
|
16
docs/FAQ
16
docs/FAQ
@@ -803,6 +803,22 @@ FAQ
|
|||||||
|
|
||||||
(Provided by Andrew Francis)
|
(Provided by Andrew Francis)
|
||||||
|
|
||||||
|
When building an application that uses the static libcurl library, you must
|
||||||
|
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
|
||||||
|
dynamic import symbols. If you get linker error like "unknown symbol
|
||||||
|
__imp__curl_easy_init ..." you have linked against the wrong (static) library.
|
||||||
|
If you want to use the curl.dll and import lib, you don't need any extra CFLAGS,
|
||||||
|
but use one of the import libraries below. These are the libraries produced by
|
||||||
|
the various lib/Makefile.* files:
|
||||||
|
|
||||||
|
Target: static lib. import lib for curl*.dll.
|
||||||
|
--------------------------------------------------------
|
||||||
|
MingW: libcurl.a libcurldll.a
|
||||||
|
MSVC (release): libcurl.lib libcurl_imp.lib
|
||||||
|
MSVC (debug): libcurld.lib libcurld_imp.lib
|
||||||
|
Borland: libcurl.lib libcurl_imp.lib
|
||||||
|
|
||||||
|
|
||||||
5.8 libcurl.so.3: open failed: No such file or directory
|
5.8 libcurl.so.3: open failed: No such file or directory
|
||||||
|
|
||||||
This is an error message you might get when you try to run a program linked
|
This is an error message you might get when you try to run a program linked
|
||||||
|
151
docs/INSTALL
151
docs/INSTALL
@@ -79,8 +79,18 @@ UNIX
|
|||||||
env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
|
env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
|
||||||
./configure
|
./configure
|
||||||
|
|
||||||
If your SSL library was compiled with rsaref (usually for use in the United
|
If you have shared SSL libs installed in a directory where your run-time
|
||||||
States), you may also need to set:
|
linker doesn't find them (which usually causes configure failures), you can
|
||||||
|
provide the -R option to ld on some operating systems to set a hard-coded
|
||||||
|
path to the run-time linker:
|
||||||
|
|
||||||
|
LDFLAGS=-R/usr/local/ssl/lib ./configure --with-ssl
|
||||||
|
|
||||||
|
Another option to the previous trick, is to set LD_LIBRARY_PATH or edit the
|
||||||
|
/etc/ld.so.conf file.
|
||||||
|
|
||||||
|
If your SSL library was compiled with rsaref (this was common in the past
|
||||||
|
when used in the United States), you may also need to set:
|
||||||
|
|
||||||
LIBS=-lRSAglue -lrsaref
|
LIBS=-lRSAglue -lrsaref
|
||||||
(as suggested by Doug Kaufman)
|
(as suggested by Doug Kaufman)
|
||||||
@@ -92,7 +102,7 @@ UNIX
|
|||||||
|
|
||||||
CC=cc ./configure
|
CC=cc ./configure
|
||||||
or
|
or
|
||||||
env Cc=cc ./configure
|
env CC=cc ./configure
|
||||||
|
|
||||||
To force a static library compile, disable the shared library creation
|
To force a static library compile, disable the shared library creation
|
||||||
by running configure like:
|
by running configure like:
|
||||||
@@ -353,9 +363,9 @@ VMS
|
|||||||
+----+------------+-------------+---+
|
+----+------------+-------------+---+
|
||||||
|
|
||||||
With the Ctrl-bits an application can tell if part or the whole message has
|
With the Ctrl-bits an application can tell if part or the whole message has
|
||||||
allready been printed from the program, DCL doesn't need to print it again.
|
already been printed from the program, DCL doesn't need to print it again.
|
||||||
|
|
||||||
Facility - basicaly the program ID. A code assigned to the program
|
Facility - basically the program ID. A code assigned to the program
|
||||||
the name can be fetched from external or internal message libraries
|
the name can be fetched from external or internal message libraries
|
||||||
Errorcode - the errodes assigned by the application
|
Errorcode - the errodes assigned by the application
|
||||||
Sev. - severity: Even = error, off = non error
|
Sev. - severity: Even = error, off = non error
|
||||||
@@ -387,7 +397,7 @@ QNX
|
|||||||
===
|
===
|
||||||
(This section was graciously brought to us by David Bentham)
|
(This section was graciously brought to us by David Bentham)
|
||||||
|
|
||||||
As QNX is targetted for resource constrained environments, the QNX headers
|
As QNX is targeted for resource constrained environments, the QNX headers
|
||||||
set conservative limits. This includes the FD_SETSIZE macro, set by default
|
set conservative limits. This includes the FD_SETSIZE macro, set by default
|
||||||
to 32. Socket descriptors returned within the CURL library may exceed this,
|
to 32. Socket descriptors returned within the CURL library may exceed this,
|
||||||
resulting in memory faults/SIGSEGV crashes when passed into select(..)
|
resulting in memory faults/SIGSEGV crashes when passed into select(..)
|
||||||
@@ -397,44 +407,6 @@ QNX
|
|||||||
libcurl, by overriding CFLAGS during configure, example
|
libcurl, by overriding CFLAGS during configure, example
|
||||||
# configure CFLAGS='-DFD_SETSIZE=64 -g -O2'
|
# configure CFLAGS='-DFD_SETSIZE=64 -g -O2'
|
||||||
|
|
||||||
CROSS COMPILE
|
|
||||||
=============
|
|
||||||
|
|
||||||
(This section was graciously brought to us by Jim Duey, 23-oct-2001)
|
|
||||||
|
|
||||||
Download and unpack the cURL package. Version should be 7.9.1 or later.
|
|
||||||
|
|
||||||
'cd' to the new directory. (ie. curl-7.9.1-pre4)
|
|
||||||
|
|
||||||
Set environment variables to point to the cross-compile toolchain and call
|
|
||||||
configure with any options you need. Be sure and specify the '--host' and
|
|
||||||
'--build' parameters at configuration time. The following script is an
|
|
||||||
example of cross-compiling for the IBM 405GP PowerPC processor using the
|
|
||||||
toolchain from MonteVista for Hardhat Linux.
|
|
||||||
|
|
||||||
(begin script)
|
|
||||||
|
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin
|
|
||||||
export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include"
|
|
||||||
export AR=ppc_405-ar
|
|
||||||
export AS=ppc_405-as
|
|
||||||
export LD=ppc_405-ld
|
|
||||||
export RANLIB=ppc_405-ranlib
|
|
||||||
export CC=ppc_405-gcc
|
|
||||||
export NM=ppc_405-nm
|
|
||||||
|
|
||||||
configure --target=powerpc-hardhat-linux \
|
|
||||||
--host=powerpc-hardhat-linux \
|
|
||||||
--build=i586-pc-linux-gnu \
|
|
||||||
--prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \
|
|
||||||
--exec-prefix=/usr/local
|
|
||||||
|
|
||||||
(end script)
|
|
||||||
|
|
||||||
The '--prefix' parameter specifies where cURL will be installed. If
|
|
||||||
'configure' completes successfully, do 'make' and 'make install' as usual.
|
|
||||||
|
|
||||||
RISC OS
|
RISC OS
|
||||||
=======
|
=======
|
||||||
@@ -478,31 +450,107 @@ NetWare
|
|||||||
- gnu make and awk running on the platform you compile on;
|
- gnu make and awk running on the platform you compile on;
|
||||||
native Win32 versions can be downloaded from:
|
native Win32 versions can be downloaded from:
|
||||||
http://www.gknw.com/development/prgtools/
|
http://www.gknw.com/development/prgtools/
|
||||||
- recent Novell LibC SDK availabable from:
|
- recent Novell LibC SDK available from:
|
||||||
http://developer.novell.com/ndk/libc.htm
|
http://developer.novell.com/ndk/libc.htm
|
||||||
- optional zlib sources (at the moment only dynamic linking with zlib.imp);
|
- optional zlib sources (at the moment only dynamic linking with zlib.imp);
|
||||||
sources with NetWare Makefile can be optained from:
|
sources with NetWare Makefile can be obtained from:
|
||||||
http://www.gknw.com/mirror/zlib/
|
http://www.gknw.com/mirror/zlib/
|
||||||
|
|
||||||
Set a search path to your compiler, linker and tools; if you want to have
|
Set a search path to your compiler, linker and tools; if you want to have
|
||||||
zlib support then set the environment var ZLIB_PATH pointing to your zlib
|
zlib support then set the environment var ZLIB_PATH pointing to your zlib
|
||||||
sources, on Linux make sure the var OSTYPE contains the string 'linux';
|
sources, on Linux make sure the var OSTYPE contains the string 'linux';
|
||||||
and finally type 'make netware' from the top source directory...
|
and finally type 'make netware' from the top source directory...
|
||||||
I found on some Linux systems (RH9) that OS detection didnt work although
|
I found on some Linux systems (RH9) that OS detection didnlt work although
|
||||||
a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it
|
a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it
|
||||||
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...;
|
with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked...;
|
||||||
other options are currently not supported, although partly prepared.
|
other options are currently not supported, although partly prepared.
|
||||||
The Ares lib builds arlready fine, and both test tools work fine at least
|
The Ares lib builds arlready fine, and both test tools work fine at least
|
||||||
when build with CodeWarrior...; dont know yet why they fail when build with
|
when build with CodeWarrior...; don't know yet why they fail when build with
|
||||||
gcc though; if you want to compile with Ares support then set an env var
|
gcc though; if you want to compile with Ares support then set an env var
|
||||||
WITH_ARES=1; I've not tested yet including libcares into curl.
|
WITH_ARES=1; I've not tested yet including libares into curl.
|
||||||
Any help in testing appreciated!
|
Any help in testing appreciated!
|
||||||
Buils automatically created 4 times a day from current CVS are here:
|
Builds automatically created 4 times a day from current CVS are here:
|
||||||
http://www.gknw.com/mirror/curl/autobuilds/
|
http://www.gknw.com/mirror/curl/autobuilds/
|
||||||
the status of these buids can be viewed at the autobuild table:
|
the status of these builds can be viewed at the autobuild table:
|
||||||
http://curl.haxx.se/auto/
|
http://curl.haxx.se/auto/
|
||||||
|
|
||||||
|
|
||||||
|
CROSS COMPILE
|
||||||
|
=============
|
||||||
|
|
||||||
|
(This section was graciously brought to us by Jim Duey, with additions by
|
||||||
|
Dan Fandrich)
|
||||||
|
|
||||||
|
Download and unpack the cURL package. Version should be 7.9.1 or later.
|
||||||
|
|
||||||
|
'cd' to the new directory. (e.g. cd curl-7.12.3)
|
||||||
|
|
||||||
|
Set environment variables to point to the cross-compile toolchain and call
|
||||||
|
configure with any options you need. Be sure and specify the '--host' and
|
||||||
|
'--build' parameters at configuration time. The following script is an
|
||||||
|
example of cross-compiling for the IBM 405GP PowerPC processor using the
|
||||||
|
toolchain from MonteVista for Hardhat Linux.
|
||||||
|
|
||||||
|
(begin script)
|
||||||
|
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin
|
||||||
|
export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include"
|
||||||
|
export AR=ppc_405-ar
|
||||||
|
export AS=ppc_405-as
|
||||||
|
export LD=ppc_405-ld
|
||||||
|
export RANLIB=ppc_405-ranlib
|
||||||
|
export CC=ppc_405-gcc
|
||||||
|
export NM=ppc_405-nm
|
||||||
|
|
||||||
|
./configure --target=powerpc-hardhat-linux \
|
||||||
|
--host=powerpc-hardhat-linux \
|
||||||
|
--build=i586-pc-linux-gnu \
|
||||||
|
--prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \
|
||||||
|
--exec-prefix=/usr/local
|
||||||
|
|
||||||
|
(end script)
|
||||||
|
|
||||||
|
You may also need to provide a parameter like '--with-random=/dev/urandom'
|
||||||
|
to configure as it cannot detect the presence of a random number
|
||||||
|
generating device for a target system. The '--prefix' parameter
|
||||||
|
specifies where cURL will be installed. If 'configure' completes
|
||||||
|
successfully, do 'make' and 'make install' as usual.
|
||||||
|
|
||||||
|
In some cases, you may be able to simplify the above commands to as
|
||||||
|
little as:
|
||||||
|
|
||||||
|
./configure --host=ARCH-OS
|
||||||
|
|
||||||
|
There are a number of configure options that can be used to reduce the
|
||||||
|
size of libcurl for embedded applications where binary size is an
|
||||||
|
important factor. First, be sure to set the CFLAGS environment variable
|
||||||
|
when configuring with any compiler optimization flags to reduce the
|
||||||
|
size of the binary. For gcc, this would mean at minimum:
|
||||||
|
|
||||||
|
env CFLAGS='-Os' ./configure ...
|
||||||
|
|
||||||
|
Be sure to specify as many --disable- and --without- flags on the configure
|
||||||
|
command-line as you can to disable all the libcurl features that you
|
||||||
|
know your application is not going to need. Besides specifying the
|
||||||
|
--disable-PROTOCOL flags for all the types of URLs your application
|
||||||
|
will not use, here are some other flags that can reduce the size of the
|
||||||
|
library:
|
||||||
|
|
||||||
|
--disable-ares (disables support for the ARES DNS library)
|
||||||
|
--disable-cookies (disables support for HTTP cookies)
|
||||||
|
--disable-crypto-auth (disables HTTP cryptographic authentication)
|
||||||
|
--disable-ipv6 (disables support for IPv6)
|
||||||
|
--disable-verbose (eliminates debugging strings and error code strings)
|
||||||
|
--without-libidn (disables support for the libidn DNS library)
|
||||||
|
--without-ssl (disables support for SSL/TLS)
|
||||||
|
--without-zlib (disables support for on-the-fly decompression)
|
||||||
|
|
||||||
|
You may find that statically linking libcurl to your application will
|
||||||
|
result in a lower total size.
|
||||||
|
|
||||||
|
|
||||||
PORTS
|
PORTS
|
||||||
=====
|
=====
|
||||||
This is a probably incomplete list of known hardware and operating systems
|
This is a probably incomplete list of known hardware and operating systems
|
||||||
@@ -538,6 +586,7 @@ PORTS
|
|||||||
- Ultrix 4.3a
|
- Ultrix 4.3a
|
||||||
- i386 BeOS
|
- i386 BeOS
|
||||||
- i386 DOS
|
- i386 DOS
|
||||||
|
- i386 Esix 4.1
|
||||||
- i386 FreeBSD
|
- i386 FreeBSD
|
||||||
- i386 HURD
|
- i386 HURD
|
||||||
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4
|
- i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4
|
||||||
|
@@ -3,6 +3,12 @@ join in and help us correct one or more of these! Also be sure to check the
|
|||||||
changelog of the current development status, as one or more of these problems
|
changelog of the current development status, as one or more of these problems
|
||||||
may have been fixed since this was written!
|
may have been fixed since this was written!
|
||||||
|
|
||||||
|
* Test case 165 might fail on system which has libidn present, but with an
|
||||||
|
old iconv version (2.1.3 is a known bad version), since it doesn't recognize
|
||||||
|
the charset when named ISO8859-1. Changing the name to ISO-8859-1 makes the
|
||||||
|
test pass, but instead makes it fail on Solaris hosts that use its native
|
||||||
|
iconv.
|
||||||
|
|
||||||
* curl version 7.12.2 fails on AIX if compiled with --enable-ares.
|
* curl version 7.12.2 fails on AIX if compiled with --enable-ares.
|
||||||
The workaround is to combine --enable-ares with --disable-shared
|
The workaround is to combine --enable-ares with --disable-shared
|
||||||
|
|
||||||
@@ -18,10 +24,6 @@ may have been fixed since this was written!
|
|||||||
wrongly only considers authentication if there's a user name provided.
|
wrongly only considers authentication if there's a user name provided.
|
||||||
Bug report #1004841. How? http://curl.haxx.se/mail/lib-2004-08/0182.html
|
Bug report #1004841. How? http://curl.haxx.se/mail/lib-2004-08/0182.html
|
||||||
|
|
||||||
* If you use a very large amount of file descriptors (more than FD_SETSIZE)
|
|
||||||
and then use libcurl, it might crash on its use of select() which then
|
|
||||||
stores data out of bounds. Bug report #948950.
|
|
||||||
|
|
||||||
* --limit-rate using -d or -F does not work. This is because the limit logic
|
* --limit-rate using -d or -F does not work. This is because the limit logic
|
||||||
is provided by the curl app in its read/write callbacks, and when doing
|
is provided by the curl app in its read/write callbacks, and when doing
|
||||||
-d/-F the callbacks aren't used! Bug report #921395.
|
-d/-F the callbacks aren't used! Bug report #921395.
|
||||||
|
28
docs/MANUAL
28
docs/MANUAL
@@ -170,8 +170,8 @@ UPLOADING
|
|||||||
|
|
||||||
curl -T - http://www.upload.com/myfile
|
curl -T - http://www.upload.com/myfile
|
||||||
|
|
||||||
Note that the http server must've been configured to accept PUT before this
|
Note that the http server must have been configured to accept PUT before
|
||||||
can be done successfully.
|
this can be done successfully.
|
||||||
|
|
||||||
For other ways to do http data upload, see the POST section below.
|
For other ways to do http data upload, see the POST section below.
|
||||||
|
|
||||||
@@ -370,7 +370,7 @@ COOKIES
|
|||||||
curl -b headers www.example.com
|
curl -b headers www.example.com
|
||||||
|
|
||||||
While saving headers to a file is a working way to store cookies, it is
|
While saving headers to a file is a working way to store cookies, it is
|
||||||
however error-prone and not the prefered way to do this. Instead, make curl
|
however error-prone and not the preferred way to do this. Instead, make curl
|
||||||
save the incoming cookies using the well-known netscape cookie format like
|
save the incoming cookies using the well-known netscape cookie format like
|
||||||
this:
|
this:
|
||||||
|
|
||||||
@@ -388,7 +388,7 @@ COOKIES
|
|||||||
file contents. In the above command, curl will parse the header and store
|
file contents. In the above command, curl will parse the header and store
|
||||||
the cookies received from www.example.com. curl will send to the server the
|
the cookies received from www.example.com. curl will send to the server the
|
||||||
stored cookies which match the request as it follows the location. The
|
stored cookies which match the request as it follows the location. The
|
||||||
file "empty.txt" may be a non-existant file.
|
file "empty.txt" may be a nonexistent file.
|
||||||
|
|
||||||
Alas, to both read and write cookies from a netscape cookie file, you can
|
Alas, to both read and write cookies from a netscape cookie file, you can
|
||||||
set both -b and -c to use the same file:
|
set both -b and -c to use the same file:
|
||||||
@@ -417,7 +417,7 @@ PROGRESS METER
|
|||||||
Upload - the average transfer speed of the upload
|
Upload - the average transfer speed of the upload
|
||||||
Time Total - expected time to complete the operation
|
Time Total - expected time to complete the operation
|
||||||
Time Current - time passed since the invoke
|
Time Current - time passed since the invoke
|
||||||
Time Left - expected time left to completetion
|
Time Left - expected time left to completion
|
||||||
Curr.Speed - the average transfer speed the last 5 seconds (the first
|
Curr.Speed - the average transfer speed the last 5 seconds (the first
|
||||||
5 seconds of a transfer is based on less time of course.)
|
5 seconds of a transfer is based on less time of course.)
|
||||||
|
|
||||||
@@ -437,14 +437,14 @@ SPEED LIMIT
|
|||||||
curl -Y 3000 -y 60 www.far-away-site.com
|
curl -Y 3000 -y 60 www.far-away-site.com
|
||||||
|
|
||||||
This can very well be used in combination with the overall time limit, so
|
This can very well be used in combination with the overall time limit, so
|
||||||
that the above operatioin must be completed in whole within 30 minutes:
|
that the above operation must be completed in whole within 30 minutes:
|
||||||
|
|
||||||
curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
|
curl -m 1800 -Y 3000 -y 60 www.far-away-site.com
|
||||||
|
|
||||||
Forcing curl not to transfer data faster than a given rate is also possible,
|
Forcing curl not to transfer data faster than a given rate is also possible,
|
||||||
which might be useful if you're using a limited bandwidth connection and you
|
which might be useful if you're using a limited bandwidth connection and you
|
||||||
don't want your transfer to use all of it (sometimes referred to as
|
don't want your transfer to use all of it (sometimes referred to as
|
||||||
"bandwith throttle").
|
"bandwidth throttle").
|
||||||
|
|
||||||
Make curl transfer data no faster than 10 kilobytes per second:
|
Make curl transfer data no faster than 10 kilobytes per second:
|
||||||
|
|
||||||
@@ -590,7 +590,7 @@ HTTPS
|
|||||||
|
|
||||||
Secure HTTP requires SSL libraries to be installed and used when curl is
|
Secure HTTP requires SSL libraries to be installed and used when curl is
|
||||||
built. If that is done, curl is capable of retrieving and posting documents
|
built. If that is done, curl is capable of retrieving and posting documents
|
||||||
using the HTTPS procotol.
|
using the HTTPS protocol.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
@@ -765,7 +765,7 @@ NETRC
|
|||||||
to specify name and password for commonly visited ftp sites in a file so
|
to specify name and password for commonly visited ftp sites in a file so
|
||||||
that you don't have to type them in each time you visit those sites. You
|
that you don't have to type them in each time you visit those sites. You
|
||||||
realize this is a big security risk if someone else gets hold of your
|
realize this is a big security risk if someone else gets hold of your
|
||||||
passwords, so therefor most unix programs won't read this file unless it is
|
passwords, so therefore most unix programs won't read this file unless it is
|
||||||
only readable by yourself (curl doesn't care though).
|
only readable by yourself (curl doesn't care though).
|
||||||
|
|
||||||
Curl supports .netrc files if told so (using the -n/--netrc and
|
Curl supports .netrc files if told so (using the -n/--netrc and
|
||||||
@@ -830,22 +830,22 @@ TELNET
|
|||||||
to track when the login prompt is received and send the username and
|
to track when the login prompt is received and send the username and
|
||||||
password accordingly.
|
password accordingly.
|
||||||
|
|
||||||
PERSISTANT CONNECTIONS
|
PERSISTENT CONNECTIONS
|
||||||
|
|
||||||
Specifying multiple files on a single command line will make curl transfer
|
Specifying multiple files on a single command line will make curl transfer
|
||||||
all of them, one after the other in the specified order.
|
all of them, one after the other in the specified order.
|
||||||
|
|
||||||
libcurl will attempt to use persistant connections for the transfers so that
|
libcurl will attempt to use persistent connections for the transfers so that
|
||||||
the second transfer to the same host can use the same connection that was
|
the second transfer to the same host can use the same connection that was
|
||||||
already initiated and was left open in the previous transfer. This greatly
|
already initiated and was left open in the previous transfer. This greatly
|
||||||
decreases connection time for all but the first transfer and it makes a far
|
decreases connection time for all but the first transfer and it makes a far
|
||||||
better use of the network.
|
better use of the network.
|
||||||
|
|
||||||
Note that curl cannot use persistant connections for transfers that are used
|
Note that curl cannot use persistent connections for transfers that are used
|
||||||
in subsequence curl invokes. Try to stuff as many URLs as possible on the
|
in subsequence curl invokes. Try to stuff as many URLs as possible on the
|
||||||
same command line if they are using the same host, as that'll make the
|
same command line if they are using the same host, as that'll make the
|
||||||
transfers faster. If you use a http proxy for file transfers, practicly
|
transfers faster. If you use a http proxy for file transfers, practically
|
||||||
all transfers will be persistant.
|
all transfers will be persistent.
|
||||||
|
|
||||||
MAILING LISTS
|
MAILING LISTS
|
||||||
|
|
||||||
|
10
docs/THANKS
10
docs/THANKS
@@ -98,3 +98,13 @@ Gisle Vanem <gvanem@broadpark.no>
|
|||||||
Giuseppe Attardi <attardi@di.unipi.it>
|
Giuseppe Attardi <attardi@di.unipi.it>
|
||||||
Tor Arntsen <tor@spacetec.no>
|
Tor Arntsen <tor@spacetec.no>
|
||||||
David Byron <DByron@everdreamcorp.com>
|
David Byron <DByron@everdreamcorp.com>
|
||||||
|
David Phillips
|
||||||
|
Alexander Krasnostavsky
|
||||||
|
G<EFBFBD>nter Knauf
|
||||||
|
Bertrand Demiddelaer
|
||||||
|
Peter Sylvester
|
||||||
|
Alexis S. L. Carvalho
|
||||||
|
Casey O'Donnell
|
||||||
|
Marty Kuhrt
|
||||||
|
James Bursa
|
||||||
|
Greg Hewgill
|
||||||
|
33
docs/TODO
33
docs/TODO
@@ -15,10 +15,10 @@ TODO
|
|||||||
LIBCURL
|
LIBCURL
|
||||||
|
|
||||||
* Introduce an interface to libcurl that allows applications to easier get to
|
* Introduce an interface to libcurl that allows applications to easier get to
|
||||||
know what cookies that are received. Pushing interface that calls a
|
know what cookies that are received. CURLINFO_COOKIELIST to get a
|
||||||
callback on each received cookie? Querying interface that asks about
|
curl_slist with cookies (netscape/mozilla cookie file formatted), and
|
||||||
existing cookies? We probably need both. Enable applications to modify
|
CURLOPT_COOKIELIST to set a list of cookies (using the same format).
|
||||||
existing cookies as well. http://curl.haxx.se/dev/COOKIES
|
http://curl.haxx.se/mail/lib-2004-12/0195.html
|
||||||
|
|
||||||
* Introduce another callback interface for upload/download that makes one
|
* Introduce another callback interface for upload/download that makes one
|
||||||
less copy of data and thus a faster operation.
|
less copy of data and thus a faster operation.
|
||||||
@@ -38,6 +38,11 @@ TODO
|
|||||||
|
|
||||||
LIBCURL - multi interface
|
LIBCURL - multi interface
|
||||||
|
|
||||||
|
* Add a curl_multi_fdset() alternative that returns only two arrays with file
|
||||||
|
desrciptors for reading and writing to allow the app to use whatever
|
||||||
|
function it prefers. Plus, this allows apps to avoid the FD_SETSIZE problem
|
||||||
|
with select().
|
||||||
|
|
||||||
* Add curl_multi_timeout() to make libcurl's ares-functionality better.
|
* Add curl_multi_timeout() to make libcurl's ares-functionality better.
|
||||||
|
|
||||||
* Make sure we don't ever loop because of non-blocking sockets return
|
* Make sure we don't ever loop because of non-blocking sockets return
|
||||||
@@ -57,24 +62,14 @@ TODO
|
|||||||
|
|
||||||
FTP
|
FTP
|
||||||
|
|
||||||
* "PASV IP override" - When an FTPS host is behind a NAT firewall, passive
|
|
||||||
mode fails. The PASV response from the host ["227 PASV Entering passive
|
|
||||||
mode (_ip_address_, _port_)."] contains the private network IP address of
|
|
||||||
the host, which since it is encrypted, cannot be modified by the firewall
|
|
||||||
to the public IP address. What is needed is a cURL option to override the
|
|
||||||
IP address passed by the host "227 PASV" response. Requested by Ed
|
|
||||||
Hingsbergen
|
|
||||||
|
|
||||||
* Support GSS/Kerberos 5 for ftp file transfer. This will allow user
|
* Support GSS/Kerberos 5 for ftp file transfer. This will allow user
|
||||||
authentication and file encryption. Possible libraries and example clients
|
authentication and file encryption. Possible libraries and example clients
|
||||||
are available from MIT or Heimdal. Requsted by Markus Moeller.
|
are available from MIT or Heimdal. Requsted by Markus Moeller.
|
||||||
|
|
||||||
* Optimize the way libcurl uses CWD on each new request over a persistent
|
|
||||||
connection (on FTP) even if it doesn't have to.
|
|
||||||
|
|
||||||
* REST fix for servers not behaving well on >2GB requests. This should fail
|
* REST fix for servers not behaving well on >2GB requests. This should fail
|
||||||
if the server doesn't set the pointer to the requested index. The tricky
|
if the server doesn't set the pointer to the requested index. The tricky
|
||||||
part is to figure out if the server did the right thing or not.
|
(impossible?) part is to figure out if the server did the right thing or
|
||||||
|
not.
|
||||||
|
|
||||||
* Support the most common FTP proxies, Philip Newton provided a list
|
* Support the most common FTP proxies, Philip Newton provided a list
|
||||||
allegedly from ncftp:
|
allegedly from ncftp:
|
||||||
@@ -221,9 +216,6 @@ TODO
|
|||||||
* Make the test servers able to serve multiple running test suites. Like if
|
* Make the test servers able to serve multiple running test suites. Like if
|
||||||
two users run 'make test' at once.
|
two users run 'make test' at once.
|
||||||
|
|
||||||
* Make runtests.pl capable of changing port numbers for the servers. This was
|
|
||||||
the intention from the start, but in practise it is now hard.
|
|
||||||
|
|
||||||
* If perl wasn't found by the configure script, don't attempt to run the
|
* If perl wasn't found by the configure script, don't attempt to run the
|
||||||
tests but explain something nice why it doesn't.
|
tests but explain something nice why it doesn't.
|
||||||
|
|
||||||
@@ -250,3 +242,6 @@ TODO
|
|||||||
|
|
||||||
They will instead become curlx_ - alternatives. That makes the curl app
|
They will instead become curlx_ - alternatives. That makes the curl app
|
||||||
still capable of building with them from source.
|
still capable of building with them from source.
|
||||||
|
|
||||||
|
* Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
|
||||||
|
internally. Let the app judge success or not for itself.
|
||||||
|
@@ -1,7 +1,5 @@
|
|||||||
Online: http://curl.haxx.se/docs/httpscripting.shtml
|
Online: http://curl.haxx.se/docs/httpscripting.shtml
|
||||||
Author: Daniel Stenberg <daniel@haxx.se>
|
Date: December 9, 2004
|
||||||
Date: November 6, 2001
|
|
||||||
Version: 0.6
|
|
||||||
|
|
||||||
The Art Of Scripting HTTP Requests Using Curl
|
The Art Of Scripting HTTP Requests Using Curl
|
||||||
=============================================
|
=============================================
|
||||||
@@ -139,11 +137,11 @@ Version: 0.6
|
|||||||
you need to replace that space with %20 etc. Failing to comply with this
|
you need to replace that space with %20 etc. Failing to comply with this
|
||||||
will most likely cause your data to be received wrongly and messed up.
|
will most likely cause your data to be received wrongly and messed up.
|
||||||
|
|
||||||
4.3 FILE UPLOAD POST
|
4.3 File Upload POST
|
||||||
|
|
||||||
Back in late 1995 they defined a new way to post data over HTTP. It was
|
Back in late 1995 they defined an additional way to post data over HTTP. It
|
||||||
documented in the RFC 1867, why this method sometimes is referred to as
|
is documented in the RFC 1867, why this method sometimes is referred to as
|
||||||
a RFC1867-posting.
|
RFC1867-posting.
|
||||||
|
|
||||||
This method is mainly designed to better support file uploads. A form that
|
This method is mainly designed to better support file uploads. A form that
|
||||||
allows a user to upload a file could be written like this in HTML:
|
allows a user to upload a file could be written like this in HTML:
|
||||||
@@ -160,7 +158,7 @@ Version: 0.6
|
|||||||
|
|
||||||
curl -F upload=@localfilename -F press=OK [URL]
|
curl -F upload=@localfilename -F press=OK [URL]
|
||||||
|
|
||||||
4.4 HIDDEN FIELDS
|
4.4 Hidden Fields
|
||||||
|
|
||||||
A very common way for HTML based application to pass state information
|
A very common way for HTML based application to pass state information
|
||||||
between pages is to add hidden fields to the forms. Hidden fields are
|
between pages is to add hidden fields to the forms. Hidden fields are
|
||||||
@@ -181,7 +179,7 @@ Version: 0.6
|
|||||||
|
|
||||||
curl -d "birthyear=1905&press=OK&person=daniel" [URL]
|
curl -d "birthyear=1905&press=OK&person=daniel" [URL]
|
||||||
|
|
||||||
4.5 FIGURE OUT WHAT A POST LOOKS LIKE
|
4.5 Figure Out What A POST Looks Like
|
||||||
|
|
||||||
When you're about fill in a form and send to a server by using curl instead
|
When you're about fill in a form and send to a server by using curl instead
|
||||||
of a browser, you're of course very interested in sending a POST exactly the
|
of a browser, you're of course very interested in sending a POST exactly the
|
||||||
@@ -204,7 +202,7 @@ Version: 0.6
|
|||||||
|
|
||||||
curl -T uploadfile www.uploadhttp.com/receive.cgi
|
curl -T uploadfile www.uploadhttp.com/receive.cgi
|
||||||
|
|
||||||
6. AUTHENTICATION
|
6. Authentication
|
||||||
|
|
||||||
Authentication is the ability to tell the server your username and password
|
Authentication is the ability to tell the server your username and password
|
||||||
so that it can verify that you're allowed to do the request you're doing. The
|
so that it can verify that you're allowed to do the request you're doing. The
|
||||||
@@ -229,31 +227,31 @@ Version: 0.6
|
|||||||
curl -U proxyuser:proxypassword curl.haxx.se
|
curl -U proxyuser:proxypassword curl.haxx.se
|
||||||
|
|
||||||
If your proxy requires the authentication to be done using the NTLM method,
|
If your proxy requires the authentication to be done using the NTLM method,
|
||||||
use --proxy-ntlm.
|
use --proxy-ntlm, if it requires Digest use --proxy-digest.
|
||||||
|
|
||||||
If you use any one these user+password options but leave out the password
|
If you use any one these user+password options but leave out the password
|
||||||
part, curl will prompt for the password interactively.
|
part, curl will prompt for the password interactively.
|
||||||
|
|
||||||
Do note that when a program is run, its parameters are possible to see when
|
Do note that when a program is run, its parameters might be possible to see
|
||||||
listing the running processes of the system. Thus, other users may be able to
|
when listing the running processes of the system. Thus, other users may be
|
||||||
watch your passwords if you pass them as plain command line options. There
|
able to watch your passwords if you pass them as plain command line
|
||||||
are ways to circumvent this.
|
options. There are ways to circumvent this.
|
||||||
|
|
||||||
7. REFERER
|
7. Referer
|
||||||
|
|
||||||
A HTTP request may include a 'referer' field, which can be used to tell from
|
A HTTP request may include a 'referer' field (yes it is misspelled), which
|
||||||
which URL the client got to this particular resource. Some programs/scripts
|
can be used to tell from which URL the client got to this particular
|
||||||
check the referer field of requests to verify that this wasn't arriving from
|
resource. Some programs/scripts check the referer field of requests to verify
|
||||||
an external site or an unknown page. While this is a stupid way to check
|
that this wasn't arriving from an external site or an unknown page. While
|
||||||
something so easily forged, many scripts still do it. Using curl, you can put
|
this is a stupid way to check something so easily forged, many scripts still
|
||||||
anything you want in the referer-field and thus more easily be able to fool
|
do it. Using curl, you can put anything you want in the referer-field and
|
||||||
the server into serving your request.
|
thus more easily be able to fool the server into serving your request.
|
||||||
|
|
||||||
Use curl to set the referer field with:
|
Use curl to set the referer field with:
|
||||||
|
|
||||||
curl -e http://curl.haxx.se daniel.haxx.se
|
curl -e http://curl.haxx.se daniel.haxx.se
|
||||||
|
|
||||||
8. USER AGENT
|
8. User Agent
|
||||||
|
|
||||||
Very similar to the referer field, all HTTP requests may set the User-Agent
|
Very similar to the referer field, all HTTP requests may set the User-Agent
|
||||||
field. It names what user agent (client) that is being used. Many
|
field. It names what user agent (client) that is being used. Many
|
||||||
@@ -275,7 +273,7 @@ Version: 0.6
|
|||||||
|
|
||||||
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
|
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
|
||||||
|
|
||||||
9. REDIRECTS
|
9. Redirects
|
||||||
|
|
||||||
When a resource is requested from a server, the reply from the server may
|
When a resource is requested from a server, the reply from the server may
|
||||||
include a hint about where the browser should go next to find this page, or a
|
include a hint about where the browser should go next to find this page, or a
|
||||||
@@ -294,7 +292,7 @@ Version: 0.6
|
|||||||
page, you can safely use -L and -d/-F together. Curl will only use POST in
|
page, you can safely use -L and -d/-F together. Curl will only use POST in
|
||||||
the first request, and then revert to GET in the following operations.
|
the first request, and then revert to GET in the following operations.
|
||||||
|
|
||||||
10. COOKIES
|
10. Cookies
|
||||||
|
|
||||||
The way the web browsers do "client side state control" is by using
|
The way the web browsers do "client side state control" is by using
|
||||||
cookies. Cookies are just names with associated contents. The cookies are
|
cookies. Cookies are just names with associated contents. The cookies are
|
||||||
@@ -366,7 +364,7 @@ Version: 0.6
|
|||||||
|
|
||||||
curl https://that.secure.server.com
|
curl https://that.secure.server.com
|
||||||
|
|
||||||
11.1 CERTIFICATES
|
11.1 Certificates
|
||||||
|
|
||||||
In the HTTPS world, you use certificates to validate that you are the one
|
In the HTTPS world, you use certificates to validate that you are the one
|
||||||
you you claim to be, as an addition to normal passwords. Curl supports
|
you you claim to be, as an addition to normal passwords. Curl supports
|
||||||
@@ -379,11 +377,67 @@ Version: 0.6
|
|||||||
curl -E mycert.pem https://that.secure.server.com
|
curl -E mycert.pem https://that.secure.server.com
|
||||||
|
|
||||||
curl also tries to verify that the server is who it claims to be, by
|
curl also tries to verify that the server is who it claims to be, by
|
||||||
verifying the server's certificate against a CA cert bundle. Failing the
|
verifying the server's certificate against a locally stored CA cert
|
||||||
verification will cause curl to deny the connection. You must then use -k in
|
bundle. Failing the verification will cause curl to deny the connection. You
|
||||||
case you want to tell curl to ignore that the server can't be verified.
|
must then use -k in case you want to tell curl to ignore that the server
|
||||||
|
can't be verified.
|
||||||
|
|
||||||
12. REFERENCES
|
More about server certificate verification and ca cert bundles can be read
|
||||||
|
in the SSLCERTS document, available online here:
|
||||||
|
|
||||||
|
http://curl.haxx.se/docs/sslcerts.html
|
||||||
|
|
||||||
|
12. Custom Request Elements
|
||||||
|
|
||||||
|
Doing fancy stuff, you may need to add or change elements of a single curl
|
||||||
|
request.
|
||||||
|
|
||||||
|
For example, you can change the POST request to a PROPFIND and send the data
|
||||||
|
as "Content-Type: text/xml" (instead of the default Content-Type) like this:
|
||||||
|
|
||||||
|
curl -d "<xml>" -H "Content-Type: text/xml" -X PROPFIND url.com
|
||||||
|
|
||||||
|
You can delete a default header by providing one without content. Like you
|
||||||
|
can ruin the request by chopping off the Host: header:
|
||||||
|
|
||||||
|
curl -H "Host:" http://mysite.com
|
||||||
|
|
||||||
|
You can add headers the same way. Your server may want a "Destination:"
|
||||||
|
header, and you can add it:
|
||||||
|
|
||||||
|
curl -H "Destination: http://moo.com/nowhere" http://url.com
|
||||||
|
|
||||||
|
13. Debug
|
||||||
|
|
||||||
|
Many times when you run curl on a site, you'll notice that the site doesn't
|
||||||
|
seem to respond the same way to your curl requests as it does to your
|
||||||
|
browser's.
|
||||||
|
|
||||||
|
Then you need to start making your curl requests more similar to your
|
||||||
|
browser's requests:
|
||||||
|
|
||||||
|
* Use the --trace-ascii option to store fully detailed logs of the requests
|
||||||
|
for easier analyzing and better understanding
|
||||||
|
|
||||||
|
* Make sure you check for and use cookies when needed (both reading with -b
|
||||||
|
and writing with -c)
|
||||||
|
|
||||||
|
* Set user-agent to one like a recent popular browser does
|
||||||
|
|
||||||
|
* Set referer like it is set by the browser
|
||||||
|
|
||||||
|
* If you use POST, make sure you send all the fields and in the same order as
|
||||||
|
the browser does it. (See chapter 4.5 above)
|
||||||
|
|
||||||
|
A very good helper to make sure you do this right, is the LiveHTTPHeader tool
|
||||||
|
that lets you view all headers you send and receive with Mozilla/Firefox
|
||||||
|
(even when using HTTPS).
|
||||||
|
|
||||||
|
A more raw approach is to capture the HTTP traffic on the network with tools
|
||||||
|
such as ethereal or tcpdump and check what headers that were sent and
|
||||||
|
received by the browser. (HTTPS makes this technique inefficient.)
|
||||||
|
|
||||||
|
14. References
|
||||||
|
|
||||||
RFC 2616 is a must to read if you want in-depth understanding of the HTTP
|
RFC 2616 is a must to read if you want in-depth understanding of the HTTP
|
||||||
protocol.
|
protocol.
|
||||||
|
@@ -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 "8 Oct 2002" "Curl 7.10" "curl-config manual"
|
.TH curl-config 1 "11 Dec 2004" "Curl 7.10" "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
|
||||||
@@ -38,7 +38,8 @@ Outputs version information about the installed libcurl.
|
|||||||
Outputs version information about the installed libcurl, in numerical mode.
|
Outputs version information about the installed libcurl, in numerical mode.
|
||||||
This outputs the version number, in hexadecimal, with 8 bits for each part;
|
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
|
major, minor, patch. So that libcurl 7.7.4 would appear as 070704 and libcurl
|
||||||
12.13.14 would appear as 0c0d0e...
|
12.13.14 would appear as 0c0d0e... Note that the initial zero might be
|
||||||
|
omitted.
|
||||||
.SH "EXAMPLES"
|
.SH "EXAMPLES"
|
||||||
What linker options do I need when I link with libcurl?
|
What linker options do I need when I link with libcurl?
|
||||||
|
|
||||||
|
95
docs/curl.1
95
docs/curl.1
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $Id$
|
||||||
.\" **************************************************************************
|
.\" **************************************************************************
|
||||||
.\"
|
.\"
|
||||||
.TH curl 1 "3 May 2004" "Curl 7.12" "Curl Manual"
|
.TH curl 1 "7 Dec 2004" "Curl 7.12.3" "Curl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl \- transfer a URL
|
curl \- transfer a URL
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -91,6 +91,11 @@ network round-trip. This is used instead of setting a specific authentication
|
|||||||
method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and
|
method, which you can do with \fI--basic\fP, \fI--digest\fP, \fI--ntlm\fP, and
|
||||||
\fI--negotiate\fP. (Added in 7.10.6)
|
\fI--negotiate\fP. (Added in 7.10.6)
|
||||||
|
|
||||||
|
Note that using --anyauth is not recommended if you do uploads from stdin,
|
||||||
|
since it may require data to be sent twice and then the client must be able to
|
||||||
|
rewind. If the need should arise when uploading from stdin, the upload
|
||||||
|
operation will fail.
|
||||||
|
|
||||||
If this option is used several times, the following occurrences make no
|
If this option is used several times, the following occurrences make no
|
||||||
difference.
|
difference.
|
||||||
.IP "-b/--cookie <name=data>"
|
.IP "-b/--cookie <name=data>"
|
||||||
@@ -160,12 +165,12 @@ won't fail or even report an error clearly. Using -v will get a warning
|
|||||||
displayed, but that is the only visible feedback you get about this possibly
|
displayed, but that is the only visible feedback you get about this possibly
|
||||||
lethal situation.
|
lethal situation.
|
||||||
|
|
||||||
If this option is used several times, the last specfied file name will be
|
If this option is used several times, the last specified file name will be
|
||||||
used.
|
used.
|
||||||
.IP "-C/--continue-at <offset>"
|
.IP "-C/--continue-at <offset>"
|
||||||
Continue/Resume a previous file transfer at the given offset. The given offset
|
Continue/Resume a previous file transfer at the given offset. The given offset
|
||||||
is the exact number of bytes that will be skipped counted from the beginning
|
is the exact number of bytes that will be skipped counted from the beginning
|
||||||
of the source file before it is transfered to the destination. If used with
|
of the source file before it is transferred to the destination. If used with
|
||||||
uploads, the ftp server command SIZE will not be used by curl.
|
uploads, the ftp server command SIZE will not be used by curl.
|
||||||
|
|
||||||
Use "-C -" to tell curl to automatically find out where/how to resume the
|
Use "-C -" to tell curl to automatically find out where/how to resume the
|
||||||
@@ -236,7 +241,7 @@ active FTP transfers. Curl will normally always first attempt to use EPRT,
|
|||||||
then LPRT before using PORT, but with this option, it will use PORT right
|
then LPRT before using PORT, but with this option, it will use PORT right
|
||||||
away. EPRT and LPRT are extensions to the original FTP protocol, may not work
|
away. EPRT and LPRT are extensions to the original FTP protocol, may not work
|
||||||
on all servers but enable more functionality in a better way than the
|
on all servers but enable more functionality in a better way than the
|
||||||
traditional PORT command. (Aded in 7.10.5)
|
traditional PORT command. (Added in 7.10.5)
|
||||||
|
|
||||||
If this option is used several times, each occurrence will toggle this on/off.
|
If this option is used several times, each occurrence will toggle this on/off.
|
||||||
.IP "--disable-epsv"
|
.IP "--disable-epsv"
|
||||||
@@ -265,6 +270,11 @@ automatically set the previous URL when it follows a Location: header. The
|
|||||||
";auto" string can be used alone, even if you don't set an initial referer.
|
";auto" string can be used alone, even if you don't set an initial referer.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
|
.IP "--engine <name>"
|
||||||
|
Select the OpenSSL crypto engine to use for cipher
|
||||||
|
operations. Use \fI--engine list\fP to print a list of build-time supported
|
||||||
|
engines. Note that not all (or none) of the engines may be available at
|
||||||
|
run-time.
|
||||||
.IP "--environment"
|
.IP "--environment"
|
||||||
(RISC OS ONLY) Sets a range of environment variables, using the names the -w
|
(RISC OS ONLY) Sets a range of environment variables, using the names the -w
|
||||||
option supports, to easier allow extraction of useful information after having
|
option supports, to easier allow extraction of useful information after having
|
||||||
@@ -328,7 +338,7 @@ will instead attempt to create missing directories. (Added in 7.10.7)
|
|||||||
If this option is used twice, the second will again disable silent failure.
|
If this option is used twice, the second will again disable silent failure.
|
||||||
.IP "--ftp-pasv"
|
.IP "--ftp-pasv"
|
||||||
(FTP) Use PASV when transfering. PASV is the internal default behavior, but
|
(FTP) Use PASV when transfering. PASV is the internal default behavior, but
|
||||||
using this option can be used to override a previos --ftp-port option. (Added
|
using this option can be used to override a previous --ftp-port option. (Added
|
||||||
in 7.11.0)
|
in 7.11.0)
|
||||||
|
|
||||||
If this option is used twice, the second will again disable silent failure.
|
If this option is used twice, the second will again disable silent failure.
|
||||||
@@ -340,7 +350,7 @@ If this option is used twice, the second will again disable this.
|
|||||||
(HTTP) This lets curl emulate a filled in form in which a user has pressed the
|
(HTTP) This lets curl emulate a filled in form in which a user has pressed the
|
||||||
submit button. This causes curl to POST data using the Content-Type
|
submit button. This causes curl to POST data using the Content-Type
|
||||||
multipart/form-data according to RFC1867. This enables uploading of binary
|
multipart/form-data according to RFC1867. This enables uploading of binary
|
||||||
files etc. To force the 'content' part to be be a file, prefix the file name
|
files etc. To force the 'content' part to be a file, prefix the file name
|
||||||
with an @ sign. To just get the content part from a file, prefix the file name
|
with an @ sign. To just get the content part from a file, prefix the file name
|
||||||
with the letter <. The difference between @ and < is then that @ makes a file
|
with the letter <. The difference between @ and < is then that @ makes a file
|
||||||
get attached in the post as a file upload, while the < makes a text field and
|
get attached in the post as a file upload, while the < makes a text field and
|
||||||
@@ -352,7 +362,7 @@ input:
|
|||||||
|
|
||||||
\fBcurl\fP -F password=@/etc/passwd www.mypasswords.com
|
\fBcurl\fP -F password=@/etc/passwd www.mypasswords.com
|
||||||
|
|
||||||
To read the file's content from stdin insted of a file, use - where the file
|
To read the file's content from stdin instead of a file, use - where the file
|
||||||
name should've been. This goes for both @ and < constructs.
|
name should've been. This goes for both @ and < constructs.
|
||||||
|
|
||||||
You can also tell curl what Content-Type to use by using 'type=', in a manner
|
You can also tell curl what Content-Type to use by using 'type=', in a manner
|
||||||
@@ -420,7 +430,7 @@ time only.
|
|||||||
If this option is used twice, the second will again disable header only.
|
If this option is used twice, the second will again disable header only.
|
||||||
.IP "-j/--junk-session-cookies"
|
.IP "-j/--junk-session-cookies"
|
||||||
(HTTP) When curl is told to read cookies from a given file, this option will
|
(HTTP) When curl is told to read cookies from a given file, this option will
|
||||||
make it discard all "session cookies". This will basicly have the same effect
|
make it discard all "session cookies". This will basically have the same effect
|
||||||
as if a new session is started. Typical browsers always discard session
|
as if a new session is started. Typical browsers always discard session
|
||||||
cookies when they're closed down. (Added in 7.9.7)
|
cookies when they're closed down. (Added in 7.9.7)
|
||||||
|
|
||||||
@@ -448,7 +458,7 @@ If this option is used several times, the last one will be used.
|
|||||||
should be one of 'clear', 'safe', 'confidential' or 'private'. Should you use
|
should be one of 'clear', 'safe', 'confidential' or 'private'. Should you use
|
||||||
a level that is not one of these, 'private' will instead be used.
|
a level that is not one of these, 'private' will instead be used.
|
||||||
|
|
||||||
This option requiures that the library was built with kerberos4 support. This
|
This option requires that the library was built with kerberos4 support. This
|
||||||
is not very common. Use \fI-V/--version\fP to see if your curl supports it.
|
is not very common. Use \fI-V/--version\fP to see if your curl supports it.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
@@ -558,12 +568,12 @@ Very similar to \fI--netrc\fP, but this option makes the .netrc usage
|
|||||||
\fBoptional\fP and not mandatory as the \fI--netrc\fP does.
|
\fBoptional\fP and not mandatory as the \fI--netrc\fP does.
|
||||||
.IP "--negotiate"
|
.IP "--negotiate"
|
||||||
(HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate method was
|
(HTTP) Enables GSS-Negotiate authentication. The GSS-Negotiate method was
|
||||||
designed by Microsoft and is used in their web aplications. It is primarily
|
designed by Microsoft and is used in their web applications. It is primarily
|
||||||
meant as a support for Kerberos5 authentication but may be also used along
|
meant as a support for Kerberos5 authentication but may be also used along
|
||||||
with another authentication methods. For more information see IETF draft
|
with another authentication methods. For more information see IETF draft
|
||||||
draft-brezak-spnego-http-04.txt. (Added in 7.10.6)
|
draft-brezak-spnego-http-04.txt. (Added in 7.10.6)
|
||||||
|
|
||||||
This option requiures that the library was built with GSSAPI support. This is
|
This option requires that the library was built with GSSAPI support. This is
|
||||||
not very common. Use \fI-V/--version\fP to see if your version supports
|
not very common. Use \fI-V/--version\fP to see if your version supports
|
||||||
GSS-Negotiate.
|
GSS-Negotiate.
|
||||||
|
|
||||||
@@ -587,7 +597,7 @@ authentication method instead. Such as Digest. (Added in 7.10.6)
|
|||||||
If you want to enable NTLM for your proxy authentication, then use
|
If you want to enable NTLM for your proxy authentication, then use
|
||||||
\fI--proxy-ntlm\fP.
|
\fI--proxy-ntlm\fP.
|
||||||
|
|
||||||
This option requiures that the library was built with SSL support. Use
|
This option requires that the library was built with SSL support. Use
|
||||||
\fI-V/--version\fP to see if your curl supports NTLM.
|
\fI-V/--version\fP to see if your curl supports NTLM.
|
||||||
|
|
||||||
If this option is used several times, the following occurrences make no
|
If this option is used several times, the following occurrences make no
|
||||||
@@ -723,6 +733,37 @@ remote file, and if that is available make the local file get that same
|
|||||||
timestamp.
|
timestamp.
|
||||||
|
|
||||||
If this option is used twice, the second time disables this again.
|
If this option is used twice, the second time disables this again.
|
||||||
|
.IP "--retry <num>"
|
||||||
|
If a transient error is returned when curl tries to perform a transfer, it
|
||||||
|
will retry this number of times before giving up. Setting the number to 0
|
||||||
|
makes curl do no retries (which is the default). Transient error means either:
|
||||||
|
a timeout, an FTP 5xx response code or an HTTP 5xx response code.
|
||||||
|
|
||||||
|
When curl is about to retry a transfer, it will first wait one second and then
|
||||||
|
for all forthcoming retries it will double the waiting time until it reaches
|
||||||
|
10 minutes which then will be the delay between the rest of the retries. By
|
||||||
|
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See
|
||||||
|
also \fI--retry-max-time\fP to limit the total time allowed for
|
||||||
|
retries. (Option added in 7.12.3)
|
||||||
|
|
||||||
|
If this option is used multiple times, the last occurrence decide the amount.
|
||||||
|
.IP "--retry-delay <seconds>"
|
||||||
|
Make curl sleep this amount of time between each retry when a transfer has
|
||||||
|
failed with a transient error (it changes the default backoff time algorithm
|
||||||
|
between retries). This option is only interesting if \fI--retry\fP is also
|
||||||
|
used. Setting this delay to zero will make curl use the default backoff time.
|
||||||
|
(Option added in 7.12.3)
|
||||||
|
|
||||||
|
If this option is used multiple times, the last occurrence decide the amount.
|
||||||
|
.IP "--retry-max-time <seconds>"
|
||||||
|
The retry timer is reset before the first transfer attempt. Retries will be
|
||||||
|
done as usual (see \fI--retry\fP) as long as the timer hasn't reached this
|
||||||
|
given limit. Notice that if the timer hasn't reached the limit, the request
|
||||||
|
will be made and while performing, it may take longer than this given time
|
||||||
|
period. To limit a single request\'s maximum time, use \fI-m/--max-time\fP.
|
||||||
|
Set this option to zero to not timeout retries. (Option added in 7.12.3)
|
||||||
|
|
||||||
|
If this option is used multiple times, the last occurrence decide the amount.
|
||||||
.IP "-s/--silent"
|
.IP "-s/--silent"
|
||||||
Silent mode. Don't show progress meter or error messages. Makes
|
Silent mode. Don't show progress meter or error messages. Makes
|
||||||
Curl mute.
|
Curl mute.
|
||||||
@@ -750,7 +791,7 @@ If this option is used several times, the last one will be used.
|
|||||||
Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for
|
Turn on the TCP_NODELAY option. See the \fIcurl_easy_setopt(3)\fP man page for
|
||||||
details about this option. (Added in 7.11.2)
|
details about this option. (Added in 7.11.2)
|
||||||
|
|
||||||
If this option is used several times, each occurance toggles this on/off.
|
If this option is used several times, each occurrence toggles this on/off.
|
||||||
.IP "-t/--telnet-option <OPT=val>"
|
.IP "-t/--telnet-option <OPT=val>"
|
||||||
Pass options to the telnet protocol. Supported options are:
|
Pass options to the telnet protocol. Supported options are:
|
||||||
|
|
||||||
@@ -820,7 +861,7 @@ starting with '>' means data sent by curl, '<' means data received by curl
|
|||||||
that is hidden in normal cases and lines starting with '*' means additional
|
that is hidden in normal cases and lines starting with '*' means additional
|
||||||
info provided by curl.
|
info provided by curl.
|
||||||
|
|
||||||
Note that if you want to see HTTP headers in the output, \fI-i/--include\fP
|
Note that if you only want HTTP headers in the output, \fI-i/--include\fP
|
||||||
might be option you're looking for.
|
might be option you're looking for.
|
||||||
|
|
||||||
If you think this option still doesn't give you enough details, consider using
|
If you think this option still doesn't give you enough details, consider using
|
||||||
@@ -848,16 +889,16 @@ HTTPS and FTPS are supported.
|
|||||||
.IP "libz"
|
.IP "libz"
|
||||||
Automatic decompression of compressed files over HTTP is supported.
|
Automatic decompression of compressed files over HTTP is supported.
|
||||||
.IP "NTLM"
|
.IP "NTLM"
|
||||||
NTLM authenticaion is supported.
|
NTLM authentication is supported.
|
||||||
.IP "GSS-Negotiate"
|
.IP "GSS-Negotiate"
|
||||||
Negotiate authenticaion is supported.
|
Negotiate authentication is supported.
|
||||||
.IP "Debug"
|
.IP "Debug"
|
||||||
This curl uses a libcurl built with Debug. This enables more error-tracking
|
This curl uses a libcurl built with Debug. This enables more error-tracking
|
||||||
and memory debugging etc. For curl-developers only!
|
and memory debugging etc. For curl-developers only!
|
||||||
.IP "AsynchDNS"
|
.IP "AsynchDNS"
|
||||||
This curl uses asynchronous name resolves.
|
This curl uses asynchronous name resolves.
|
||||||
.IP "SPNEGO"
|
.IP "SPNEGO"
|
||||||
SPNEGO Negotiate authenticaion is supported.
|
SPNEGO Negotiate authentication is supported.
|
||||||
.IP "Largefile"
|
.IP "Largefile"
|
||||||
This curl supports transfers of large files, files larger than 2GB.
|
This curl supports transfers of large files, files larger than 2GB.
|
||||||
.IP "IDN"
|
.IP "IDN"
|
||||||
@@ -907,9 +948,15 @@ The time, in seconds, it took from the start until the file transfer is just
|
|||||||
about to begin. This includes all pre-transfer commands and negotiations that
|
about to begin. This includes all pre-transfer commands and negotiations that
|
||||||
are specific to the particular protocol(s) involved.
|
are specific to the particular protocol(s) involved.
|
||||||
.TP
|
.TP
|
||||||
|
.B time_redirect
|
||||||
|
The time, in seconds, it took for all redirection steps include name lookup,
|
||||||
|
connect, pretransfer and transfer before final transaction was
|
||||||
|
started. time_redirect shows the complete execution time for multiple
|
||||||
|
redirections. (Added in 7.12.3)
|
||||||
|
.TP
|
||||||
.B time_starttransfer
|
.B time_starttransfer
|
||||||
The time, in seconds, it took from the start until the first byte is just about
|
The time, in seconds, it took from the start until the first byte is just about
|
||||||
to be transfered. This includes time_pretransfer and also the time the
|
to be transferred. This includes time_pretransfer and also the time the
|
||||||
server needs to calculate the result.
|
server needs to calculate the result.
|
||||||
.TP
|
.TP
|
||||||
.B size_download
|
.B size_download
|
||||||
@@ -932,6 +979,12 @@ The average upload speed that curl measured for the complete upload.
|
|||||||
.TP
|
.TP
|
||||||
.B content_type
|
.B content_type
|
||||||
The Content-Type of the requested document, if there was any. (Added in 7.9.5)
|
The Content-Type of the requested document, if there was any. (Added in 7.9.5)
|
||||||
|
.TP
|
||||||
|
.B num_connects
|
||||||
|
Number of new connects made in the recent transfer. (Added in 7.12.3)
|
||||||
|
.TP
|
||||||
|
.B num_redirects
|
||||||
|
Number of redirects that were followed in the request. (Added in 7.12.3)
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
@@ -944,7 +997,7 @@ use. If there's an environment variable setting a proxy, you can set proxy to
|
|||||||
\&"" to override it.
|
\&"" to override it.
|
||||||
|
|
||||||
\fBNote\fP that all operations that are performed over a HTTP proxy will
|
\fBNote\fP that all operations that are performed over a HTTP proxy will
|
||||||
transparantly be converted to HTTP. It means that certain protocol specific
|
transparently be converted to HTTP. It means that certain protocol specific
|
||||||
operations might not be available. This is not the case if you can tunnel
|
operations might not be available. This is not the case if you can tunnel
|
||||||
through the proxy, as done with the \fI-p/--proxytunnel\fP option.
|
through the proxy, as done with the \fI-p/--proxytunnel\fP option.
|
||||||
|
|
||||||
@@ -1077,7 +1130,7 @@ FTP can't reconnect. Couldn't connect to the host we got in the 227-line.
|
|||||||
.IP 17
|
.IP 17
|
||||||
FTP couldn't set binary. Couldn't change transfer method to binary.
|
FTP couldn't set binary. Couldn't change transfer method to binary.
|
||||||
.IP 18
|
.IP 18
|
||||||
Partial file. Only a part of the file was transfered.
|
Partial file. Only a part of the file was transferred.
|
||||||
.IP 19
|
.IP 19
|
||||||
FTP couldn't download/access the given file, the RETR (or similar) command
|
FTP couldn't download/access the given file, the RETR (or similar) command
|
||||||
failed.
|
failed.
|
||||||
@@ -1187,4 +1240,4 @@ ftp://ftp.sunet.se/pub/www/utilities/curl/
|
|||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR ftp (1),
|
.BR ftp (1),
|
||||||
.BR wget (1),
|
.BR wget (1),
|
||||||
.BR snarf (1)
|
|
||||||
|
@@ -9,7 +9,8 @@ EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit2.c \
|
|||||||
ftpupload.c httpput.c simplessl.c ftpgetresp.c http-post.c \
|
ftpupload.c httpput.c simplessl.c ftpgetresp.c http-post.c \
|
||||||
post-callback.c multi-app.c multi-double.c multi-single.c \
|
post-callback.c multi-app.c multi-double.c multi-single.c \
|
||||||
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
|
multi-post.c fopen.c simplepost.c makefile.dj curlx.c https.c \
|
||||||
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c
|
multi-debugcallback.c fileupload.c getinfo.c ftp3rdparty.c debug.c \
|
||||||
|
anyauthput.c
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@echo "done"
|
@echo "done"
|
||||||
|
@@ -1,4 +1,8 @@
|
|||||||
EXAMPLES
|
_ _ ____ _
|
||||||
|
___| | | | _ \| |
|
||||||
|
/ __| | | | |_) | |
|
||||||
|
| (__| |_| | _ <| |___
|
||||||
|
\___|\___/|_| \_\_____|
|
||||||
|
|
||||||
This directory is for libcurl programming examples. They are meant to show
|
This directory is for libcurl programming examples. They are meant to show
|
||||||
some simple steps on how you can build your own application to take full
|
some simple steps on how you can build your own application to take full
|
||||||
@@ -7,6 +11,8 @@ advantage of libcurl.
|
|||||||
If you end up with other small but still useful example sources, please mail
|
If you end up with other small but still useful example sources, please mail
|
||||||
them for submission in future packages and on the web site.
|
them for submission in future packages and on the web site.
|
||||||
|
|
||||||
|
BUILDING
|
||||||
|
|
||||||
The Makefile.example is an example makefile that could be used to build these
|
The Makefile.example is an example makefile that could be used to build these
|
||||||
examples. Just edit the file according to your system and requirements first.
|
examples. Just edit the file according to your system and requirements first.
|
||||||
|
|
||||||
@@ -23,3 +29,34 @@ want you do reorganize them like:
|
|||||||
applications/experiments. Even if the examples in this directory use that site
|
applications/experiments. Even if the examples in this directory use that site
|
||||||
as an example URL at some places, it doesn't mean that the URLs work or that
|
as an example URL at some places, it doesn't mean that the URLs work or that
|
||||||
we expect you to actually torture our web site with your tests! Thanks.
|
we expect you to actually torture our web site with your tests! Thanks.
|
||||||
|
|
||||||
|
EXAMPLES
|
||||||
|
|
||||||
|
anyauthput.c - HTTP PUT using "any" authentication method
|
||||||
|
curlgtk.c - download using a GTK progress bar
|
||||||
|
curlx.c - getting file info from the remote cert data
|
||||||
|
debug.c - showing how to use the debug callback
|
||||||
|
fileupload.c - uploading to a file:// URL
|
||||||
|
fopen.c - fopen() layer that supports opening URLs and files
|
||||||
|
ftp3rdparty.c - FTP 3rd party transfer
|
||||||
|
ftpget.c - simple getting a file from FTP
|
||||||
|
ftpgetresp.c - get the response strings from the FTP server
|
||||||
|
ftpupload.c - upload a file to a FTP server
|
||||||
|
getinfo.c - get the Content-Type from the recent transfer
|
||||||
|
getinmemory.c - download a file to memory only
|
||||||
|
http-post.c - HTTP POST
|
||||||
|
httpput.c - HTTP PUT a local file
|
||||||
|
https.c - simple HTTPS transfer
|
||||||
|
multi-app.c - a multi-interface app
|
||||||
|
multi-debugcallback.c - a multi-interface app using the debug callback
|
||||||
|
multi-double.c - a multi-interface app doing two simultaneous transfers
|
||||||
|
multi-post.c - a multi-interface app doing a multipart formpost
|
||||||
|
multi-single.c - a multi-interface app getting a single file
|
||||||
|
multithread.c - an example using multi-treading transfering multiple files
|
||||||
|
persistant.c - request two URLs with a persistant connection
|
||||||
|
post-callback.c - send a HTTP POST using a callback
|
||||||
|
postit2.c - send a HTTP multipart formpost
|
||||||
|
sepheaders.c - download headers to a separate file
|
||||||
|
simple.c - the most simple download a URL source
|
||||||
|
simplepost.c - HTTP POST
|
||||||
|
simplessl.c - HTTPS example with certificates many options set
|
||||||
|
35
docs/examples/adddocsref.pl
Executable file
35
docs/examples/adddocsref.pl
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# pass files as argument(s)
|
||||||
|
|
||||||
|
my $docroot="http://curl.haxx.se/libcurl/c";
|
||||||
|
|
||||||
|
for $f (@ARGV) {
|
||||||
|
open(NEW, ">$f.new");
|
||||||
|
open(F, "<$f");
|
||||||
|
while(<F>) {
|
||||||
|
my $l = $_;
|
||||||
|
if($l =~ /\/* $docroot/) {
|
||||||
|
# just ignore preciously added refs
|
||||||
|
}
|
||||||
|
elsif($l =~ /^( *).*curl_easy_setopt\([^,]*, *([^ ,]*) *,/) {
|
||||||
|
my ($prefix, $anc) = ($1, $2);
|
||||||
|
$anc =~ s/_//g;
|
||||||
|
print NEW "$prefix/* $docroot/curl_easy_setopt.html#$anc */\n";
|
||||||
|
print NEW $l;
|
||||||
|
}
|
||||||
|
elsif($l =~ /^( *).*(curl_([^\(]*))\(/) {
|
||||||
|
my ($prefix, $func) = ($1, $2);
|
||||||
|
print NEW "$prefix/* $docroot/$func.html */\n";
|
||||||
|
print NEW $l;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
print NEW $l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(F);
|
||||||
|
close(NEW);
|
||||||
|
|
||||||
|
system("mv $f $f.org");
|
||||||
|
system("mv $f.new $f");
|
||||||
|
}
|
135
docs/examples/anyauthput.c
Normal file
135
docs/examples/anyauthput.c
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
#if LIBCURL_VERSION_NUM < 0x070c03
|
||||||
|
#error "upgrade your libcurl to no less than 7.12.3"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This example shows a HTTP PUT operation with authentiction using "any"
|
||||||
|
* type. It PUTs a file given as a command line argument to the URL also given
|
||||||
|
* on the command line.
|
||||||
|
*
|
||||||
|
* Since libcurl 7.12.3, using "any" auth and POST/PUT requires a set ioctl
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* This example also uses its own read callback.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ioctl callback function */
|
||||||
|
static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
|
||||||
|
{
|
||||||
|
int fd = (int)userp;
|
||||||
|
|
||||||
|
(void)handle; /* not used in here */
|
||||||
|
|
||||||
|
switch(cmd) {
|
||||||
|
case CURLIOCMD_RESTARTREAD:
|
||||||
|
/* mr libcurl kindly asks as to rewind the read data stream to start */
|
||||||
|
if(-1 == lseek(fd, 0, SEEK_SET))
|
||||||
|
/* couldn't rewind */
|
||||||
|
return CURLIOE_FAILRESTART;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: /* ignore unknown commands */
|
||||||
|
return CURLIOE_UNKNOWNCMD;
|
||||||
|
}
|
||||||
|
return CURLIOE_OK; /* success! */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read callback function, fread() look alike */
|
||||||
|
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||||
|
{
|
||||||
|
size_t retcode;
|
||||||
|
|
||||||
|
int fd = (int)stream;
|
||||||
|
|
||||||
|
retcode = read(fd, ptr, size * nmemb);
|
||||||
|
|
||||||
|
fprintf(stderr, "*** We read %d bytes from file\n", retcode);
|
||||||
|
|
||||||
|
return retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
int hd ;
|
||||||
|
struct stat file_info;
|
||||||
|
|
||||||
|
char *file;
|
||||||
|
char *url;
|
||||||
|
|
||||||
|
if(argc < 3)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
file= argv[1];
|
||||||
|
url = argv[2];
|
||||||
|
|
||||||
|
/* get the file size of the local file */
|
||||||
|
hd = open(file, O_RDONLY) ;
|
||||||
|
fstat(hd, &file_info);
|
||||||
|
|
||||||
|
/* In windows, this will init the winsock stuff */
|
||||||
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
|
||||||
|
/* get a curl handle */
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
/* we want to use our own read function */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||||
|
|
||||||
|
/* which file to upload */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_READDATA, hd);
|
||||||
|
|
||||||
|
/* set the ioctl function */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, my_ioctl);
|
||||||
|
|
||||||
|
/* pass the file descriptor to the ioctl callback as well */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_IOCTLDATA, hd);
|
||||||
|
|
||||||
|
/* enable "uploading" (which means PUT when doing HTTP) */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ;
|
||||||
|
|
||||||
|
/* specify target URL, and note that this URL should also include a file
|
||||||
|
name, not only a directory (as you can do with GTP uploads) */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_URL, url);
|
||||||
|
|
||||||
|
/* and give the size of the upload, this supports large file sizes
|
||||||
|
on systems that have general support for it */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_info.st_size);
|
||||||
|
|
||||||
|
/* tell libcurl we can use "any" auth, which lets the lib pick one, but it
|
||||||
|
also costs one extra round-trip and possibly sending of all the PUT
|
||||||
|
data twice!!! */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
|
||||||
|
|
||||||
|
/* set user name and password for the authentication */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
|
||||||
|
|
||||||
|
/* Now run off and do what you've been told! */
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
close(hd); /* close the local file */
|
||||||
|
|
||||||
|
curl_global_cleanup();
|
||||||
|
return 0;
|
||||||
|
}
|
@@ -42,7 +42,7 @@ int my_progress_func(GtkWidget *Bar,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *curl_thread(void *ptr)
|
void *my_thread(void *ptr)
|
||||||
{
|
{
|
||||||
CURL *curl;
|
CURL *curl;
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
@@ -94,7 +94,7 @@ int main(int argc, char **argv)
|
|||||||
gtk_container_add(GTK_CONTAINER(Frame2), Bar);
|
gtk_container_add(GTK_CONTAINER(Frame2), Bar);
|
||||||
gtk_widget_show_all(Window);
|
gtk_widget_show_all(Window);
|
||||||
|
|
||||||
if (!g_thread_create(&curl_thread, argv[1], FALSE, NULL) != 0)
|
if (!g_thread_create(&my_thread, argv[1], FALSE, NULL) != 0)
|
||||||
g_warning("can't create the thread");
|
g_warning("can't create the thread");
|
||||||
|
|
||||||
|
|
||||||
|
@@ -95,22 +95,22 @@
|
|||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
|
|
||||||
static char *curlx_usage[]={
|
static char *curlx_usage[]={
|
||||||
"usage: curlx args\n",
|
"usage: curlx args\n",
|
||||||
" -p12 arg - tia file ",
|
" -p12 arg - tia file ",
|
||||||
" -envpass arg - environement variable which content the tia private key password",
|
" -envpass arg - environement variable which content the tia private key password",
|
||||||
" -out arg - output file (response)- default stdout",
|
" -out arg - output file (response)- default stdout",
|
||||||
" -in arg - input file (request)- default stdin",
|
" -in arg - input file (request)- default stdin",
|
||||||
" -connect arg - URL of the server for the connection ex: www.openevidenve.org",
|
" -connect arg - URL of the server for the connection ex: www.openevidenve.org",
|
||||||
" -mimetype arg - MIME type for data in ex : application/timestamp-query or application/dvcs -default application/timestamp-query",
|
" -mimetype arg - MIME type for data in ex : application/timestamp-query or application/dvcs -default application/timestamp-query",
|
||||||
" -acceptmime arg - MIME type acceptable for the response ex : application/timestamp-response or application/dvcs -default none",
|
" -acceptmime arg - MIME type acceptable for the response ex : application/timestamp-response or application/dvcs -default none",
|
||||||
" -accesstype arg - an Object identifier in an AIA/SIA method, e.g. AD_DVCS or ad_timestamping",
|
" -accesstype arg - an Object identifier in an AIA/SIA method, e.g. AD_DVCS or ad_timestamping",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
./curlx -p12 psy.p12 -envpass XX -in request -verbose -accesstype AD_DVCS
|
./curlx -p12 psy.p12 -envpass XX -in request -verbose -accesstype AD_DVCS
|
||||||
-mimetype application/dvcs -acceptmime application/dvcs -out response
|
-mimetype application/dvcs -acceptmime application/dvcs -out response
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -135,7 +135,8 @@ typedef struct sslctxparm_st {
|
|||||||
static char *i2s_ASN1_IA5STRING( ASN1_IA5STRING *ia5)
|
static char *i2s_ASN1_IA5STRING( ASN1_IA5STRING *ia5)
|
||||||
{
|
{
|
||||||
char *tmp;
|
char *tmp;
|
||||||
if(!ia5 || !ia5->length) return NULL;
|
if(!ia5 || !ia5->length)
|
||||||
|
return NULL;
|
||||||
tmp = OPENSSL_malloc(ia5->length + 1);
|
tmp = OPENSSL_malloc(ia5->length + 1);
|
||||||
memcpy(tmp, ia5->data, ia5->length);
|
memcpy(tmp, ia5->data, ia5->length);
|
||||||
tmp[ia5->length] = 0;
|
tmp[ia5->length] = 0;
|
||||||
@@ -150,7 +151,8 @@ static unsigned char *my_get_ext(X509 * cert, const int type, int extensiontype)
|
|||||||
STACK_OF(ACCESS_DESCRIPTION) * accessinfo ;
|
STACK_OF(ACCESS_DESCRIPTION) * accessinfo ;
|
||||||
accessinfo = X509_get_ext_d2i(cert, extensiontype, NULL, NULL) ;
|
accessinfo = X509_get_ext_d2i(cert, extensiontype, NULL, NULL) ;
|
||||||
|
|
||||||
if (!sk_ACCESS_DESCRIPTION_num(accessinfo)) return NULL;
|
if (!sk_ACCESS_DESCRIPTION_num(accessinfo))
|
||||||
|
return NULL;
|
||||||
for (i = 0; i < sk_ACCESS_DESCRIPTION_num(accessinfo); i++) {
|
for (i = 0; i < sk_ACCESS_DESCRIPTION_num(accessinfo); i++) {
|
||||||
ACCESS_DESCRIPTION * ad = sk_ACCESS_DESCRIPTION_value(accessinfo, i);
|
ACCESS_DESCRIPTION * ad = sk_ACCESS_DESCRIPTION_value(accessinfo, i);
|
||||||
if (OBJ_obj2nid(ad->method) == type) {
|
if (OBJ_obj2nid(ad->method) == type) {
|
||||||
@@ -169,23 +171,35 @@ static unsigned char *my_get_ext(X509 * cert, const int type, int extensiontype)
|
|||||||
the URL to be used in the POST.
|
the URL to be used in the POST.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg) {
|
static int ssl_app_verify_callback(X509_STORE_CTX *ctx, void *arg)
|
||||||
|
{
|
||||||
sslctxparm * p = (sslctxparm *) arg;
|
sslctxparm * p = (sslctxparm *) arg;
|
||||||
int ok;
|
int ok;
|
||||||
|
|
||||||
if (p->verbose > 2) BIO_printf(p->errorbio,"entering ssl_app_verify_callback\n");
|
if (p->verbose > 2)
|
||||||
|
BIO_printf(p->errorbio,"entering ssl_app_verify_callback\n");
|
||||||
|
|
||||||
if ((ok= X509_verify_cert(ctx)) && ctx->cert) {
|
if ((ok= X509_verify_cert(ctx)) && ctx->cert) {
|
||||||
unsigned char * accessinfo ;
|
unsigned char * accessinfo ;
|
||||||
if (p->verbose > 1) X509_print_ex(p->errorbio,ctx->cert,0,0);
|
if (p->verbose > 1)
|
||||||
|
X509_print_ex(p->errorbio,ctx->cert,0,0);
|
||||||
|
|
||||||
if (accessinfo = my_get_ext(ctx->cert,p->accesstype ,NID_sinfo_access)) {
|
if (accessinfo = my_get_ext(ctx->cert,p->accesstype ,NID_sinfo_access)) {
|
||||||
if (p->verbose) BIO_printf(p->errorbio,"Setting URL from SIA to: %s\n",accessinfo);
|
if (p->verbose)
|
||||||
|
BIO_printf(p->errorbio,"Setting URL from SIA to: %s\n", accessinfo);
|
||||||
|
|
||||||
curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo);
|
curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo);
|
||||||
} else if (accessinfo = my_get_ext(ctx->cert,p->accesstype ,NID_info_access)) {
|
}
|
||||||
if (p->verbose) BIO_printf(p->errorbio,"Setting URL from AIA to: %s\n",accessinfo);
|
else if (accessinfo = my_get_ext(ctx->cert,p->accesstype,
|
||||||
|
NID_info_access)) {
|
||||||
|
if (p->verbose)
|
||||||
|
BIO_printf(p->errorbio,"Setting URL from AIA to: %s\n", accessinfo);
|
||||||
|
|
||||||
curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo);
|
curl_easy_setopt(p->curl, CURLOPT_URL,accessinfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (p->verbose > 2) BIO_printf(p->errorbio,"leaving ssl_app_verify_callback with %d\n",ok);
|
if (p->verbose > 2)
|
||||||
|
BIO_printf(p->errorbio,"leaving ssl_app_verify_callback with %d\n", ok);
|
||||||
return(ok);
|
return(ok);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,7 +231,8 @@ static CURLcode sslctxfun(CURL * curl, void * sslctx, void * parm) {
|
|||||||
SSL_CTX_set_cipher_list(ctx,"RC4-MD5");
|
SSL_CTX_set_cipher_list(ctx,"RC4-MD5");
|
||||||
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
|
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
|
||||||
|
|
||||||
X509_STORE_add_cert(ctx->cert_store,sk_X509_value(p->ca,sk_X509_num(p->ca)-1));
|
X509_STORE_add_cert(ctx->cert_store,sk_X509_value(p->ca,
|
||||||
|
sk_X509_num(p->ca)-1));
|
||||||
|
|
||||||
SSL_CTX_set_verify_depth(ctx,2);
|
SSL_CTX_set_verify_depth(ctx,2);
|
||||||
|
|
||||||
@@ -227,7 +242,7 @@ static CURLcode sslctxfun(CURL * curl, void * sslctx, void * parm) {
|
|||||||
|
|
||||||
|
|
||||||
return CURLE_OK ;
|
return CURLE_OK ;
|
||||||
err:
|
err:
|
||||||
ERR_print_errors(p->errorbio);
|
ERR_print_errors(p->errorbio);
|
||||||
return CURLE_SSL_CERTPROBLEM;
|
return CURLE_SSL_CERTPROBLEM;
|
||||||
|
|
||||||
@@ -238,7 +253,6 @@ int main(int argc, char **argv) {
|
|||||||
BIO* in=NULL;
|
BIO* in=NULL;
|
||||||
BIO* out=NULL;
|
BIO* out=NULL;
|
||||||
|
|
||||||
|
|
||||||
char * outfile = NULL;
|
char * outfile = NULL;
|
||||||
char * infile = NULL ;
|
char * infile = NULL ;
|
||||||
|
|
||||||
@@ -264,7 +278,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
|
||||||
/* we need some more for the P12 decoding */
|
/* we need some more for the P12 decoding */
|
||||||
|
|
||||||
OpenSSL_add_all_ciphers();
|
OpenSSL_add_all_ciphers();
|
||||||
OpenSSL_add_all_digests();
|
OpenSSL_add_all_digests();
|
||||||
@@ -375,30 +389,42 @@ int main(int argc, char **argv) {
|
|||||||
BIO_printf(p.errorbio,"No trustworthy CA given.%s\n", p.p12file); goto err;
|
BIO_printf(p.errorbio,"No trustworthy CA given.%s\n", p.p12file); goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.verbose > 1) X509_print_ex(p.errorbio,p.usercert,0,0);
|
if (p.verbose > 1)
|
||||||
|
X509_print_ex(p.errorbio,p.usercert,0,0);
|
||||||
|
|
||||||
/* determine URL to go */
|
/* determine URL to go */
|
||||||
|
|
||||||
if (hostporturl) {
|
if (hostporturl) {
|
||||||
serverurl=(char*) malloc(9+strlen(hostporturl));
|
serverurl=(char*) malloc(9+strlen(hostporturl));
|
||||||
sprintf(serverurl,"https://%s",hostporturl);
|
sprintf(serverurl,"https://%s",hostporturl);
|
||||||
} else if (p.accesstype != 0) { /* see whether we can find an AIA or SIA for a given access type */
|
}
|
||||||
|
else if (p.accesstype != 0) { /* see whether we can find an AIA or SIA for a given access type */
|
||||||
if (!(serverurl = my_get_ext(p.usercert,p.accesstype,NID_info_access))) {
|
if (!(serverurl = my_get_ext(p.usercert,p.accesstype,NID_info_access))) {
|
||||||
BIO_printf(p.errorbio,"no service URL in user cert cherching in others certificats\n");
|
BIO_printf(p.errorbio,"no service URL in user cert "
|
||||||
|
"cherching in others certificats\n");
|
||||||
int j=0;
|
int j=0;
|
||||||
int find=0;
|
int find=0;
|
||||||
for (j=0;j<sk_X509_num(p.ca);j++) {
|
for (j=0;j<sk_X509_num(p.ca);j++) {
|
||||||
if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,NID_info_access))) break;
|
if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,
|
||||||
if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,NID_sinfo_access))) break;
|
NID_info_access)))
|
||||||
|
break;
|
||||||
|
if ((serverurl = my_get_ext(sk_X509_value(p.ca,j),p.accesstype,
|
||||||
|
NID_sinfo_access)))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!serverurl) {
|
if (!serverurl) {
|
||||||
BIO_printf(p.errorbio, "no service URL in certificats, check '-accesstype (AD_DVCS | ad_timestamping)' or use '-connect'\n"); goto err;
|
BIO_printf(p.errorbio, "no service URL in certificats,"
|
||||||
|
" check '-accesstype (AD_DVCS | ad_timestamping)'"
|
||||||
|
" or use '-connect'\n");
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p.verbose) BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
|
if (p.verbose)
|
||||||
|
BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
|
||||||
|
|
||||||
curl_easy_setopt(p.curl, CURLOPT_URL, serverurl);
|
curl_easy_setopt(p.curl, CURLOPT_URL, serverurl);
|
||||||
|
|
||||||
/* Now specify the POST binary data */
|
/* Now specify the POST binary data */
|
||||||
@@ -413,7 +439,8 @@ int main(int argc, char **argv) {
|
|||||||
headers = curl_slist_append(headers,contenttype);
|
headers = curl_slist_append(headers,contenttype);
|
||||||
curl_easy_setopt(p.curl, CURLOPT_HTTPHEADER, headers);
|
curl_easy_setopt(p.curl, CURLOPT_HTTPHEADER, headers);
|
||||||
|
|
||||||
if (p.verbose) BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
|
if (p.verbose)
|
||||||
|
BIO_printf(p.errorbio, "Service URL: <%s>\n", serverurl);
|
||||||
|
|
||||||
{
|
{
|
||||||
FILE *outfp;
|
FILE *outfp;
|
||||||
@@ -447,14 +474,18 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
/* Perform the request, res will get the return code */
|
/* Perform the request, res will get the return code */
|
||||||
|
|
||||||
BIO_printf(p.errorbio,"%d %s %d\n", __LINE__, "curl_easy_perform", res = curl_easy_perform(p.curl));
|
BIO_printf(p.errorbio,"%d %s %d\n", __LINE__, "curl_easy_perform",
|
||||||
|
res = curl_easy_perform(p.curl));
|
||||||
{
|
{
|
||||||
int result =curl_easy_getinfo(p.curl,CURLINFO_CONTENT_TYPE,&response);
|
int result =curl_easy_getinfo(p.curl,CURLINFO_CONTENT_TYPE,&response);
|
||||||
if( mimetypeaccept && p.verbose)
|
if( mimetypeaccept && p.verbose)
|
||||||
if(!strcmp(mimetypeaccept,response))
|
if(!strcmp(mimetypeaccept,response))
|
||||||
BIO_printf(p.errorbio,"the response has a correct mimetype : %s\n",response);
|
BIO_printf(p.errorbio,"the response has a correct mimetype : %s\n",
|
||||||
|
response);
|
||||||
else
|
else
|
||||||
BIO_printf(p.errorbio,"the reponse doesn\'t has an acceptable mime type, it is %s instead of %s\n",response,mimetypeaccept);
|
BIO_printf(p.errorbio,"the reponse doesn\'t has an acceptable "
|
||||||
|
"mime type, it is %s instead of %s\n",
|
||||||
|
response,mimetypeaccept);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/
|
/*** code d'erreur si accept mime ***, egalement code return HTTP != 200 ***/
|
||||||
@@ -470,11 +501,6 @@ int main(int argc, char **argv) {
|
|||||||
BIO_free(out);
|
BIO_free(out);
|
||||||
return (EXIT_SUCCESS);
|
return (EXIT_SUCCESS);
|
||||||
|
|
||||||
|
|
||||||
err: BIO_printf(p.errorbio,"error");
|
err: BIO_printf(p.errorbio,"error");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -124,7 +124,7 @@ write_callback(char *buffer,
|
|||||||
|
|
||||||
/* use to attempt to fill the read buffer up to requested number of bytes */
|
/* use to attempt to fill the read buffer up to requested number of bytes */
|
||||||
static int
|
static int
|
||||||
curl_fill_buffer(URL_FILE *file,int want,int waittime)
|
fill_buffer(URL_FILE *file,int want,int waittime)
|
||||||
{
|
{
|
||||||
fd_set fdread;
|
fd_set fdread;
|
||||||
fd_set fdwrite;
|
fd_set fdwrite;
|
||||||
@@ -179,7 +179,7 @@ curl_fill_buffer(URL_FILE *file,int want,int waittime)
|
|||||||
|
|
||||||
/* use to remove want bytes from the front of a files buffer */
|
/* use to remove want bytes from the front of a files buffer */
|
||||||
static int
|
static int
|
||||||
curl_use_buffer(URL_FILE *file,int want)
|
use_buffer(URL_FILE *file,int want)
|
||||||
{
|
{
|
||||||
/* sort out buffer */
|
/* sort out buffer */
|
||||||
if((file->buffer_pos - want) <=0)
|
if((file->buffer_pos - want) <=0)
|
||||||
@@ -333,9 +333,9 @@ url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
|
|||||||
case CFTYPE_CURL:
|
case CFTYPE_CURL:
|
||||||
want = nmemb * size;
|
want = nmemb * size;
|
||||||
|
|
||||||
curl_fill_buffer(file,want,1);
|
fill_buffer(file,want,1);
|
||||||
|
|
||||||
/* check if theres data in the buffer - if not curl_fill_buffer()
|
/* check if theres data in the buffer - if not fill_buffer()
|
||||||
* either errored or EOF */
|
* either errored or EOF */
|
||||||
if(!file->buffer_pos)
|
if(!file->buffer_pos)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -347,7 +347,7 @@ url_fread(void *ptr, size_t size, size_t nmemb, URL_FILE *file)
|
|||||||
/* xfer data to caller */
|
/* xfer data to caller */
|
||||||
memcpy(ptr, file->buffer, want);
|
memcpy(ptr, file->buffer, want);
|
||||||
|
|
||||||
curl_use_buffer(file,want);
|
use_buffer(file,want);
|
||||||
|
|
||||||
want = want / size; /* number of items - nb correct op - checked
|
want = want / size; /* number of items - nb correct op - checked
|
||||||
* with glibc code*/
|
* with glibc code*/
|
||||||
@@ -377,7 +377,7 @@ url_fgets(char *ptr, int size, URL_FILE *file)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case CFTYPE_CURL:
|
case CFTYPE_CURL:
|
||||||
curl_fill_buffer(file,want,1);
|
fill_buffer(file,want,1);
|
||||||
|
|
||||||
/* check if theres data in the buffer - if not fill either errored or
|
/* check if theres data in the buffer - if not fill either errored or
|
||||||
* EOF */
|
* EOF */
|
||||||
@@ -403,7 +403,7 @@ url_fgets(char *ptr, int size, URL_FILE *file)
|
|||||||
memcpy(ptr, file->buffer, want);
|
memcpy(ptr, file->buffer, want);
|
||||||
ptr[want]=0;/* allways null terminate */
|
ptr[want]=0;/* allways null terminate */
|
||||||
|
|
||||||
curl_use_buffer(file,want);
|
use_buffer(file,want);
|
||||||
|
|
||||||
/*printf("(fgets) return %d bytes %d left\n", want,file->buffer_pos);*/
|
/*printf("(fgets) return %d bytes %d left\n", want,file->buffer_pos);*/
|
||||||
break;
|
break;
|
||||||
|
@@ -72,6 +72,12 @@ int main(int argc, char **argv)
|
|||||||
/* now specify which file to upload */
|
/* now specify which file to upload */
|
||||||
curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
|
curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
|
||||||
|
|
||||||
|
/* NOTE: if you want this example to work on Windows with libcurl as a
|
||||||
|
DLL, you MUST also provide a read callback with
|
||||||
|
CURLOPT_READFUNCTION. Failing to do so will give you a crash since a
|
||||||
|
DLL may not use the variable's memory when passed in to it from an app
|
||||||
|
like this. */
|
||||||
|
|
||||||
/* and give the size of the upload (optional) */
|
/* and give the size of the upload (optional) */
|
||||||
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_info.st_size);
|
curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, file_info.st_size);
|
||||||
|
|
||||||
|
@@ -16,14 +16,18 @@ int main(void)
|
|||||||
CURL *curl;
|
CURL *curl;
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
|
|
||||||
|
/* http://curl.haxx.se/libcurl/c/curl_easy_init.html */
|
||||||
curl = curl_easy_init();
|
curl = curl_easy_init();
|
||||||
if(curl) {
|
if(curl) {
|
||||||
|
/* http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTURL */
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
|
curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
|
||||||
|
/* http://curl.haxx.se/libcurl/c/curl_easy_perform.html */
|
||||||
res = curl_easy_perform(curl);
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
if(CURLE_OK == res) {
|
if(CURLE_OK == res) {
|
||||||
char *ct;
|
char *ct;
|
||||||
/* ask for the content-type */
|
/* ask for the content-type */
|
||||||
|
/* http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html */
|
||||||
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
|
res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
|
||||||
|
|
||||||
if((CURLE_OK == res) && ct)
|
if((CURLE_OK == res) && ct)
|
||||||
@@ -31,6 +35,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* always cleanup */
|
/* always cleanup */
|
||||||
|
/* http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html */
|
||||||
curl_easy_cleanup(curl);
|
curl_easy_cleanup(curl);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -24,13 +24,23 @@ struct MemoryStruct {
|
|||||||
size_t size;
|
size_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void *myrealloc(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
/* There might be a realloc() out there that doesn't like reallocing
|
||||||
|
NULL pointers, so we take care of it here */
|
||||||
|
if(ptr)
|
||||||
|
return realloc(ptr, size);
|
||||||
|
else
|
||||||
|
return malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
{
|
{
|
||||||
register int realsize = size * nmemb;
|
register int realsize = size * nmemb;
|
||||||
struct MemoryStruct *mem = (struct MemoryStruct *)data;
|
struct MemoryStruct *mem = (struct MemoryStruct *)data;
|
||||||
|
|
||||||
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
|
mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1);
|
||||||
if (mem->memory) {
|
if (mem->memory) {
|
||||||
memcpy(&(mem->memory[mem->size]), ptr, realsize);
|
memcpy(&(mem->memory[mem->size]), ptr, realsize);
|
||||||
mem->size += realsize;
|
mem->size += realsize;
|
||||||
|
@@ -39,7 +39,6 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
CURL *curl;
|
CURL *curl;
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
FILE *ftpfile;
|
|
||||||
FILE * hd_src ;
|
FILE * hd_src ;
|
||||||
int hd ;
|
int hd ;
|
||||||
struct stat file_info;
|
struct stat file_info;
|
||||||
|
@@ -20,7 +20,7 @@ PROGRAMS = fopen.exe ftpget.exe ftpgetresp.exe ftpupload.exe \
|
|||||||
multi-double.exe multi-post.exe multi-single.exe \
|
multi-double.exe multi-post.exe multi-single.exe \
|
||||||
persistant.exe post-callback.exe postit2.exe \
|
persistant.exe post-callback.exe postit2.exe \
|
||||||
sepheaders.exe simple.exe simplessl.exe https.exe \
|
sepheaders.exe simple.exe simplessl.exe https.exe \
|
||||||
ftp3rdparty.exe getinfo.exe
|
ftp3rdparty.exe getinfo.exe anyauthput.exe
|
||||||
|
|
||||||
all: $(PROGRAMS)
|
all: $(PROGRAMS)
|
||||||
|
|
||||||
|
@@ -15,7 +15,15 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
|
|
||||||
/* silly list of test-URLs */
|
/*
|
||||||
|
List of URLs to fetch.
|
||||||
|
|
||||||
|
If you intend to use a SSL-based protocol here you MUST setup the OpenSSL
|
||||||
|
callback functions as described here:
|
||||||
|
|
||||||
|
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
|
||||||
|
|
||||||
|
*/
|
||||||
char *urls[]= {
|
char *urls[]= {
|
||||||
"http://curl.haxx.se/",
|
"http://curl.haxx.se/",
|
||||||
"ftp://cool.haxx.se/",
|
"ftp://cool.haxx.se/",
|
||||||
@@ -28,10 +36,8 @@ void *pull_one_url(void *url)
|
|||||||
CURL *curl;
|
CURL *curl;
|
||||||
|
|
||||||
curl = curl_easy_init();
|
curl = curl_easy_init();
|
||||||
|
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, url);
|
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||||
curl_easy_perform(curl);
|
curl_easy_perform(curl); /* ignores error */
|
||||||
|
|
||||||
curl_easy_cleanup(curl);
|
curl_easy_cleanup(curl);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
.\" nroff -man [file]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_easy_getinfo 3 "20 Aug 2003" "libcurl 7.10.8" "libcurl Manual"
|
.TH curl_easy_getinfo 3 "14 Dec 2004" "libcurl 7.12.3" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_easy_getinfo - extract information from a curl handle
|
curl_easy_getinfo - extract information from a curl handle
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -12,13 +12,12 @@ curl_easy_getinfo - extract information from a curl handle
|
|||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Request internal information from the curl session with this function. The
|
Request internal information from the curl session with this function. The
|
||||||
third argument
|
third argument \fBMUST\fP be a pointer to a long, a pointer to a char *, a
|
||||||
.B MUST
|
pointer to a struct curl_slist * or a pointer to a double (as this
|
||||||
be a pointer to a long, a pointer to a char * or a pointer to a double (as
|
documentation describes further down). The data pointed-to will be filled in
|
||||||
this documentation describes further down). The data pointed-to will be
|
accordingly and can be relied upon only if the function returns CURLE_OK.
|
||||||
filled in accordingly and can be relied upon only if the function returns
|
This function is intended to get used AFTER a performed transfer, all results
|
||||||
CURLE_OK. This function is intended to get used *AFTER* a performed transfer,
|
from this function are undefined until the transfer is completed.
|
||||||
all results from this function are undefined until the transfer is completed.
|
|
||||||
|
|
||||||
You should not free the memory returned by this function unless it is
|
You should not free the memory returned by this function unless it is
|
||||||
explictly mentioned below.
|
explictly mentioned below.
|
||||||
@@ -89,6 +88,13 @@ than one request if FOLLOWLOCATION is true.
|
|||||||
Pass a pointer to a long to receive the result of the certification
|
Pass a pointer to a long to receive the result of the certification
|
||||||
verification that was requested (using the CURLOPT_SSL_VERIFYPEER option to
|
verification that was requested (using the CURLOPT_SSL_VERIFYPEER option to
|
||||||
\fIcurl_easy_setopt(3)\fP).
|
\fIcurl_easy_setopt(3)\fP).
|
||||||
|
.IP CURLINFO_SSL_ENGINES
|
||||||
|
Pass the address of a 'struct curl_slist *' to receive a linked-list of
|
||||||
|
OpenSSL crypto-engines supported. Note that engines are normally implemented
|
||||||
|
in separate dynamic libraries. Hence not all the returned engines may be
|
||||||
|
available at run-time. \fBNOTE:\fP you must call \fIcurl_slist_free_all(3)\fP
|
||||||
|
on the list pointer once you're done with it, as libcurl will not free the
|
||||||
|
data for you. (Added in 7.12.3)
|
||||||
.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD
|
.IP CURLINFO_CONTENT_LENGTH_DOWNLOAD
|
||||||
Pass a pointer to a double to receive the content-length of the download. This
|
Pass a pointer to a double to receive the content-length of the download. This
|
||||||
is the value read from the Content-Length: field.
|
is the value read from the Content-Length: field.
|
||||||
@@ -113,6 +119,13 @@ method(s) available for your proxy authentication. (Added in 7.10.8)
|
|||||||
.IP CURLINFO_OS_ERRNO
|
.IP CURLINFO_OS_ERRNO
|
||||||
Pass a pointer to a long to receive the errno variable from a connect failure.
|
Pass a pointer to a long to receive the errno variable from a connect failure.
|
||||||
(Added in 7.12.2)
|
(Added in 7.12.2)
|
||||||
|
.IP CURLINFO_NUM_CONNECTS
|
||||||
|
Pass a pointer to a long to receive how many new connections libcurl had to
|
||||||
|
create to achieve the previous transfer (only the successful connects are
|
||||||
|
counted). Combined with \fICURLINFO_REDIRECT_COUNT\fP you are able to know
|
||||||
|
how many times libcurl successfully reused existing connection(s) or not. See
|
||||||
|
the Connection Options of \fIcurl_easy_setopt(3)\fP to see how libcurl tries
|
||||||
|
to make persistent connections to save time. (Added in 7.12.3)
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
If the operation was successful, CURLE_OK is returned. Otherwise an
|
If the operation was successful, CURLE_OK is returned. Otherwise an
|
||||||
appropriate error code will be returned.
|
appropriate error code will be returned.
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
.\" * $Id$
|
.\" * $Id$
|
||||||
.\" **************************************************************************
|
.\" **************************************************************************
|
||||||
.\"
|
.\"
|
||||||
.TH curl_easy_setopt 3 "12 Mar 2004" "libcurl 7.11.1" "libcurl Manual"
|
.TH curl_easy_setopt 3 "29 Nov 2004" "libcurl 7.12.3" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_easy_setopt - set options for a curl easy handle
|
curl_easy_setopt - set options for a curl easy handle
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -142,6 +142,18 @@ don't specify a read callback, this must be a valid FILE *.
|
|||||||
|
|
||||||
This option is also known with the older name \fICURLOPT_INFILE\fP, the name
|
This option is also known with the older name \fICURLOPT_INFILE\fP, the name
|
||||||
\fICURLOPT_READDATA\fP was introduced in 7.9.7.
|
\fICURLOPT_READDATA\fP was introduced in 7.9.7.
|
||||||
|
.IP CURLOPT_IOCTLFUNCTION
|
||||||
|
Function pointer that should match the \fIcurl_ioctl_callback\fP prototype
|
||||||
|
found in \fI<curl/curl.h>\fP. This function gets called by libcurl when
|
||||||
|
something special I/O-related needs to be done that the library can't do by
|
||||||
|
itself. For now, rewinding the read data stream is the only action it can
|
||||||
|
request. The rewinding of the read data stream may be necessary when doing a
|
||||||
|
HTTP PUT or POST with a multi-pass authentication method. (Opion added in
|
||||||
|
7.12.3)
|
||||||
|
.IP CURLOPT_IOCTLDATA
|
||||||
|
Pass a pointer that will be untouched by libcurl and passed as the 3rd
|
||||||
|
argument in the ioctl callback set with \fICURLOPT_IOCTLFUNCTION\fP. (Option
|
||||||
|
added in 7.12.3)
|
||||||
.IP CURLOPT_PROGRESSFUNCTION
|
.IP CURLOPT_PROGRESSFUNCTION
|
||||||
Function pointer that should match the \fIcurl_progress_callback\fP prototype
|
Function pointer that should match the \fIcurl_progress_callback\fP prototype
|
||||||
found in \fI<curl/curl.h>\fP. This function gets called by libcurl instead of
|
found in \fI<curl/curl.h>\fP. This function gets called by libcurl instead of
|
||||||
@@ -479,9 +491,13 @@ application/x-www-form-urlencoded" header. (This is by far the most commonly
|
|||||||
used POST method).
|
used POST method).
|
||||||
|
|
||||||
Use the \fICURLOPT_POSTFIELDS\fP option to specify what data to post and
|
Use the \fICURLOPT_POSTFIELDS\fP option to specify what data to post and
|
||||||
\fICURLOPT_POSTFIELDSIZE\fP to set the data size. Optionally, you can provide
|
\fICURLOPT_POSTFIELDSIZE\fP to set the data size.
|
||||||
data to POST using the \fICURLOPT_READFUNCTION\fP and \fICURLOPT_READDATA\fP
|
|
||||||
options.
|
Optionally, you can provide data to POST using the \fICURLOPT_READFUNCTION\fP
|
||||||
|
and \fICURLOPT_READDATA\fP options but then you must make sure to not set
|
||||||
|
\fICURLOPT_POSTFIELDS\fP to anything but NULL. When providing data with a
|
||||||
|
callback, you must transmit it using chunked transfer-encoding or you must set
|
||||||
|
the size of the data with the \fICURLOPT_POSTFIELDSIZE\fP option.
|
||||||
|
|
||||||
You can override the default POST Content-Type: header by setting your own
|
You can override the default POST Content-Type: header by setting your own
|
||||||
with \fICURLOPT_HTTPHEADER\fP.
|
with \fICURLOPT_HTTPHEADER\fP.
|
||||||
@@ -518,7 +534,7 @@ the \fICURLOPT_HTTPPOST\fP option.
|
|||||||
If you want to post data to the server without letting libcurl do a strlen()
|
If you want to post data to the server without letting libcurl do a strlen()
|
||||||
to measure the data size, this option must be used. When this option is used
|
to measure the data size, this option must be used. When this option is used
|
||||||
you can post fully binary data, which otherwise is likely to fail. If this
|
you can post fully binary data, which otherwise is likely to fail. If this
|
||||||
size is set to zero, the library will use strlen() to get the size.
|
size is set to -1, the library will use strlen() to get the size.
|
||||||
.IP CURLOPT_POSTFIELDSIZE_LARGE
|
.IP CURLOPT_POSTFIELDSIZE_LARGE
|
||||||
Pass a curl_off_t as parameter. Use this to set the size of the
|
Pass a curl_off_t as parameter. Use this to set the size of the
|
||||||
\fICURLOPT_POSTFIELDS\fP data to prevent libcurl from doing strlen() on the
|
\fICURLOPT_POSTFIELDS\fP data to prevent libcurl from doing strlen() on the
|
||||||
@@ -690,11 +706,15 @@ LPRT) command when doing active FTP downloads (which is enabled by
|
|||||||
\fICURLOPT_FTPPORT\fP). Using EPRT means that it will first attempt to use
|
\fICURLOPT_FTPPORT\fP). Using EPRT means that it will first attempt to use
|
||||||
EPRT and then LPRT before using PORT, but if you pass FALSE (zero) to this
|
EPRT and then LPRT before using PORT, but if you pass FALSE (zero) to this
|
||||||
option, it will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5)
|
option, it will not try using EPRT or LPRT, only plain PORT. (Added in 7.10.5)
|
||||||
|
|
||||||
|
If the server is an IPv6 host, this option will have no effect as of 7.12.3.
|
||||||
.IP CURLOPT_FTP_USE_EPSV
|
.IP CURLOPT_FTP_USE_EPSV
|
||||||
Pass a long. If the value is non-zero, it tells curl to use the EPSV command
|
Pass a long. If the value is non-zero, it tells curl to use the EPSV command
|
||||||
when doing passive FTP downloads (which it always does by default). Using EPSV
|
when doing passive FTP downloads (which it always does by default). Using EPSV
|
||||||
means that it will first attempt to use EPSV before using PASV, but if you
|
means that it will first attempt to use EPSV before using PASV, but if you
|
||||||
pass FALSE (zero) to this option, it will not try using EPSV, only plain PASV.
|
pass FALSE (zero) to this option, it will not try using EPSV, only plain PASV.
|
||||||
|
|
||||||
|
If the server is an IPv6 host, this option will have no effect as of 7.12.3.
|
||||||
.IP CURLOPT_FTP_CREATE_MISSING_DIRS
|
.IP CURLOPT_FTP_CREATE_MISSING_DIRS
|
||||||
Pass a long. If the value is non-zero, curl will attempt to create any remote
|
Pass a long. If the value is non-zero, curl will attempt to create any remote
|
||||||
directory that it fails to CWD into. CWD is the command that changes working
|
directory that it fails to CWD into. CWD is the command that changes working
|
||||||
@@ -723,7 +743,7 @@ Require SSL for all communication or fail with \fICURLE_FTP_SSL_FAILED\fP.
|
|||||||
.IP CURLOPT_FTPSSLAUTH
|
.IP CURLOPT_FTPSSLAUTH
|
||||||
Pass a long using one of the values from below, to alter how libcurl issues
|
Pass a long using one of the values from below, to alter how libcurl issues
|
||||||
\&"AUTH TLS" or "AUTH SSL" when FTP over SSL is activated (see
|
\&"AUTH TLS" or "AUTH SSL" when FTP over SSL is activated (see
|
||||||
\fICURLOPT_FTP_SSL\fP).
|
\fICURLOPT_FTP_SSL\fP). (Added in 7.12.2)
|
||||||
.RS
|
.RS
|
||||||
.IP CURLFTPAUTH_DEFAULT
|
.IP CURLFTPAUTH_DEFAULT
|
||||||
Allow libcurl to decide
|
Allow libcurl to decide
|
||||||
|
@@ -35,28 +35,28 @@ is made for file upload, there are also a stored CONTENT-TYPE and a
|
|||||||
FILENAME. Below here, we'll discuss on what options you use to set these
|
FILENAME. Below here, we'll discuss on what options you use to set these
|
||||||
properties in the parts you want to add to your post.
|
properties in the parts you want to add to your post.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.B CURLFORM_COPYNAME
|
.IP CURLFORM_COPYNAME
|
||||||
followed by string is used to set the name of this part. libcurl copies the
|
followed by string is used to set the name of this part. libcurl copies the
|
||||||
given data, so your application doesn't need to keep it around after this
|
given data, so your application doesn't need to keep it around after this
|
||||||
function call. If the name isn't zero terminated properly, or if you'd like it
|
function call. If the name isn't zero terminated properly, or if you'd like it
|
||||||
to contain zero bytes, you need to set the length of the name with
|
to contain zero bytes, you need to set the length of the name with
|
||||||
\fBCURLFORM_NAMELENGTH\fP.
|
\fBCURLFORM_NAMELENGTH\fP.
|
||||||
|
|
||||||
.B CURLFORM_PTRNAME
|
.IP CURLFORM_PTRNAME
|
||||||
followed by a string is used for the name of this part. libcurl will use the
|
followed by a string is used for the name of this part. libcurl will use the
|
||||||
pointer and refer to the data in your application, you must make sure it
|
pointer and refer to the data in your application, you must make sure it
|
||||||
remains until curl no longer needs it. If the name isn't zero terminated
|
remains until curl no longer needs it. If the name isn't zero terminated
|
||||||
properly, or if you'd like it to contain zero bytes, you need to set the
|
properly, or if you'd like it to contain zero bytes, you need to set the
|
||||||
length of the name with \fBCURLFORM_NAMELENGTH\fP.
|
length of the name with \fBCURLFORM_NAMELENGTH\fP.
|
||||||
|
|
||||||
.B CURLFORM_COPYCONTENTS
|
.IP CURLFORM_COPYCONTENTS
|
||||||
followed by a string is used for the contents of this part, the actual data to
|
followed by a string is used for the contents of this part, the actual data to
|
||||||
send away. libcurl copies the given data, so your application doesn't need to
|
send away. libcurl copies the given data, so your application doesn't need to
|
||||||
keep it around after this function call. If the data isn't zero terminated
|
keep it around after this function call. If the data isn't zero terminated
|
||||||
properly, or if you'd like it to contain zero bytes, you need to set the
|
properly, or if you'd like it to contain zero bytes, you need to set the
|
||||||
length of the name with \fBCURLFORM_CONTENTSLENGTH\fP.
|
length of the name with \fBCURLFORM_CONTENTSLENGTH\fP.
|
||||||
|
|
||||||
.B CURLFORM_PTRCONTENTS
|
.IP CURLFORM_PTRCONTENTS
|
||||||
followed by a string is used for the contents of this part, the actual data to
|
followed by a string is used for the contents of this part, the actual data to
|
||||||
send away. libcurl will use the pointer and refer to the data in your
|
send away. libcurl will use the pointer and refer to the data in your
|
||||||
application, you must make sure it remains until curl no longer needs it. If
|
application, you must make sure it remains until curl no longer needs it. If
|
||||||
@@ -64,11 +64,14 @@ the data isn't zero terminated properly, or if you'd like it to contain zero
|
|||||||
bytes, you need to set the length of the name with
|
bytes, you need to set the length of the name with
|
||||||
\fBCURLFORM_CONTENTSLENGTH\fP.
|
\fBCURLFORM_CONTENTSLENGTH\fP.
|
||||||
|
|
||||||
.B CURLFORM_FILECONTENT
|
.IP CURLFORM_CONTENTSLENGTH
|
||||||
|
followed by a long setting the length of the contents.
|
||||||
|
|
||||||
|
.IP CURLFORM_FILECONTENT
|
||||||
followed by a file name, makes that file read and the contents will be used in
|
followed by a file name, makes that file read and the contents will be used in
|
||||||
as data in this part.
|
as data in this part.
|
||||||
|
|
||||||
.B CURLFORM_FILE
|
.IP CURLFORM_FILE
|
||||||
followed by a file name, makes this part a file upload part. It sets the file
|
followed by a file name, makes this part a file upload part. It sets the file
|
||||||
name field to the actual file name used here, it gets the contents of the file
|
name field to the actual file name used here, it gets the contents of the file
|
||||||
and passes as data and sets the content-type if the given file match one of
|
and passes as data and sets the content-type if the given file match one of
|
||||||
@@ -77,32 +80,33 @@ send one or more files in one part by providing multiple \fBCURLFORM_FILE\fP
|
|||||||
arguments each followed by the filename (and each CURLFORM_FILE is allowed to
|
arguments each followed by the filename (and each CURLFORM_FILE is allowed to
|
||||||
have a CURLFORM_CONTENTTYPE).
|
have a CURLFORM_CONTENTTYPE).
|
||||||
|
|
||||||
.B CURLFORM_CONTENTTYPE
|
.IP CURLFORM_CONTENTTYPE
|
||||||
followed by a pointer to a string with a content-type will make curl use this
|
followed by a pointer to a string with a content-type will make curl use this
|
||||||
given content-type for this file upload part, possibly instead of an
|
given content-type for this file upload part, possibly instead of an
|
||||||
internally chosen one.
|
internally chosen one.
|
||||||
|
|
||||||
.B CURLFORM_FILENAME
|
.IP CURLFORM_FILENAME
|
||||||
followed by a pointer to a string to a name, will make libcurl use the given
|
followed by a pointer to a string to a name, will make libcurl use the given
|
||||||
name in the file upload part, instead of the actual file name given to
|
name in the file upload part, instead of the actual file name given to
|
||||||
\fICURLFORM_FILE\fP.
|
\fICURLFORM_FILE\fP.
|
||||||
|
|
||||||
.B BCURLFORM_BUFFER
|
.IP BCURLFORM_BUFFER
|
||||||
followed by a string, tells libcurl that a buffer is to be used to upload data
|
followed by a string, tells libcurl that a buffer is to be used to upload data
|
||||||
instead of using a file. The given string is used as the value of the file
|
instead of using a file. The given string is used as the value of the file
|
||||||
name field in the content header.
|
name field in the content header.
|
||||||
|
|
||||||
.B CURLFORM_BUFFERPTR
|
.IP CURLFORM_BUFFERPTR
|
||||||
followed by a pointer to a data area, tells libcurl the address of the buffer
|
followed by a pointer to a data area, tells libcurl the address of the buffer
|
||||||
containing data to upload (as indicated with \fICURLFORM_BUFFER\fP). The
|
containing data to upload (as indicated with \fICURLFORM_BUFFER\fP). The
|
||||||
buffer containing this data must not be freed until after
|
buffer containing this data must not be freed until after
|
||||||
\fIcurl_easy_cleanup(3)\fP is called.
|
\fIcurl_easy_cleanup(3)\fP is called. You must also use
|
||||||
|
\fICURLFORM_BUFFERLENGTH\fP to set the length of the given buffer area.
|
||||||
|
|
||||||
.B CURLFORM_BUFFERLENGTH
|
.IP CURLFORM_BUFFERLENGTH
|
||||||
followed by a long with the size of the \fICURLFORM_BUFFERPTR\fP data area,
|
followed by a long with the size of the \fICURLFORM_BUFFERPTR\fP data area,
|
||||||
tells libcurl the length of the buffer to upload.
|
tells libcurl the length of the buffer to upload.
|
||||||
|
|
||||||
.B CURLFORM_ARRAY
|
.IP CURLFORM_ARRAY
|
||||||
Another possibility to send options to curl_formadd() is the
|
Another possibility to send options to curl_formadd() is the
|
||||||
\fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as
|
\fBCURLFORM_ARRAY\fP option, that passes a struct curl_forms array pointer as
|
||||||
its value. Each curl_forms structure element has a CURLformoption and a char
|
its value. Each curl_forms structure element has a CURLformoption and a char
|
||||||
@@ -110,7 +114,7 @@ pointer. The final element in the array must be a CURLFORM_END. All available
|
|||||||
options can be used in an array, except the CURLFORM_ARRAY option itself! The
|
options can be used in an array, except the CURLFORM_ARRAY option itself! The
|
||||||
last argument in such an array must always be \fBCURLFORM_END\fP.
|
last argument in such an array must always be \fBCURLFORM_END\fP.
|
||||||
|
|
||||||
.B CURLFORM_CONTENTHEADER
|
.IP CURLFORM_CONTENTHEADER
|
||||||
specifies extra headers for the form POST section. This takes a curl_slist
|
specifies extra headers for the form POST section. This takes a curl_slist
|
||||||
prepared in the usual way using \fBcurl_slist_append\fP and appends the list
|
prepared in the usual way using \fBcurl_slist_append\fP and appends the list
|
||||||
of headers to those libcurl automatically generates. The list must exist while
|
of headers to those libcurl automatically generates. The list must exist while
|
||||||
|
@@ -9,7 +9,7 @@ curl_getdate - Convert an date string to number of seconds since January 1,
|
|||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B #include <curl/curl.h>
|
.B #include <curl/curl.h>
|
||||||
.sp
|
.sp
|
||||||
.BI "time_t curl_getdate(char *" datestring ", time_t *"now" );"
|
.BI "time_t curl_getdate(char *" datestring ", time_t *"now " );"
|
||||||
.ad
|
.ad
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
This function returns the number of seconds since January 1st 1970 in the UTC
|
This function returns the number of seconds since January 1st 1970 in the UTC
|
||||||
@@ -83,6 +83,9 @@ only ones RFC2616 says HTTP applications may use.
|
|||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
This function returns -1 when it fails to parse the date string. Otherwise it
|
This function returns -1 when it fails to parse the date string. Otherwise it
|
||||||
returns the number of seconds as described.
|
returns the number of seconds as described.
|
||||||
|
|
||||||
|
If the year is larger than 2037 on systems with 32 bit time_t, this function
|
||||||
|
will return 0x7fffffff (since that is the largest possible 31 bit number).
|
||||||
.SH REWRITE
|
.SH REWRITE
|
||||||
The former version of this function was built with yacc and was not only very
|
The former version of this function was built with yacc and was not only very
|
||||||
large, it was also never quite understood and it wasn't possible to build with
|
large, it was also never quite understood and it wasn't possible to build with
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
.\" $Id$
|
.\" $Id$
|
||||||
.\"
|
.\"
|
||||||
.TH curl_multi_info_read 3 "27 Feb 2002" "libcurl 7.10.3" "libcurl Manual"
|
.TH curl_multi_info_read 3 "18 Dec 2004" "libcurl 7.10.3" "libcurl Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
curl_multi_info_read - read multi stack informationals
|
curl_multi_info_read - read multi stack informationals
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -21,7 +21,7 @@ integer pointed to with \fImsgs_in_queue\fP will contain the number of
|
|||||||
remaining messages after this function was called.
|
remaining messages after this function was called.
|
||||||
|
|
||||||
The data the returned pointer points to will not survive calling
|
The data the returned pointer points to will not survive calling
|
||||||
\fIcurl_multi_cleanup(3)\fP.
|
\fIcurl_multi_cleanup(3)\fP or \fIcurl_multi_remove_handle(3)\fP.
|
||||||
|
|
||||||
The 'CURLMsg' struct is very simple and only contain very basic information.
|
The 'CURLMsg' struct is very simple and only contain very basic information.
|
||||||
If more involved information is wanted, the particular "easy handle" in
|
If more involved information is wanted, the particular "easy handle" in
|
||||||
|
@@ -47,15 +47,35 @@ typedef void CURL;
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Decorate exportable functions for Win32 DLL linking.
|
||||||
|
* This avoids using a .def file for building libcurl.dll.
|
||||||
|
*/
|
||||||
|
#if (defined(WIN32) || defined(_WIN32)) && !defined(CURL_STATICLIB)
|
||||||
|
#if defined(BUILDING_LIBCURL)
|
||||||
|
#define CURL_EXTERN __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define CURL_EXTERN __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define CURL_EXTERN
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We want the typedef curl_off_t setup for large file support on all
|
* We want the typedef curl_off_t setup for large file support on all
|
||||||
* platforms. We also provide a CURL_FORMAT_OFF_T define to use in *printf
|
* platforms. We also provide a CURL_FORMAT_OFF_T define to use in *printf
|
||||||
* format strings when outputting a variable of type curl_off_t.
|
* format strings when outputting a variable of type curl_off_t.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(_MSC_VER) || defined(__LCC__)
|
#if defined(_MSC_VER) || defined(__LCC__)
|
||||||
/* MSVC */
|
/* MSVC */
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
typedef long curl_off_t;
|
||||||
|
#define CURL_FORMAT_OFF_T "%ld"
|
||||||
|
#else
|
||||||
typedef signed __int64 curl_off_t;
|
typedef signed __int64 curl_off_t;
|
||||||
#define CURL_FORMAT_OFF_T "%I64d"
|
#define CURL_FORMAT_OFF_T "%I64d"
|
||||||
|
#endif
|
||||||
#else /* _MSC_VER || __LCC__ */
|
#else /* _MSC_VER || __LCC__ */
|
||||||
#if (defined(__GNUC__) && defined(WIN32)) || defined(__WATCOMC__)
|
#if (defined(__GNUC__) && defined(WIN32)) || defined(__WATCOMC__)
|
||||||
/* gcc on windows or Watcom */
|
/* gcc on windows or Watcom */
|
||||||
@@ -143,19 +163,39 @@ typedef size_t (*curl_write_callback)(char *buffer,
|
|||||||
size_t nitems,
|
size_t nitems,
|
||||||
void *outstream);
|
void *outstream);
|
||||||
|
|
||||||
/* This is a brand new return code for the read callback that will signal
|
/* This is a return code for the read callback that, when returned, will
|
||||||
the caller to immediately abort the current transfer. */
|
signal libcurl to immediately abort the current transfer. */
|
||||||
#define CURL_READFUNC_ABORT 0x10000000
|
#define CURL_READFUNC_ABORT 0x10000000
|
||||||
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,
|
||||||
void *instream);
|
void *instream);
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CURL_NO_OLDIES
|
||||||
/* not used since 7.10.8, will be removed in a future release */
|
/* not used since 7.10.8, will be removed in a future release */
|
||||||
typedef int (*curl_passwd_callback)(void *clientp,
|
typedef int (*curl_passwd_callback)(void *clientp,
|
||||||
const char *prompt,
|
const char *prompt,
|
||||||
char *buffer,
|
char *buffer,
|
||||||
int buflen);
|
int buflen);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLIOE_OK, /* I/O operation successful */
|
||||||
|
CURLIOE_UNKNOWNCMD, /* command was unknown to callback */
|
||||||
|
CURLIOE_FAILRESTART, /* failed to restart the read */
|
||||||
|
CURLIOE_LAST /* never use */
|
||||||
|
} curlioerr;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CURLIOCMD_NOP, /* no operation */
|
||||||
|
CURLIOCMD_RESTARTREAD, /* restart the read stream from start */
|
||||||
|
CURLIOCMD_LAST /* never use */
|
||||||
|
} curliocmd;
|
||||||
|
|
||||||
|
typedef curlioerr (*curl_ioctl_callback)(CURL *handle,
|
||||||
|
int cmd,
|
||||||
|
void *clientp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following typedef's are signatures of malloc, free, realloc, strdup and
|
* The following typedef's are signatures of malloc, free, realloc, strdup and
|
||||||
@@ -262,7 +302,9 @@ typedef enum {
|
|||||||
CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */
|
CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */
|
||||||
CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */
|
CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */
|
||||||
CURLE_FTP_SSL_FAILED, /* 64 - Requested FTP SSL level failed */
|
CURLE_FTP_SSL_FAILED, /* 64 - Requested FTP SSL level failed */
|
||||||
|
CURLE_SEND_FAIL_REWIND, /* 65 - Sending the data requires a rewind
|
||||||
|
that failed */
|
||||||
|
CURLE_SSL_ENGINE_INITFAILED, /* 66 - failed to initialise ENGINE */
|
||||||
CURL_LAST /* never use! */
|
CURL_LAST /* never use! */
|
||||||
} CURLcode;
|
} CURLcode;
|
||||||
|
|
||||||
@@ -274,9 +316,12 @@ typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */
|
|||||||
/* Make a spelling correction for the operation timed-out define */
|
/* Make a spelling correction for the operation timed-out define */
|
||||||
#define CURLE_OPERATION_TIMEDOUT CURLE_OPERATION_TIMEOUTED
|
#define CURLE_OPERATION_TIMEDOUT CURLE_OPERATION_TIMEOUTED
|
||||||
|
|
||||||
|
#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
|
||||||
|
the obsolete stuff removed! */
|
||||||
/* backwards compatibility with older names */
|
/* backwards compatibility with older names */
|
||||||
#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR
|
#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR
|
||||||
#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED
|
#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CURLPROXY_HTTP = 0,
|
CURLPROXY_HTTP = 0,
|
||||||
@@ -292,14 +337,17 @@ typedef enum {
|
|||||||
#define CURLAUTH_ANY ~0 /* all types set */
|
#define CURLAUTH_ANY ~0 /* all types set */
|
||||||
#define CURLAUTH_ANYSAFE (~CURLAUTH_BASIC)
|
#define CURLAUTH_ANYSAFE (~CURLAUTH_BASIC)
|
||||||
|
|
||||||
|
#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
|
||||||
|
the obsolete stuff removed! */
|
||||||
/* this was the error code 50 in 7.7.3 and a few earlier versions, this
|
/* 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
|
is no longer used by libcurl but is instead #defined here only to not
|
||||||
make programs break */
|
make programs break */
|
||||||
#define CURLE_ALREADY_COMPLETE 99999
|
#define CURLE_ALREADY_COMPLETE 99999
|
||||||
|
|
||||||
/* This is just to make older programs not break: */
|
/* These are just to make older programs not break: */
|
||||||
#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE
|
#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE
|
||||||
#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME
|
#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME
|
||||||
|
#endif
|
||||||
|
|
||||||
#define CURL_ERROR_SIZE 256
|
#define CURL_ERROR_SIZE 256
|
||||||
|
|
||||||
@@ -834,6 +882,9 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
CINIT(FTPSSLAUTH, LONG, 129),
|
CINIT(FTPSSLAUTH, LONG, 129),
|
||||||
|
|
||||||
|
CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),
|
||||||
|
CINIT(IOCTLDATA, OBJECTPOINT, 131),
|
||||||
|
|
||||||
CURLOPT_LASTENTRY /* the last unused */
|
CURLOPT_LASTENTRY /* the last unused */
|
||||||
} CURLoption;
|
} CURLoption;
|
||||||
|
|
||||||
@@ -915,8 +966,8 @@ typedef enum {
|
|||||||
|
|
||||||
/* curl_strequal() and curl_strnequal() are subject for removal in a future
|
/* curl_strequal() and curl_strnequal() are subject for removal in a future
|
||||||
libcurl, see lib/README.curlx for details */
|
libcurl, see lib/README.curlx for details */
|
||||||
extern int (curl_strequal)(const char *s1, const char *s2);
|
CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2);
|
||||||
extern int (curl_strnequal)(const char *s1, const char *s2, size_t n);
|
CURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n);
|
||||||
|
|
||||||
/* name is uppercase CURLFORM_<name> */
|
/* name is uppercase CURLFORM_<name> */
|
||||||
#ifdef CFINIT
|
#ifdef CFINIT
|
||||||
@@ -1005,7 +1056,7 @@ typedef enum {
|
|||||||
* adds one part that together construct a full post. Then use
|
* adds one part that together construct a full post. Then use
|
||||||
* CURLOPT_HTTPPOST to send it off to libcurl.
|
* CURLOPT_HTTPPOST to send it off to libcurl.
|
||||||
*/
|
*/
|
||||||
CURLFORMcode curl_formadd(struct curl_httppost **httppost,
|
CURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost,
|
||||||
struct curl_httppost **last_post,
|
struct curl_httppost **last_post,
|
||||||
...);
|
...);
|
||||||
|
|
||||||
@@ -1016,7 +1067,7 @@ CURLFORMcode curl_formadd(struct curl_httppost **httppost,
|
|||||||
*
|
*
|
||||||
* Free a multipart formpost previously built with curl_formadd().
|
* Free a multipart formpost previously built with curl_formadd().
|
||||||
*/
|
*/
|
||||||
void curl_formfree(struct curl_httppost *form);
|
CURL_EXTERN void curl_formfree(struct curl_httppost *form);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_getenv()
|
* NAME curl_getenv()
|
||||||
@@ -1026,7 +1077,7 @@ void curl_formfree(struct curl_httppost *form);
|
|||||||
* Returns a malloc()'ed string that MUST be curl_free()ed after usage is
|
* Returns a malloc()'ed string that MUST be curl_free()ed after usage is
|
||||||
* complete. DEPRECATED - see lib/README.curlx
|
* complete. DEPRECATED - see lib/README.curlx
|
||||||
*/
|
*/
|
||||||
char *curl_getenv(const char *variable);
|
CURL_EXTERN char *curl_getenv(const char *variable);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_version()
|
* NAME curl_version()
|
||||||
@@ -1035,7 +1086,7 @@ char *curl_getenv(const char *variable);
|
|||||||
*
|
*
|
||||||
* Returns a static ascii string of the libcurl version.
|
* Returns a static ascii string of the libcurl version.
|
||||||
*/
|
*/
|
||||||
char *curl_version(void);
|
CURL_EXTERN char *curl_version(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_escape()
|
* NAME curl_escape()
|
||||||
@@ -1046,7 +1097,7 @@ char *curl_version(void);
|
|||||||
* %XX versions). This function returns a new allocated string or NULL if an
|
* %XX versions). This function returns a new allocated string or NULL if an
|
||||||
* error occurred.
|
* error occurred.
|
||||||
*/
|
*/
|
||||||
char *curl_escape(const char *string, int length);
|
CURL_EXTERN char *curl_escape(const char *string, int length);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_unescape()
|
* NAME curl_unescape()
|
||||||
@@ -1057,7 +1108,7 @@ char *curl_escape(const char *string, int length);
|
|||||||
* versions). This function returns a new allocated string or NULL if an error
|
* versions). This function returns a new allocated string or NULL if an error
|
||||||
* occurred.
|
* occurred.
|
||||||
*/
|
*/
|
||||||
char *curl_unescape(const char *string, int length);
|
CURL_EXTERN char *curl_unescape(const char *string, int length);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_free()
|
* NAME curl_free()
|
||||||
@@ -1067,7 +1118,7 @@ char *curl_unescape(const char *string, int length);
|
|||||||
* Provided for de-allocation in the same translation unit that did the
|
* Provided for de-allocation in the same translation unit that did the
|
||||||
* allocation. Added in libcurl 7.10
|
* allocation. Added in libcurl 7.10
|
||||||
*/
|
*/
|
||||||
void curl_free(void *p);
|
CURL_EXTERN void curl_free(void *p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_global_init()
|
* NAME curl_global_init()
|
||||||
@@ -1077,7 +1128,7 @@ void curl_free(void *p);
|
|||||||
* curl_global_init() should be invoked exactly once for each application that
|
* curl_global_init() should be invoked exactly once for each application that
|
||||||
* uses libcurl
|
* uses libcurl
|
||||||
*/
|
*/
|
||||||
CURLcode curl_global_init(long flags);
|
CURL_EXTERN CURLcode curl_global_init(long flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_global_init_mem()
|
* NAME curl_global_init_mem()
|
||||||
@@ -1092,7 +1143,7 @@ CURLcode curl_global_init(long flags);
|
|||||||
* callback routines with be invoked by this library instead of the system
|
* callback routines with be invoked by this library instead of the system
|
||||||
* memory management routines like malloc, free etc.
|
* memory management routines like malloc, free etc.
|
||||||
*/
|
*/
|
||||||
CURLcode curl_global_init_mem(long flags,
|
CURL_EXTERN CURLcode curl_global_init_mem(long flags,
|
||||||
curl_malloc_callback m,
|
curl_malloc_callback m,
|
||||||
curl_free_callback f,
|
curl_free_callback f,
|
||||||
curl_realloc_callback r,
|
curl_realloc_callback r,
|
||||||
@@ -1107,7 +1158,7 @@ CURLcode curl_global_init_mem(long flags,
|
|||||||
* curl_global_cleanup() should be invoked exactly once for each application
|
* curl_global_cleanup() should be invoked exactly once for each application
|
||||||
* that uses libcurl
|
* that uses libcurl
|
||||||
*/
|
*/
|
||||||
void curl_global_cleanup(void);
|
CURL_EXTERN void curl_global_cleanup(void);
|
||||||
|
|
||||||
/* 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 {
|
||||||
@@ -1123,7 +1174,8 @@ struct curl_slist {
|
|||||||
* Appends a string to a linked list. If no list exists, it will be created
|
* Appends a string to a linked list. If no list exists, it will be created
|
||||||
* first. Returns the new list, after appending.
|
* first. Returns the new list, after appending.
|
||||||
*/
|
*/
|
||||||
struct curl_slist *curl_slist_append(struct curl_slist *, const char *);
|
CURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,
|
||||||
|
const char *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_slist_free_all()
|
* NAME curl_slist_free_all()
|
||||||
@@ -1132,7 +1184,7 @@ struct curl_slist *curl_slist_append(struct curl_slist *, const char *);
|
|||||||
*
|
*
|
||||||
* free a previously built curl_slist.
|
* free a previously built curl_slist.
|
||||||
*/
|
*/
|
||||||
void curl_slist_free_all(struct curl_slist *);
|
CURL_EXTERN void curl_slist_free_all(struct curl_slist *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_getdate()
|
* NAME curl_getdate()
|
||||||
@@ -1144,11 +1196,12 @@ void curl_slist_free_all(struct curl_slist *);
|
|||||||
* where the specified time is relative now, like 'two weeks' or 'tomorrow'
|
* where the specified time is relative now, like 'two weeks' or 'tomorrow'
|
||||||
* etc.
|
* etc.
|
||||||
*/
|
*/
|
||||||
time_t curl_getdate(const char *p, const time_t *now);
|
CURL_EXTERN time_t curl_getdate(const char *p, const time_t *now);
|
||||||
|
|
||||||
#define CURLINFO_STRING 0x100000
|
#define CURLINFO_STRING 0x100000
|
||||||
#define CURLINFO_LONG 0x200000
|
#define CURLINFO_LONG 0x200000
|
||||||
#define CURLINFO_DOUBLE 0x300000
|
#define CURLINFO_DOUBLE 0x300000
|
||||||
|
#define CURLINFO_SLIST 0x400000
|
||||||
#define CURLINFO_MASK 0x0fffff
|
#define CURLINFO_MASK 0x0fffff
|
||||||
#define CURLINFO_TYPEMASK 0xf00000
|
#define CURLINFO_TYPEMASK 0xf00000
|
||||||
|
|
||||||
@@ -1179,9 +1232,11 @@ typedef enum {
|
|||||||
CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23,
|
CURLINFO_HTTPAUTH_AVAIL = CURLINFO_LONG + 23,
|
||||||
CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24,
|
CURLINFO_PROXYAUTH_AVAIL = CURLINFO_LONG + 24,
|
||||||
CURLINFO_OS_ERRNO = CURLINFO_LONG + 25,
|
CURLINFO_OS_ERRNO = CURLINFO_LONG + 25,
|
||||||
|
CURLINFO_NUM_CONNECTS = CURLINFO_LONG + 26,
|
||||||
|
CURLINFO_SSL_ENGINES = CURLINFO_SLIST + 27,
|
||||||
/* Fill in new entries below here! */
|
/* Fill in new entries below here! */
|
||||||
|
|
||||||
CURLINFO_LASTONE = 26
|
CURLINFO_LASTONE = 28
|
||||||
} CURLINFO;
|
} CURLINFO;
|
||||||
|
|
||||||
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
|
/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
|
||||||
@@ -1264,9 +1319,9 @@ typedef enum {
|
|||||||
CURLSHOPT_LAST /* never use */
|
CURLSHOPT_LAST /* never use */
|
||||||
} CURLSHoption;
|
} CURLSHoption;
|
||||||
|
|
||||||
CURLSH *curl_share_init(void);
|
CURL_EXTERN CURLSH *curl_share_init(void);
|
||||||
CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);
|
CURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);
|
||||||
CURLSHcode curl_share_cleanup(CURLSH *);
|
CURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Structures for querying information about the curl library at runtime.
|
* Structures for querying information about the curl library at runtime.
|
||||||
@@ -1326,7 +1381,7 @@ typedef struct {
|
|||||||
* This function returns a pointer to a static copy of the version info
|
* This function returns a pointer to a static copy of the version info
|
||||||
* struct. See above.
|
* struct. See above.
|
||||||
*/
|
*/
|
||||||
curl_version_info_data *curl_version_info(CURLversion);
|
CURL_EXTERN curl_version_info_data *curl_version_info(CURLversion);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_easy_strerror()
|
* NAME curl_easy_strerror()
|
||||||
@@ -1337,7 +1392,7 @@ curl_version_info_data *curl_version_info(CURLversion);
|
|||||||
* into the equivalent human readable error string. This is useful
|
* into the equivalent human readable error string. This is useful
|
||||||
* for printing meaningful error messages.
|
* for printing meaningful error messages.
|
||||||
*/
|
*/
|
||||||
const char *curl_easy_strerror(CURLcode);
|
CURL_EXTERN const char *curl_easy_strerror(CURLcode);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_share_strerror()
|
* NAME curl_share_strerror()
|
||||||
@@ -1348,7 +1403,7 @@ const char *curl_easy_strerror(CURLcode);
|
|||||||
* into the equivalent human readable error string. This is useful
|
* into the equivalent human readable error string. This is useful
|
||||||
* for printing meaningful error messages.
|
* for printing meaningful error messages.
|
||||||
*/
|
*/
|
||||||
const char *curl_share_strerror(CURLSHcode);
|
CURL_EXTERN const char *curl_share_strerror(CURLSHcode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
/* This is the version number of the libcurl package from which this header
|
/* This is the version number of the libcurl package from which this header
|
||||||
file origins: */
|
file origins: */
|
||||||
#define LIBCURL_VERSION "7.12.2-CVS"
|
#define LIBCURL_VERSION "7.12.3-CVS"
|
||||||
|
|
||||||
/* This is the numeric version of the libcurl version number, meant for easier
|
/* This is the numeric version of the libcurl version number, meant for easier
|
||||||
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
|
||||||
@@ -44,12 +44,12 @@
|
|||||||
always a greater number in a more recent release. It makes comparisons with
|
always a greater number in a more recent release. It makes comparisons with
|
||||||
greater than and less than work.
|
greater than and less than work.
|
||||||
*/
|
*/
|
||||||
#define LIBCURL_VERSION_NUM 0x070c02
|
#define LIBCURL_VERSION_NUM 0x070c03
|
||||||
|
|
||||||
/* The numeric version number is also available "in parts" by using these
|
/* The numeric version number is also available "in parts" by using these
|
||||||
defines: */
|
defines: */
|
||||||
#define LIBCURL_VERSION_MAJOR 7
|
#define LIBCURL_VERSION_MAJOR 7
|
||||||
#define LIBCURL_VERSION_MINOR 12
|
#define LIBCURL_VERSION_MINOR 12
|
||||||
#define LIBCURL_VERSION_PATCH 2
|
#define LIBCURL_VERSION_PATCH 3
|
||||||
|
|
||||||
#endif /* __CURL_CURLVER_H */
|
#endif /* __CURL_CURLVER_H */
|
||||||
|
@@ -26,10 +26,10 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CURL *curl_easy_init(void);
|
CURL_EXTERN CURL *curl_easy_init(void);
|
||||||
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
|
CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
|
||||||
CURLcode curl_easy_perform(CURL *curl);
|
CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);
|
||||||
void curl_easy_cleanup(CURL *curl);
|
CURL_EXTERN void curl_easy_cleanup(CURL *curl);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_easy_getinfo()
|
* NAME curl_easy_getinfo()
|
||||||
@@ -44,7 +44,7 @@ void curl_easy_cleanup(CURL *curl);
|
|||||||
* performed transfer, all results from this function are undefined until the
|
* performed transfer, all results from this function are undefined until the
|
||||||
* transfer is completed.
|
* transfer is completed.
|
||||||
*/
|
*/
|
||||||
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
|
CURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -59,7 +59,7 @@ CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
|
|||||||
* curl_easy_duphandle() for each new thread to avoid a series of identical
|
* curl_easy_duphandle() for each new thread to avoid a series of identical
|
||||||
* curl_easy_setopt() invokes in every thread.
|
* curl_easy_setopt() invokes in every thread.
|
||||||
*/
|
*/
|
||||||
CURL* curl_easy_duphandle(CURL *curl);
|
CURL_EXTERN CURL* curl_easy_duphandle(CURL *curl);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NAME curl_easy_reset()
|
* NAME curl_easy_reset()
|
||||||
@@ -72,7 +72,7 @@ CURL* curl_easy_duphandle(CURL *curl);
|
|||||||
* It does keep: live connections, the Session ID cache, the DNS cache and the
|
* It does keep: live connections, the Session ID cache, the DNS cache and the
|
||||||
* cookies.
|
* cookies.
|
||||||
*/
|
*/
|
||||||
void curl_easy_reset(CURL *curl);
|
CURL_EXTERN void curl_easy_reset(CURL *curl);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -27,16 +27,18 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h> /* needed for FILE */
|
#include <stdio.h> /* needed for FILE */
|
||||||
|
|
||||||
int curl_mprintf(const char *format, ...);
|
#include "curl.h"
|
||||||
int curl_mfprintf(FILE *fd, const char *format, ...);
|
|
||||||
int curl_msprintf(char *buffer, const char *format, ...);
|
CURL_EXTERN int curl_mprintf(const char *format, ...);
|
||||||
int curl_msnprintf(char *buffer, size_t maxlength, const char *format, ...);
|
CURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...);
|
||||||
int curl_mvprintf(const char *format, va_list args);
|
CURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...);
|
||||||
int curl_mvfprintf(FILE *fd, const char *format, va_list args);
|
CURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength, const char *format, ...);
|
||||||
int curl_mvsprintf(char *buffer, const char *format, va_list args);
|
CURL_EXTERN int curl_mvprintf(const char *format, va_list args);
|
||||||
int curl_mvsnprintf(char *buffer, size_t maxlength, const char *format, va_list args);
|
CURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args);
|
||||||
char *curl_maprintf(const char *format, ...);
|
CURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args);
|
||||||
char *curl_mvaprintf(const char *format, va_list args);
|
CURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength, const char *format, va_list args);
|
||||||
|
CURL_EXTERN char *curl_maprintf(const char *format, ...);
|
||||||
|
CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
|
||||||
|
|
||||||
#ifdef _MPRINTF_REPLACE
|
#ifdef _MPRINTF_REPLACE
|
||||||
# define printf curl_mprintf
|
# define printf curl_mprintf
|
||||||
|
@@ -51,7 +51,8 @@
|
|||||||
#define WIN32 1
|
#define WIN32 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) || \
|
||||||
|
defined(__MINGW32__)
|
||||||
#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H))
|
#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H))
|
||||||
/* The check above prevents the winsock2 inclusion if winsock.h already was
|
/* The check above prevents the winsock2 inclusion if winsock.h already was
|
||||||
included, since they can't co-exist without problems */
|
included, since they can't co-exist without problems */
|
||||||
@@ -112,7 +113,7 @@ typedef struct CURLMsg CURLMsg;
|
|||||||
* Desc: inititalize multi-style curl usage
|
* Desc: inititalize multi-style curl usage
|
||||||
* Returns: a new CURLM handle to use in all 'curl_multi' functions.
|
* Returns: a new CURLM handle to use in all 'curl_multi' functions.
|
||||||
*/
|
*/
|
||||||
CURLM *curl_multi_init(void);
|
CURL_EXTERN CURLM *curl_multi_init(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name: curl_multi_add_handle()
|
* Name: curl_multi_add_handle()
|
||||||
@@ -120,7 +121,7 @@ CURLM *curl_multi_init(void);
|
|||||||
* Desc: add a standard curl handle to the multi stack
|
* Desc: add a standard curl handle to the multi stack
|
||||||
* Returns: CURLMcode type, general multi error code.
|
* Returns: CURLMcode type, general multi error code.
|
||||||
*/
|
*/
|
||||||
CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
||||||
CURL *curl_handle);
|
CURL *curl_handle);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -129,7 +130,7 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle,
|
|||||||
* Desc: removes a curl handle from the multi stack again
|
* Desc: removes a curl handle from the multi stack again
|
||||||
* Returns: CURLMcode type, general multi error code.
|
* Returns: CURLMcode type, general multi error code.
|
||||||
*/
|
*/
|
||||||
CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
||||||
CURL *curl_handle);
|
CURL *curl_handle);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -140,7 +141,7 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
|||||||
* them are ready.
|
* them are ready.
|
||||||
* Returns: CURLMcode type, general multi error code.
|
* Returns: CURLMcode type, general multi error code.
|
||||||
*/
|
*/
|
||||||
CURLMcode curl_multi_fdset(CURLM *multi_handle,
|
CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
|
||||||
fd_set *read_fd_set,
|
fd_set *read_fd_set,
|
||||||
fd_set *write_fd_set,
|
fd_set *write_fd_set,
|
||||||
fd_set *exc_fd_set,
|
fd_set *exc_fd_set,
|
||||||
@@ -162,7 +163,7 @@ CURLMcode curl_multi_fdset(CURLM *multi_handle,
|
|||||||
* still have occurred problems on invidual transfers even when this
|
* still have occurred problems on invidual transfers even when this
|
||||||
* returns OK.
|
* returns OK.
|
||||||
*/
|
*/
|
||||||
CURLMcode curl_multi_perform(CURLM *multi_handle,
|
CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
|
||||||
int *running_handles);
|
int *running_handles);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -174,7 +175,7 @@ CURLMcode curl_multi_perform(CURLM *multi_handle,
|
|||||||
* in the middle of a transfer.
|
* in the middle of a transfer.
|
||||||
* Returns: CURLMcode type, general multi error code.
|
* Returns: CURLMcode type, general multi error code.
|
||||||
*/
|
*/
|
||||||
CURLMcode curl_multi_cleanup(CURLM *multi_handle);
|
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name: curl_multi_info_read()
|
* Name: curl_multi_info_read()
|
||||||
@@ -204,7 +205,7 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle);
|
|||||||
* queue (after this read) in the integer the second argument points
|
* queue (after this read) in the integer the second argument points
|
||||||
* to.
|
* to.
|
||||||
*/
|
*/
|
||||||
CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
||||||
int *msgs_in_queue);
|
int *msgs_in_queue);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -216,7 +217,7 @@ CURLMsg *curl_multi_info_read(CURLM *multi_handle,
|
|||||||
* into the equivalent human readable error string. This is useful
|
* into the equivalent human readable error string. This is useful
|
||||||
* for printing meaningful error messages.
|
* for printing meaningful error messages.
|
||||||
*/
|
*/
|
||||||
const char *curl_multi_strerror(CURLMcode);
|
CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* end of extern "C" */
|
} /* end of extern "C" */
|
||||||
|
@@ -24,14 +24,13 @@ AUTOMAKE_OPTIONS = foreign nostdinc
|
|||||||
|
|
||||||
DSP = curllib.dsp
|
DSP = curllib.dsp
|
||||||
|
|
||||||
EXTRA_DIST = Makefile.b32 Makefile.m32 \
|
EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 Makefile.riscos $(DSP) \
|
||||||
Makefile.vc6 Makefile.riscos libcurl.def $(DSP) curllib.dsw \
|
curllib.dsw config-vms.h config-win32.h config-win32ce.h config-riscos.h \
|
||||||
config-vms.h config-win32.h config-riscos.h config-mac.h config.h.in \
|
config-mac.h config.h.in ca-bundle.crt README.encoding README.memoryleak \
|
||||||
ca-bundle.crt README.encoding README.memoryleak README.ares \
|
README.ares README.curlx makefile.dj config.dj libcurl.framework.make \
|
||||||
README.curlx makefile.dj config.dj libcurl.framework.make \
|
libcurl.plist libcurl.rc config-amigaos.h amigaos.c amigaos.h makefile.amiga \
|
||||||
libcurl.plist libcurl.rc config-amigaos.h amigaos.c amigaos.h \
|
Makefile.netware nwlib.c libcurl.imp msvcproj.head msvcproj.foot \
|
||||||
makefile.amiga Makefile.netware nwlib.c libcurl.imp \
|
config-win32ce.h README.httpauth
|
||||||
msvcproj.head msvcproj.foot
|
|
||||||
|
|
||||||
CLEANFILES = $(DSP)
|
CLEANFILES = $(DSP)
|
||||||
|
|
||||||
@@ -90,7 +89,7 @@ include Makefile.inc
|
|||||||
|
|
||||||
libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
|
libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
|
||||||
|
|
||||||
WIN32SOURCES = $(CSOURCES) libcurl.def
|
WIN32SOURCES = $(CSOURCES)
|
||||||
WIN32HEADERS = $(HHEADERS) config-win32.h
|
WIN32HEADERS = $(HHEADERS) config-win32.h
|
||||||
|
|
||||||
BUILT_SOURCES = $(top_builddir)/lib/ca-bundle.h
|
BUILT_SOURCES = $(top_builddir)/lib/ca-bundle.h
|
||||||
|
@@ -22,9 +22,10 @@ ZLIB_PATH = ../../zlib-1.2.1
|
|||||||
OPENSSL_PATH = ../../openssl-0.9.7d
|
OPENSSL_PATH = ../../openssl-0.9.7d
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
# Set libcurl's name
|
# Set libcurl static lib, dll and import lib
|
||||||
LIBCURLLIB = libcurl.lib
|
LIBCURL_LIB = libcurl.lib
|
||||||
LIBCURLDLL = libcurl.dll
|
LIBCURL_DLL = libcurl.dll
|
||||||
|
LIBCURL_IMPLIB = libcurl_imp.lib
|
||||||
|
|
||||||
# Setup environment
|
# Setup environment
|
||||||
CXX = bcc32
|
CXX = bcc32
|
||||||
@@ -32,27 +33,28 @@ LD = bcc32
|
|||||||
CP = copy
|
CP = copy
|
||||||
RM = del
|
RM = del
|
||||||
LIB = tlib
|
LIB = tlib
|
||||||
TOPDIR = ..
|
IMPLIB = implib
|
||||||
CURNTDIR = .
|
|
||||||
|
|
||||||
CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM
|
CXXFLAGS = -q -5 -O2 -w-aus -w-ccc -w-csu -w-par -w-pia -w-rch -w-inl -w-ngu -w-pro -tWM
|
||||||
LIBFLAGS = /C /P32
|
LIBFLAGS = /C /P32
|
||||||
LDFLAGS = -q -lq -laa -tWD
|
LDFLAGS = -q -lq -laa -tWD
|
||||||
|
|
||||||
INCDIRS = -I$(CURNTDIR);$(TOPDIR)/include
|
INCDIRS = -I.;../include
|
||||||
LINKLIB = $(BCCDIR)/lib/cw32mt.lib
|
LINKLIB = $(BCCDIR)/lib/cw32mt.lib
|
||||||
|
|
||||||
# If you build with SSL support, set WITH_SSL=1
|
# If you build with SSL support, set WITH_SSL=1
|
||||||
DEFINES = -DLIBCURL_BIGENDIAN=0 -DNDEBUG -DWIN32 -D_CONSOLE -D_MBCS
|
DEFINES = -DNDEBUG -DWIN32 -D_CONSOLE -D_MBCS -DBUILDING_LIBCURL
|
||||||
|
|
||||||
!ifdef WITH_ZLIB
|
!ifdef WITH_ZLIB
|
||||||
DEFINES = $(DEFINES) -DHAVE_LIBZ -DHAVE_ZLIB_H
|
DEFINES = $(DEFINES) -DHAVE_LIBZ -DHAVE_ZLIB_H
|
||||||
INCDIRS = $(INCDIRS);$(ZLIB_PATH)
|
INCDIRS = $(INCDIRS);$(ZLIB_PATH)
|
||||||
# LINKLIB = $(LINKLIB) $(ZLIB_PATH)/zlib.lib
|
LINKLIB = $(LINKLIB) $(ZLIB_PATH)/zlib.lib
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
!ifdef WITH_SSL
|
!ifdef WITH_SSL
|
||||||
DEFINES = $(DEFINES) -DUSE_SSLEAY
|
DEFINES = $(DEFINES) -DUSE_SSLEAY
|
||||||
INCDIRS = $(INCDIRS);$(OPENSSL_PATH)/inc32;$(OPENSSL_PATH)/inc32/openssl
|
INCDIRS = $(INCDIRS);$(OPENSSL_PATH)/inc32;$(OPENSSL_PATH)/inc32/openssl
|
||||||
# LINKLIB = $(LINKLIB) $(OPENSSL_PATH)/out32/ssleay32.lib $(OPENSSL_PATH)/out32/libeay32.lib
|
LINKLIB = $(LINKLIB) $(OPENSSL_PATH)/out32/ssleay32.lib $(OPENSSL_PATH)/out32/libeay32.lib
|
||||||
!endif
|
!endif
|
||||||
|
|
||||||
.autodepend
|
.autodepend
|
||||||
@@ -65,21 +67,24 @@ OBJECTS = $(CSOURCES:.c=.obj)
|
|||||||
.c.obj:
|
.c.obj:
|
||||||
$(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $<
|
$(CXX) -c $(INCDIRS) $(CXXFLAGS) $(DEFINES) $<
|
||||||
|
|
||||||
all: $(LIBCURLLIB)
|
all: $(LIBCURL_LIB) $(LIBCURL_DLL)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
-$(RM) $(LIBCURLLIB)
|
-$(RM) $(LIBCURL_LIB)
|
||||||
|
-$(RM) $(LIBCURL_IMPLIB)
|
||||||
|
-$(RM) libcurl.tds
|
||||||
-$(RM) *.obj
|
-$(RM) *.obj
|
||||||
|
|
||||||
$(LIBCURLLIB): $(OBJECTS)
|
$(LIBCURL_LIB): $(OBJECTS)
|
||||||
@-$(RM) $@
|
@-$(RM) $@
|
||||||
$(LIB) $(LIBFLAGS) $@ @&&!
|
$(LIB) $(LIBFLAGS) $@ @&&!
|
||||||
+$(**: = &^
|
+$(**: = &^
|
||||||
+)
|
+)
|
||||||
!
|
!
|
||||||
|
|
||||||
$(LIBCURLDLL): $(OBJECTS) $(LINKLIB)
|
$(LIBCURL_DLL) $(LIBCURL_IMPLIB): $(OBJECTS) $(LINKLIB)
|
||||||
@-$(RM) $@
|
@-$(RM) $(LIBCURL_DLL)
|
||||||
$(LD) $(LDFLAGS) -e$@ $**
|
@-$(RM) $(LIBCURL_IMPLIB)
|
||||||
|
$(LD) $(LDFLAGS) -e$(LIBCURL_DLL) $**
|
||||||
|
$(IMPLIB) $(LIBCURL_IMPLIB) $(LIBCURL_DLL)
|
||||||
|
|
||||||
|
@@ -7,7 +7,8 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
|
|||||||
memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \
|
memdebug.c http_chunks.c strtok.c connect.c llist.c hash.c multi.c \
|
||||||
content_encoding.c share.c http_digest.c md5.c http_negotiate.c \
|
content_encoding.c share.c http_digest.c md5.c http_negotiate.c \
|
||||||
http_ntlm.c inet_pton.c strtoofft.c strerror.c hostares.c hostasyn.c \
|
http_ntlm.c inet_pton.c strtoofft.c strerror.c hostares.c hostasyn.c \
|
||||||
hostip4.c hostip6.c hostsyn.c hostthre.c inet_ntop.c parsedate.c
|
hostip4.c hostip6.c hostsyn.c hostthre.c inet_ntop.c parsedate.c \
|
||||||
|
select.c
|
||||||
|
|
||||||
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h \
|
HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h \
|
||||||
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
|
progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h \
|
||||||
@@ -16,4 +17,4 @@ HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h \
|
|||||||
http_chunks.h strtok.h connect.h llist.h hash.h content_encoding.h \
|
http_chunks.h strtok.h connect.h llist.h hash.h content_encoding.h \
|
||||||
share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h \
|
share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h \
|
||||||
inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h \
|
inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h \
|
||||||
setup.h transfer.h
|
setup.h transfer.h select.h
|
||||||
|
@@ -25,11 +25,13 @@ STRIP = strip -g
|
|||||||
########################################################
|
########################################################
|
||||||
## Nothing more to do below this line!
|
## Nothing more to do below this line!
|
||||||
|
|
||||||
INCLUDES = -I. -I.. -I../include -I../src
|
INCLUDES = -I. -I../include
|
||||||
CFLAGS = -g -O2 -DMINGW32
|
CFLAGS = -g -O2 -DMINGW32 -DBUILDING_LIBCURL -DHAVE_LONGLONG
|
||||||
ifdef SSL
|
ifdef SSL
|
||||||
INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
|
INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
|
||||||
CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H
|
CFLAGS += -DUSE_SSLEAY -DUSE_OPENSSL -DHAVE_OPENSSL_ENGINE_H -DHAVE_OPENSSL_PKCS12_H \
|
||||||
|
-DHAVE_ENGINE_LOAD_BUILTIN_ENGINES -DOPENSSL_NO_KRB5 \
|
||||||
|
-DCURL_CA_BUNDLE='getenv("CURL_CA_BUNDLE")'
|
||||||
DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32
|
DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32
|
||||||
endif
|
endif
|
||||||
ifdef ZLIB
|
ifdef ZLIB
|
||||||
@@ -59,22 +61,16 @@ RESOURCE = libcurl.res
|
|||||||
|
|
||||||
# remove the last line above to keep debug info
|
# remove the last line above to keep debug info
|
||||||
|
|
||||||
libcurl.dll libcurldll.a: libcurl.a libcurl.def $(RESOURCE)
|
libcurl.dll libcurldll.a: $(libcurl_a_OBJECTS) $(RESOURCE)
|
||||||
$(RM) $@
|
$(RM) $@
|
||||||
dllwrap --dllname $@ --output-lib libcurldll.a --export-all --def libcurl.def $(libcurl_a_LIBRARIES) $(RESOURCE) $(DLL_LIBS) -lwsock32 -lws2_32 -lwinmm
|
$(CC) -s -shared -Wl,--out-implib,libcurldll.a -o libcurl.dll \
|
||||||
$(STRIP) $@
|
$(libcurl_a_OBJECTS) $(RESOURCE) $(DLL_LIBS) -lws2_32 -lwinmm
|
||||||
|
|
||||||
# remove the last line above to keep debug info
|
# remove the above '-s' to keep debug info
|
||||||
|
|
||||||
.c.o:
|
.c.o:
|
||||||
$(COMPILE) -c $<
|
$(COMPILE) -c $<
|
||||||
|
|
||||||
.s.o:
|
|
||||||
$(COMPILE) -c $<
|
|
||||||
|
|
||||||
.S.o:
|
|
||||||
$(COMPILE) -c $<
|
|
||||||
|
|
||||||
libcurl.res: libcurl.rc
|
libcurl.res: libcurl.rc
|
||||||
windres -DCURLDEBUG=0 -O COFF -o $@ -i $^
|
windres -DCURLDEBUG=0 -O COFF -o $@ -i $^
|
||||||
|
|
||||||
|
@@ -353,6 +353,7 @@ ifdef ZLIB_PATH
|
|||||||
endif
|
endif
|
||||||
ifdef SSL
|
ifdef SSL
|
||||||
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
|
@echo $(DL)#define USE_SSLEAY 1$(DL) >> $@
|
||||||
|
@echo $(DL)#define USE_OPENSSL 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_OPENSSL_X509_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_OPENSSL_SSL_H 1$(DL) >> $@
|
||||||
@echo $(DL)#define HAVE_OPENSSL_RSA_H 1$(DL) >> $@
|
@echo $(DL)#define HAVE_OPENSSL_RSA_H 1$(DL) >> $@
|
||||||
|
@@ -5,11 +5,12 @@
|
|||||||
# Project objects:
|
# Project objects:
|
||||||
objs = o.base64 o.connect o.cookie o.dict \
|
objs = o.base64 o.connect o.cookie o.dict \
|
||||||
o.dllinit o.easy o.escape o.file \
|
o.dllinit o.easy o.escape o.file \
|
||||||
o.formdata o.ftp o.getdate o.getenv \
|
o.formdata o.ftp o.getenv \
|
||||||
o.getinfo o.getpass o.hostip o.http \
|
o.getinfo o.getpass o.hostip \
|
||||||
o.http_chunks o.if2ip o.krb4 o.ldap \
|
o.hostip4 o.hostsyn o.http \
|
||||||
o.memdebug o.mprintf o.netrc o.progress \
|
o.http_chunks o.inet_ntop o.inet_pton o.if2ip o.krb4 o.ldap \
|
||||||
o.security o.sendf o.speedcheck o.ssluse \
|
o.memdebug o.mprintf o.netrc o.parsedate o.progress \
|
||||||
|
o.security o.select o.sendf o.speedcheck o.ssluse \
|
||||||
o.strequal o.strtok o.telnet o.timeval \
|
o.strequal o.strtok o.telnet o.timeval \
|
||||||
o.transfer o.url o.version o.strtoofft
|
o.transfer o.url o.version o.strtoofft
|
||||||
|
|
||||||
@@ -52,9 +53,6 @@ o.formdata: c.formdata
|
|||||||
o.ftp: c.ftp
|
o.ftp: c.ftp
|
||||||
gcc $(compileropts) -c -o ftp.o c.ftp
|
gcc $(compileropts) -c -o ftp.o c.ftp
|
||||||
|
|
||||||
o.getdate: c.getdate
|
|
||||||
gcc $(compileropts) -c -o getdate.o c.getdate
|
|
||||||
|
|
||||||
o.getenv: c.getenv
|
o.getenv: c.getenv
|
||||||
gcc $(compileropts) -c -o getenv.o c.getenv
|
gcc $(compileropts) -c -o getenv.o c.getenv
|
||||||
|
|
||||||
@@ -67,6 +65,12 @@ o.getpass: c.getpass
|
|||||||
o.hostip: c.hostip
|
o.hostip: c.hostip
|
||||||
gcc $(compileropts) -c -o hostip.o c.hostip
|
gcc $(compileropts) -c -o hostip.o c.hostip
|
||||||
|
|
||||||
|
o.hostip4: c.hostip4
|
||||||
|
gcc $(compileropts) -c -o hostip4.o c.hostip4
|
||||||
|
|
||||||
|
o.hostsyn: c.hostsyn
|
||||||
|
gcc $(compileropts) -c -o hostsyn.o c.hostsyn
|
||||||
|
|
||||||
o.http: c.http
|
o.http: c.http
|
||||||
gcc $(compileropts) -c -o http.o c.http
|
gcc $(compileropts) -c -o http.o c.http
|
||||||
|
|
||||||
@@ -76,6 +80,12 @@ o.http_chunks: c.http_chunks
|
|||||||
o.if2ip: c.if2ip
|
o.if2ip: c.if2ip
|
||||||
gcc $(compileropts) -c -o if2ip.o c.if2ip
|
gcc $(compileropts) -c -o if2ip.o c.if2ip
|
||||||
|
|
||||||
|
o.inet_ntop: c.inet_ntop
|
||||||
|
gcc $(compileropts) -c -o inet_ntop.o c.inet_ntop
|
||||||
|
|
||||||
|
o.inet_pton: c.inet_pton
|
||||||
|
gcc $(compileropts) -c -o inet_pton.o c.inet_pton
|
||||||
|
|
||||||
o.krb4: c.krb4
|
o.krb4: c.krb4
|
||||||
gcc $(compileropts) -c -o krb4.o c.krb4
|
gcc $(compileropts) -c -o krb4.o c.krb4
|
||||||
|
|
||||||
@@ -91,12 +101,18 @@ o.mprintf: c.mprintf
|
|||||||
o.netrc: c.netrc
|
o.netrc: c.netrc
|
||||||
gcc $(compileropts) -c -o netrc.o c.netrc
|
gcc $(compileropts) -c -o netrc.o c.netrc
|
||||||
|
|
||||||
|
o.parsedate: c.parsedate
|
||||||
|
gcc $(compileropts) -c -o parsedate.o c.parsedate
|
||||||
|
|
||||||
o.progress: c.progress
|
o.progress: c.progress
|
||||||
gcc $(compileropts) -c -o progress.o c.progress
|
gcc $(compileropts) -c -o progress.o c.progress
|
||||||
|
|
||||||
o.security: c.security
|
o.security: c.security
|
||||||
gcc $(compileropts) -c -o security.o c.security
|
gcc $(compileropts) -c -o security.o c.security
|
||||||
|
|
||||||
|
o.select: c.select
|
||||||
|
gcc $(compileropts) -c -o select.o c.select
|
||||||
|
|
||||||
o.sendf: c.sendf
|
o.sendf: c.sendf
|
||||||
gcc $(compileropts) -c -o sendf.o c.sendf
|
gcc $(compileropts) -c -o sendf.o c.sendf
|
||||||
|
|
||||||
|
@@ -22,8 +22,18 @@
|
|||||||
# $Id: Makefile.vc6,v 1.17 2004/01/13 08:57:01 bagder Exp $
|
# $Id: Makefile.vc6,v 1.17 2004/01/13 08:57:01 bagder Exp $
|
||||||
##############################################################
|
##############################################################
|
||||||
|
|
||||||
|
#
|
||||||
|
# Stem for static libs and DLLs
|
||||||
|
#
|
||||||
LIB_NAME = libcurl
|
LIB_NAME = libcurl
|
||||||
LIB_NAME_DEBUG = libcurld
|
LIB_NAME_DEBUG = libcurld
|
||||||
|
|
||||||
|
#
|
||||||
|
# Stem for DLL import libs
|
||||||
|
#
|
||||||
|
IMPLIB_NAME = libcurl_imp
|
||||||
|
IMPLIB_NAME_DEBUG = libcurld_imp
|
||||||
|
|
||||||
!IFNDEF OPENSSL_PATH
|
!IFNDEF OPENSSL_PATH
|
||||||
OPENSSL_PATH = ../../openssl-0.9.7d
|
OPENSSL_PATH = ../../openssl-0.9.7d
|
||||||
!ENDIF
|
!ENDIF
|
||||||
@@ -39,12 +49,12 @@ USEMM_LIBS = YES
|
|||||||
#############################################################
|
#############################################################
|
||||||
## Nothing more to do below this line!
|
## Nothing more to do below this line!
|
||||||
|
|
||||||
CCNODBG = cl.exe /MD /O2 /D "NDEBUG"
|
CCNODBG = cl.exe /MD /O2 /DNDEBUG
|
||||||
CCDEBUG = cl.exe /MDd /Od /Gm /Zi /D "_DEBUG" /GZ
|
CCDEBUG = cl.exe /MDd /Od /Gm /Zi /D_DEBUG /GZ
|
||||||
CFLAGSSSL = /D "USE_SSLEAY" /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
|
CFLAGSSSL = /DUSE_SSLEAY /I "$(OPENSSL_PATH)/inc32" /I "$(OPENSSL_PATH)/inc32/openssl"
|
||||||
CFLAGSZLIB = /D "HAVE_ZLIB_H" /D "HAVE_ZLIB" /D "HAVE_LIBZ" /I "$(ZLIB_PATH)"
|
CFLAGSZLIB = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ /I "$(ZLIB_PATH)"
|
||||||
CFLAGS = /I "." /I "../include" /nologo /W3 /GX /D "WIN32" /D "VC6" /D "_MBCS" /D "_LIB" /YX /FD /c /D "MSDOS"
|
CFLAGS = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
|
||||||
LNKDLL = link.exe /DLL /def:libcurl.def
|
LNKDLL = link.exe /DLL
|
||||||
LNKLIB = link.exe /lib
|
LNKLIB = link.exe /lib
|
||||||
LFLAGS = /nologo
|
LFLAGS = /nologo
|
||||||
SSLLIBS = libeay32.lib ssleay32.lib
|
SSLLIBS = libeay32.lib ssleay32.lib
|
||||||
@@ -52,7 +62,7 @@ SSLLIBS = libeay32.lib ssleay32.lib
|
|||||||
WINLIBS = wsock32.lib winmm.lib
|
WINLIBS = wsock32.lib winmm.lib
|
||||||
!ELSE
|
!ELSE
|
||||||
WINLIBS = wsock32.lib
|
WINLIBS = wsock32.lib
|
||||||
CFLAGS = $(CFLAGS) /D "WITHOUT_MM_LIB"
|
CFLAGS = $(CFLAGS) /DWITHOUT_MM_LIB
|
||||||
!ENDIF
|
!ENDIF
|
||||||
# RSAglue.lib was formerly needed in the SSLLIBS
|
# RSAglue.lib was formerly needed in the SSLLIBS
|
||||||
CFGSET = FALSE
|
CFGSET = FALSE
|
||||||
@@ -61,8 +71,8 @@ CFGSET = FALSE
|
|||||||
# release
|
# release
|
||||||
|
|
||||||
!IF "$(CFG)" == "release"
|
!IF "$(CFG)" == "release"
|
||||||
TARGET =$(LIB_NAME).lib
|
TARGET = $(LIB_NAME).lib
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LNK = $(LNKLIB) /out:$(TARGET)
|
LNK = $(LNKLIB) /out:$(TARGET)
|
||||||
CC = $(CCNODBG)
|
CC = $(CCNODBG)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
@@ -72,8 +82,8 @@ CFGSET = TRUE
|
|||||||
# release-zlib
|
# release-zlib
|
||||||
|
|
||||||
!IF "$(CFG)" == "release-zlib"
|
!IF "$(CFG)" == "release-zlib"
|
||||||
TARGET =$(LIB_NAME).lib
|
TARGET = $(LIB_NAME).lib
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
|
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
|
||||||
LNK = $(LNKLIB) $(LFLAGSZLIB) /out:$(TARGET)
|
LNK = $(LNKLIB) $(LFLAGSZLIB) /out:$(TARGET)
|
||||||
CC = $(CCNODBG) $(CFLAGSZLIB)
|
CC = $(CCNODBG) $(CFLAGSZLIB)
|
||||||
@@ -84,9 +94,9 @@ CFGSET = TRUE
|
|||||||
# release-dll
|
# release-dll
|
||||||
|
|
||||||
!IF "$(CFG)" == "release-dll"
|
!IF "$(CFG)" == "release-dll"
|
||||||
TARGET =$(LIB_NAME).dll
|
TARGET = $(LIB_NAME).dll
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LNK = $(LNKDLL) $(WINLIBS) /out:$(TARGET) /IMPLIB:"$(LIB_NAME).lib"
|
LNK = $(LNKDLL) $(WINLIBS) /out:$(TARGET) /IMPLIB:$(IMPLIB_NAME).lib
|
||||||
CC = $(CCNODBG)
|
CC = $(CCNODBG)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
RESOURCE = $(DIROBJ)\libcurl.res
|
RESOURCE = $(DIROBJ)\libcurl.res
|
||||||
@@ -96,8 +106,8 @@ RESOURCE = $(DIROBJ)\libcurl.res
|
|||||||
# release-ssl
|
# release-ssl
|
||||||
|
|
||||||
!IF "$(CFG)" == "release-ssl"
|
!IF "$(CFG)" == "release-ssl"
|
||||||
TARGET =$(LIB_NAME).lib
|
TARGET = $(LIB_NAME).lib
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32"
|
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32"
|
||||||
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(TARGET)
|
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(TARGET)
|
||||||
CC = $(CCNODBG) $(CFLAGSSSL)
|
CC = $(CCNODBG) $(CFLAGSSSL)
|
||||||
@@ -108,10 +118,10 @@ CFGSET = TRUE
|
|||||||
# release-ssl-dll
|
# release-ssl-dll
|
||||||
|
|
||||||
!IF "$(CFG)" == "release-ssl-dll"
|
!IF "$(CFG)" == "release-ssl-dll"
|
||||||
TARGET =$(LIB_NAME).dll
|
TARGET = $(LIB_NAME).dll
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32dll"
|
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32dll"
|
||||||
LNK = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(WINLIBS) $(LFLAGSSSL) /out:$(TARGET) /IMPLIB:"$(LIB_NAME).lib"
|
LNK = $(LNKDLL) $(SSLLIBS) $(WINLIBS) $(LFLAGSSSL) /out:$(TARGET) /IMPLIB:$(IMPLIB_NAME).lib
|
||||||
CC = $(CCNODBG) $(CFLAGSSSL)
|
CC = $(CCNODBG) $(CFLAGSSSL)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
RESOURCE = $(DIROBJ)\libcurl.res
|
RESOURCE = $(DIROBJ)\libcurl.res
|
||||||
@@ -120,8 +130,8 @@ RESOURCE = $(DIROBJ)\libcurl.res
|
|||||||
######################
|
######################
|
||||||
# release-ssl-zlib
|
# release-ssl-zlib
|
||||||
!IF "$(CFG)" == "release-ssl-zlib"
|
!IF "$(CFG)" == "release-ssl-zlib"
|
||||||
TARGET =$(LIB_NAME).lib
|
TARGET = $(LIB_NAME).lib
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32"
|
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32"
|
||||||
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
|
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
|
||||||
LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(TARGET)
|
LNK = $(LNKLIB) $(LFLAGSSSL) $(LFLAGSZLIB) /out:$(TARGET)
|
||||||
@@ -132,8 +142,8 @@ CFGSET = TRUE
|
|||||||
######################
|
######################
|
||||||
# release-libcurl-ssl-dll
|
# release-libcurl-ssl-dll
|
||||||
!IF "$(CFG)" == "release-libcurl-ssl-dll"
|
!IF "$(CFG)" == "release-libcurl-ssl-dll"
|
||||||
TARGET =$(LIB_NAME).lib
|
TARGET = $(LIB_NAME).lib
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32dll"
|
LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)/out32dll"
|
||||||
LNK = $(LNKLIB) $(SSLLIBS) $(LFLAGSSSL) /out:$(TARGET)
|
LNK = $(LNKLIB) $(SSLLIBS) $(LFLAGSSSL) /out:$(TARGET)
|
||||||
CC = $(CCNODBG) $(CFLAGSSSL)
|
CC = $(CCNODBG) $(CFLAGSSSL)
|
||||||
@@ -146,8 +156,8 @@ RESOURCE = $(DIROBJ)\libcurl.res
|
|||||||
# debug
|
# debug
|
||||||
|
|
||||||
!IF "$(CFG)" == "debug"
|
!IF "$(CFG)" == "debug"
|
||||||
TARGET =$(LIB_NAME_DEBUG).lib
|
TARGET = $(LIB_NAME_DEBUG).lib
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LNK = $(LNKLIB) /out:$(TARGET)
|
LNK = $(LNKLIB) /out:$(TARGET)
|
||||||
CC = $(CCDEBUG)
|
CC = $(CCDEBUG)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
@@ -157,9 +167,9 @@ CFGSET = TRUE
|
|||||||
# debug-dll
|
# debug-dll
|
||||||
|
|
||||||
!IF "$(CFG)" == "debug-dll"
|
!IF "$(CFG)" == "debug-dll"
|
||||||
TARGET =$(LIB_NAME_DEBUG).dll
|
TARGET = $(LIB_NAME_DEBUG).dll
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" /PDB:"$(LIB_NAME_DEBUG).pdb"
|
LNK = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(TARGET) /IMPLIB:$(IMPLIB_NAME_DEBUG).lib /PDB:$(IMPLIB_NAME_DEBUG).pdb
|
||||||
CC = $(CCDEBUG)
|
CC = $(CCDEBUG)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
RESOURCE = $(DIROBJ)\libcurl.res
|
RESOURCE = $(DIROBJ)\libcurl.res
|
||||||
@@ -170,7 +180,7 @@ RESOURCE = $(DIROBJ)\libcurl.res
|
|||||||
#todo
|
#todo
|
||||||
!IF "$(CFG)" == "debug-ssl"
|
!IF "$(CFG)" == "debug-ssl"
|
||||||
TARGET = $(LIB_NAME_DEBUG).lib
|
TARGET = $(LIB_NAME_DEBUG).lib
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(TARGET)
|
LNK = $(LNKLIB) $(LFLAGSSSL) /out:$(TARGET)
|
||||||
CC = $(CCDEBUG) $(CFLAGSSSL)
|
CC = $(CCDEBUG) $(CFLAGSSSL)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
@@ -180,7 +190,7 @@ CFGSET = TRUE
|
|||||||
# debug-zlib
|
# debug-zlib
|
||||||
!IF "$(CFG)" == "debug-zlib"
|
!IF "$(CFG)" == "debug-zlib"
|
||||||
TARGET = $(LIB_NAME_DEBUG).lib
|
TARGET = $(LIB_NAME_DEBUG).lib
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
|
LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)"
|
||||||
LNK = $(LNKLIB) $(LFLAGSZLIB) /out:$(TARGET)
|
LNK = $(LNKLIB) $(LFLAGSZLIB) /out:$(TARGET)
|
||||||
CC = $(CCDEBUG) $(CFLAGSZLIB)
|
CC = $(CCDEBUG) $(CFLAGSZLIB)
|
||||||
@@ -191,10 +201,10 @@ CFGSET = TRUE
|
|||||||
# debug-ssl-dll
|
# debug-ssl-dll
|
||||||
|
|
||||||
!IF "$(CFG)" == "debug-ssl-dll"
|
!IF "$(CFG)" == "debug-ssl-dll"
|
||||||
TARGET =$(LIB_NAME_DEBUG).dll
|
TARGET = $(LIB_NAME_DEBUG).dll
|
||||||
DIROBJ =.\$(CFG)
|
DIROBJ = .\$(CFG)
|
||||||
LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)/out32dll
|
LFLAGSSSL = /LIBPATH:$(OPENSSL_PATH)/out32dll
|
||||||
LNK = $(LNKDLL) $(WINLIBS) $(LFLAGSSSL) /DEBUG /out:$(TARGET) /IMPLIB:"$(LIB_NAME_DEBUG).lib" /PDB:"$(LIB_NAME_DEBUG).pdb"
|
LNK = $(LNKDLL) $(WINLIBS) $(LFLAGSSSL) /DEBUG /out:$(TARGET) /IMPLIB:$(IMPLIB_NAME_DEBUG).lib /PDB:$(IMPLIB_NAME_DEBUG).pdb
|
||||||
CC = $(CCDEBUG) $(CFLAGSSSL)
|
CC = $(CCDEBUG) $(CFLAGSSSL)
|
||||||
CFGSET = TRUE
|
CFGSET = TRUE
|
||||||
RESOURCE = $(DIROBJ)\libcurl.res
|
RESOURCE = $(DIROBJ)\libcurl.res
|
||||||
@@ -272,7 +282,9 @@ X_OBJS= \
|
|||||||
$(DIROBJ)\http_negotiate.obj \
|
$(DIROBJ)\http_negotiate.obj \
|
||||||
$(DIROBJ)\http_ntlm.obj \
|
$(DIROBJ)\http_ntlm.obj \
|
||||||
$(DIROBJ)\md5.obj \
|
$(DIROBJ)\md5.obj \
|
||||||
|
$(DIROBJ)\memdebug.obj \
|
||||||
$(DIROBJ)\strerror.obj \
|
$(DIROBJ)\strerror.obj \
|
||||||
|
$(DIROBJ)\select.obj \
|
||||||
$(DIROBJ)\content_encoding.obj \
|
$(DIROBJ)\content_encoding.obj \
|
||||||
$(RESOURCE)
|
$(RESOURCE)
|
||||||
|
|
||||||
@@ -307,3 +319,4 @@ clean:
|
|||||||
-@erase $(DIROBJ)\*.res
|
-@erase $(DIROBJ)\*.res
|
||||||
-@erase vc60.idb
|
-@erase vc60.idb
|
||||||
-@erase vc60.pch
|
-@erase vc60.pch
|
||||||
|
|
||||||
|
74
lib/README.httpauth
Normal file
74
lib/README.httpauth
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
|
||||||
|
1. PUT/POST without a known auth to use (possibly no auth required):
|
||||||
|
|
||||||
|
(When explicitly set to use a multi-pass auth when doing a POST/PUT,
|
||||||
|
libcurl should immediately go the Content-Length: 0 bytes route to avoid
|
||||||
|
the first send all data phase, step 2. If told to use a single-pass auth,
|
||||||
|
goto step 3.)
|
||||||
|
|
||||||
|
Issue the proper PUT/POST request immediately, with the correct
|
||||||
|
Content-Length and Expect: headers.
|
||||||
|
|
||||||
|
If a 100 response is received or the wait for one times out, start sending
|
||||||
|
the request-body.
|
||||||
|
|
||||||
|
If a 401 (or 407 when talking through a proxy) is received, then:
|
||||||
|
|
||||||
|
If we have "more than just a little" data left to send, close the
|
||||||
|
connection. Exactly what "more than just a little" means will have to be
|
||||||
|
determined. Possibly the current transfer speed should be taken into
|
||||||
|
account as well.
|
||||||
|
|
||||||
|
NOTE: if the size of the POST data is less than MAX_INITIAL_POST_SIZE (when
|
||||||
|
CURLOPT_POSTFIELDS is used), libcurl will send everything in one single
|
||||||
|
write() (all request-headers and request-body) and thus it will
|
||||||
|
unconditionally send the full post data here.
|
||||||
|
|
||||||
|
2. PUT/POST with multi-pass auth but not yet completely negotiated:
|
||||||
|
|
||||||
|
Send a PUT/POST request, we know that it will be rejected and thus we claim
|
||||||
|
Content-Length zero to avoid having to send the request-body. (This seems
|
||||||
|
to be what IE does.)
|
||||||
|
|
||||||
|
3. PUT/POST as the last step in the auth negotiation, that is when we have
|
||||||
|
what we believe is a completed negotiation:
|
||||||
|
|
||||||
|
Send a full and proper PUT/POST request (again) with the proper
|
||||||
|
Content-Length and a following request-body.
|
||||||
|
|
||||||
|
NOTE: this may very well be the second (or even third) time the whole or at
|
||||||
|
least parts of the request body is sent to the server. Since the data may
|
||||||
|
be provided to libcurl with a callback, we need a way to tell the app that
|
||||||
|
the upload is to be restarted so that the callback will provide data from
|
||||||
|
the start again. This requires an API method/mechanism that libcurl
|
||||||
|
doesn't have today. See below.
|
||||||
|
|
||||||
|
Data Rewind
|
||||||
|
|
||||||
|
It will be troublesome for some apps to deal with a rewind like this in all
|
||||||
|
circumstances. I'm thinking for example when using 'curl' to upload data
|
||||||
|
from stdin. If libcurl ends up having to rewind the reading for a request
|
||||||
|
to succeed, of course a lack of this callback or if it returns failure, will
|
||||||
|
cause the request to fail completely.
|
||||||
|
|
||||||
|
The new callback is set with CURLOPT_IOCTLFUNCTION (in an attempt to add a
|
||||||
|
more generic function that might be used for other IO-related controls in
|
||||||
|
the future):
|
||||||
|
|
||||||
|
curlioerr curl_ioctl(CURL *handle, curliocmd cmd, void *clientp);
|
||||||
|
|
||||||
|
And in the case where the read is to be rewinded, it would be called with a
|
||||||
|
cmd named CURLIOCMD_RESTARTREAD. The callback would then return CURLIOE_OK,
|
||||||
|
if things are fine, or CURLIOE_FAILRESTART if not.
|
||||||
|
|
||||||
|
Backwards Compatibility
|
||||||
|
|
||||||
|
The approach used until now, that issues a HEAD on the given URL to trigger
|
||||||
|
the auth negotiation could still be supported and encouraged, but it would
|
||||||
|
be up to the app to first fetch a URL with GET/HEAD to negotiate on, since
|
||||||
|
then a following PUT/POST wouldn't need to negotiate authentication and
|
||||||
|
thus avoid double-sending data.
|
||||||
|
|
||||||
|
Optionally, we keep the current approach if some option is set
|
||||||
|
(CURLOPT_HEADBEFOREAUTH or similar), since it seems to work fairly well for
|
||||||
|
POST on most servers.
|
@@ -110,7 +110,7 @@ size_t Curl_base64_decode(const char *src, char *dest)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ---- Base64 Encoding --- */
|
/* ---- Base64 Encoding --- */
|
||||||
static char table64[]=
|
static const char table64[]=
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -55,6 +55,9 @@
|
|||||||
#define HAVE_WRITABLE_ARGV 1
|
#define HAVE_WRITABLE_ARGV 1
|
||||||
#define HAVE_ZLIB_H 1
|
#define HAVE_ZLIB_H 1
|
||||||
|
|
||||||
|
#define USE_OPENSSL 1
|
||||||
|
#define USE_SSLEAY 1
|
||||||
|
|
||||||
#define OS "AmigaOS"
|
#define OS "AmigaOS"
|
||||||
|
|
||||||
#define PACKAGE "curl"
|
#define PACKAGE "curl"
|
||||||
|
@@ -53,9 +53,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
|
|
||||||
|
|
||||||
/* Set to explicitly specify we don't want to use thread-safe functions */
|
/* Set to explicitly specify we don't want to use thread-safe functions */
|
||||||
#define DISABLED_THREADSAFE
|
#define DISABLED_THREADSAFE
|
||||||
|
|
||||||
|
@@ -343,8 +343,11 @@
|
|||||||
/* Define if you have the getpass function. */
|
/* Define if you have the getpass function. */
|
||||||
#undef HAVE_GETPASS
|
#undef HAVE_GETPASS
|
||||||
|
|
||||||
/* Define if you have a working OpenSSL installation */
|
/* if OpenSSL is in use */
|
||||||
#define OPENSSL_ENABLED 1
|
#define USE_OPENSSL 1
|
||||||
|
|
||||||
|
/* if SSL is enabled */
|
||||||
|
#define USE_SSLEAY 1
|
||||||
|
|
||||||
/* Define if you have the `dlopen' function. */
|
/* Define if you have the `dlopen' function. */
|
||||||
#undef HAVE_DLOPEN
|
#undef HAVE_DLOPEN
|
||||||
|
@@ -107,7 +107,7 @@
|
|||||||
#define HAVE_STRSTR 1
|
#define HAVE_STRSTR 1
|
||||||
|
|
||||||
/* Define if you have the strtoll function. */
|
/* Define if you have the strtoll function. */
|
||||||
#ifdef MINGW32
|
#if defined(__MINGW32__) || defined(__WATCOMC__)
|
||||||
#define HAVE_STRTOLL 1
|
#define HAVE_STRTOLL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -121,7 +121,9 @@
|
|||||||
/*#define HAVE_UNAME 1*/
|
/*#define HAVE_UNAME 1*/
|
||||||
|
|
||||||
/* Define if you have utime() */
|
/* Define if you have utime() */
|
||||||
|
#ifndef __BORLANDC__
|
||||||
#define HAVE_UTIME 1
|
#define HAVE_UTIME 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Define if you have the <alloca.h> header file. */
|
/* Define if you have the <alloca.h> header file. */
|
||||||
/*#define HAVE_ALLOCA_H 1*/
|
/*#define HAVE_ALLOCA_H 1*/
|
||||||
@@ -178,7 +180,9 @@
|
|||||||
#define HAVE_SYS_STAT_H 1
|
#define HAVE_SYS_STAT_H 1
|
||||||
|
|
||||||
/* Define if you have the <sys/utime.h> header file */
|
/* Define if you have the <sys/utime.h> header file */
|
||||||
|
#ifndef __BORLANDC__
|
||||||
#define HAVE_SYS_UTIME_H 1
|
#define HAVE_SYS_UTIME_H 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Define if you have the <sys/types.h> header file. */
|
/* Define if you have the <sys/types.h> header file. */
|
||||||
#define HAVE_SYS_TYPES_H 1
|
#define HAVE_SYS_TYPES_H 1
|
||||||
@@ -232,7 +236,7 @@
|
|||||||
* This section is for compiler specific defines.*
|
* This section is for compiler specific defines.*
|
||||||
*************************************************/
|
*************************************************/
|
||||||
/* Borland and MS don't have this */
|
/* Borland and MS don't have this */
|
||||||
#if defined(MINGW32) || defined(__WATCOMC__) || defined(__LCC__)
|
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__)
|
||||||
|
|
||||||
/* Define if you have the <unistd.h> header file. */
|
/* Define if you have the <unistd.h> header file. */
|
||||||
#define HAVE_UNISTD_H 1
|
#define HAVE_UNISTD_H 1
|
||||||
|
257
lib/config-win32ce.h
Normal file
257
lib/config-win32ce.h
Normal file
@@ -0,0 +1,257 @@
|
|||||||
|
/* config.h. Generated automatically by configure. */
|
||||||
|
/* config.h.in. Generated automatically from configure.in by autoheader. */
|
||||||
|
|
||||||
|
#ifndef __CONFIG_WIN32CE_H
|
||||||
|
#define __CONFIG_WIN32CE_H
|
||||||
|
|
||||||
|
/* Define if on AIX 3.
|
||||||
|
System headers sometimes define this.
|
||||||
|
We just want to avoid a redefinition error message. */
|
||||||
|
#ifndef _ALL_SOURCE
|
||||||
|
/* #undef _ALL_SOURCE */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define to empty if the keyword does not work. */
|
||||||
|
/* #undef const */
|
||||||
|
|
||||||
|
/* Define if you don't have vprintf but do have _doprnt. */
|
||||||
|
/* #undef HAVE_DOPRNT */
|
||||||
|
|
||||||
|
/* Define if you have the vprintf function. */
|
||||||
|
#define HAVE_VPRINTF 1
|
||||||
|
|
||||||
|
/* Define as the return type of signal handlers (int or void). */
|
||||||
|
/*#define RETSIGTYPE void */
|
||||||
|
|
||||||
|
/* Define to `unsigned' if <sys/types.h> doesn't define. */
|
||||||
|
/* #undef size_t */
|
||||||
|
|
||||||
|
/* Define this to 'int' if ssize_t is not an available typedefed type */
|
||||||
|
#define ssize_t int
|
||||||
|
|
||||||
|
/* Define this to 'int' if socklen_t is not an available typedefed type */
|
||||||
|
#if !defined(ENABLE_IPV6) && ((_MSC_VER < 1300) || !defined(USE_SSLEAY))
|
||||||
|
#define socklen_t int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The size of a `curl_off_t', as computed by sizeof. */
|
||||||
|
#ifdef SIZEOF_CURL_OFF_T
|
||||||
|
#undef SIZEOF_CURL_OFF_T
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Borland lacks _lseeki64(), so we don't support >2GB files */
|
||||||
|
#define SIZEOF_CURL_OFF_T 4
|
||||||
|
|
||||||
|
/* Define if you have the ANSI C header files. */
|
||||||
|
#define STDC_HEADERS 1
|
||||||
|
|
||||||
|
/* Define if you can safely include both <sys/time.h> and <time.h>. */
|
||||||
|
/* #define TIME_WITH_SYS_TIME 1 */
|
||||||
|
|
||||||
|
/* Define cpu-machine-OS */
|
||||||
|
#define OS "i386-pc-win32ce"
|
||||||
|
|
||||||
|
/* The number of bytes in a long double. */
|
||||||
|
#define SIZEOF_LONG_DOUBLE 16
|
||||||
|
|
||||||
|
/* The number of bytes in a long long. */
|
||||||
|
/* #define SIZEOF_LONG_LONG 8 */
|
||||||
|
|
||||||
|
/* Define if you have the gethostbyaddr function. */
|
||||||
|
#define HAVE_GETHOSTBYADDR 1
|
||||||
|
|
||||||
|
/* Define if you have the gethostname function. */
|
||||||
|
#define HAVE_GETHOSTNAME 1
|
||||||
|
|
||||||
|
/* Define if you have the getpass function. */
|
||||||
|
/*#define HAVE_GETPASS 1*/
|
||||||
|
|
||||||
|
/* Define if you have the getservbyname function. */
|
||||||
|
#define HAVE_GETSERVBYNAME 1
|
||||||
|
|
||||||
|
/* Define if you have the gettimeofday function. */
|
||||||
|
/* #define HAVE_GETTIMEOFDAY 1 */
|
||||||
|
|
||||||
|
/* Define if you have the inet_addr function. */
|
||||||
|
#define HAVE_INET_ADDR 1
|
||||||
|
|
||||||
|
/* Define if you have the inet_ntoa function. */
|
||||||
|
#define HAVE_INET_NTOA 1
|
||||||
|
|
||||||
|
/* Define if you have the perror function. */
|
||||||
|
#define HAVE_PERROR 1
|
||||||
|
|
||||||
|
/* Define if you have the select function. */
|
||||||
|
#define HAVE_SELECT 1
|
||||||
|
|
||||||
|
/* Define if you have the socket function. */
|
||||||
|
#define HAVE_SOCKET 1
|
||||||
|
|
||||||
|
/* Define if you have the strcasecmp function. */
|
||||||
|
/*#define HAVE_STRCASECMP 1*/
|
||||||
|
|
||||||
|
/* Define if you have the stricmp function. */
|
||||||
|
//#define HAVE_STRICMP 1
|
||||||
|
|
||||||
|
/* Define if you have the strdup function. */
|
||||||
|
//#define HAVE_STRDUP 1
|
||||||
|
|
||||||
|
/* Define if you have the strftime function. */
|
||||||
|
//#define HAVE_STRFTIME 1
|
||||||
|
|
||||||
|
/* Define if you have the strstr function. */
|
||||||
|
#define HAVE_STRSTR 1
|
||||||
|
|
||||||
|
/* Define if you have the strtoll function. */
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#define HAVE_STRTOLL 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define if you have the tcgetattr function. */
|
||||||
|
/*#define HAVE_TCGETATTR 1*/
|
||||||
|
|
||||||
|
/* Define if you have the tcsetattr function. */
|
||||||
|
/*#define HAVE_TCSETATTR 1*/
|
||||||
|
|
||||||
|
/* Define if you have the uname function. */
|
||||||
|
/*#define HAVE_UNAME 1*/
|
||||||
|
|
||||||
|
/* Define if you have utime() */
|
||||||
|
#define HAVE_UTIME 1
|
||||||
|
|
||||||
|
/* Define if you have the <alloca.h> header file. */
|
||||||
|
/*#define HAVE_ALLOCA_H 1*/
|
||||||
|
|
||||||
|
/* Define if you have the malloc.h file. */
|
||||||
|
#define HAVE_MALLOC_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <arpa/inet.h> header file. */
|
||||||
|
/* #define HAVE_ARPA_INET_H 1 */
|
||||||
|
|
||||||
|
/* Define if you have the <assert.h> header file. */
|
||||||
|
//#define HAVE_ASSERT_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <crypto.h> header file. */
|
||||||
|
/* #undef HAVE_CRYPTO_H */
|
||||||
|
|
||||||
|
/* Define if you have the <dlfcn.h> header file. */
|
||||||
|
/*#define HAVE_DLFCN_H 1*/
|
||||||
|
|
||||||
|
/* Define if you have the <err.h> header file. */
|
||||||
|
/* #undef HAVE_ERR_H */
|
||||||
|
|
||||||
|
/* Define if you have the <fcntl.h> header file. */
|
||||||
|
#define HAVE_FCNTL_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <getopt.h> header file. */
|
||||||
|
/* #undef HAVE_GETOPT_H */
|
||||||
|
|
||||||
|
/* Define if you have the <netdb.h> header file. */
|
||||||
|
/* #define HAVE_NETDB_H 1 */
|
||||||
|
|
||||||
|
/* Define if you have the <netinet/in.h> header file. */
|
||||||
|
/*#define HAVE_NETINET_IN_H 1*/
|
||||||
|
|
||||||
|
/* Define if you have the <sgtty.h> header file. */
|
||||||
|
/*#define HAVE_SGTTY_H 1*/
|
||||||
|
|
||||||
|
/* Define if you have the <ssl.h> header file. */
|
||||||
|
/* #undef HAVE_SSL_H */
|
||||||
|
|
||||||
|
/* Define if you have the <sys/param.h> header file. */
|
||||||
|
/*#define HAVE_SYS_PARAM_H 1*/
|
||||||
|
|
||||||
|
/* Define if you have the <sys/select.h> header file. */
|
||||||
|
/* #define HAVE_SYS_SELECT_H 1 */
|
||||||
|
|
||||||
|
/* Define if you have the <sys/socket.h> header file. */
|
||||||
|
/*#define HAVE_SYS_SOCKET_H 1*/
|
||||||
|
|
||||||
|
/* Define if you have the <sys/sockio.h> header file. */
|
||||||
|
/* #define HAVE_SYS_SOCKIO_H 1 */
|
||||||
|
|
||||||
|
/* Define if you have the <sys/stat.h> header file. */
|
||||||
|
#define HAVE_SYS_STAT_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <sys/utime.h> header file */
|
||||||
|
#define HAVE_SYS_UTIME_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <sys/types.h> header file. */
|
||||||
|
//#define HAVE_SYS_TYPES_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <termio.h> header file. */
|
||||||
|
/* #define HAVE_TERMIO_H 1 */
|
||||||
|
|
||||||
|
/* Define if you have the <termios.h> header file. */
|
||||||
|
/* #define HAVE_TERMIOS_H 1 */
|
||||||
|
|
||||||
|
/* Name of package */
|
||||||
|
#define PACKAGE "curl"
|
||||||
|
|
||||||
|
/* Define if you have the <io.h> header file. */
|
||||||
|
#define HAVE_IO_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <time.h> header file. */
|
||||||
|
#define HAVE_TIME_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <winsock.h> header file. */
|
||||||
|
#define HAVE_WINSOCK_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <winsock2.h> header file. */
|
||||||
|
//#define HAVE_WINSOCK2_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <ws2tcpip.h> header file. */
|
||||||
|
//#define HAVE_WS2TCPIP_H 1
|
||||||
|
|
||||||
|
/* Define if you have the <stdlib.h> header file. */
|
||||||
|
#define HAVE_STDLIB_H 1
|
||||||
|
|
||||||
|
/* Define if you have the closesocket function. */
|
||||||
|
#define HAVE_CLOSESOCKET 1
|
||||||
|
|
||||||
|
/* Define if you have the setvbuf function. */
|
||||||
|
#define HAVE_SETVBUF 1
|
||||||
|
|
||||||
|
/* Define if you have the RAND_screen function when using SSL */
|
||||||
|
#define HAVE_RAND_SCREEN 1
|
||||||
|
|
||||||
|
/* Define if you have the `RAND_status' function. */
|
||||||
|
#define HAVE_RAND_STATUS 1
|
||||||
|
|
||||||
|
/* Define this to if in_addr_t is not an available typedefed type */
|
||||||
|
#define in_addr_t unsigned long
|
||||||
|
|
||||||
|
/* use ioctlsocket() for non-blocking sockets */
|
||||||
|
#define HAVE_IOCTLSOCKET
|
||||||
|
|
||||||
|
/*************************************************
|
||||||
|
* This section is for compiler specific defines.*
|
||||||
|
*************************************************/
|
||||||
|
/* Borland and MS don't have this */
|
||||||
|
#if defined(__MINGW32__) || defined(__WATCOMC__) || defined(__LCC__)
|
||||||
|
|
||||||
|
/* Define if you have the <unistd.h> header file. */
|
||||||
|
#define HAVE_UNISTD_H 1
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* WinCE */
|
||||||
|
|
||||||
|
#define CURL_DISABLE_FILE
|
||||||
|
|
||||||
|
#define CURL_DISABLE_TELNET
|
||||||
|
#define CURL_DISABLE_LDAP
|
||||||
|
#define WITHOUT_MM_LIB
|
||||||
|
|
||||||
|
#include <winsock.h>
|
||||||
|
#include <process.h>
|
||||||
|
|
||||||
|
#define ENOSPC 1
|
||||||
|
#define ENOMEM 2
|
||||||
|
#define EAGAIN 3
|
||||||
|
|
||||||
|
extern int stat(const char *path,struct stat *buffer );
|
||||||
|
|
||||||
|
#endif
|
@@ -10,7 +10,6 @@
|
|||||||
/* #define HAVE_DLOPEN 1 maybe not (DXE3) */
|
/* #define HAVE_DLOPEN 1 maybe not (DXE3) */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define HAVE_ALARM 1
|
|
||||||
#define HAVE_ASSERT_T 1
|
#define HAVE_ASSERT_T 1
|
||||||
#define HAVE_ARPA_INET_H 1
|
#define HAVE_ARPA_INET_H 1
|
||||||
#define HAVE_BASENAME 1
|
#define HAVE_BASENAME 1
|
||||||
@@ -27,6 +26,7 @@
|
|||||||
#define HAVE_IOCTLSOCKET 1
|
#define HAVE_IOCTLSOCKET 1
|
||||||
#define HAVE_INET_PTON 1
|
#define HAVE_INET_PTON 1
|
||||||
#define HAVE_INET_NTOP 1
|
#define HAVE_INET_NTOP 1
|
||||||
|
#define HAVE_LOCALE_H 1
|
||||||
#define HAVE_LONGLONG 1
|
#define HAVE_LONGLONG 1
|
||||||
#define HAVE_MALLOC_H 1
|
#define HAVE_MALLOC_H 1
|
||||||
#define HAVE_MEMORY_H 1
|
#define HAVE_MEMORY_H 1
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
#define HAVE_PERROR 1
|
#define HAVE_PERROR 1
|
||||||
#define HAVE_SELECT 1
|
#define HAVE_SELECT 1
|
||||||
#define HAVE_SETJMP_H 1
|
#define HAVE_SETJMP_H 1
|
||||||
|
#define HAVE_SETLOCALE 1
|
||||||
#define HAVE_SETVBUF 1
|
#define HAVE_SETVBUF 1
|
||||||
#define HAVE_SIGNAL 1
|
#define HAVE_SIGNAL 1
|
||||||
#define HAVE_SIGACTION 1
|
#define HAVE_SIGACTION 1
|
||||||
@@ -89,6 +90,7 @@
|
|||||||
#define HAVE_LIBSSL 1
|
#define HAVE_LIBSSL 1
|
||||||
#define HAVE_LIBCRYPTO 1
|
#define HAVE_LIBCRYPTO 1
|
||||||
#define OPENSSL_NO_KRB5 1
|
#define OPENSSL_NO_KRB5 1
|
||||||
|
#define USE_OPENSSL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Because djgpp <= 2.03 doesn't have snprintf() etc.
|
/* Because djgpp <= 2.03 doesn't have snprintf() etc.
|
||||||
|
@@ -97,6 +97,7 @@
|
|||||||
#include "strerror.h"
|
#include "strerror.h"
|
||||||
#include "connect.h"
|
#include "connect.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
#include "select.h"
|
||||||
|
|
||||||
/* The last #include file should be: */
|
/* The last #include file should be: */
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
@@ -156,6 +157,7 @@ int Curl_nonblock(curl_socket_t sockfd, /* operate on this */
|
|||||||
/* Windows? */
|
/* Windows? */
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
flags = nonblock;
|
flags = nonblock;
|
||||||
|
|
||||||
return ioctlsocket(sockfd, FIONBIO, &flags);
|
return ioctlsocket(sockfd, FIONBIO, &flags);
|
||||||
#define SETBLOCK 3
|
#define SETBLOCK 3
|
||||||
#endif
|
#endif
|
||||||
@@ -201,9 +203,6 @@ static
|
|||||||
int waitconnect(curl_socket_t sockfd, /* socket */
|
int waitconnect(curl_socket_t sockfd, /* socket */
|
||||||
long timeout_msec)
|
long timeout_msec)
|
||||||
{
|
{
|
||||||
fd_set fd;
|
|
||||||
fd_set errfd;
|
|
||||||
struct timeval interval;
|
|
||||||
int rc;
|
int rc;
|
||||||
#ifdef mpeix
|
#ifdef mpeix
|
||||||
/* Call this function once now, and ignore the results. We do this to
|
/* Call this function once now, and ignore the results. We do this to
|
||||||
@@ -213,18 +212,7 @@ int waitconnect(curl_socket_t sockfd, /* socket */
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* now select() until we get connect or timeout */
|
/* now select() until we get connect or timeout */
|
||||||
FD_ZERO(&fd);
|
rc = Curl_select(CURL_SOCKET_BAD, sockfd, (int)timeout_msec);
|
||||||
FD_SET(sockfd, &fd);
|
|
||||||
|
|
||||||
FD_ZERO(&errfd);
|
|
||||||
FD_SET(sockfd, &errfd);
|
|
||||||
|
|
||||||
interval.tv_sec = (int)(timeout_msec/1000);
|
|
||||||
timeout_msec -= interval.tv_sec*1000;
|
|
||||||
|
|
||||||
interval.tv_usec = timeout_msec*1000;
|
|
||||||
|
|
||||||
rc = select(sockfd+1, NULL, &fd, &errfd, &interval);
|
|
||||||
if(-1 == rc)
|
if(-1 == rc)
|
||||||
/* error, no connect here, try next */
|
/* error, no connect here, try next */
|
||||||
return WAITCONN_SELECT_ERROR;
|
return WAITCONN_SELECT_ERROR;
|
||||||
@@ -233,7 +221,7 @@ int waitconnect(curl_socket_t sockfd, /* socket */
|
|||||||
/* timeout, no connect today */
|
/* timeout, no connect today */
|
||||||
return WAITCONN_TIMEOUT;
|
return WAITCONN_TIMEOUT;
|
||||||
|
|
||||||
if(FD_ISSET(sockfd, &errfd))
|
if(rc & CSELECT_ERR)
|
||||||
/* error condition caught */
|
/* error condition caught */
|
||||||
return WAITCONN_FDSET_ERROR;
|
return WAITCONN_FDSET_ERROR;
|
||||||
|
|
||||||
@@ -406,13 +394,25 @@ static bool verifyconnect(curl_socket_t sockfd, int *error)
|
|||||||
*
|
*
|
||||||
* Someone got to verify this on Win-NT 4.0, 2000."
|
* Someone got to verify this on Win-NT 4.0, 2000."
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
Sleep(0);
|
||||||
|
#else
|
||||||
SleepEx(0, FALSE);
|
SleepEx(0, FALSE);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
|
if( -1 == getsockopt(sockfd, SOL_SOCKET, SO_ERROR,
|
||||||
(void *)&err, &errSize))
|
(void *)&err, &errSize))
|
||||||
err = Curl_ourerrno();
|
err = Curl_ourerrno();
|
||||||
|
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
/* Always returns this error, bug in CE? */
|
||||||
|
if(WSAENOPROTOOPT==err)
|
||||||
|
err=0;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ((0 == err) || (EISCONN == err))
|
if ((0 == err) || (EISCONN == err))
|
||||||
/* we are connected, awesome! */
|
/* we are connected, awesome! */
|
||||||
rc = TRUE;
|
rc = TRUE;
|
||||||
@@ -478,7 +478,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
*connected = FALSE; /* a very negative world view is best */
|
*connected = FALSE; /* a very negative world view is best */
|
||||||
|
|
||||||
/* Evaluate in milliseconds how much time that has passed */
|
/* Evaluate in milliseconds how much time that has passed */
|
||||||
has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.start);
|
has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle);
|
||||||
|
|
||||||
/* subtract the most strict timeout of the ones */
|
/* subtract the most strict timeout of the ones */
|
||||||
if(data->set.timeout && data->set.connecttimeout) {
|
if(data->set.timeout && data->set.connecttimeout) {
|
||||||
@@ -523,10 +523,20 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(WAITCONN_TIMEOUT != rc) {
|
else if(WAITCONN_TIMEOUT != rc) {
|
||||||
|
int error = 0;
|
||||||
|
|
||||||
/* nope, not connected */
|
/* nope, not connected */
|
||||||
|
if (WAITCONN_FDSET_ERROR == rc) {
|
||||||
|
verifyconnect(sockfd, &error);
|
||||||
|
data->state.os_errno = error;
|
||||||
|
infof(data, "%s\n",Curl_strerror(conn,error));
|
||||||
|
}
|
||||||
|
else
|
||||||
infof(data, "Connection failed\n");
|
infof(data, "Connection failed\n");
|
||||||
|
|
||||||
if(trynextip(conn, sockindex, connected)) {
|
if(trynextip(conn, sockindex, connected)) {
|
||||||
int error = Curl_ourerrno();
|
error = Curl_ourerrno();
|
||||||
|
data->state.os_errno = error;
|
||||||
failf(data, "Failed connect to %s:%d; %s",
|
failf(data, "Failed connect to %s:%d; %s",
|
||||||
conn->host.name, conn->port, Curl_strerror(conn,error));
|
conn->host.name, conn->port, Curl_strerror(conn,error));
|
||||||
code = CURLE_COULDNT_CONNECT;
|
code = CURLE_COULDNT_CONNECT;
|
||||||
@@ -636,6 +646,7 @@ singleipconnect(struct connectdata *conn,
|
|||||||
/* unknown error, fallthrough and try another address! */
|
/* unknown error, fallthrough and try another address! */
|
||||||
failf(data, "Failed to connect to %s: %s",
|
failf(data, "Failed to connect to %s: %s",
|
||||||
addr_buf, Curl_strerror(conn,error));
|
addr_buf, Curl_strerror(conn,error));
|
||||||
|
data->state.os_errno = error;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -703,7 +714,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
long has_passed;
|
long has_passed;
|
||||||
|
|
||||||
/* Evaluate in milliseconds how much time that has passed */
|
/* Evaluate in milliseconds how much time that has passed */
|
||||||
has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.start);
|
has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle);
|
||||||
|
|
||||||
#ifndef min
|
#ifndef min
|
||||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||||
@@ -784,5 +795,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
if(sockconn)
|
if(sockconn)
|
||||||
*sockconn = sockfd; /* the socket descriptor we've connected */
|
*sockconn = sockfd; /* the socket descriptor we've connected */
|
||||||
|
|
||||||
|
data->info.numconnects++; /* to track the number of connections made */
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
@@ -36,6 +36,10 @@
|
|||||||
|
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
|
|
||||||
|
/* Comment this out if zlib is always going to be at least ver. 1.2.0.4
|
||||||
|
(doing so will reduce code size slightly). */
|
||||||
|
#define OLD_ZLIB_SUPPORT 1
|
||||||
|
|
||||||
#define DSIZ 0x10000 /* buffer size for decompressed data */
|
#define DSIZ 0x10000 /* buffer size for decompressed data */
|
||||||
|
|
||||||
#define GZIP_MAGIC_0 0x1f
|
#define GZIP_MAGIC_0 0x1f
|
||||||
@@ -49,14 +53,23 @@
|
|||||||
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
||||||
#define RESERVED 0xE0 /* bits 5..7: reserved */
|
#define RESERVED 0xE0 /* bits 5..7: reserved */
|
||||||
|
|
||||||
|
enum zlibState {
|
||||||
|
ZLIB_UNINIT, /* uninitialized */
|
||||||
|
ZLIB_INIT, /* initialized */
|
||||||
|
ZLIB_GZIP_HEADER, /* reading gzip header */
|
||||||
|
ZLIB_GZIP_INFLATING, /* inflating gzip stream */
|
||||||
|
ZLIB_INIT_GZIP /* initialized in transparent gzip mode */
|
||||||
|
};
|
||||||
|
|
||||||
static CURLcode
|
static CURLcode
|
||||||
process_zlib_error(struct SessionHandle *data, z_stream *z)
|
process_zlib_error(struct SessionHandle *data,
|
||||||
|
z_stream *z)
|
||||||
{
|
{
|
||||||
if (z->msg)
|
if (z->msg)
|
||||||
failf (data, "Error while processing content unencoding.\n%s",
|
failf (data, "Error while processing content unencoding: %s",
|
||||||
z->msg);
|
z->msg);
|
||||||
else
|
else
|
||||||
failf (data, "Error while processing content unencoding.\n"
|
failf (data, "Error while processing content unencoding: "
|
||||||
"Unknown failure within decompression software.");
|
"Unknown failure within decompression software.");
|
||||||
|
|
||||||
return CURLE_BAD_CONTENT_ENCODING;
|
return CURLE_BAD_CONTENT_ENCODING;
|
||||||
@@ -66,55 +79,48 @@ static CURLcode
|
|||||||
exit_zlib(z_stream *z, bool *zlib_init, CURLcode result)
|
exit_zlib(z_stream *z, bool *zlib_init, CURLcode result)
|
||||||
{
|
{
|
||||||
inflateEnd(z);
|
inflateEnd(z);
|
||||||
*zlib_init = 0;
|
*zlib_init = ZLIB_UNINIT;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode
|
static CURLcode
|
||||||
Curl_unencode_deflate_write(struct SessionHandle *data,
|
inflate_stream(struct SessionHandle *data,
|
||||||
struct Curl_transfer_keeper *k,
|
struct Curl_transfer_keeper *k)
|
||||||
ssize_t nread)
|
|
||||||
{
|
{
|
||||||
|
z_stream *z = &k->z; /* zlib state structure */
|
||||||
int status; /* zlib status */
|
int status; /* zlib status */
|
||||||
CURLcode result = CURLE_OK; /* Curl_client_write status */
|
CURLcode result = CURLE_OK; /* Curl_client_write status */
|
||||||
char decomp[DSIZ]; /* Put the decompressed data here. */
|
char *decomp; /* Put the decompressed data here. */
|
||||||
z_stream *z = &k->z; /* zlib state structure */
|
|
||||||
|
|
||||||
/* Initialize zlib? */
|
/* Dynamically allocate a buffer for decompression because it's uncommonly
|
||||||
if (!k->zlib_init) {
|
large to hold on the stack */
|
||||||
z->zalloc = (alloc_func)Z_NULL;
|
decomp = (char*)malloc(DSIZ);
|
||||||
z->zfree = (free_func)Z_NULL;
|
if (decomp == NULL) {
|
||||||
z->opaque = 0;
|
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||||
z->next_in = NULL;
|
|
||||||
z->avail_in = 0;
|
|
||||||
if (inflateInit(z) != Z_OK)
|
|
||||||
return process_zlib_error(data, z);
|
|
||||||
k->zlib_init = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the compressed input when this function is called */
|
/* because the buffer size is fixed, iteratively decompress and transfer to
|
||||||
z->next_in = (Bytef *)k->str;
|
the client via client_write. */
|
||||||
z->avail_in = (uInt)nread;
|
|
||||||
|
|
||||||
/* because the buffer size is fixed, iteratively decompress
|
|
||||||
and transfer to the client via client_write. */
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
/* (re)set buffer for decompressed output for every iteration */
|
/* (re)set buffer for decompressed output for every iteration */
|
||||||
z->next_out = (Bytef *)&decomp[0];
|
z->next_out = (Bytef *)decomp;
|
||||||
z->avail_out = DSIZ;
|
z->avail_out = DSIZ;
|
||||||
|
|
||||||
status = inflate(z, Z_SYNC_FLUSH);
|
status = inflate(z, Z_SYNC_FLUSH);
|
||||||
if (status == Z_OK || status == Z_STREAM_END) {
|
if (status == Z_OK || status == Z_STREAM_END) {
|
||||||
if (DSIZ - z->avail_out) {
|
if(DSIZ - z->avail_out) {
|
||||||
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
||||||
DSIZ - z->avail_out);
|
DSIZ - z->avail_out);
|
||||||
/* if !CURLE_OK, clean up, return */
|
/* if !CURLE_OK, clean up, return */
|
||||||
if (result)
|
if (result) {
|
||||||
|
free(decomp);
|
||||||
return exit_zlib(z, &k->zlib_init, result);
|
return exit_zlib(z, &k->zlib_init, result);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Done?; clean up, return */
|
/* Done? clean up, return */
|
||||||
if (status == Z_STREAM_END) {
|
if (status == Z_STREAM_END) {
|
||||||
|
free(decomp);
|
||||||
if (inflateEnd(z) == Z_OK)
|
if (inflateEnd(z) == Z_OK)
|
||||||
return exit_zlib(z, &k->zlib_init, result);
|
return exit_zlib(z, &k->zlib_init, result);
|
||||||
else
|
else
|
||||||
@@ -122,15 +128,47 @@ Curl_unencode_deflate_write(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Done with these bytes, exit */
|
/* Done with these bytes, exit */
|
||||||
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0)
|
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0) {
|
||||||
|
free(decomp);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else { /* Error; exit loop, handle below */
|
else { /* Error; exit loop, handle below */
|
||||||
|
free(decomp);
|
||||||
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* Will never get here */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CURLcode
|
||||||
|
Curl_unencode_deflate_write(struct SessionHandle *data,
|
||||||
|
struct Curl_transfer_keeper *k,
|
||||||
|
ssize_t nread)
|
||||||
|
{
|
||||||
|
z_stream *z = &k->z; /* zlib state structure */
|
||||||
|
|
||||||
|
/* Initialize zlib? */
|
||||||
|
if (k->zlib_init == ZLIB_UNINIT) {
|
||||||
|
z->zalloc = (alloc_func)Z_NULL;
|
||||||
|
z->zfree = (free_func)Z_NULL;
|
||||||
|
z->opaque = 0;
|
||||||
|
z->next_in = NULL;
|
||||||
|
z->avail_in = 0;
|
||||||
|
if (inflateInit(z) != Z_OK)
|
||||||
|
return process_zlib_error(data, z);
|
||||||
|
k->zlib_init = ZLIB_INIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the compressed input when this function is called */
|
||||||
|
z->next_in = (Bytef *)k->str;
|
||||||
|
z->avail_in = (uInt)nread;
|
||||||
|
|
||||||
|
/* Now uncompress the data */
|
||||||
|
return inflate_stream(data, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef OLD_ZLIB_SUPPORT
|
||||||
/* Skip over the gzip header */
|
/* Skip over the gzip header */
|
||||||
static enum {
|
static enum {
|
||||||
GZIP_OK,
|
GZIP_OK,
|
||||||
@@ -172,6 +210,7 @@ static enum {
|
|||||||
return GZIP_UNDERFLOW;
|
return GZIP_UNDERFLOW;
|
||||||
|
|
||||||
len -= (extra_len + 2);
|
len -= (extra_len + 2);
|
||||||
|
data += (extra_len + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & ORIG_NAME) {
|
if (flags & ORIG_NAME) {
|
||||||
@@ -213,38 +252,67 @@ static enum {
|
|||||||
*headerlen = totallen - len;
|
*headerlen = totallen - len;
|
||||||
return GZIP_OK;
|
return GZIP_OK;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
CURLcode
|
CURLcode
|
||||||
Curl_unencode_gzip_write(struct SessionHandle *data,
|
Curl_unencode_gzip_write(struct SessionHandle *data,
|
||||||
struct Curl_transfer_keeper *k,
|
struct Curl_transfer_keeper *k,
|
||||||
ssize_t nread)
|
ssize_t nread)
|
||||||
{
|
{
|
||||||
int status; /* zlib status */
|
|
||||||
CURLcode result = CURLE_OK; /* Curl_client_write status */
|
|
||||||
char decomp[DSIZ]; /* Put the decompressed data here. */
|
|
||||||
z_stream *z = &k->z; /* zlib state structure */
|
z_stream *z = &k->z; /* zlib state structure */
|
||||||
|
|
||||||
/* Initialize zlib? */
|
/* Initialize zlib? */
|
||||||
if (!k->zlib_init) {
|
if (k->zlib_init == ZLIB_UNINIT) {
|
||||||
z->zalloc = (alloc_func)Z_NULL;
|
z->zalloc = (alloc_func)Z_NULL;
|
||||||
z->zfree = (free_func)Z_NULL;
|
z->zfree = (free_func)Z_NULL;
|
||||||
z->opaque = 0;
|
z->opaque = 0;
|
||||||
z->next_in = NULL;
|
z->next_in = NULL;
|
||||||
z->avail_in = 0;
|
z->avail_in = 0;
|
||||||
if (inflateInit2(z, -MAX_WBITS) != Z_OK)
|
|
||||||
|
if (strcmp(zlibVersion(), "1.2.0.4") >= 0) {
|
||||||
|
/* zlib ver. >= 1.2.0.4 supports transparent gzip decompressing */
|
||||||
|
if (inflateInit2(z, MAX_WBITS+32) != Z_OK) {
|
||||||
return process_zlib_error(data, z);
|
return process_zlib_error(data, z);
|
||||||
k->zlib_init = 1; /* Initial call state */
|
}
|
||||||
|
k->zlib_init = ZLIB_INIT_GZIP; /* Transparent gzip decompress state */
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* we must parse the gzip header ourselves */
|
||||||
|
if (inflateInit2(z, -MAX_WBITS) != Z_OK) {
|
||||||
|
return process_zlib_error(data, z);
|
||||||
|
}
|
||||||
|
k->zlib_init = ZLIB_INIT; /* Initial call state */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (k->zlib_init == ZLIB_INIT_GZIP) {
|
||||||
|
/* Let zlib handle the gzip decompression entirely */
|
||||||
|
z->next_in = (Bytef *)k->str;
|
||||||
|
z->avail_in = (uInt)nread;
|
||||||
|
/* Now uncompress the data */
|
||||||
|
return inflate_stream(data, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef OLD_ZLIB_SUPPORT
|
||||||
|
/* Support for old zlib versions is compiled away and we are running with
|
||||||
|
an old version, so return an error. */
|
||||||
|
return exit_zlib(z, &k->zlib_init, CURLE_FUNCTION_NOT_FOUND);
|
||||||
|
|
||||||
|
#else
|
||||||
/* This next mess is to get around the potential case where there isn't
|
/* This next mess is to get around the potential case where there isn't
|
||||||
* enough data passed in to skip over the gzip header. If that happens, we
|
* enough data passed in to skip over the gzip header. If that happens, we
|
||||||
* malloc a block and copy what we have then wait for the next call. If
|
* malloc a block and copy what we have then wait for the next call. If
|
||||||
* there still isn't enough (this is definitely a worst-case scenario), we
|
* there still isn't enough (this is definitely a worst-case scenario), we
|
||||||
* make the block bigger, copy the next part in and keep waiting.
|
* make the block bigger, copy the next part in and keep waiting.
|
||||||
|
*
|
||||||
|
* This is only required with zlib versions < 1.2.0.4 as newer versions
|
||||||
|
* can handle the gzip header themselves.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
switch (k->zlib_init) {
|
||||||
/* Skip over gzip header? */
|
/* Skip over gzip header? */
|
||||||
if (k->zlib_init == 1) {
|
case ZLIB_INIT:
|
||||||
|
{
|
||||||
/* Initial call state */
|
/* Initial call state */
|
||||||
ssize_t hlen;
|
ssize_t hlen;
|
||||||
|
|
||||||
@@ -252,7 +320,7 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
|
|||||||
case GZIP_OK:
|
case GZIP_OK:
|
||||||
z->next_in = (Bytef *)k->str + hlen;
|
z->next_in = (Bytef *)k->str + hlen;
|
||||||
z->avail_in = (uInt)(nread - hlen);
|
z->avail_in = (uInt)(nread - hlen);
|
||||||
k->zlib_init = 3; /* Inflating stream state */
|
k->zlib_init = ZLIB_GZIP_INFLATING; /* Inflating stream state */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GZIP_UNDERFLOW:
|
case GZIP_UNDERFLOW:
|
||||||
@@ -269,7 +337,7 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
|
|||||||
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
return exit_zlib(z, &k->zlib_init, CURLE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
memcpy(z->next_in, k->str, z->avail_in);
|
memcpy(z->next_in, k->str, z->avail_in);
|
||||||
k->zlib_init = 2; /* Need more gzip header data state */
|
k->zlib_init = ZLIB_GZIP_HEADER; /* Need more gzip header data state */
|
||||||
/* We don't have any data to inflate yet */
|
/* We don't have any data to inflate yet */
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
|
||||||
@@ -279,7 +347,10 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (k->zlib_init == 2) {
|
break;
|
||||||
|
|
||||||
|
case ZLIB_GZIP_HEADER:
|
||||||
|
{
|
||||||
/* Need more gzip header data state */
|
/* Need more gzip header data state */
|
||||||
ssize_t hlen;
|
ssize_t hlen;
|
||||||
unsigned char *oldblock = z->next_in;
|
unsigned char *oldblock = z->next_in;
|
||||||
@@ -300,7 +371,7 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
|
|||||||
/* Don't point into the malloced block since we just freed it */
|
/* Don't point into the malloced block since we just freed it */
|
||||||
z->next_in = (Bytef *)k->str + hlen + nread - z->avail_in;
|
z->next_in = (Bytef *)k->str + hlen + nread - z->avail_in;
|
||||||
z->avail_in = (uInt)(z->avail_in - hlen);
|
z->avail_in = (uInt)(z->avail_in - hlen);
|
||||||
k->zlib_init = 3; /* Inflating stream state */
|
k->zlib_init = ZLIB_GZIP_INFLATING; /* Inflating stream state */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GZIP_UNDERFLOW:
|
case GZIP_UNDERFLOW:
|
||||||
@@ -314,10 +385,14 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
break;
|
||||||
|
|
||||||
|
case ZLIB_GZIP_INFLATING:
|
||||||
|
default:
|
||||||
/* Inflating stream state */
|
/* Inflating stream state */
|
||||||
z->next_in = (Bytef *)k->str;
|
z->next_in = (Bytef *)k->str;
|
||||||
z->avail_in = (uInt)nread;
|
z->avail_in = (uInt)nread;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (z->avail_in == 0) {
|
if (z->avail_in == 0) {
|
||||||
@@ -325,39 +400,8 @@ Curl_unencode_gzip_write(struct SessionHandle *data,
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* because the buffer size is fixed, iteratively decompress and transfer to
|
/* We've parsed the header, now uncompress the data */
|
||||||
the client via client_write. */
|
return inflate_stream(data, k);
|
||||||
for (;;) {
|
#endif
|
||||||
/* (re)set buffer for decompressed output for every iteration */
|
|
||||||
z->next_out = (Bytef *)&decomp[0];
|
|
||||||
z->avail_out = DSIZ;
|
|
||||||
|
|
||||||
status = inflate(z, Z_SYNC_FLUSH);
|
|
||||||
if (status == Z_OK || status == Z_STREAM_END) {
|
|
||||||
if(DSIZ - z->avail_out) {
|
|
||||||
result = Curl_client_write(data, CLIENTWRITE_BODY, decomp,
|
|
||||||
DSIZ - z->avail_out);
|
|
||||||
/* if !CURLE_OK, clean up, return */
|
|
||||||
if (result)
|
|
||||||
return exit_zlib(z, &k->zlib_init, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Done?; clean up, return */
|
|
||||||
/* We should really check the gzip CRC here */
|
|
||||||
if (status == Z_STREAM_END) {
|
|
||||||
if (inflateEnd(z) == Z_OK)
|
|
||||||
return exit_zlib(z, &k->zlib_init, result);
|
|
||||||
else
|
|
||||||
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Done with these bytes, exit */
|
|
||||||
if (status == Z_OK && z->avail_in == 0 && z->avail_out > 0)
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
else { /* Error; exit loop, handle below */
|
|
||||||
return exit_zlib(z, &k->zlib_init, process_zlib_error(data, z));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* HAVE_LIBZ */
|
#endif /* HAVE_LIBZ */
|
||||||
|
@@ -80,7 +80,7 @@ Example set of cookies:
|
|||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -878,4 +878,4 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CURL_DISABLE_HTTP */
|
#endif /* CURL_DISABLE_HTTP || CURL_DISABLE_COOKIES */
|
||||||
|
@@ -23,14 +23,20 @@
|
|||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
|
#ifndef CURL_DISABLE_DICT
|
||||||
|
|
||||||
/* -- WIN32 approved -- */
|
/* -- WIN32 approved -- */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_STAT_H
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@@ -218,3 +224,4 @@ CURLcode Curl_dict(struct connectdata *conn)
|
|||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
#endif /*CURL_DISABLE_DICT*/
|
||||||
|
12
lib/easy.c
12
lib/easy.c
@@ -29,8 +29,12 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_STAT_H
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@@ -168,6 +172,11 @@ static long init_flags = 0;
|
|||||||
* If a memory-using function (like curl_getenv) is used before
|
* If a memory-using function (like curl_getenv) is used before
|
||||||
* curl_global_init() is called, we need to have these pointers set already.
|
* curl_global_init() is called, we need to have these pointers set already.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
#define strdup _strdup
|
||||||
|
#endif
|
||||||
|
|
||||||
curl_malloc_callback Curl_cmalloc = (curl_malloc_callback)malloc;
|
curl_malloc_callback Curl_cmalloc = (curl_malloc_callback)malloc;
|
||||||
curl_free_callback Curl_cfree = (curl_free_callback)free;
|
curl_free_callback Curl_cfree = (curl_free_callback)free;
|
||||||
curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc;
|
curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc;
|
||||||
@@ -455,7 +464,7 @@ CURL *curl_easy_duphandle(CURL *incurl)
|
|||||||
outcurl->progress.flags = data->progress.flags;
|
outcurl->progress.flags = data->progress.flags;
|
||||||
outcurl->progress.callback = data->progress.callback;
|
outcurl->progress.callback = data->progress.callback;
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
|
||||||
if(data->cookies) {
|
if(data->cookies) {
|
||||||
/* If cookies are enabled in the parent handle, we enable them
|
/* If cookies are enabled in the parent handle, we enable them
|
||||||
in the clone as well! */
|
in the clone as well! */
|
||||||
@@ -546,6 +555,7 @@ void curl_easy_reset(CURL *curl)
|
|||||||
data->set.fread = (curl_read_callback)fread;
|
data->set.fread = (curl_read_callback)fread;
|
||||||
|
|
||||||
data->set.infilesize = -1; /* we don't know any size */
|
data->set.infilesize = -1; /* we don't know any size */
|
||||||
|
data->set.postfieldsize = -1;
|
||||||
|
|
||||||
data->state.current_speed = -1; /* init to negative == impossible */
|
data->state.current_speed = -1; /* init to negative == impossible */
|
||||||
|
|
||||||
|
31
lib/file.c
31
lib/file.c
@@ -30,8 +30,12 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_STAT_H
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@@ -66,9 +70,6 @@
|
|||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_STAT_H
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_FCNTL_H
|
#ifdef HAVE_FCNTL_H
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -103,7 +104,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
|
|||||||
char *real_path = curl_unescape(conn->path, 0);
|
char *real_path = curl_unescape(conn->path, 0);
|
||||||
struct FILEPROTO *file;
|
struct FILEPROTO *file;
|
||||||
int fd;
|
int fd;
|
||||||
#if defined(WIN32) || defined(__EMX__)
|
#if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
|
||||||
int i;
|
int i;
|
||||||
char *actual_path;
|
char *actual_path;
|
||||||
#endif
|
#endif
|
||||||
@@ -119,7 +120,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
|
|||||||
|
|
||||||
conn->proto.file = file;
|
conn->proto.file = file;
|
||||||
|
|
||||||
#if defined(WIN32) || defined(__EMX__)
|
#if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
|
||||||
/* If the first character is a slash, and there's
|
/* If the first character is a slash, and there's
|
||||||
something that looks like a drive at the beginning of
|
something that looks like a drive at the beginning of
|
||||||
the path, skip the slash. If we remove the initial
|
the path, skip the slash. If we remove the initial
|
||||||
@@ -143,7 +144,7 @@ CURLcode Curl_file_connect(struct connectdata *conn)
|
|||||||
actual_path++;
|
actual_path++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* change path separators from '/' to '\\' for Windows and OS/2 */
|
/* change path separators from '/' to '\\' for DOS, Windows and OS/2 */
|
||||||
for (i=0; actual_path[i] != '\0'; ++i)
|
for (i=0; actual_path[i] != '\0'; ++i)
|
||||||
if (actual_path[i] == '/')
|
if (actual_path[i] == '/')
|
||||||
actual_path[i] = '\\';
|
actual_path[i] = '\\';
|
||||||
@@ -166,10 +167,6 @@ CURLcode Curl_file_connect(struct connectdata *conn)
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(WIN32) && (SIZEOF_CURL_OFF_T > 4)
|
|
||||||
#define lseek(x,y,z) _lseeki64(x, y, z)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
CURLcode Curl_file_done(struct connectdata *conn,
|
CURLcode Curl_file_done(struct connectdata *conn,
|
||||||
CURLcode status)
|
CURLcode status)
|
||||||
{
|
{
|
||||||
@@ -183,7 +180,7 @@ CURLcode Curl_file_done(struct connectdata *conn,
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(WIN32) || defined(__EMX__)
|
#if defined(WIN32) || defined(MSDOS) || defined(__EMX__)
|
||||||
#define DIRSEP '\\'
|
#define DIRSEP '\\'
|
||||||
#else
|
#else
|
||||||
#define DIRSEP '/'
|
#define DIRSEP '/'
|
||||||
@@ -277,7 +274,9 @@ CURLcode Curl_file(struct connectdata *conn)
|
|||||||
(via NFS, Samba, NT sharing) can be accessed through a file:// URL
|
(via NFS, Samba, NT sharing) can be accessed through a file:// URL
|
||||||
*/
|
*/
|
||||||
CURLcode res = CURLE_OK;
|
CURLcode res = CURLE_OK;
|
||||||
struct stat statbuf;
|
struct_stat statbuf; /* struct_stat instead of struct stat just to allow the
|
||||||
|
Windows version to have a different struct without
|
||||||
|
having to redefine the simple word 'stat' */
|
||||||
curl_off_t expected_size=0;
|
curl_off_t expected_size=0;
|
||||||
bool fstated=FALSE;
|
bool fstated=FALSE;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
@@ -339,12 +338,12 @@ CURLcode Curl_file(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Added by Dolbneff A.V & Spiridonoff A.V */
|
|
||||||
if (conn->resume_from <= expected_size)
|
if (conn->resume_from <= expected_size)
|
||||||
expected_size -= conn->resume_from;
|
expected_size -= conn->resume_from;
|
||||||
else
|
else {
|
||||||
/* Is this error code suitable in such situation? */
|
failf(data, "failed to resume file:// transfer");
|
||||||
return CURLE_FTP_BAD_DOWNLOAD_RESUME;
|
return CURLE_BAD_DOWNLOAD_RESUME;
|
||||||
|
}
|
||||||
|
|
||||||
if (fstated && (expected_size == 0))
|
if (fstated && (expected_size == 0))
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
@@ -112,7 +112,9 @@ Content-Disposition: form-data; name="FILECONTENT"
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#ifdef HAVE_SYS_STAT_H
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
|
#if defined(HAVE_LIBGEN_H) && defined(HAVE_BASENAME)
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -259,7 +261,7 @@ static const char * ContentTypeForFilename (const char *filename,
|
|||||||
const char *extension;
|
const char *extension;
|
||||||
const char *type;
|
const char *type;
|
||||||
};
|
};
|
||||||
static struct ContentType ctts[]={
|
static const struct ContentType ctts[]={
|
||||||
{".gif", "image/gif"},
|
{".gif", "image/gif"},
|
||||||
{".jpg", "image/jpeg"},
|
{".jpg", "image/jpeg"},
|
||||||
{".jpeg", "image/jpeg"},
|
{".jpeg", "image/jpeg"},
|
||||||
@@ -833,7 +835,7 @@ static CURLcode AddFormData(struct FormData **formp,
|
|||||||
/* Since this is a file to be uploaded here, add the size of the actual
|
/* Since this is a file to be uploaded here, add the size of the actual
|
||||||
file */
|
file */
|
||||||
if(!strequal("-", newform->line)) {
|
if(!strequal("-", newform->line)) {
|
||||||
struct stat file;
|
struct_stat file;
|
||||||
if(!stat(newform->line, &file)) {
|
if(!stat(newform->line, &file)) {
|
||||||
*size += file.st_size;
|
*size += file.st_size;
|
||||||
}
|
}
|
||||||
@@ -1307,9 +1309,13 @@ size_t Curl_FormReader(char *buffer,
|
|||||||
if(!form->data)
|
if(!form->data)
|
||||||
return 0; /* nothing, error, empty */
|
return 0; /* nothing, error, empty */
|
||||||
|
|
||||||
if(form->data->type == FORM_FILE)
|
if(form->data->type == FORM_FILE) {
|
||||||
return readfromfile(form, buffer, wantedsize);
|
gotsize = readfromfile(form, buffer, wantedsize);
|
||||||
|
|
||||||
|
if(gotsize)
|
||||||
|
/* If positive or -1, return. If zero, continue! */
|
||||||
|
return gotsize;
|
||||||
|
}
|
||||||
do {
|
do {
|
||||||
|
|
||||||
if( (form->data->length - form->sent ) > wantedsize - gotsize) {
|
if( (form->data->length - form->sent ) > wantedsize - gotsize) {
|
||||||
@@ -1537,7 +1543,7 @@ char *Curl_FormBoundary(void)
|
|||||||
the same form won't be identical */
|
the same form won't be identical */
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
static char table16[]="abcdef0123456789";
|
static const char table16[]="abcdef0123456789";
|
||||||
|
|
||||||
retstring = (char *)malloc(BOUNDARY_LENGTH+1);
|
retstring = (char *)malloc(BOUNDARY_LENGTH+1);
|
||||||
|
|
||||||
|
209
lib/ftp.c
209
lib/ftp.c
@@ -34,13 +34,10 @@
|
|||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SYS_SELECT_H
|
|
||||||
#include <sys/select.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
||||||
|
|
||||||
#else /* some kind of unix */
|
#else /* probably some kind of unix */
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -51,7 +48,9 @@
|
|||||||
#ifdef HAVE_ARPA_INET_H
|
#ifdef HAVE_ARPA_INET_H
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_UTSNAME_H
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_NETDB_H
|
#ifdef HAVE_NETDB_H
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -94,6 +93,7 @@
|
|||||||
#include "strerror.h"
|
#include "strerror.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "inet_ntop.h"
|
#include "inet_ntop.h"
|
||||||
|
#include "select.h"
|
||||||
|
|
||||||
#if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL)
|
#if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL)
|
||||||
#include "inet_ntoa_r.h"
|
#include "inet_ntoa_r.h"
|
||||||
@@ -160,8 +160,7 @@ static void freedirs(struct FTP *ftp)
|
|||||||
*/
|
*/
|
||||||
static CURLcode AllowServerConnect(struct connectdata *conn)
|
static CURLcode AllowServerConnect(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
fd_set rdset;
|
int timeout_ms;
|
||||||
struct timeval dt;
|
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
curl_socket_t sock = conn->sock[SECONDARYSOCKET];
|
curl_socket_t sock = conn->sock[SECONDARYSOCKET];
|
||||||
struct timeval now = Curl_tvnow();
|
struct timeval now = Curl_tvnow();
|
||||||
@@ -169,10 +168,6 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
|||||||
long timeout = data->set.connecttimeout?data->set.connecttimeout:
|
long timeout = data->set.connecttimeout?data->set.connecttimeout:
|
||||||
(data->set.timeout?data->set.timeout: 0);
|
(data->set.timeout?data->set.timeout: 0);
|
||||||
|
|
||||||
FD_ZERO(&rdset);
|
|
||||||
|
|
||||||
FD_SET(sock, &rdset);
|
|
||||||
|
|
||||||
if(timeout) {
|
if(timeout) {
|
||||||
timeout -= timespent;
|
timeout -= timespent;
|
||||||
if(timeout<=0) {
|
if(timeout<=0) {
|
||||||
@@ -181,11 +176,11 @@ static CURLcode AllowServerConnect(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we give the server 60 seconds to connect to us, or a custom timeout */
|
/* We allow the server 60 seconds to connect to us, or a custom timeout.
|
||||||
dt.tv_sec = (int)(timeout?timeout:60);
|
Note the typecast here. */
|
||||||
dt.tv_usec = 0;
|
timeout_ms = (timeout?(int)timeout:60) * 1000;
|
||||||
|
|
||||||
switch (select(sock+1, &rdset, NULL, NULL, &dt)) {
|
switch (Curl_select(sock, CURL_SOCKET_BAD, timeout_ms)) {
|
||||||
case -1: /* error */
|
case -1: /* error */
|
||||||
/* let's die here */
|
/* let's die here */
|
||||||
failf(data, "Error while waiting for server connect");
|
failf(data, "Error while waiting for server connect");
|
||||||
@@ -248,9 +243,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
|||||||
ssize_t gotbytes;
|
ssize_t gotbytes;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
long timeout; /* timeout in seconds */
|
long timeout; /* timeout in seconds */
|
||||||
struct timeval interval;
|
int interval_ms;
|
||||||
fd_set rkeepfd;
|
|
||||||
fd_set readfd;
|
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
char *line_start;
|
char *line_start;
|
||||||
int code=0; /* default ftp "error code" to return */
|
int code=0; /* default ftp "error code" to return */
|
||||||
@@ -262,13 +255,6 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
|||||||
if (ftpcode)
|
if (ftpcode)
|
||||||
*ftpcode = 0; /* 0 for errors */
|
*ftpcode = 0; /* 0 for errors */
|
||||||
|
|
||||||
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;
|
ptr=buf;
|
||||||
line_start = buf;
|
line_start = buf;
|
||||||
|
|
||||||
@@ -302,11 +288,9 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!ftp->cache) {
|
if(!ftp->cache) {
|
||||||
readfd = rkeepfd; /* set every lap */
|
interval_ms = 1 * 1000; /* use 1 second timeout intervals */
|
||||||
interval.tv_sec = 1; /* use 1 second timeout intervals */
|
|
||||||
interval.tv_usec = 0;
|
|
||||||
|
|
||||||
switch (select (sockfd+1, &readfd, NULL, NULL, &interval)) {
|
switch (Curl_select(sockfd, CURL_SOCKET_BAD, interval_ms)) {
|
||||||
case -1: /* select() error, stop reading */
|
case -1: /* select() error, stop reading */
|
||||||
result = CURLE_RECV_ERROR;
|
result = CURLE_RECV_ERROR;
|
||||||
failf(data, "FTP response aborted due to select() error: %d", errno);
|
failf(data, "FTP response aborted due to select() error: %d", errno);
|
||||||
@@ -458,10 +442,6 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *ftpauth[]= {
|
|
||||||
"SSL", "TLS", NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Curl_ftp_connect() should do everything that is to be considered a part of
|
* Curl_ftp_connect() should do everything that is to be considered a part of
|
||||||
* the connection phase.
|
* the connection phase.
|
||||||
@@ -474,13 +454,15 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
|||||||
char *buf = data->state.buffer; /* this is our buffer */
|
char *buf = data->state.buffer; /* this is our buffer */
|
||||||
struct FTP *ftp;
|
struct FTP *ftp;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
int ftpcode, try;
|
int ftpcode, trynum;
|
||||||
|
static const char * const ftpauth[] = {
|
||||||
|
"SSL", "TLS", NULL
|
||||||
|
};
|
||||||
|
|
||||||
ftp = (struct FTP *)malloc(sizeof(struct FTP));
|
ftp = (struct FTP *)calloc(sizeof(struct FTP), 1);
|
||||||
if(!ftp)
|
if(!ftp)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
memset(ftp, 0, sizeof(struct FTP));
|
|
||||||
conn->proto.ftp = ftp;
|
conn->proto.ftp = ftp;
|
||||||
|
|
||||||
/* We always support persistant connections on ftp */
|
/* We always support persistant connections on ftp */
|
||||||
@@ -562,9 +544,9 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
|||||||
return CURLE_FAILED_INIT; /* we don't know what to do */
|
return CURLE_FAILED_INIT; /* we don't know what to do */
|
||||||
}
|
}
|
||||||
|
|
||||||
for (try = start; ftpauth[count]; try=trynext, count++) {
|
for (trynum = start; ftpauth[count]; trynum=trynext, count++) {
|
||||||
|
|
||||||
FTPSENDF(conn, "AUTH %s", ftpauth[try]);
|
FTPSENDF(conn, "AUTH %s", ftpauth[trynum]);
|
||||||
|
|
||||||
result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
|
result = Curl_GetFTPResponse(&nread, conn, &ftpcode);
|
||||||
|
|
||||||
@@ -693,12 +675,14 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
if(ftpcode == 200)
|
if(ftpcode/100 == 2)
|
||||||
/* We have enabled SSL for the data connection! */
|
/* We have enabled SSL for the data connection! */
|
||||||
conn->ssl[SECONDARYSOCKET].use = TRUE;
|
conn->ssl[SECONDARYSOCKET].use = TRUE;
|
||||||
|
|
||||||
/* FTP servers typically responds with 500 if they decide to reject
|
/* FTP servers typically responds with 500 if they decide to reject
|
||||||
our 'P' request */
|
our 'P' request */
|
||||||
|
else if(data->set.ftp_ssl> CURLFTPSSL_CONTROL)
|
||||||
|
/* we failed and bails out */
|
||||||
|
return CURLE_FTP_SSL_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -778,9 +762,32 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status)
|
|||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
int ftpcode;
|
int ftpcode;
|
||||||
CURLcode result=CURLE_OK;
|
CURLcode result=CURLE_OK;
|
||||||
|
|
||||||
bool was_ctl_valid = ftp->ctl_valid;
|
bool was_ctl_valid = ftp->ctl_valid;
|
||||||
|
size_t flen;
|
||||||
|
size_t dlen;
|
||||||
|
char *path;
|
||||||
|
|
||||||
|
/* now store a copy of the directory we are in */
|
||||||
|
if(ftp->prevpath)
|
||||||
|
free(ftp->prevpath);
|
||||||
|
|
||||||
|
path = curl_unescape(conn->path, 0); /* get the "raw" path */
|
||||||
|
if(!path)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
flen = ftp->file?strlen(ftp->file):0; /* file is "raw" already */
|
||||||
|
dlen = strlen(path)-flen;
|
||||||
|
if(dlen) {
|
||||||
|
ftp->prevpath = path;
|
||||||
|
if(flen)
|
||||||
|
/* if 'path' is not the whole string */
|
||||||
|
ftp->prevpath[dlen]=0; /* terminate */
|
||||||
|
infof(data, "Remembering we are in dir %s\n", ftp->prevpath);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ftp->prevpath = NULL; /* no path */
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
/* free the dir tree and file parts */
|
/* free the dir tree and file parts */
|
||||||
freedirs(ftp);
|
freedirs(ftp);
|
||||||
|
|
||||||
@@ -840,8 +847,15 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status)
|
|||||||
#ifdef HAVE_KRB4
|
#ifdef HAVE_KRB4
|
||||||
Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]);
|
Curl_sec_fflush_fd(conn, conn->sock[SECONDARYSOCKET]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* shut down the socket to inform the server we're done */
|
/* shut down the socket to inform the server we're done */
|
||||||
|
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
shutdown(conn->sock[SECONDARYSOCKET],2); /* SD_BOTH */
|
||||||
|
#endif
|
||||||
|
|
||||||
sclose(conn->sock[SECONDARYSOCKET]);
|
sclose(conn->sock[SECONDARYSOCKET]);
|
||||||
|
|
||||||
conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD;
|
conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD;
|
||||||
|
|
||||||
if(!ftp->no_transfer && !status) {
|
if(!ftp->no_transfer && !status) {
|
||||||
@@ -1095,8 +1109,8 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
unsigned char *pp;
|
unsigned char *pp;
|
||||||
char portmsgbuf[1024], tmp[1024];
|
char portmsgbuf[1024], tmp[1024];
|
||||||
|
|
||||||
|
enum ftpcommand { EPRT, LPRT, PORT, DONE } fcmd;
|
||||||
const char *mode[] = { "EPRT", "LPRT", "PORT", NULL };
|
const char *mode[] = { "EPRT", "LPRT", "PORT", NULL };
|
||||||
char **modep;
|
|
||||||
int rc;
|
int rc;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
@@ -1175,11 +1189,28 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (modep = (char **)(data->set.ftp_use_eprt?&mode[0]:&mode[2]);
|
#ifdef PF_INET6
|
||||||
modep && *modep; modep++) {
|
if(!conn->bits.ftp_use_eprt &&
|
||||||
|
(conn->ip_addr->ai_family == PF_INET6)) {
|
||||||
|
/* EPRT is disabled but we are connected to a IPv6 host, so we ignore the
|
||||||
|
request! */
|
||||||
|
conn->bits.ftp_use_eprt = TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
for (fcmd = EPRT; fcmd != DONE; fcmd++) {
|
||||||
int lprtaf, eprtaf;
|
int lprtaf, eprtaf;
|
||||||
int alen=0, plen=0;
|
int alen=0, plen=0;
|
||||||
|
|
||||||
|
if(!conn->bits.ftp_use_eprt && (EPRT == fcmd))
|
||||||
|
/* if disabled, goto next */
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(!conn->bits.ftp_use_lprt && (LPRT == fcmd))
|
||||||
|
/* if disabled, goto next */
|
||||||
|
continue;
|
||||||
|
|
||||||
switch (sa->sa_family) {
|
switch (sa->sa_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
ap = (unsigned char *)&((struct sockaddr_in *)&ss)->sin_addr;
|
ap = (unsigned char *)&((struct sockaddr_in *)&ss)->sin_addr;
|
||||||
@@ -1203,7 +1234,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(*modep, "EPRT") == 0) {
|
if (EPRT == fcmd) {
|
||||||
if (eprtaf < 0)
|
if (eprtaf < 0)
|
||||||
continue;
|
continue;
|
||||||
if (getnameinfo((struct sockaddr *)&ss, sslen,
|
if (getnameinfo((struct sockaddr *)&ss, sslen,
|
||||||
@@ -1218,22 +1249,21 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
*q = '\0';
|
*q = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
result = Curl_ftpsendf(conn, "%s |%d|%s|%s|", *modep, eprtaf,
|
result = Curl_ftpsendf(conn, "%s |%d|%s|%s|", mode[fcmd], eprtaf,
|
||||||
portmsgbuf, tmp);
|
portmsgbuf, tmp);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
else if (strcmp(*modep, "LPRT") == 0 ||
|
else if ((LPRT == fcmd) || (PORT == fcmd)) {
|
||||||
strcmp(*modep, "PORT") == 0) {
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (strcmp(*modep, "LPRT") == 0 && lprtaf < 0)
|
if ((LPRT == fcmd) && lprtaf < 0)
|
||||||
continue;
|
continue;
|
||||||
if (strcmp(*modep, "PORT") == 0 && sa->sa_family != AF_INET)
|
if ((PORT == fcmd) && sa->sa_family != AF_INET)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
portmsgbuf[0] = '\0';
|
portmsgbuf[0] = '\0';
|
||||||
if (strcmp(*modep, "LPRT") == 0) {
|
if (LPRT == fcmd) {
|
||||||
snprintf(tmp, sizeof(tmp), "%d,%d", lprtaf, alen);
|
snprintf(tmp, sizeof(tmp), "%d,%d", lprtaf, alen);
|
||||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >=
|
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >=
|
||||||
sizeof(portmsgbuf)) {
|
sizeof(portmsgbuf)) {
|
||||||
@@ -1253,7 +1283,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(*modep, "LPRT") == 0) {
|
if (LPRT == fcmd) {
|
||||||
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))
|
||||||
@@ -1269,7 +1299,7 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result = Curl_ftpsendf(conn, "%s %s", *modep, portmsgbuf);
|
result = Curl_ftpsendf(conn, "%s %s", mode[fcmd], portmsgbuf);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1279,13 +1309,21 @@ CURLcode ftp_use_port(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
|
|
||||||
if (ftpcode != 200) {
|
if (ftpcode != 200) {
|
||||||
|
if (EPRT == fcmd) {
|
||||||
|
infof(data, "disabling EPRT usage\n");
|
||||||
|
conn->bits.ftp_use_eprt = FALSE;
|
||||||
|
}
|
||||||
|
else if (LPRT == fcmd) {
|
||||||
|
infof(data, "disabling LPRT usage\n");
|
||||||
|
conn->bits.ftp_use_lprt = FALSE;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!*modep) {
|
if (fcmd == DONE) {
|
||||||
sclose(portsock);
|
sclose(portsock);
|
||||||
failf(data, "PORT command attempts failed");
|
failf(data, "PORT command attempts failed");
|
||||||
return CURLE_FTP_PORT_FAILED;
|
return CURLE_FTP_PORT_FAILED;
|
||||||
@@ -1486,10 +1524,19 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
|
|||||||
|
|
||||||
/* newhost must be able to hold a full IP-style address in ASCII, which
|
/* newhost must be able to hold a full IP-style address in ASCII, which
|
||||||
in the IPv6 case means 5*8-1 = 39 letters */
|
in the IPv6 case means 5*8-1 = 39 letters */
|
||||||
char newhost[48];
|
#define NEWHOST_BUFSIZE 48
|
||||||
char *newhostp=NULL;
|
char newhost[NEWHOST_BUFSIZE];
|
||||||
|
|
||||||
for (modeoff = (data->set.ftp_use_epsv?0:1);
|
#ifdef PF_INET6
|
||||||
|
if(!conn->bits.ftp_use_epsv &&
|
||||||
|
(conn->ip_addr->ai_family == PF_INET6)) {
|
||||||
|
/* EPSV is disabled but we are connected to a IPv6 host, so we ignore the
|
||||||
|
request! */
|
||||||
|
conn->bits.ftp_use_epsv = TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (modeoff = (conn->bits.ftp_use_epsv?0:1);
|
||||||
mode[modeoff]; modeoff++) {
|
mode[modeoff]; modeoff++) {
|
||||||
result = Curl_ftpsendf(conn, "%s", mode[modeoff]);
|
result = Curl_ftpsendf(conn, "%s", mode[modeoff]);
|
||||||
if(result)
|
if(result)
|
||||||
@@ -1499,6 +1546,12 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
if (ftpcode == results[modeoff])
|
if (ftpcode == results[modeoff])
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if(modeoff == 0) {
|
||||||
|
/* EPSV is not supported, disable it for next transfer */
|
||||||
|
conn->bits.ftp_use_epsv = FALSE;
|
||||||
|
infof(data, "disabling EPSV usage\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mode[modeoff]) {
|
if (!mode[modeoff]) {
|
||||||
@@ -1536,7 +1589,6 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
|
|||||||
|
|
||||||
snprintf(newhost, sizeof(newhost),
|
snprintf(newhost, sizeof(newhost),
|
||||||
"%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
"%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
||||||
newhostp = newhost;
|
|
||||||
newport = (port[0]<<8) + port[1];
|
newport = (port[0]<<8) + port[1];
|
||||||
}
|
}
|
||||||
else if (229 == results[modeoff]) {
|
else if (229 == results[modeoff]) {
|
||||||
@@ -1565,8 +1617,8 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
|
|||||||
if(ptr) {
|
if(ptr) {
|
||||||
newport = num;
|
newport = num;
|
||||||
|
|
||||||
/* we should use the same host we already are connected to */
|
/* We must use the same IP we are already connected to */
|
||||||
newhostp = conn->host.name;
|
Curl_printable_address(conn->ip_addr, newhost, NEWHOST_BUFSIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1598,12 +1650,12 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* normal, direct, ftp connection */
|
/* normal, direct, ftp connection */
|
||||||
rc = Curl_resolv(conn, newhostp, newport, &addr);
|
rc = Curl_resolv(conn, newhost, newport, &addr);
|
||||||
if(rc == CURLRESOLV_PENDING)
|
if(rc == CURLRESOLV_PENDING)
|
||||||
rc = Curl_wait_for_resolv(conn, &addr);
|
rc = Curl_wait_for_resolv(conn, &addr);
|
||||||
|
|
||||||
if(!addr) {
|
if(!addr) {
|
||||||
failf(data, "Can't resolve new host %s:%d", newhostp, newport);
|
failf(data, "Can't resolve new host %s:%d", newhost, newport);
|
||||||
return CURLE_FTP_CANT_GET_HOST;
|
return CURLE_FTP_CANT_GET_HOST;
|
||||||
}
|
}
|
||||||
connectport = newport; /* we connect to the remote port */
|
connectport = newport; /* we connect to the remote port */
|
||||||
@@ -1628,13 +1680,13 @@ CURLcode ftp_use_pasv(struct connectdata *conn,
|
|||||||
|
|
||||||
if(data->set.verbose)
|
if(data->set.verbose)
|
||||||
/* this just dumps information about this second connection */
|
/* this just dumps information about this second connection */
|
||||||
ftp_pasv_verbose(conn, conninfo, newhostp, connectport);
|
ftp_pasv_verbose(conn, conninfo, newhost, connectport);
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#ifndef CURL_DISABLE_HTTP
|
||||||
if(conn->bits.tunnel_proxy) {
|
if(conn->bits.tunnel_proxy) {
|
||||||
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||||
result = Curl_ConnectHTTPProxyTunnel(conn, SECONDARYSOCKET,
|
result = Curl_ConnectHTTPProxyTunnel(conn, SECONDARYSOCKET,
|
||||||
newhostp, newport);
|
newhost, newport);
|
||||||
if(CURLE_OK != result)
|
if(CURLE_OK != result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1917,7 +1969,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
|
|||||||
failf(data, "Offset (%" FORMAT_OFF_T
|
failf(data, "Offset (%" FORMAT_OFF_T
|
||||||
") was beyond file size (%" FORMAT_OFF_T ")",
|
") was beyond file size (%" FORMAT_OFF_T ")",
|
||||||
conn->resume_from, foundsize);
|
conn->resume_from, foundsize);
|
||||||
return CURLE_FTP_BAD_DOWNLOAD_RESUME;
|
return CURLE_BAD_DOWNLOAD_RESUME;
|
||||||
}
|
}
|
||||||
/* convert to size to download */
|
/* convert to size to download */
|
||||||
downloadsize = -conn->resume_from;
|
downloadsize = -conn->resume_from;
|
||||||
@@ -1929,7 +1981,7 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
|
|||||||
failf(data, "Offset (%" FORMAT_OFF_T
|
failf(data, "Offset (%" FORMAT_OFF_T
|
||||||
") was beyond file size (%" FORMAT_OFF_T ")",
|
") was beyond file size (%" FORMAT_OFF_T ")",
|
||||||
conn->resume_from, foundsize);
|
conn->resume_from, foundsize);
|
||||||
return CURLE_FTP_BAD_DOWNLOAD_RESUME;
|
return CURLE_BAD_DOWNLOAD_RESUME;
|
||||||
}
|
}
|
||||||
/* Now store the number of bytes we are expected to download */
|
/* Now store the number of bytes we are expected to download */
|
||||||
downloadsize = foundsize-conn->resume_from;
|
downloadsize = foundsize-conn->resume_from;
|
||||||
@@ -2372,6 +2424,10 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
|
|||||||
ftp->cache = NULL;
|
ftp->cache = NULL;
|
||||||
}
|
}
|
||||||
freedirs(ftp);
|
freedirs(ftp);
|
||||||
|
if(ftp->prevpath) {
|
||||||
|
free(ftp->prevpath);
|
||||||
|
ftp->prevpath = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
@@ -2647,6 +2703,7 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
CURLcode retcode = CURLE_OK;
|
CURLcode retcode = CURLE_OK;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct FTP *ftp;
|
struct FTP *ftp;
|
||||||
|
size_t dlen;
|
||||||
|
|
||||||
char *slash_pos; /* position of the first '/' char in curpos */
|
char *slash_pos; /* position of the first '/' char in curpos */
|
||||||
char *cur_pos = conn->path; /* current position in path. point at the begin
|
char *cur_pos = conn->path; /* current position in path. point at the begin
|
||||||
@@ -2717,6 +2774,24 @@ CURLcode ftp_parse_url_path(struct connectdata *conn)
|
|||||||
ftp->file=NULL; /* instead of point to a zero byte, we make it a NULL
|
ftp->file=NULL; /* instead of point to a zero byte, we make it a NULL
|
||||||
pointer */
|
pointer */
|
||||||
|
|
||||||
|
ftp->cwddone = FALSE; /* default to not done */
|
||||||
|
|
||||||
|
if(ftp->prevpath) {
|
||||||
|
/* prevpath is "raw" so we convert the input path before we compare the
|
||||||
|
strings */
|
||||||
|
char *path = curl_unescape(conn->path, 0);
|
||||||
|
if(!path)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
dlen = strlen(path) - (ftp->file?strlen(ftp->file):0);
|
||||||
|
if((dlen == strlen(ftp->prevpath)) &&
|
||||||
|
curl_strnequal(path, ftp->prevpath, dlen)) {
|
||||||
|
infof(data, "Request has same path as previous transfer\n");
|
||||||
|
ftp->cwddone = TRUE;
|
||||||
|
}
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
|
||||||
return retcode;
|
return retcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2737,6 +2812,10 @@ CURLcode ftp_cwd_and_create_path(struct connectdata *conn)
|
|||||||
struct FTP *ftp = conn->proto.ftp;
|
struct FTP *ftp = conn->proto.ftp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if(ftp->cwddone)
|
||||||
|
/* already done and fine */
|
||||||
|
return CURLE_OK;
|
||||||
|
|
||||||
/* This is a re-used connection. Since we change directory to where the
|
/* This is a re-used connection. Since we change directory to where the
|
||||||
transfer is taking place, we must now get back to the original dir
|
transfer is taking place, we must now get back to the original dir
|
||||||
where we ended up after login: */
|
where we ended up after login: */
|
||||||
|
@@ -43,6 +43,9 @@
|
|||||||
static
|
static
|
||||||
char *GetEnv(const char *variable)
|
char *GetEnv(const char *variable)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
/* This shit requires windows.h (HUGE) to be included */
|
/* This shit requires windows.h (HUGE) to be included */
|
||||||
char env[MAX_PATH]; /* MAX_PATH is from windef.h */
|
char env[MAX_PATH]; /* MAX_PATH is from windef.h */
|
||||||
@@ -62,6 +65,7 @@ char *GetEnv(const char *variable)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return (env && env[0])?strdup(env):NULL;
|
return (env && env[0])?strdup(env):NULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
char *curl_getenv(const char *v)
|
char *curl_getenv(const char *v)
|
||||||
|
@@ -33,12 +33,13 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
#include "ssluse.h"
|
||||||
|
|
||||||
/* Make this the last #include */
|
/* Make this the last #include */
|
||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is supposed to be called in the beginning of a permform() session
|
* This is supposed to be called in the beginning of a perform() session
|
||||||
* and should reset all session-info variables
|
* and should reset all session-info variables
|
||||||
*/
|
*/
|
||||||
CURLcode Curl_initinfo(struct SessionHandle *data)
|
CURLcode Curl_initinfo(struct SessionHandle *data)
|
||||||
@@ -63,6 +64,7 @@ CURLcode Curl_initinfo(struct SessionHandle *data)
|
|||||||
|
|
||||||
info->header_size = 0;
|
info->header_size = 0;
|
||||||
info->request_size = 0;
|
info->request_size = 0;
|
||||||
|
info->numconnects = 0;
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,6 +74,7 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
long *param_longp=NULL;
|
long *param_longp=NULL;
|
||||||
double *param_doublep=NULL;
|
double *param_doublep=NULL;
|
||||||
char **param_charp=NULL;
|
char **param_charp=NULL;
|
||||||
|
struct curl_slist **param_slistp=NULL;
|
||||||
va_start(arg, info);
|
va_start(arg, info);
|
||||||
|
|
||||||
switch(info&CURLINFO_TYPEMASK) {
|
switch(info&CURLINFO_TYPEMASK) {
|
||||||
@@ -92,6 +95,11 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
if(NULL == param_doublep)
|
if(NULL == param_doublep)
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
break;
|
break;
|
||||||
|
case CURLINFO_SLIST:
|
||||||
|
param_slistp = va_arg(arg, struct curl_slist **);
|
||||||
|
if(NULL == param_slistp)
|
||||||
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(info) {
|
switch(info) {
|
||||||
@@ -159,7 +167,7 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
*param_charp = data->info.contenttype;
|
*param_charp = data->info.contenttype;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_PRIVATE:
|
case CURLINFO_PRIVATE:
|
||||||
*param_charp = data->set.private;
|
*param_charp = data->set.private_data;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_HTTPAUTH_AVAIL:
|
case CURLINFO_HTTPAUTH_AVAIL:
|
||||||
*param_longp = data->info.httpauthavail;
|
*param_longp = data->info.httpauthavail;
|
||||||
@@ -170,6 +178,12 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
|||||||
case CURLINFO_OS_ERRNO:
|
case CURLINFO_OS_ERRNO:
|
||||||
*param_longp = data->state.os_errno;
|
*param_longp = data->state.os_errno;
|
||||||
break;
|
break;
|
||||||
|
case CURLINFO_NUM_CONNECTS:
|
||||||
|
*param_longp = data->info.numconnects;
|
||||||
|
break;
|
||||||
|
case CURLINFO_SSL_ENGINES:
|
||||||
|
*param_slistp = Curl_SSL_engines_list(data);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return CURLE_BAD_FUNCTION_ARGUMENT;
|
return CURLE_BAD_FUNCTION_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
@@ -174,7 +174,8 @@ void Curl_global_host_cache_dtor(void)
|
|||||||
int Curl_num_addresses(const Curl_addrinfo *addr)
|
int Curl_num_addresses(const Curl_addrinfo *addr)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; addr; addr = addr->ai_next, i++);
|
for (i = 0; addr; addr = addr->ai_next, i++)
|
||||||
|
; /* empty loop */
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -195,7 +195,9 @@ static unsigned __stdcall gethostbyname_thread (void *arg)
|
|||||||
* hopefully make printouts synchronised. I'm not sure it works
|
* hopefully make printouts synchronised. I'm not sure it works
|
||||||
* with a static runtime lib (MSVC's libc.lib).
|
* with a static runtime lib (MSVC's libc.lib).
|
||||||
*/
|
*/
|
||||||
|
#ifndef _WIN32_WCE
|
||||||
*stderr = *td->stderr_file;
|
*stderr = *td->stderr_file;
|
||||||
|
#endif
|
||||||
|
|
||||||
WSASetLastError (conn->async.status = NO_DATA); /* pending status */
|
WSASetLastError (conn->async.status = NO_DATA); /* pending status */
|
||||||
he = gethostbyname (conn->async.hostname);
|
he = gethostbyname (conn->async.hostname);
|
||||||
@@ -375,8 +377,17 @@ static bool init_resolve_thread (struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
td->stderr_file = stderr;
|
td->stderr_file = stderr;
|
||||||
|
|
||||||
|
#ifdef _WIN32_WCE
|
||||||
|
td->thread_hnd = (HANDLE) CreateThread(NULL, 0,
|
||||||
|
(LPTHREAD_START_ROUTINE) THREAD_FUNC,
|
||||||
|
conn, 0, &td->thread_id);
|
||||||
|
#else
|
||||||
|
|
||||||
td->thread_hnd = (HANDLE) _beginthreadex(NULL, 0, THREAD_FUNC,
|
td->thread_hnd = (HANDLE) _beginthreadex(NULL, 0, THREAD_FUNC,
|
||||||
conn, 0, &td->thread_id);
|
conn, 0, &td->thread_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CURLRES_IPV6
|
#ifdef CURLRES_IPV6
|
||||||
curlassert(hints);
|
curlassert(hints);
|
||||||
td->hints = *hints;
|
td->hints = *hints;
|
||||||
@@ -450,8 +461,9 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
|||||||
TRACE(("%s() thread stuck?!, ", THREAD_NAME));
|
TRACE(("%s() thread stuck?!, ", THREAD_NAME));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Thread finished before timeout; propagate Winsock error to this thread.
|
/* Thread finished before timeout; propagate Winsock error to this
|
||||||
* 'conn->async.done = TRUE' is set in Curl_addrinfo4/6_callback().
|
* thread. 'conn->async.done = TRUE' is set in
|
||||||
|
* Curl_addrinfo4/6_callback().
|
||||||
*/
|
*/
|
||||||
WSASetLastError(conn->async.status);
|
WSASetLastError(conn->async.status);
|
||||||
GetExitCodeThread(td->thread_hnd, &td->thread_status);
|
GetExitCodeThread(td->thread_hnd, &td->thread_status);
|
||||||
|
312
lib/http.c
312
lib/http.c
@@ -30,8 +30,12 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_STAT_H
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
@@ -70,10 +74,6 @@
|
|||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SELECT_H
|
|
||||||
#include <sys/select.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
@@ -94,6 +94,7 @@
|
|||||||
#include "hostip.h"
|
#include "hostip.h"
|
||||||
#include "http.h"
|
#include "http.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
#include "select.h"
|
||||||
|
|
||||||
#define _MPRINTF_REPLACE /* use our functions only */
|
#define _MPRINTF_REPLACE /* use our functions only */
|
||||||
#include <curl/mprintf.h>
|
#include <curl/mprintf.h>
|
||||||
@@ -191,6 +192,87 @@ static bool pickoneauth(struct auth *pick)
|
|||||||
return picked;
|
return picked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* perhapsrewind()
|
||||||
|
*
|
||||||
|
* If we are doing POST or PUT {
|
||||||
|
* If we have more data to send {
|
||||||
|
* If we are doing NTLM {
|
||||||
|
* Keep sending since we must not disconnect
|
||||||
|
* }
|
||||||
|
* else {
|
||||||
|
* If there is more than just a little data left to send, close
|
||||||
|
* the current connection by force.
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* If we have sent any data {
|
||||||
|
* If we don't have track of all the data {
|
||||||
|
* call app to tell it to rewind
|
||||||
|
* }
|
||||||
|
* else {
|
||||||
|
* rewind internally so that the operation can restart fine
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
static CURLcode perhapsrewind(struct connectdata *conn)
|
||||||
|
{
|
||||||
|
struct HTTP *http = conn->proto.http;
|
||||||
|
struct SessionHandle *data = conn->data;
|
||||||
|
curl_off_t bytessent;
|
||||||
|
curl_off_t expectsend = -1; /* default is unknown */
|
||||||
|
|
||||||
|
if(!http)
|
||||||
|
/* If this is still NULL, we have not reach very far and we can
|
||||||
|
safely skip this rewinding stuff */
|
||||||
|
return CURLE_OK;
|
||||||
|
|
||||||
|
bytessent = http->writebytecount;
|
||||||
|
|
||||||
|
/* figure out how much data we are expected to send */
|
||||||
|
switch(data->set.httpreq) {
|
||||||
|
case HTTPREQ_POST:
|
||||||
|
if(data->set.postfieldsize != -1)
|
||||||
|
expectsend = data->set.postfieldsize;
|
||||||
|
break;
|
||||||
|
case HTTPREQ_PUT:
|
||||||
|
if(data->set.infilesize != -1)
|
||||||
|
expectsend = data->set.infilesize;
|
||||||
|
break;
|
||||||
|
case HTTPREQ_POST_FORM:
|
||||||
|
expectsend = http->postsize;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
conn->bits.rewindaftersend = FALSE; /* default */
|
||||||
|
|
||||||
|
if((expectsend == -1) || (expectsend > bytessent)) {
|
||||||
|
/* There is still data left to send */
|
||||||
|
if((data->state.authproxy.picked == CURLAUTH_NTLM) ||/* using NTLM */
|
||||||
|
(data->state.authhost.picked == CURLAUTH_NTLM) ) {
|
||||||
|
conn->bits.close = FALSE; /* don't close, keep on sending */
|
||||||
|
|
||||||
|
/* rewind data when completely done sending! */
|
||||||
|
conn->bits.rewindaftersend = TRUE;
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* If there is more than just a little data left to send, close the
|
||||||
|
* current connection by force.
|
||||||
|
*/
|
||||||
|
conn->bits.close = TRUE;
|
||||||
|
conn->size = 0; /* don't download any more than 0 bytes */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bytessent)
|
||||||
|
return Curl_readrewind(conn);
|
||||||
|
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Curl_http_auth_act() gets called when a all HTTP headers have been received
|
* Curl_http_auth_act() gets called when a all HTTP headers have been received
|
||||||
* and it checks what authentication methods that are available and decides
|
* and it checks what authentication methods that are available and decides
|
||||||
@@ -210,25 +292,33 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
|
|||||||
|
|
||||||
if(conn->bits.user_passwd &&
|
if(conn->bits.user_passwd &&
|
||||||
((conn->keep.httpcode == 401) ||
|
((conn->keep.httpcode == 401) ||
|
||||||
(conn->bits.authprobe && conn->keep.httpcode < 300))) {
|
(conn->bits.authneg && conn->keep.httpcode < 300))) {
|
||||||
pickhost = pickoneauth(&data->state.authhost);
|
pickhost = pickoneauth(&data->state.authhost);
|
||||||
if(!pickhost)
|
if(!pickhost)
|
||||||
data->state.authproblem = TRUE;
|
data->state.authproblem = TRUE;
|
||||||
}
|
}
|
||||||
if(conn->bits.proxy_user_passwd &&
|
if(conn->bits.proxy_user_passwd &&
|
||||||
((conn->keep.httpcode == 407) ||
|
((conn->keep.httpcode == 407) ||
|
||||||
(conn->bits.authprobe && conn->keep.httpcode < 300))) {
|
(conn->bits.authneg && conn->keep.httpcode < 300))) {
|
||||||
pickproxy = pickoneauth(&data->state.authproxy);
|
pickproxy = pickoneauth(&data->state.authproxy);
|
||||||
if(!pickproxy)
|
if(!pickproxy)
|
||||||
data->state.authproblem = TRUE;
|
data->state.authproblem = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pickhost || pickproxy)
|
if(pickhost || pickproxy) {
|
||||||
conn->newurl = strdup(data->change.url); /* clone URL */
|
conn->newurl = strdup(data->change.url); /* clone URL */
|
||||||
|
|
||||||
|
if((data->set.httpreq != HTTPREQ_GET) &&
|
||||||
|
(data->set.httpreq != HTTPREQ_HEAD)) {
|
||||||
|
code = perhapsrewind(conn);
|
||||||
|
if(code)
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
else if((conn->keep.httpcode < 300) &&
|
else if((conn->keep.httpcode < 300) &&
|
||||||
(!data->state.authhost.done) &&
|
(!data->state.authhost.done) &&
|
||||||
conn->bits.authprobe) {
|
conn->bits.authneg) {
|
||||||
/* no (known) authentication available,
|
/* no (known) authentication available,
|
||||||
authentication is not "done" yet and
|
authentication is not "done" yet and
|
||||||
no authentication seems to be required and
|
no authentication seems to be required and
|
||||||
@@ -272,29 +362,34 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
struct SessionHandle *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
char *auth=NULL;
|
char *auth=NULL;
|
||||||
|
struct auth *authhost;
|
||||||
|
struct auth *authproxy;
|
||||||
|
|
||||||
curlassert(data);
|
curlassert(data);
|
||||||
|
|
||||||
|
authhost = &data->state.authhost;
|
||||||
|
authproxy = &data->state.authproxy;
|
||||||
|
|
||||||
if((conn->bits.httpproxy && conn->bits.proxy_user_passwd) ||
|
if((conn->bits.httpproxy && conn->bits.proxy_user_passwd) ||
|
||||||
conn->bits.user_passwd)
|
conn->bits.user_passwd)
|
||||||
/* continue please */ ;
|
/* continue please */ ;
|
||||||
else {
|
else {
|
||||||
data->state.authhost.done = TRUE;
|
authhost->done = TRUE;
|
||||||
data->state.authproxy.done = TRUE;
|
authproxy->done = TRUE;
|
||||||
return CURLE_OK; /* no authentication with no user or password */
|
return CURLE_OK; /* no authentication with no user or password */
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data->state.authhost.want && !data->state.authhost.picked)
|
if(authhost->want && !authhost->picked)
|
||||||
/* The app has selected one or more methods, but none has been picked
|
/* The app has selected one or more methods, but none has been picked
|
||||||
so far by a server round-trip. Then we set the picked one to the
|
so far by a server round-trip. Then we set the picked one to the
|
||||||
want one, and if this is one single bit it'll be used instantly. */
|
want one, and if this is one single bit it'll be used instantly. */
|
||||||
data->state.authhost.picked = data->state.authhost.want;
|
authhost->picked = authhost->want;
|
||||||
|
|
||||||
if(data->state.authproxy.want && !data->state.authproxy.picked)
|
if(authproxy->want && !authproxy->picked)
|
||||||
/* The app has selected one or more methods, but none has been picked so
|
/* The app has selected one or more methods, but none has been picked so
|
||||||
far by a proxy round-trip. Then we set the picked one to the want one,
|
far by a proxy round-trip. Then we set the picked one to the want one,
|
||||||
and if this is one single bit it'll be used instantly. */
|
and if this is one single bit it'll be used instantly. */
|
||||||
data->state.authproxy.picked = data->state.authproxy.want;
|
authproxy->picked = authproxy->want;
|
||||||
|
|
||||||
/* To prevent the user+password to get sent to other than the original
|
/* To prevent the user+password to get sent to other than the original
|
||||||
host due to a location-follow, we do some weirdo checks here */
|
host due to a location-follow, we do some weirdo checks here */
|
||||||
@@ -307,7 +402,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
if (conn->bits.httpproxy &&
|
if (conn->bits.httpproxy &&
|
||||||
(conn->bits.tunnel_proxy == proxytunnel)) {
|
(conn->bits.tunnel_proxy == proxytunnel)) {
|
||||||
#ifdef USE_SSLEAY
|
#ifdef USE_SSLEAY
|
||||||
if(data->state.authproxy.want == CURLAUTH_NTLM) {
|
if(authproxy->want == CURLAUTH_NTLM) {
|
||||||
auth=(char *)"NTLM";
|
auth=(char *)"NTLM";
|
||||||
result = Curl_output_ntlm(conn, TRUE);
|
result = Curl_output_ntlm(conn, TRUE);
|
||||||
if(result)
|
if(result)
|
||||||
@@ -315,7 +410,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if(data->state.authproxy.want == CURLAUTH_BASIC) {
|
if(authproxy->want == CURLAUTH_BASIC) {
|
||||||
/* Basic */
|
/* Basic */
|
||||||
if(conn->bits.proxy_user_passwd &&
|
if(conn->bits.proxy_user_passwd &&
|
||||||
!checkheaders(data, "Proxy-authorization:")) {
|
!checkheaders(data, "Proxy-authorization:")) {
|
||||||
@@ -324,9 +419,12 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
data->state.authproxy.done = TRUE;
|
/* NOTE: Curl_output_basic() should set 'done' TRUE, as the other auth
|
||||||
|
functions work that way */
|
||||||
|
authproxy->done = TRUE;
|
||||||
}
|
}
|
||||||
else if(data->state.authproxy.want == CURLAUTH_DIGEST) {
|
#ifndef CURL_DISABLE_CRYPTO_AUTH
|
||||||
|
else if(authproxy->want == CURLAUTH_DIGEST) {
|
||||||
auth=(char *)"Digest";
|
auth=(char *)"Digest";
|
||||||
result = Curl_output_digest(conn,
|
result = Curl_output_digest(conn,
|
||||||
TRUE, /* proxy */
|
TRUE, /* proxy */
|
||||||
@@ -335,32 +433,37 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
if(auth) {
|
||||||
infof(data, "Proxy auth using %s with user '%s'\n",
|
infof(data, "Proxy auth using %s with user '%s'\n",
|
||||||
auth, conn->proxyuser?conn->proxyuser:"");
|
auth, conn->proxyuser?conn->proxyuser:"");
|
||||||
|
authproxy->multi = !authproxy->done;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
authproxy->multi = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* we have no proxy so let's pretend we're done authenticating
|
/* we have no proxy so let's pretend we're done authenticating
|
||||||
with it */
|
with it */
|
||||||
data->state.authproxy.done = TRUE;
|
authproxy->done = TRUE;
|
||||||
|
|
||||||
/* Send web authentication header if needed */
|
/* Send web authentication header if needed */
|
||||||
{
|
{
|
||||||
auth = NULL;
|
auth = NULL;
|
||||||
#ifdef HAVE_GSSAPI
|
#ifdef HAVE_GSSAPI
|
||||||
if((data->state.authhost.want == CURLAUTH_GSSNEGOTIATE) &&
|
if((authhost->want == CURLAUTH_GSSNEGOTIATE) &&
|
||||||
data->state.negotiate.context &&
|
data->state.negotiate.context &&
|
||||||
!GSS_ERROR(data->state.negotiate.status)) {
|
!GSS_ERROR(data->state.negotiate.status)) {
|
||||||
auth=(char *)"GSS-Negotiate";
|
auth=(char *)"GSS-Negotiate";
|
||||||
result = Curl_output_negotiate(conn);
|
result = Curl_output_negotiate(conn);
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
data->state.authhost.done = TRUE;
|
authhost->done = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_SSLEAY
|
#ifdef USE_SSLEAY
|
||||||
if(data->state.authhost.picked == CURLAUTH_NTLM) {
|
if(authhost->picked == CURLAUTH_NTLM) {
|
||||||
auth=(char *)"NTLM";
|
auth=(char *)"NTLM";
|
||||||
result = Curl_output_ntlm(conn, FALSE);
|
result = Curl_output_ntlm(conn, FALSE);
|
||||||
if(result)
|
if(result)
|
||||||
@@ -369,7 +472,8 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if(data->state.authhost.picked == CURLAUTH_DIGEST) {
|
#ifndef CURL_DISABLE_CRYPTO_AUTH
|
||||||
|
if(authhost->picked == CURLAUTH_DIGEST) {
|
||||||
auth=(char *)"Digest";
|
auth=(char *)"Digest";
|
||||||
result = Curl_output_digest(conn,
|
result = Curl_output_digest(conn,
|
||||||
FALSE, /* not a proxy */
|
FALSE, /* not a proxy */
|
||||||
@@ -377,8 +481,9 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
(unsigned char *)path);
|
(unsigned char *)path);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
} else
|
||||||
else if(data->state.authhost.picked == CURLAUTH_BASIC) {
|
#endif
|
||||||
|
if(authhost->picked == CURLAUTH_BASIC) {
|
||||||
if(conn->bits.user_passwd &&
|
if(conn->bits.user_passwd &&
|
||||||
!checkheaders(data, "Authorization:")) {
|
!checkheaders(data, "Authorization:")) {
|
||||||
auth=(char *)"Basic";
|
auth=(char *)"Basic";
|
||||||
@@ -387,16 +492,21 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
/* basic is always ready */
|
/* basic is always ready */
|
||||||
data->state.authhost.done = TRUE;
|
authhost->done = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(auth)
|
if(auth) {
|
||||||
infof(data, "Server auth using %s with user '%s'\n",
|
infof(data, "Server auth using %s with user '%s'\n",
|
||||||
auth, conn->user);
|
auth, conn->user);
|
||||||
|
|
||||||
|
authhost->multi = !authhost->done;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
authhost->multi = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
data->state.authhost.done = TRUE;
|
authhost->done = TRUE;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -485,6 +595,7 @@ CURLcode Curl_http_input_auth(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef CURL_DISABLE_CRYPTO_AUTH
|
||||||
if(checkprefix("Digest", start)) {
|
if(checkprefix("Digest", start)) {
|
||||||
CURLdigest dig;
|
CURLdigest dig;
|
||||||
*availp |= CURLAUTH_DIGEST;
|
*availp |= CURLAUTH_DIGEST;
|
||||||
@@ -500,7 +611,9 @@ CURLcode Curl_http_input_auth(struct connectdata *conn,
|
|||||||
data->state.authproblem = TRUE;
|
data->state.authproblem = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(checkprefix("Basic", start)) {
|
else
|
||||||
|
#endif
|
||||||
|
if(checkprefix("Basic", start)) {
|
||||||
*availp |= CURLAUTH_BASIC;
|
*availp |= CURLAUTH_BASIC;
|
||||||
authp->avail |= CURLAUTH_BASIC;
|
authp->avail |= CURLAUTH_BASIC;
|
||||||
if(authp->picked == CURLAUTH_BASIC) {
|
if(authp->picked == CURLAUTH_BASIC) {
|
||||||
@@ -553,6 +666,14 @@ int Curl_http_should_fail(struct connectdata *conn)
|
|||||||
if (k->httpcode < 400)
|
if (k->httpcode < 400)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (conn->resume_from &&
|
||||||
|
(data->set.httpreq==HTTPREQ_GET) &&
|
||||||
|
(k->httpcode == 416)) {
|
||||||
|
/* "Requested Range Not Satisfiable", just proceed and
|
||||||
|
pretend this is no error */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Any code >= 400 that's not 401 or 407 is always
|
** Any code >= 400 that's not 401 or 407 is always
|
||||||
** a terminal error
|
** a terminal error
|
||||||
@@ -910,16 +1031,13 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
struct Curl_transfer_keeper *k = &conn->keep;
|
struct Curl_transfer_keeper *k = &conn->keep;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
size_t nread; /* total size read */
|
size_t nread; /* total size read */
|
||||||
int perline; /* count bytes per line */
|
int perline; /* count bytes per line */
|
||||||
bool keepon=TRUE;
|
bool keepon=TRUE;
|
||||||
ssize_t gotbytes;
|
ssize_t gotbytes;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
long timeout = 3600; /* default timeout in seconds */
|
long timeout =
|
||||||
struct timeval interval;
|
data->set.timeout?data->set.timeout:3600; /* in seconds */
|
||||||
fd_set rkeepfd;
|
|
||||||
fd_set readfd;
|
|
||||||
char *line_start;
|
char *line_start;
|
||||||
char *host_port;
|
char *host_port;
|
||||||
curl_socket_t tunnelsocket = conn->sock[sockindex];
|
curl_socket_t tunnelsocket = conn->sock[sockindex];
|
||||||
@@ -956,7 +1074,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
"%s"
|
"%s"
|
||||||
"\r\n",
|
"\r\n",
|
||||||
hostname, remote_port,
|
hostname, remote_port,
|
||||||
conn->bits.proxy_user_passwd?
|
conn->allocptr.proxyuserpwd?
|
||||||
conn->allocptr.proxyuserpwd:"",
|
conn->allocptr.proxyuserpwd:"",
|
||||||
data->set.useragent?conn->allocptr.uagent:""
|
data->set.useragent?conn->allocptr.uagent:""
|
||||||
);
|
);
|
||||||
@@ -967,13 +1085,6 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
FD_ZERO (&readfd); /* clear it */
|
|
||||||
FD_SET (tunnelsocket, &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=data->state.buffer;
|
ptr=data->state.buffer;
|
||||||
line_start = ptr;
|
line_start = ptr;
|
||||||
|
|
||||||
@@ -982,22 +1093,18 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
keepon=TRUE;
|
keepon=TRUE;
|
||||||
|
|
||||||
while((nread<BUFSIZE) && (keepon && !error)) {
|
while((nread<BUFSIZE) && (keepon && !error)) {
|
||||||
readfd = rkeepfd; /* set every lap */
|
|
||||||
interval.tv_sec = 1; /* timeout each second and check the timeout */
|
|
||||||
interval.tv_usec = 0;
|
|
||||||
|
|
||||||
if(data->set.timeout) {
|
|
||||||
/* if timeout is requested, find out how much remaining time we have */
|
/* if timeout is requested, find out how much remaining time we have */
|
||||||
timeout = data->set.timeout - /* timeout time */
|
long check = timeout - /* timeout time */
|
||||||
Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */
|
Curl_tvdiff(Curl_tvnow(), conn->now)/1000; /* spent time */
|
||||||
if(timeout <=0 ) {
|
if(check <=0 ) {
|
||||||
failf(data, "Proxy connection aborted due to timeout");
|
failf(data, "Proxy CONNECT aborted due to timeout");
|
||||||
error = SELECT_TIMEOUT; /* already too little time */
|
error = SELECT_TIMEOUT; /* already too little time */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
switch (select (tunnelsocket+1, &readfd, NULL, NULL, &interval)) {
|
/* timeout each second and check the timeout */
|
||||||
|
switch (Curl_select(tunnelsocket, CURL_SOCKET_BAD, 1000)) {
|
||||||
case -1: /* select() error, stop reading */
|
case -1: /* select() error, stop reading */
|
||||||
error = SELECT_ERROR;
|
error = SELECT_ERROR;
|
||||||
failf(data, "Proxy CONNECT aborted due to select() error");
|
failf(data, "Proxy CONNECT aborted due to select() error");
|
||||||
@@ -1005,12 +1112,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
case 0: /* timeout */
|
case 0: /* timeout */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/*
|
res = Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread, &gotbytes);
|
||||||
* 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!
|
|
||||||
*/
|
|
||||||
res= Curl_read(conn, tunnelsocket, ptr, BUFSIZE-nread, &gotbytes);
|
|
||||||
if(res< 0)
|
if(res< 0)
|
||||||
/* EWOULDBLOCK */
|
/* EWOULDBLOCK */
|
||||||
continue; /* go loop yourself */
|
continue; /* go loop yourself */
|
||||||
@@ -1025,12 +1127,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
/*
|
/*
|
||||||
* We got a whole chunk of data, which can be anything from one byte
|
* We got a whole chunk of data, which can be anything from one byte
|
||||||
* to a set of lines and possibly just a piece of the last line.
|
* to a set of lines and possibly just a piece of the last line.
|
||||||
*
|
*/
|
||||||
* TODO: To make this code work less error-prone, we need to make
|
|
||||||
* sure that we read and create full lines before we compare them,
|
|
||||||
* as there is really nothing that stops the proxy from delivering
|
|
||||||
* the response lines in multiple parts, each part consisting of
|
|
||||||
* only a little piece of the line(s). */
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
nread += gotbytes;
|
nread += gotbytes;
|
||||||
@@ -1040,7 +1137,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
char letter;
|
char letter;
|
||||||
int writetype;
|
int writetype;
|
||||||
|
|
||||||
/* output debug output if that is requested */
|
/* output debug if that is requested */
|
||||||
if(data->set.verbose)
|
if(data->set.verbose)
|
||||||
Curl_debug(data, CURLINFO_HEADER_IN, line_start, perline,
|
Curl_debug(data, CURLINFO_HEADER_IN, line_start, perline,
|
||||||
conn->host.dispname);
|
conn->host.dispname);
|
||||||
@@ -1202,6 +1299,11 @@ CURLcode Curl_http_done(struct connectdata *conn,
|
|||||||
conn->bytecount = http->readbytecount + http->writebytecount;
|
conn->bytecount = http->readbytecount + http->writebytecount;
|
||||||
|
|
||||||
Curl_formclean(http->sendit); /* Now free that whole lot */
|
Curl_formclean(http->sendit); /* Now free that whole lot */
|
||||||
|
if(http->form.fp) {
|
||||||
|
/* a file being uploaded was left opened, close it! */
|
||||||
|
fclose(http->form.fp);
|
||||||
|
http->form.fp = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(HTTPREQ_PUT == data->set.httpreq)
|
else if(HTTPREQ_PUT == data->set.httpreq)
|
||||||
conn->bytecount = http->readbytecount + http->writebytecount;
|
conn->bytecount = http->readbytecount + http->writebytecount;
|
||||||
@@ -1300,20 +1402,15 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
if((!data->state.authhost.done || !data->state.authproxy.done ) &&
|
if((data->state.authhost.multi || data->state.authproxy.multi) &&
|
||||||
(httpreq != HTTPREQ_GET)) {
|
(httpreq != HTTPREQ_GET) &&
|
||||||
/* Until we are authenticated, we switch over to HEAD. Unless its a GET
|
(httpreq != HTTPREQ_HEAD)) {
|
||||||
we want to do. The explanation for this is rather long and boring, but
|
/* Auth is required and we are not authenticated yet. Make a PUT or POST
|
||||||
the point is that it can't be done otherwise without risking having to
|
with content-length zero as a "probe". */
|
||||||
send the POST or PUT data multiple times. */
|
conn->bits.authneg = TRUE;
|
||||||
httpreq = HTTPREQ_HEAD;
|
|
||||||
request = (char *)"HEAD";
|
|
||||||
conn->bits.no_body = TRUE;
|
|
||||||
conn->bits.authprobe = TRUE; /* this is a request done to probe for
|
|
||||||
authentication methods */
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
conn->bits.authprobe = FALSE;
|
conn->bits.authneg = FALSE;
|
||||||
|
|
||||||
Curl_safefree(conn->allocptr.ref);
|
Curl_safefree(conn->allocptr.ref);
|
||||||
if(data->change.referer && !checkheaders(data, "Referer:"))
|
if(data->change.referer && !checkheaders(data, "Referer:"))
|
||||||
@@ -1364,6 +1461,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
ptr = checkheaders(data, "Host:");
|
ptr = checkheaders(data, "Host:");
|
||||||
if(ptr && (!data->state.this_is_a_follow ||
|
if(ptr && (!data->state.this_is_a_follow ||
|
||||||
curl_strequal(data->state.first_host, conn->host.name))) {
|
curl_strequal(data->state.first_host, conn->host.name))) {
|
||||||
|
#if !defined(CURL_DISABLE_COOKIES)
|
||||||
/* If we have a given custom Host: header, we extract the host name in
|
/* If we have a given custom Host: header, we extract the host name in
|
||||||
order to possibly use it for cookie reasons later on. We only allow the
|
order to possibly use it for cookie reasons later on. We only allow the
|
||||||
custom Host: header if this is NOT a redirect, as setting Host: in the
|
custom Host: header if this is NOT a redirect, as setting Host: in the
|
||||||
@@ -1387,6 +1485,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
memcpy(conn->allocptr.cookiehost, start, len);
|
memcpy(conn->allocptr.cookiehost, start, len);
|
||||||
conn->allocptr.cookiehost[len]=0;
|
conn->allocptr.cookiehost[len]=0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
conn->allocptr.host = NULL;
|
conn->allocptr.host = NULL;
|
||||||
}
|
}
|
||||||
@@ -1623,6 +1722,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
#if !defined(CURL_DISABLE_COOKIES)
|
||||||
if(data->cookies || addcookies) {
|
if(data->cookies || addcookies) {
|
||||||
struct Cookie *co=NULL; /* no cookies from start */
|
struct Cookie *co=NULL; /* no cookies from start */
|
||||||
int count=0;
|
int count=0;
|
||||||
@@ -1672,6 +1772,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if(data->set.timecondition) {
|
if(data->set.timecondition) {
|
||||||
struct tm *thistime;
|
struct tm *thistime;
|
||||||
@@ -1755,6 +1856,24 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
switch(httpreq) {
|
switch(httpreq) {
|
||||||
|
|
||||||
case HTTPREQ_POST_FORM:
|
case HTTPREQ_POST_FORM:
|
||||||
|
if(!http->sendit || conn->bits.authneg) {
|
||||||
|
/* nothing to post! */
|
||||||
|
result = add_bufferf(req_buffer, "Content-Length: 0\r\n\r\n");
|
||||||
|
if(result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
result = add_buffer_send(req_buffer, conn,
|
||||||
|
&data->info.request_size);
|
||||||
|
if(result)
|
||||||
|
failf(data, "Failed sending POST request");
|
||||||
|
else
|
||||||
|
/* setup variables for the upcoming transfer */
|
||||||
|
result = Curl_Transfer(conn, FIRSTSOCKET, -1, TRUE,
|
||||||
|
&http->readbytecount,
|
||||||
|
-1, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if(Curl_FormInit(&http->form, http->sendit)) {
|
if(Curl_FormInit(&http->form, http->sendit)) {
|
||||||
failf(data, "Internal HTTP POST error!");
|
failf(data, "Internal HTTP POST error!");
|
||||||
return CURLE_HTTP_POST_ERROR;
|
return CURLE_HTTP_POST_ERROR;
|
||||||
@@ -1835,11 +1954,16 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
|
|
||||||
case HTTPREQ_PUT: /* Let's PUT the data to the server! */
|
case HTTPREQ_PUT: /* Let's PUT the data to the server! */
|
||||||
|
|
||||||
if((data->set.infilesize>0) && !conn->bits.upload_chunky) {
|
if(conn->bits.authneg)
|
||||||
|
postsize = 0;
|
||||||
|
else
|
||||||
|
postsize = data->set.infilesize;
|
||||||
|
|
||||||
|
if((postsize != -1) && !conn->bits.upload_chunky) {
|
||||||
/* only add Content-Length if not uploading chunked */
|
/* only add Content-Length if not uploading chunked */
|
||||||
result = add_bufferf(req_buffer,
|
result = add_bufferf(req_buffer,
|
||||||
"Content-Length: %" FORMAT_OFF_T "\r\n", /* size */
|
"Content-Length: %" FORMAT_OFF_T "\r\n",
|
||||||
data->set.infilesize );
|
postsize );
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -1862,19 +1986,19 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
|
|
||||||
/* set the upload size to the progress meter */
|
/* set the upload size to the progress meter */
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, postsize);
|
||||||
|
|
||||||
/* this sends the buffer and frees all the buffer resources */
|
/* this sends the buffer and frees all the buffer resources */
|
||||||
result = add_buffer_send(req_buffer, conn,
|
result = add_buffer_send(req_buffer, conn,
|
||||||
&data->info.request_size);
|
&data->info.request_size);
|
||||||
if(result)
|
if(result)
|
||||||
failf(data, "Failed sending POST request");
|
failf(data, "Failed sending PUT request");
|
||||||
else
|
else
|
||||||
/* prepare for transfer */
|
/* prepare for transfer */
|
||||||
result = Curl_Transfer(conn, FIRSTSOCKET, -1, TRUE,
|
result = Curl_Transfer(conn, FIRSTSOCKET, -1, TRUE,
|
||||||
&http->readbytecount,
|
&http->readbytecount,
|
||||||
FIRSTSOCKET,
|
postsize?FIRSTSOCKET:-1,
|
||||||
&http->writebytecount);
|
postsize?&http->writebytecount:NULL);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
break;
|
break;
|
||||||
@@ -1882,8 +2006,11 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
case HTTPREQ_POST:
|
case HTTPREQ_POST:
|
||||||
/* this is the simple POST, using x-www-form-urlencoded style */
|
/* this is the simple POST, using x-www-form-urlencoded style */
|
||||||
|
|
||||||
/* store the size of the postfields */
|
if(conn->bits.authneg)
|
||||||
postsize = data->set.postfieldsize?
|
postsize = 0;
|
||||||
|
else
|
||||||
|
/* figure out the size of the postfields */
|
||||||
|
postsize = (data->set.postfieldsize != -1)?
|
||||||
data->set.postfieldsize:
|
data->set.postfieldsize:
|
||||||
(data->set.postfields?(curl_off_t)strlen(data->set.postfields):0);
|
(data->set.postfields?(curl_off_t)strlen(data->set.postfields):0);
|
||||||
|
|
||||||
@@ -1913,14 +2040,15 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
if(data->set.postfields) {
|
if(data->set.postfields) {
|
||||||
|
|
||||||
if((data->state.authhost.done || data->state.authproxy.done )
|
if((data->state.authhost.done || data->state.authproxy.done )
|
||||||
&& (postsize < (100*1024))) {
|
&& (postsize < MAX_INITIAL_POST_SIZE)) {
|
||||||
/* If we're not done with the authentication phase, we don't expect
|
/* If we're not done with the authentication phase, we don't expect
|
||||||
to actually send off any data yet. Hence, we delay the sending of
|
to actually send off any data yet. Hence, we delay the sending of
|
||||||
the body until we receive that friendly 100-continue response */
|
the body until we receive that friendly 100-continue response */
|
||||||
|
|
||||||
/* The post data is less than 100K, then append it to the header.
|
/* The post data is less than MAX_INITIAL_PORT_SIZE, then append it
|
||||||
This limit is no magic limit but only set to prevent really huge
|
to the header. This limit is no magic limit but only set to
|
||||||
POSTs to get the data duplicated with malloc() and family. */
|
prevent really huge POSTs to get the data duplicated with
|
||||||
|
malloc() and family. */
|
||||||
|
|
||||||
result = add_buffer(req_buffer, "\r\n", 2); /* end of headers! */
|
result = add_buffer(req_buffer, "\r\n", 2); /* end of headers! */
|
||||||
if(result)
|
if(result)
|
||||||
@@ -1976,13 +2104,15 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
else {
|
else {
|
||||||
add_buffer(req_buffer, "\r\n", 2); /* end of headers! */
|
add_buffer(req_buffer, "\r\n", 2); /* end of headers! */
|
||||||
|
|
||||||
|
if(data->set.postfieldsize) {
|
||||||
/* set the upload size to the progress meter */
|
/* set the upload size to the progress meter */
|
||||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
Curl_pgrsSetUploadSize(data, postsize?postsize:-1);
|
||||||
|
|
||||||
/* set the pointer to mark that we will send the post body using
|
/* set the pointer to mark that we will send the post body using
|
||||||
the read callback */
|
the read callback */
|
||||||
http->postdata = (char *)&http->postdata;
|
http->postdata = (char *)&http->postdata;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* issue the request */
|
/* issue the request */
|
||||||
result = add_buffer_send(req_buffer, conn,
|
result = add_buffer_send(req_buffer, conn,
|
||||||
&data->info.request_size);
|
&data->info.request_size);
|
||||||
|
16
lib/http.h
16
lib/http.h
@@ -57,5 +57,21 @@ int Curl_http_should_fail(struct connectdata *conn);
|
|||||||
public curl/curl.h header. */
|
public curl/curl.h header. */
|
||||||
#define CURLAUTH_PICKNONE (1<<30) /* don't use auth */
|
#define CURLAUTH_PICKNONE (1<<30) /* don't use auth */
|
||||||
|
|
||||||
|
/* MAX_INITIAL_POST_SIZE indicates the number of bytes that will make the POST
|
||||||
|
data get included in the initial data chunk sent to the server. If the
|
||||||
|
data is larger than this, it will automatically get split up in multiple
|
||||||
|
system calls.
|
||||||
|
|
||||||
|
This value used to be fairly big (100K), but we must take into account that
|
||||||
|
if the server rejects the POST due for authentication reasons, this data
|
||||||
|
will always be uncondtionally sent and thus it may not be larger than can
|
||||||
|
always be afforded to send twice.
|
||||||
|
|
||||||
|
It must not be greater than 64K to work on VMS.
|
||||||
|
*/
|
||||||
|
#ifndef MAX_INITIAL_POST_SIZE
|
||||||
|
#define MAX_INITIAL_POST_SIZE 1024
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
|
||||||
/* -- WIN32 approved -- */
|
/* -- WIN32 approved -- */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@@ -202,6 +202,8 @@ static void mkhash(char *password,
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
/* 21 bytes fits 3 7-bytes chunks, as we use 56 bit (7 bytes) as DES input,
|
||||||
|
and we add three different ones, see the calc_resp() function */
|
||||||
unsigned char lmbuffer[21];
|
unsigned char lmbuffer[21];
|
||||||
#ifdef USE_NTRESPONSES
|
#ifdef USE_NTRESPONSES
|
||||||
unsigned char ntbuffer[21];
|
unsigned char ntbuffer[21];
|
||||||
@@ -239,7 +241,7 @@ static void mkhash(char *password,
|
|||||||
DES_ecb_encrypt((DES_cblock *)magic, (DES_cblock *)(lmbuffer+8),
|
DES_ecb_encrypt((DES_cblock *)magic, (DES_cblock *)(lmbuffer+8),
|
||||||
DESKEY(ks), DES_ENCRYPT);
|
DESKEY(ks), DES_ENCRYPT);
|
||||||
|
|
||||||
memset(lmbuffer+16, 0, 5);
|
memset(lmbuffer+16, 0, sizeof(lmbuffer)-16);
|
||||||
}
|
}
|
||||||
/* create LM responses */
|
/* create LM responses */
|
||||||
calc_resp(lmbuffer, nonce, lmresp);
|
calc_resp(lmbuffer, nonce, lmresp);
|
||||||
@@ -260,7 +262,7 @@ static void mkhash(char *password,
|
|||||||
MD4_Update(&MD4, pw, 2*len);
|
MD4_Update(&MD4, pw, 2*len);
|
||||||
MD4_Final(ntbuffer, &MD4);
|
MD4_Final(ntbuffer, &MD4);
|
||||||
|
|
||||||
memset(ntbuffer+16, 0, 8);
|
memset(ntbuffer+16, 0, sizeof(ntbuffer)-16);
|
||||||
}
|
}
|
||||||
|
|
||||||
calc_resp(ntbuffer, nonce, ntresp);
|
calc_resp(ntbuffer, nonce, ntresp);
|
||||||
|
@@ -127,9 +127,9 @@ char *Curl_if2ip(const char *interface, char *buf, int buf_size)
|
|||||||
|
|
||||||
/* -- end of if2ip() -- */
|
/* -- end of if2ip() -- */
|
||||||
#else
|
#else
|
||||||
char *Curl_if2ip(const char *interface, char *buf, int buf_size)
|
char *Curl_if2ip(const char *interf, char *buf, int buf_size)
|
||||||
{
|
{
|
||||||
(void) interface;
|
(void) interf;
|
||||||
(void) buf;
|
(void) buf;
|
||||||
(void) buf_size;
|
(void) buf_size;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -74,13 +74,13 @@ Curl_inet_pton(int af, const char *src, void *dst)
|
|||||||
{
|
{
|
||||||
switch (af) {
|
switch (af) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
return (inet_pton4(src, dst));
|
return (inet_pton4(src, (unsigned char *)dst));
|
||||||
#ifdef ENABLE_IPV6
|
#ifdef ENABLE_IPV6
|
||||||
#ifndef AF_INET6
|
#ifndef AF_INET6
|
||||||
#define AF_INET6 AF_MAX+1 /* just to let this compile */
|
#define AF_INET6 (AF_MAX+1) /* just to let this compile */
|
||||||
#endif
|
#endif
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
return (inet_pton6(src, dst));
|
return (inet_pton6(src, (unsigned char *)dst));
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
errno = EAFNOSUPPORT;
|
errno = EAFNOSUPPORT;
|
||||||
@@ -114,11 +114,11 @@ inet_pton4(const char *src, unsigned char *dst)
|
|||||||
const char *pch;
|
const char *pch;
|
||||||
|
|
||||||
if ((pch = strchr(digits, ch)) != NULL) {
|
if ((pch = strchr(digits, ch)) != NULL) {
|
||||||
u_int new = *tp * 10 + (pch - digits);
|
u_int val = *tp * 10 + (pch - digits);
|
||||||
|
|
||||||
if (new > 255)
|
if (val > 255)
|
||||||
return (0);
|
return (0);
|
||||||
*tp = new;
|
*tp = val;
|
||||||
if (! saw_digit) {
|
if (! saw_digit) {
|
||||||
if (++octets > 4)
|
if (++octets > 4)
|
||||||
return (0);
|
return (0);
|
||||||
|
@@ -220,7 +220,7 @@ krb4_auth(void *app_data, struct connectdata *conn)
|
|||||||
if(ret == KDC_PR_UNKNOWN)
|
if(ret == KDC_PR_UNKNOWN)
|
||||||
ret = mk_auth(d, &adat, "rcmd", host, checksum);
|
ret = mk_auth(d, &adat, "rcmd", host, checksum);
|
||||||
if(ret) {
|
if(ret) {
|
||||||
Curl_infof(data, "%s\n", krb_get_err_text(ret));
|
infof(data, "%s\n", krb_get_err_text(ret));
|
||||||
return AUTH_CONTINUE;
|
return AUTH_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,7 +232,7 @@ krb4_auth(void *app_data, struct connectdata *conn)
|
|||||||
if (krb_get_our_ip_for_realm(krb_realmofhost(host),
|
if (krb_get_our_ip_for_realm(krb_realmofhost(host),
|
||||||
&natAddr) != KSUCCESS
|
&natAddr) != KSUCCESS
|
||||||
&& krb_get_our_ip_for_realm(NULL, &natAddr) != KSUCCESS)
|
&& krb_get_our_ip_for_realm(NULL, &natAddr) != KSUCCESS)
|
||||||
Curl_infof(data, "Can't get address for realm %s\n",
|
infof(data, "Can't get address for realm %s\n",
|
||||||
krb_realmofhost(host));
|
krb_realmofhost(host));
|
||||||
else {
|
else {
|
||||||
if (natAddr.s_addr != localaddr->sin_addr.s_addr) {
|
if (natAddr.s_addr != localaddr->sin_addr.s_addr) {
|
||||||
@@ -242,7 +242,7 @@ krb4_auth(void *app_data, struct connectdata *conn)
|
|||||||
#else
|
#else
|
||||||
char *ip = (char *)inet_ntoa(natAddr);
|
char *ip = (char *)inet_ntoa(natAddr);
|
||||||
#endif
|
#endif
|
||||||
Curl_infof(data, "Using NAT IP address (%s) for kerberos 4\n", ip);
|
infof(data, "Using NAT IP address (%s) for kerberos 4\n", ip);
|
||||||
localaddr->sin_addr = natAddr;
|
localaddr->sin_addr = natAddr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
40
lib/ldap.c
40
lib/ldap.c
@@ -30,8 +30,12 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SYS_STAT_H
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
@@ -64,7 +68,8 @@
|
|||||||
#include "memdebug.h"
|
#include "memdebug.h"
|
||||||
|
|
||||||
/* WLdap32.dll functions are *not* stdcall. Must call these via __cdecl
|
/* WLdap32.dll functions are *not* stdcall. Must call these via __cdecl
|
||||||
* pointers in case libcurl was compiled as fastcall (-Gr).
|
* pointers in case libcurl was compiled as fastcall (cl -Gr). Watcom
|
||||||
|
* uses fastcall by default.
|
||||||
*/
|
*/
|
||||||
#if !defined(WIN32) && !defined(__cdecl)
|
#if !defined(WIN32) && !defined(__cdecl)
|
||||||
#define __cdecl
|
#define __cdecl
|
||||||
@@ -103,10 +108,12 @@ typedef void * (*dynafunc)(void *input);
|
|||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
*/
|
*/
|
||||||
|
#if defined(HAVE_DLOPEN) || defined(HAVE_LIBDL) || defined(WIN32)
|
||||||
static void *libldap = NULL;
|
static void *libldap = NULL;
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
static void *liblber = NULL;
|
static void *liblber = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
static int DynaOpen(const char **mod_name)
|
static int DynaOpen(const char **mod_name)
|
||||||
{
|
{
|
||||||
@@ -136,6 +143,7 @@ static int DynaOpen(const char **mod_name)
|
|||||||
return (libldap != NULL);
|
return (libldap != NULL);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
(void) mod_name;
|
||||||
return (0);
|
return (0);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -175,6 +183,8 @@ static dynafunc DynaGetFunction(const char *name)
|
|||||||
if (libldap) {
|
if (libldap) {
|
||||||
func = (dynafunc)GetProcAddress((HINSTANCE)libldap, name);
|
func = (dynafunc)GetProcAddress((HINSTANCE)libldap, name);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
(void) name;
|
||||||
#endif
|
#endif
|
||||||
return func;
|
return func;
|
||||||
}
|
}
|
||||||
@@ -256,25 +266,25 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
|||||||
/* The types are needed because ANSI C distinguishes between
|
/* The types are needed because ANSI C distinguishes between
|
||||||
* pointer-to-object (data) and pointer-to-function.
|
* pointer-to-object (data) and pointer-to-function.
|
||||||
*/
|
*/
|
||||||
DYNA_GET_FUNCTION(void *(*)(char *, int), ldap_init);
|
DYNA_GET_FUNCTION(void *(__cdecl *)(char *, int), ldap_init);
|
||||||
DYNA_GET_FUNCTION(int (*)(void *, char *, char *), ldap_simple_bind_s);
|
DYNA_GET_FUNCTION(int (__cdecl *)(void *, char *, char *), ldap_simple_bind_s);
|
||||||
DYNA_GET_FUNCTION(int (*)(void *), ldap_unbind_s);
|
DYNA_GET_FUNCTION(int (__cdecl *)(void *), ldap_unbind_s);
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
DYNA_GET_FUNCTION(int (*)(char *, LDAPURLDesc **), ldap_url_parse);
|
DYNA_GET_FUNCTION(int (*)(char *, LDAPURLDesc **), ldap_url_parse);
|
||||||
DYNA_GET_FUNCTION(void (*)(void *), ldap_free_urldesc);
|
DYNA_GET_FUNCTION(void (*)(void *), ldap_free_urldesc);
|
||||||
#endif
|
#endif
|
||||||
DYNA_GET_FUNCTION(int (*)(void *, char *, int, char *, char **, int,
|
DYNA_GET_FUNCTION(int (__cdecl *)(void *, char *, int, char *, char **, int,
|
||||||
void **), ldap_search_s);
|
void **), ldap_search_s);
|
||||||
DYNA_GET_FUNCTION(void *(*)(void *, void *), ldap_first_entry);
|
DYNA_GET_FUNCTION(void *(__cdecl *)(void *, void *), ldap_first_entry);
|
||||||
DYNA_GET_FUNCTION(void *(*)(void *, void *), ldap_next_entry);
|
DYNA_GET_FUNCTION(void *(__cdecl *)(void *, void *), ldap_next_entry);
|
||||||
DYNA_GET_FUNCTION(char *(*)(int), ldap_err2string);
|
DYNA_GET_FUNCTION(char *(__cdecl *)(int), ldap_err2string);
|
||||||
DYNA_GET_FUNCTION(char *(*)(void *, void *), ldap_get_dn);
|
DYNA_GET_FUNCTION(char *(__cdecl *)(void *, void *), ldap_get_dn);
|
||||||
DYNA_GET_FUNCTION(char *(*)(void *, void *, void **), ldap_first_attribute);
|
DYNA_GET_FUNCTION(char *(__cdecl *)(void *, void *, void **), ldap_first_attribute);
|
||||||
DYNA_GET_FUNCTION(char *(*)(void *, void *, void *), ldap_next_attribute);
|
DYNA_GET_FUNCTION(char *(__cdecl *)(void *, void *, void *), ldap_next_attribute);
|
||||||
DYNA_GET_FUNCTION(char **(*)(void *, void *, const char *), ldap_get_values);
|
DYNA_GET_FUNCTION(char **(__cdecl *)(void *, void *, const char *), ldap_get_values);
|
||||||
DYNA_GET_FUNCTION(void (*)(char **), ldap_value_free);
|
DYNA_GET_FUNCTION(void (__cdecl *)(char **), ldap_value_free);
|
||||||
DYNA_GET_FUNCTION(void (*)(void *), ldap_memfree);
|
DYNA_GET_FUNCTION(void (__cdecl *)(void *), ldap_memfree);
|
||||||
DYNA_GET_FUNCTION(void (*)(void *, int), ber_free);
|
DYNA_GET_FUNCTION(void (__cdecl *)(void *, int), ber_free);
|
||||||
|
|
||||||
server = (*ldap_init)(conn->host.name, (int)conn->port);
|
server = (*ldap_init)(conn->host.name, (int)conn->port);
|
||||||
if (server == NULL) {
|
if (server == NULL) {
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
|
# to build Mac OS X framework call the following line with the directory set properly to lib
|
||||||
|
# make build -e -f libcurl.framework.make
|
||||||
TMP_DIR = ../lib/.lib
|
TMP_DIR = ../lib/.lib
|
||||||
LIB_DIR = ../lib
|
LIB_DIR = ../lib
|
||||||
|
|
||||||
@@ -12,11 +14,7 @@ C_OPTIONS = \
|
|||||||
-I../include \
|
-I../include \
|
||||||
-Wall
|
-Wall
|
||||||
|
|
||||||
# The 2 -framework tags are the needed Mac OS X sytem libs
|
LIBRARIES = /usr/lib/libssl.dylib \
|
||||||
# must link to version 0.9 of libssl to run on Mac OS X 10.2. 10.1 is not tested but should work.
|
|
||||||
LIBRARIES = -framework CoreFoundation \
|
|
||||||
-framework CoreServices \
|
|
||||||
/usr/lib/libssl.dylib \
|
|
||||||
/usr/lib/libcrypto.dylib \
|
/usr/lib/libcrypto.dylib \
|
||||||
-lz
|
-lz
|
||||||
|
|
||||||
@@ -30,7 +28,7 @@ LIBRARIES = -framework CoreFoundation \
|
|||||||
LINK_OPTIONS = -prebind \
|
LINK_OPTIONS = -prebind \
|
||||||
-seg1addr 0x10400000 \
|
-seg1addr 0x10400000 \
|
||||||
-dynamiclib \
|
-dynamiclib \
|
||||||
-install_name @executable_path/../frameworks/libcurl.framework/libcurl
|
-install_name @executable_path/../Frameworks/libcurl.framework/libcurl
|
||||||
|
|
||||||
# This is the file list. It is not dynamically generated so this must be updated if new files are added to the build.
|
# This is the file list. It is not dynamically generated so this must be updated if new files are added to the build.
|
||||||
OBJECTS = $(TMP_DIR)/base64.o \
|
OBJECTS = $(TMP_DIR)/base64.o \
|
||||||
@@ -43,17 +41,23 @@ OBJECTS = $(TMP_DIR)/base64.o \
|
|||||||
$(TMP_DIR)/file.o \
|
$(TMP_DIR)/file.o \
|
||||||
$(TMP_DIR)/formdata.o \
|
$(TMP_DIR)/formdata.o \
|
||||||
$(TMP_DIR)/ftp.o \
|
$(TMP_DIR)/ftp.o \
|
||||||
$(TMP_DIR)/getdate.o \
|
|
||||||
$(TMP_DIR)/getenv.o \
|
$(TMP_DIR)/getenv.o \
|
||||||
$(TMP_DIR)/getinfo.o \
|
$(TMP_DIR)/getinfo.o \
|
||||||
$(TMP_DIR)/hash.o \
|
$(TMP_DIR)/hash.o \
|
||||||
|
$(TMP_DIR)/hostares.o \
|
||||||
|
$(TMP_DIR)/hostasyn.o \
|
||||||
$(TMP_DIR)/hostip.o \
|
$(TMP_DIR)/hostip.o \
|
||||||
|
$(TMP_DIR)/hostip4.o \
|
||||||
|
$(TMP_DIR)/hostip6.o \
|
||||||
|
$(TMP_DIR)/hostsyn.o \
|
||||||
|
$(TMP_DIR)/hostthre.o \
|
||||||
$(TMP_DIR)/http.o \
|
$(TMP_DIR)/http.o \
|
||||||
$(TMP_DIR)/http_chunks.o \
|
$(TMP_DIR)/http_chunks.o \
|
||||||
$(TMP_DIR)/http_digest.o \
|
$(TMP_DIR)/http_digest.o \
|
||||||
$(TMP_DIR)/http_negotiate.o \
|
$(TMP_DIR)/http_negotiate.o \
|
||||||
$(TMP_DIR)/http_ntlm.o \
|
$(TMP_DIR)/http_ntlm.o \
|
||||||
$(TMP_DIR)/if2ip.o \
|
$(TMP_DIR)/if2ip.o \
|
||||||
|
$(TMP_DIR)/inet_ntop.o \
|
||||||
$(TMP_DIR)/inet_pton.o \
|
$(TMP_DIR)/inet_pton.o \
|
||||||
$(TMP_DIR)/krb4.o \
|
$(TMP_DIR)/krb4.o \
|
||||||
$(TMP_DIR)/ldap.o \
|
$(TMP_DIR)/ldap.o \
|
||||||
@@ -63,6 +67,7 @@ OBJECTS = $(TMP_DIR)/base64.o \
|
|||||||
$(TMP_DIR)/mprintf.o \
|
$(TMP_DIR)/mprintf.o \
|
||||||
$(TMP_DIR)/multi.o \
|
$(TMP_DIR)/multi.o \
|
||||||
$(TMP_DIR)/netrc.o \
|
$(TMP_DIR)/netrc.o \
|
||||||
|
$(TMP_DIR)/parsedate.o \
|
||||||
$(TMP_DIR)/progress.o \
|
$(TMP_DIR)/progress.o \
|
||||||
$(TMP_DIR)/security.o \
|
$(TMP_DIR)/security.o \
|
||||||
$(TMP_DIR)/sendf.o \
|
$(TMP_DIR)/sendf.o \
|
||||||
@@ -70,7 +75,9 @@ OBJECTS = $(TMP_DIR)/base64.o \
|
|||||||
$(TMP_DIR)/speedcheck.o \
|
$(TMP_DIR)/speedcheck.o \
|
||||||
$(TMP_DIR)/ssluse.o \
|
$(TMP_DIR)/ssluse.o \
|
||||||
$(TMP_DIR)/strequal.o \
|
$(TMP_DIR)/strequal.o \
|
||||||
|
$(TMP_DIR)/strerror.o \
|
||||||
$(TMP_DIR)/strtok.o \
|
$(TMP_DIR)/strtok.o \
|
||||||
|
$(TMP_DIR)/strtoofft.o \
|
||||||
$(TMP_DIR)/telnet.o \
|
$(TMP_DIR)/telnet.o \
|
||||||
$(TMP_DIR)/timeval.o \
|
$(TMP_DIR)/timeval.o \
|
||||||
$(TMP_DIR)/transfer.o \
|
$(TMP_DIR)/transfer.o \
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
<string>com.libcurl.libcurl</string>
|
<string>com.libcurl.libcurl</string>
|
||||||
|
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>7.11.0</string>
|
<string>7.12.3</string>
|
||||||
|
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
<string>libcurl</string>
|
<string>libcurl</string>
|
||||||
@@ -27,9 +27,9 @@
|
|||||||
<string>????</string>
|
<string>????</string>
|
||||||
|
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>libcurl 7.11.0</string>
|
<string>libcurl 7.12.3</string>
|
||||||
|
|
||||||
<key>CFBundleGetInfoString</key>
|
<key>CFBundleGetInfoString</key>
|
||||||
<string>libcurl.plist 7.11.0</string>
|
<string>libcurl.plist 7.12.3</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
@@ -12,12 +12,13 @@ CFLAGS = -I$(ATCPSDKI) -m68020-60 -noixemul -I. -I../include -W -Wall
|
|||||||
|
|
||||||
OBJS = \
|
OBJS = \
|
||||||
amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c \
|
amigaos.c base64.c connect.c content_encoding.c cookie.c dict.c \
|
||||||
easy.c escape.c file.c formdata.c ftp.c getdate.c getenv.c \
|
easy.c escape.c file.c formdata.c ftp.c getenv.c \
|
||||||
getinfo.c hash.c hostip.c http.c http_chunks.c http_digest.c \
|
getinfo.c hash.c hostip.c hostip4.c hostsyn.c http.c http_chunks.c \
|
||||||
http_negotiate.c http_ntlm.c if2ip.c inet_pton.c krb4.c ldap.c \
|
http_digest.c http_negotiate.c http_ntlm.c if2ip.c inet_ntop.c \
|
||||||
llist.c md5.c memdebug.c mprintf.c multi.c netrc.c progress.c \
|
inet_pton.c krb4.c ldap.c \
|
||||||
security.c sendf.c share.c speedcheck.c ssluse.c strequal.c \
|
llist.c md5.c memdebug.c mprintf.c multi.c netrc.c parsedate.c \
|
||||||
strtok.c telnet.c timeval.c transfer.c url.c version.c
|
progress.c security.c select.c sendf.c share.c speedcheck.c \
|
||||||
|
ssluse.c strequal.c strtok.c telnet.c timeval.c transfer.c url.c version.c
|
||||||
|
|
||||||
all: $(OBJS:.c=.o)
|
all: $(OBJS:.c=.o)
|
||||||
ar cru libcurl.a $(OBJS:.c=.o)
|
ar cru libcurl.a $(OBJS:.c=.o)
|
||||||
|
382
lib/makefile.dj
382
lib/makefile.dj
@@ -3,7 +3,7 @@
|
|||||||
# Gisle Vanem <giva@bgnett.no>
|
# Gisle Vanem <giva@bgnett.no>
|
||||||
#
|
#
|
||||||
|
|
||||||
DEPEND_PREREQ = config.h getdate.c
|
DEPEND_PREREQ = config.h
|
||||||
|
|
||||||
include ../packages/DOS/common.dj
|
include ../packages/DOS/common.dj
|
||||||
|
|
||||||
@@ -22,207 +22,253 @@ $(CURL_LIB): $(OBJECTS)
|
|||||||
config.h: config.dj
|
config.h: config.dj
|
||||||
cp $^ $@
|
cp $^ $@
|
||||||
|
|
||||||
getdate.c: getdate.y
|
|
||||||
$(YACC) -o $@ $^
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
- rm -f $(OBJECTS) Makefile.bak
|
- rm -f $(OBJECTS) Makefile.bak
|
||||||
|
|
||||||
realclean vclean: clean
|
realclean vclean: clean
|
||||||
- rm -f config.h getdate.c $(CURL_LIB)
|
- rm -f config.h $(CURL_LIB)
|
||||||
|
|
||||||
|
|
||||||
# DO NOT DELETE THIS LINE
|
# DO NOT DELETE THIS LINE
|
||||||
djgpp/base64.o: base64.c setup.h config.h ../include/curl/mprintf.h base64.h \
|
$(OBJ_DIR)/file.o: file.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
||||||
memory.h ../include/curl/curl.h ../include/curl/curlver.h \
|
|
||||||
../include/curl/easy.h ../include/curl/multi.h memdebug.h
|
|
||||||
djgpp/connect.o: connect.c setup.h config.h urldata.h cookie.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h sendf.h if2ip.h strerror.h connect.h memory.h memdebug.h
|
|
||||||
djgpp/content_encoding.o: content_encoding.c setup.h config.h
|
|
||||||
djgpp/cookie.o: cookie.c setup.h config.h urldata.h cookie.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h getdate.h strequal.h strtok.h sendf.h memory.h \
|
|
||||||
memdebug.h
|
|
||||||
djgpp/dict.o: dict.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
hash.h llist.h transfer.h sendf.h progress.h strequal.h dict.h \
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
../include/curl/mprintf.h
|
http_chunks.h hostip.h hash.h llist.h progress.h sendf.h escape.h \
|
||||||
djgpp/easy.o: easy.c setup.h config.h strequal.h urldata.h cookie.h \
|
file.h speedcheck.h getinfo.h transfer.h url.h memory.h \
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h transfer.h ssluse.h url.h getinfo.h share.h memory.h \
|
|
||||||
../include/curl/mprintf.h memdebug.h
|
../include/curl/mprintf.h memdebug.h
|
||||||
djgpp/escape.o: escape.c setup.h config.h ../include/curl/curl.h \
|
$(OBJ_DIR)/timeval.o: timeval.c timeval.h setup.h config.h
|
||||||
|
$(OBJ_DIR)/base64.o: base64.c setup.h config.h ../include/curl/mprintf.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h base64.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/hostip.o: hostip.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \
|
||||||
|
inet_ntop.h ../include/curl/mprintf.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/progress.o: progress.c setup.h config.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h memory.h ../include/curl/mprintf.h memdebug.h
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
djgpp/file.o: file.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
http_chunks.h hostip.h hash.h llist.h sendf.h progress.h \
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
../include/curl/mprintf.h
|
||||||
hash.h llist.h progress.h sendf.h escape.h file.h speedcheck.h \
|
$(OBJ_DIR)/formdata.o: formdata.c setup.h config.h ../include/curl/curl.h \
|
||||||
getinfo.h transfer.h url.h memory.h ../include/curl/mprintf.h \
|
|
||||||
memdebug.h
|
|
||||||
djgpp/formdata.o: formdata.c setup.h config.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h formdata.h strequal.h memory.h \
|
../include/curl/multi.h formdata.h strequal.h memory.h \
|
||||||
../include/curl/mprintf.h memdebug.h
|
../include/curl/mprintf.h memdebug.h
|
||||||
djgpp/ftp.o: ftp.c setup.h config.h ../include/curl/curl.h \
|
$(OBJ_DIR)/cookie.o: cookie.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h strequal.h strtok.h sendf.h \
|
||||||
|
memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/http.o: http.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h progress.h \
|
||||||
|
base64.h strequal.h ssluse.h http_digest.h http_ntlm.h http_negotiate.h \
|
||||||
|
url.h share.h http.h memory.h select.h ../include/curl/mprintf.h \
|
||||||
|
memdebug.h
|
||||||
|
$(OBJ_DIR)/sendf.o: sendf.c setup.h config.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h connect.h \
|
||||||
|
../include/curl/mprintf.h memory.h strerror.h memdebug.h
|
||||||
|
$(OBJ_DIR)/ftp.o: ftp.c setup.h config.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
http_chunks.h hostip.h hash.h llist.h sendf.h if2ip.h progress.h \
|
http_chunks.h hostip.h hash.h llist.h sendf.h if2ip.h progress.h \
|
||||||
transfer.h escape.h http.h ftp.h strtoofft.h strequal.h ssluse.h \
|
transfer.h escape.h http.h ftp.h strtoofft.h strequal.h ssluse.h \
|
||||||
connect.h strerror.h memory.h inet_ntop.h ../include/curl/mprintf.h \
|
connect.h strerror.h memory.h inet_ntop.h select.h \
|
||||||
memdebug.h
|
../include/curl/mprintf.h memdebug.h
|
||||||
djgpp/getdate.o: getdate.c setup.h config.h memory.h ../include/curl/curl.h \
|
$(OBJ_DIR)/url.o: url.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h memdebug.h getdate.h
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
djgpp/getenv.o: getenv.c setup.h config.h ../include/curl/curl.h \
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h netrc.h base64.h ssluse.h if2ip.h \
|
||||||
|
transfer.h sendf.h progress.h strequal.h strerror.h escape.h strtok.h \
|
||||||
|
share.h content_encoding.h http_digest.h http_negotiate.h select.h \
|
||||||
|
ftp.h dict.h telnet.h http.h file.h ldap.h url.h connect.h inet_ntop.h \
|
||||||
|
ca-bundle.h ../include/curl/mprintf.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/dict.o: dict.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h progress.h \
|
||||||
|
strequal.h dict.h ../include/curl/mprintf.h
|
||||||
|
$(OBJ_DIR)/if2ip.o: if2ip.c setup.h config.h if2ip.h memory.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h memdebug.h
|
||||||
|
$(OBJ_DIR)/speedcheck.o: speedcheck.c setup.h config.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h speedcheck.h
|
||||||
|
$(OBJ_DIR)/ldap.o: ldap.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h escape.h transfer.h \
|
||||||
|
strequal.h strtok.h ldap.h memory.h ../include/curl/mprintf.h \
|
||||||
|
memdebug.h
|
||||||
|
$(OBJ_DIR)/ssluse.o: ssluse.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h url.h inet_pton.h \
|
||||||
|
ssluse.h connect.h strequal.h select.h ../include/curl/mprintf.h
|
||||||
|
$(OBJ_DIR)/version.o: version.c setup.h config.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h ../include/curl/mprintf.h
|
||||||
|
$(OBJ_DIR)/getenv.o: getenv.c setup.h config.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h memory.h memdebug.h
|
../include/curl/multi.h memory.h memdebug.h
|
||||||
djgpp/getinfo.o: getinfo.c setup.h config.h ../include/curl/curl.h \
|
$(OBJ_DIR)/escape.o: escape.c setup.h config.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
../include/curl/multi.h memory.h ../include/curl/mprintf.h memdebug.h
|
||||||
http_chunks.h hostip.h hash.h llist.h getinfo.h memory.h memdebug.h
|
$(OBJ_DIR)/mprintf.o: mprintf.c setup.h config.h ../include/curl/mprintf.h \
|
||||||
djgpp/hash.o: hash.c setup.h config.h hash.h llist.h memory.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h memdebug.h
|
../include/curl/multi.h memory.h memdebug.h
|
||||||
djgpp/hostip.o: hostip.c setup.h config.h urldata.h cookie.h \
|
$(OBJ_DIR)/telnet.o: telnet.c setup.h config.h urldata.h cookie.h \
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
hash.h llist.h sendf.h share.h strerror.h url.h inet_ntop.h \
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
../include/curl/mprintf.h memory.h memdebug.h
|
http_chunks.h hostip.h hash.h llist.h transfer.h sendf.h telnet.h \
|
||||||
djgpp/hostip6.o: hostip6.c setup.h config.h urldata.h cookie.h \
|
../include/curl/mprintf.h arpa_telnet.h memory.h select.h memdebug.h
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
$(OBJ_DIR)/netrc.o: netrc.c setup.h config.h ../include/curl/curl.h \
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h sendf.h share.h strerror.h url.h \
|
|
||||||
../include/curl/mprintf.h memory.h memdebug.h
|
|
||||||
djgpp/hostip4.o: hostip4.c setup.h config.h urldata.h cookie.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h sendf.h share.h strerror.h url.h \
|
|
||||||
../include/curl/mprintf.h memory.h memdebug.h
|
|
||||||
djgpp/hostares.o: hostares.c setup.h config.h urldata.h cookie.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h sendf.h share.h strerror.h url.h \
|
|
||||||
../include/curl/mprintf.h memory.h memdebug.h
|
|
||||||
djgpp/hostasyn.o: hostasyn.c setup.h config.h urldata.h cookie.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h sendf.h share.h strerror.h url.h \
|
|
||||||
../include/curl/mprintf.h memory.h memdebug.h
|
|
||||||
djgpp/hostsyn.o: hostsyn.c setup.h config.h urldata.h cookie.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h sendf.h share.h strerror.h url.h \
|
|
||||||
../include/curl/mprintf.h memory.h memdebug.h
|
|
||||||
djgpp/if2ip.o: if2ip.c setup.h config.h if2ip.h memory.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h memdebug.h
|
|
||||||
djgpp/krb4.o: krb4.c setup.h config.h
|
|
||||||
djgpp/md5.o: md5.c setup.h config.h md5.h
|
|
||||||
djgpp/ldap.o: ldap.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h sendf.h escape.h transfer.h strequal.h strtok.h ldap.h \
|
|
||||||
memory.h ../include/curl/mprintf.h memdebug.h
|
|
||||||
djgpp/llist.o: llist.c setup.h config.h llist.h memory.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h memdebug.h
|
|
||||||
djgpp/memdebug.o: memdebug.c setup.h config.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h ../include/curl/mprintf.h urldata.h cookie.h \
|
|
||||||
formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h memory.h \
|
|
||||||
memdebug.h
|
|
||||||
djgpp/mprintf.o: mprintf.c setup.h config.h ../include/curl/mprintf.h memory.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h memdebug.h
|
|
||||||
djgpp/multi.o: multi.c setup.h config.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
|
||||||
http_chunks.h hostip.h hash.h llist.h transfer.h url.h connect.h \
|
|
||||||
progress.h memory.h memdebug.h
|
|
||||||
djgpp/netrc.o: netrc.c setup.h config.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h netrc.h strequal.h strtok.h memory.h \
|
../include/curl/multi.h netrc.h strequal.h strtok.h memory.h \
|
||||||
../include/curl/mprintf.h memdebug.h
|
../include/curl/mprintf.h memdebug.h
|
||||||
djgpp/progress.o: progress.c setup.h config.h ../include/curl/curl.h \
|
$(OBJ_DIR)/getinfo.o: getinfo.c setup.h config.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
http_chunks.h hostip.h hash.h llist.h sendf.h progress.h \
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
../include/curl/mprintf.h
|
http_chunks.h hostip.h hash.h llist.h getinfo.h memory.h memdebug.h
|
||||||
djgpp/security.o: security.c setup.h config.h
|
$(OBJ_DIR)/transfer.o: transfer.c setup.h config.h strtoofft.h \
|
||||||
djgpp/sendf.o: sendf.c setup.h config.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
|
||||||
http_chunks.h hostip.h hash.h llist.h sendf.h connect.h \
|
|
||||||
../include/curl/mprintf.h memory.h memdebug.h
|
|
||||||
djgpp/share.o: share.c setup.h config.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
|
||||||
http_chunks.h hostip.h hash.h llist.h share.h memory.h memdebug.h
|
|
||||||
djgpp/speedcheck.o: speedcheck.c setup.h config.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
|
||||||
http_chunks.h hostip.h hash.h llist.h sendf.h speedcheck.h
|
|
||||||
djgpp/ssluse.o: ssluse.c setup.h config.h urldata.h cookie.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h sendf.h url.h inet_pton.h ssluse.h connect.h strequal.h \
|
|
||||||
../include/curl/mprintf.h
|
|
||||||
djgpp/strequal.o: strequal.c setup.h config.h strequal.h
|
|
||||||
djgpp/strtok.o: strtok.c setup.h config.h strtok.h
|
|
||||||
djgpp/telnet.o: telnet.c setup.h config.h urldata.h cookie.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h transfer.h sendf.h telnet.h ../include/curl/mprintf.h \
|
|
||||||
arpa_telnet.h memory.h memdebug.h
|
|
||||||
djgpp/timeval.o: timeval.c timeval.h setup.h config.h
|
|
||||||
djgpp/transfer.o: transfer.c setup.h config.h strtoofft.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h strequal.h urldata.h cookie.h formdata.h \
|
../include/curl/multi.h strequal.h urldata.h cookie.h formdata.h \
|
||||||
timeval.h http_chunks.h hostip.h hash.h llist.h netrc.h \
|
timeval.h e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
content_encoding.h transfer.h sendf.h speedcheck.h progress.h getdate.h \
|
http_chunks.h hostip.h hash.h llist.h netrc.h content_encoding.h \
|
||||||
http.h url.h getinfo.h ssluse.h http_digest.h http_ntlm.h \
|
transfer.h sendf.h speedcheck.h progress.h http.h url.h getinfo.h \
|
||||||
http_negotiate.h share.h memory.h ../include/curl/mprintf.h memdebug.h
|
ssluse.h http_digest.h http_ntlm.h http_negotiate.h share.h memory.h \
|
||||||
djgpp/strerror.o: strerror.c setup.h config.h ../include/curl/curl.h \
|
select.h ../include/curl/mprintf.h memdebug.h
|
||||||
|
$(OBJ_DIR)/strequal.o: strequal.c setup.h config.h strequal.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h strerror.h urldata.h cookie.h formdata.h \
|
|
||||||
timeval.h http_chunks.h hostip.h hash.h llist.h \
|
|
||||||
../include/curl/mprintf.h
|
|
||||||
djgpp/strtoofft.o: strtoofft.c setup.h config.h strtoofft.h \
|
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h
|
../include/curl/multi.h
|
||||||
djgpp/url.o: url.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
$(OBJ_DIR)/easy.o: easy.c setup.h config.h strequal.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
|
||||||
hash.h llist.h netrc.h base64.h ssluse.h if2ip.h transfer.h sendf.h \
|
|
||||||
progress.h strequal.h escape.h strtok.h share.h content_encoding.h \
|
|
||||||
http_digest.h http_negotiate.h ftp.h dict.h telnet.h http.h file.h \
|
|
||||||
ldap.h url.h connect.h inet_ntop.h ca-bundle.h \
|
|
||||||
../include/curl/mprintf.h memory.h memdebug.h
|
|
||||||
djgpp/version.o: version.c setup.h config.h ../include/curl/curl.h \
|
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
http_chunks.h hostip.h hash.h llist.h ../include/curl/mprintf.h
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
djgpp/http.o: http.c setup.h config.h urldata.h cookie.h ../include/curl/curl.h \
|
http_chunks.h hostip.h hash.h llist.h transfer.h ssluse.h url.h \
|
||||||
|
getinfo.h share.h memory.h progress.h ../include/curl/mprintf.h \
|
||||||
|
memdebug.h
|
||||||
|
$(OBJ_DIR)/security.o: security.c setup.h config.h
|
||||||
|
$(OBJ_DIR)/krb4.o: krb4.c setup.h config.h
|
||||||
|
$(OBJ_DIR)/memdebug.o: memdebug.c setup.h config.h ../include/curl/curl.h \
|
||||||
../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
../include/curl/multi.h ../include/curl/mprintf.h urldata.h cookie.h \
|
||||||
hash.h llist.h transfer.h sendf.h progress.h base64.h strequal.h \
|
formdata.h timeval.h e:/djgpp/contrib/zlib/zlib.h \
|
||||||
ssluse.h http_digest.h http_ntlm.h http_negotiate.h url.h share.h \
|
e:/djgpp/contrib/zlib/zconf.h http_chunks.h hostip.h hash.h llist.h \
|
||||||
http.h memory.h ../include/curl/mprintf.h memdebug.h
|
memory.h memdebug.h
|
||||||
djgpp/http_chunks.o: http_chunks.c setup.h config.h urldata.h cookie.h \
|
$(OBJ_DIR)/http_chunks.o: http_chunks.c setup.h config.h urldata.h cookie.h \
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
hash.h llist.h sendf.h content_encoding.h http.h memory.h \
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
../include/curl/mprintf.h memdebug.h
|
http_chunks.h hostip.h hash.h llist.h sendf.h content_encoding.h http.h \
|
||||||
djgpp/http_digest.o: http_digest.c setup.h config.h urldata.h cookie.h \
|
memory.h ../include/curl/mprintf.h memdebug.h
|
||||||
|
$(OBJ_DIR)/strtok.o: strtok.c setup.h config.h strtok.h
|
||||||
|
$(OBJ_DIR)/connect.o: connect.c setup.h config.h urldata.h cookie.h \
|
||||||
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
../include/curl/multi.h formdata.h timeval.h http_chunks.h hostip.h \
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
hash.h llist.h sendf.h strequal.h base64.h md5.h http_digest.h strtok.h \
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
url.h memory.h ../include/curl/mprintf.h memdebug.h
|
http_chunks.h hostip.h hash.h llist.h sendf.h if2ip.h strerror.h \
|
||||||
djgpp/http_negotiate.o: http_negotiate.c setup.h config.h
|
connect.h memory.h select.h memdebug.h
|
||||||
djgpp/http_ntlm.o: http_ntlm.c setup.h config.h
|
$(OBJ_DIR)/llist.o: llist.c setup.h config.h llist.h memory.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h memdebug.h
|
||||||
|
$(OBJ_DIR)/hash.o: hash.c setup.h config.h hash.h llist.h memory.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h memdebug.h
|
||||||
|
$(OBJ_DIR)/multi.o: multi.c setup.h config.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h transfer.h url.h connect.h \
|
||||||
|
progress.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/content_encoding.o: content_encoding.c setup.h config.h urldata.h \
|
||||||
|
cookie.h ../include/curl/curl.h ../include/curl/curlver.h \
|
||||||
|
../include/curl/easy.h ../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h content_encoding.h \
|
||||||
|
memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/share.o: share.c setup.h config.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h urldata.h cookie.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h share.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/http_digest.o: http_digest.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h strequal.h base64.h md5.h \
|
||||||
|
http_digest.h strtok.h url.h memory.h ../include/curl/mprintf.h \
|
||||||
|
memdebug.h
|
||||||
|
$(OBJ_DIR)/md5.o: md5.c setup.h config.h md5.h
|
||||||
|
$(OBJ_DIR)/http_negotiate.o: http_negotiate.c setup.h config.h
|
||||||
|
$(OBJ_DIR)/http_ntlm.o: http_ntlm.c setup.h config.h
|
||||||
|
$(OBJ_DIR)/inet_pton.o: inet_pton.c setup.h config.h
|
||||||
|
$(OBJ_DIR)/strtoofft.o: strtoofft.c setup.h config.h strtoofft.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h
|
||||||
|
$(OBJ_DIR)/strerror.o: strerror.c setup.h config.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h strerror.h urldata.h cookie.h formdata.h \
|
||||||
|
timeval.h e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h ../include/curl/mprintf.h
|
||||||
|
$(OBJ_DIR)/hostares.o: hostares.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \
|
||||||
|
../include/curl/mprintf.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/hostasyn.o: hostasyn.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \
|
||||||
|
../include/curl/mprintf.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/hostip4.o: hostip4.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \
|
||||||
|
../include/curl/mprintf.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/hostip6.o: hostip6.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \
|
||||||
|
../include/curl/mprintf.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/hostsyn.o: hostsyn.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \
|
||||||
|
../include/curl/mprintf.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/hostthre.o: hostthre.c setup.h config.h urldata.h cookie.h \
|
||||||
|
../include/curl/curl.h ../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h formdata.h timeval.h \
|
||||||
|
e:/djgpp/contrib/zlib/zlib.h e:/djgpp/contrib/zlib/zconf.h \
|
||||||
|
http_chunks.h hostip.h hash.h llist.h sendf.h share.h strerror.h url.h \
|
||||||
|
../include/curl/mprintf.h inet_ntop.h memory.h memdebug.h
|
||||||
|
$(OBJ_DIR)/inet_ntop.o: inet_ntop.c setup.h config.h
|
||||||
|
$(OBJ_DIR)/parsedate.o: parsedate.c setup.h config.h ../include/curl/curl.h \
|
||||||
|
../include/curl/curlver.h ../include/curl/easy.h \
|
||||||
|
../include/curl/multi.h
|
||||||
|
$(OBJ_DIR)/select.o: select.c setup.h config.h select.h
|
||||||
|
24
lib/md5.c
24
lib/md5.c
@@ -23,7 +23,9 @@
|
|||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#ifndef USE_SSLEAY
|
#ifndef CURL_DISABLE_CRYPTO_AUTH
|
||||||
|
|
||||||
|
#if !defined(USE_SSLEAY) || !defined(USE_OPENSSL)
|
||||||
/* This code segment is only used if OpenSSL is not provided, as if it is
|
/* This code segment is only used if OpenSSL is not provided, as if it is
|
||||||
we use the MD5-function provided there instead. No good duplicating
|
we use the MD5-function provided there instead. No good duplicating
|
||||||
code! */
|
code! */
|
||||||
@@ -65,7 +67,7 @@ struct md5_ctx {
|
|||||||
typedef struct md5_ctx MD5_CTX;
|
typedef struct md5_ctx MD5_CTX;
|
||||||
|
|
||||||
static void MD5_Init(struct md5_ctx *);
|
static void MD5_Init(struct md5_ctx *);
|
||||||
static void MD5_Update(struct md5_ctx *, unsigned char *, unsigned int);
|
static void MD5_Update(struct md5_ctx *, const unsigned char *, unsigned int);
|
||||||
static void MD5_Final(unsigned char [16], struct md5_ctx *);
|
static void MD5_Final(unsigned char [16], struct md5_ctx *);
|
||||||
|
|
||||||
/* Constants for MD5Transform routine.
|
/* Constants for MD5Transform routine.
|
||||||
@@ -88,11 +90,11 @@ static void MD5_Final(unsigned char [16], struct md5_ctx *);
|
|||||||
#define S43 15
|
#define S43 15
|
||||||
#define S44 21
|
#define S44 21
|
||||||
|
|
||||||
static void MD5Transform(UINT4 [4], unsigned char [64]);
|
static void MD5Transform(UINT4 [4], const unsigned char [64]);
|
||||||
static void Encode(unsigned char *, UINT4 *, unsigned int);
|
static void Encode(unsigned char *, UINT4 *, unsigned int);
|
||||||
static void Decode(UINT4 *, unsigned char *, unsigned int);
|
static void Decode(UINT4 *, const unsigned char *, unsigned int);
|
||||||
|
|
||||||
static unsigned char PADDING[64] = {
|
static const unsigned char PADDING[64] = {
|
||||||
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
@@ -150,8 +152,8 @@ static void MD5_Init(struct md5_ctx *context)
|
|||||||
context.
|
context.
|
||||||
*/
|
*/
|
||||||
static void MD5_Update (struct md5_ctx *context, /* context */
|
static void MD5_Update (struct md5_ctx *context, /* context */
|
||||||
unsigned char *input, /* input block */
|
const unsigned char *input, /* input block */
|
||||||
unsigned int inputLen)/* length of input block */
|
unsigned int inputLen) /* length of input block */
|
||||||
{
|
{
|
||||||
unsigned int i, bufindex, partLen;
|
unsigned int i, bufindex, partLen;
|
||||||
|
|
||||||
@@ -212,7 +214,7 @@ static void MD5_Final(unsigned char digest[16], /* message digest */
|
|||||||
|
|
||||||
/* MD5 basic transformation. Transforms state based on block. */
|
/* MD5 basic transformation. Transforms state based on block. */
|
||||||
static void MD5Transform(UINT4 state[4],
|
static void MD5Transform(UINT4 state[4],
|
||||||
unsigned char block[64])
|
const unsigned char block[64])
|
||||||
{
|
{
|
||||||
UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
|
UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
|
||||||
|
|
||||||
@@ -320,7 +322,7 @@ static void Encode (unsigned char *output,
|
|||||||
a multiple of 4.
|
a multiple of 4.
|
||||||
*/
|
*/
|
||||||
static void Decode (UINT4 *output,
|
static void Decode (UINT4 *output,
|
||||||
unsigned char *input,
|
const unsigned char *input,
|
||||||
unsigned int len)
|
unsigned int len)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
@@ -339,10 +341,12 @@ static void Decode (UINT4 *output,
|
|||||||
#include "md5.h"
|
#include "md5.h"
|
||||||
|
|
||||||
void Curl_md5it(unsigned char *outbuffer, /* 16 bytes */
|
void Curl_md5it(unsigned char *outbuffer, /* 16 bytes */
|
||||||
unsigned char *input)
|
const unsigned char *input)
|
||||||
{
|
{
|
||||||
MD5_CTX ctx;
|
MD5_CTX ctx;
|
||||||
MD5_Init(&ctx);
|
MD5_Init(&ctx);
|
||||||
MD5_Update(&ctx, input, strlen((char *)input));
|
MD5_Update(&ctx, input, strlen((char *)input));
|
||||||
MD5_Final(outbuffer, &ctx);
|
MD5_Final(outbuffer, &ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@@ -24,6 +24,6 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
void Curl_md5it(unsigned char *output,
|
void Curl_md5it(unsigned char *output,
|
||||||
unsigned char *input);
|
const unsigned char *input);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user