Compare commits
	
		
			246 Commits
		
	
	
		
			curl-7_8_1
			...
			Curl_easy_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 5a905e0bb8 | ||
|   | c31216949d | ||
|   | 2cb893575d | ||
|   | 63f1f58077 | ||
|   | 36e9507e29 | ||
|   | 1fde1431c9 | ||
|   | bec97a0999 | ||
|   | 07de3c9df0 | ||
|   | 8950a2dfa1 | ||
|   | be47d83555 | ||
|   | d5054ad52d | ||
|   | 051fad8d88 | ||
|   | c4532b9a07 | ||
|   | 0e7824d1a9 | ||
|   | a2c78607a6 | ||
|   | cc1a4edf3d | ||
|   | db7bde1d7a | ||
|   | 719008596a | ||
|   | 377e78d917 | ||
|   | 894b47da9b | ||
|   | 54e7246342 | ||
|   | 9b3b050640 | ||
|   | a0e389caa2 | ||
|   | b747408f9e | ||
|   | d3e55d8155 | ||
|   | 96c7253cea | ||
|   | 3f5227dfc7 | ||
|   | b91103099a | ||
|   | 82d3ded922 | ||
|   | 5a8d1c4cd1 | ||
|   | 46372c04ee | ||
|   | 6147879837 | ||
|   | e2e3c95d3b | ||
|   | c3b448dcea | ||
|   | 86da31e031 | ||
|   | 1d7075e339 | ||
|   | 610ec27d93 | ||
|   | 70f2717c11 | ||
|   | b31a54c46a | ||
|   | 08238f4320 | ||
|   | 06993556f3 | ||
|   | 144459d364 | ||
|   | 0fa61eff77 | ||
|   | a0be515d2d | ||
|   | 5900c0f767 | ||
|   | d10cf2ba94 | ||
|   | bae1a75731 | ||
|   | f5adc8e53f | ||
|   | 67df4c9e6c | ||
|   | 50adfe3be9 | ||
|   | 71794da389 | ||
|   | 6ef11f0b13 | ||
|   | a5705acc9c | ||
|   | 47e7a3e678 | ||
|   | 0ece1b5c34 | ||
|   | 315954c175 | ||
|   | 27ce46a85d | ||
|   | ea3cc81487 | ||
|   | a9b139b25c | ||
|   | bbdd5adf6e | ||
|   | d425f5389d | ||
|   | 26983053c4 | ||
|   | 8e0043165a | ||
|   | c13dbf7bae | ||
|   | a2b6ef3478 | ||
|   | b6526af442 | ||
|   | 4edba42c7c | ||
|   | 1180ef4b31 | ||
|   | 94bf462473 | ||
|   | 233b3f718f | ||
|   | 0452fd8657 | ||
|   | 613eafaf02 | ||
|   | 725bd1dddf | ||
|   | 9835629801 | ||
|   | 3c52c53ddd | ||
|   | 321ba15a82 | ||
|   | 9e5dfc15ac | ||
|   | 8d52681e1d | ||
|   | 56f6815d3d | ||
|   | ce07e79f3c | ||
|   | 723ced9336 | ||
|   | 73417b59c7 | ||
|   | f4e2774ab8 | ||
|   | d5112c0dec | ||
|   | aace68c91b | ||
|   | 4034f31823 | ||
|   | 5323340cae | ||
|   | 3aae2ec511 | ||
|   | df09214c62 | ||
|   | 12acab9b86 | ||
|   | c9c2115088 | ||
|   | d73d28a75b | ||
|   | 13bf964b78 | ||
|   | 3fb9c5727c | ||
|   | b69f33ed44 | ||
|   | 56e8d073bf | ||
|   | 83a8786fe1 | ||
|   | e3d7cc895b | ||
|   | 0f425b01aa | ||
|   | c5a4b52d83 | ||
|   | fc2d24105c | ||
|   | 6704d44dd4 | ||
|   | 3d9aeccc90 | ||
|   | 08655d8d5d | ||
|   | 3e5dbac7a2 | ||
|   | 05d9c9b849 | ||
|   | 4c2fb64e21 | ||
|   | 46a897f604 | ||
|   | d4b23198fa | ||
|   | 6581663687 | ||
|   | 4398151fd5 | ||
|   | d5fbfa3d0b | ||
|   | 3a588fc9e7 | ||
|   | 7dbad3c382 | ||
|   | 8f55c3d47d | ||
|   | 732d80a770 | ||
|   | bd277e3daa | ||
|   | a1cec0e49a | ||
|   | 9027005411 | ||
|   | 1d3542a38f | ||
|   | 429b09ee04 | ||
|   | 6c2a9009e9 | ||
|   | 1b00298b52 | ||
|   | 5ad4a52281 | ||
|   | db5e67e34a | ||
|   | a2688b6ca1 | ||
|   | ceb8f1cb22 | ||
|   | a7a3d49996 | ||
|   | c36fc521bd | ||
|   | ca43cd46a7 | ||
|   | 47ff6f29f4 | ||
|   | 861ca06f11 | ||
|   | d9e54a3cdf | ||
|   | 32eaf9e83a | ||
|   | 9ce94207e2 | ||
|   | 9518e06413 | ||
|   | aa21e42d5b | ||
|   | 16215e80d2 | ||
|   | 658c7e8afc | ||
|   | 666d0b67d1 | ||
|   | 97f3099ff6 | ||
|   | 5a0a51a7ac | ||
|   | 38783506fe | ||
|   | 70ad8a0b2b | ||
|   | cec8a3afb2 | ||
|   | f78de2d8c1 | ||
|   | 7d17713d62 | ||
|   | 546f4dca52 | ||
|   | 09a9b57bae | ||
|   | 10ab082188 | ||
|   | 4999087879 | ||
|   | bff5f1b944 | ||
|   | 6e22b74253 | ||
|   | a547f3a21e | ||
|   | db9bb9221f | ||
|   | 7994817185 | ||
|   | 5ce97dbf0a | ||
|   | 0879515d4c | ||
|   | 2a6e1ea83c | ||
|   | ea6d35d973 | ||
|   | a80f65c578 | ||
|   | 7751756636 | ||
|   | 2de6d8baf6 | ||
|   | b8c69928db | ||
|   | b73746ae43 | ||
|   | ca06bbe583 | ||
|   | a9665b092b | ||
|   | 1ad7023758 | ||
|   | 1a7e13e166 | ||
|   | 3a37c0ae23 | ||
|   | ccb3a13ce6 | ||
|   | 94a3886455 | ||
|   | 616d8eda41 | ||
|   | 85bb25e628 | ||
|   | 83a5e39065 | ||
|   | bd0afd8db4 | ||
|   | 2d68ea45d8 | ||
|   | 5f42ef8f5b | ||
|   | dff0145447 | ||
|   | 8e1f95ac7d | ||
|   | 95e7e551f6 | ||
|   | 5afc694879 | ||
|   | b1c57788f3 | ||
|   | 3d4bb3be22 | ||
|   | 0c063f85fc | ||
|   | c11a1bf72a | ||
|   | f195502064 | ||
|   | 4df9d94414 | ||
|   | 9a7fc9ce3a | ||
|   | 9fa464aa94 | ||
|   | d95ed06aa9 | ||
|   | 5abe5f664a | ||
|   | e9e5197cea | ||
|   | 7b4b166718 | ||
|   | e32641d412 | ||
|   | 1603f64771 | ||
|   | c8926138d1 | ||
|   | ab6c8a06e0 | ||
|   | f35b6e90f5 | ||
|   | b49565308f | ||
|   | f8c357e4ff | ||
|   | 4b6c240832 | ||
|   | 022ea42265 | ||
|   | b54b68ac7b | ||
|   | 1ddf2907c7 | ||
|   | 33dc9c1f95 | ||
|   | f112cc14b9 | ||
|   | 5de39884c3 | ||
|   | e840c109e7 | ||
|   | f1ce203686 | ||
|   | d6ccc33dec | ||
|   | 1b2f4031e1 | ||
|   | 64822958e6 | ||
|   | af59b9b94c | ||
|   | 59ab21ed07 | ||
|   | edec65246a | ||
|   | 95837043e2 | ||
|   | dcfb10fb31 | ||
|   | 0553ab8181 | ||
|   | 410dd54da7 | ||
|   | 7b9ec9507f | ||
|   | 4045cd5ec0 | ||
|   | 81b6ebc0f4 | ||
|   | 56da5a05be | ||
|   | c528dc53c9 | ||
|   | ed786290e2 | ||
|   | 8b2861da85 | ||
|   | 2a70465434 | ||
|   | d60cd937b7 | ||
|   | 76125e196c | ||
|   | 8219990012 | ||
|   | f8d09660cd | ||
|   | 823fa6d273 | ||
|   | 2cf45f68b0 | ||
|   | 7950a95401 | ||
|   | 24805e17d7 | ||
|   | 490d46affb | ||
|   | d30c478378 | ||
|   | 5b6640960a | ||
|   | 6f543f3ede | ||
|   | 93bcfd4e65 | ||
|   | 1400561a5a | ||
|   | 8dc4ac2147 | ||
|   | 7948b0becc | ||
|   | 72e67d3b9d | ||
|   | 711a3a79e3 | 
							
								
								
									
										272
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										272
									
								
								CHANGES
									
									
									
									
									
								
							| @@ -6,6 +6,276 @@ | |||||||
|  |  | ||||||
|                                History of Changes |                                History of Changes | ||||||
|  |  | ||||||
|  | Daniel (11 September 2001) | ||||||
|  | - Added verbose output for SSL connections that output the server | ||||||
|  |   certificate's start and expire dates. As suggested by Paul Harrington. | ||||||
|  |  | ||||||
|  | - Heikki Korpela found problems in the perl ftp server used for the test | ||||||
|  |   suite, when he runs on on OpenBSD with perl 5.6. Some changes have been | ||||||
|  |   made, but nothing really certain. | ||||||
|  |  | ||||||
|  | - T. Bharath has experienced problems with libcurl's stack usage on windows | ||||||
|  |   and works on reducing it. | ||||||
|  |  | ||||||
|  | Daniel (10 September 2001) | ||||||
|  | - Cris Bailiff fixed the perl interface. It stopped working since the changed | ||||||
|  |   behavior with WRITEHEADER and NULL pointers. | ||||||
|  |  | ||||||
|  | - The "output cookies" function could dump core if no cookies were enabled. | ||||||
|  |  | ||||||
|  | Daniel (7 September 2001) | ||||||
|  | - SM pointed out that the SSL code didn't compile any longer if SSL was | ||||||
|  |   disabled... Also, we needed to correct the #include for the utime stuff on | ||||||
|  |   windows. | ||||||
|  |  | ||||||
|  | Daniel (6 September 2001) | ||||||
|  | - T. Bharath pointed out a flaw in the SSL session cache code that made it | ||||||
|  |   sometimes read from a NULL pointer. | ||||||
|  |  | ||||||
|  | Version 7.9-pre3 | ||||||
|  |  | ||||||
|  | Daniel (3 September 2001) | ||||||
|  | - Added the -R/--remote-time option, that uses the remote file's datestamp to | ||||||
|  |   set the local file's datestamp. Thus, when you get a remote file your local | ||||||
|  |   file will get the same time and date. Note that this only works when you use | ||||||
|  |   -o or -O. | ||||||
|  |  | ||||||
|  | - Installed libtool 1.4.1, libtoolized and everything. | ||||||
|  |  | ||||||
|  | Daniel (1 September 2001) | ||||||
|  | - Heikki Korpela pointed out that I did not ship the proper libtool stuff in  | ||||||
|  |   the pre-releases, even though that was my intention. libtoolize has now | ||||||
|  |   been re-run. | ||||||
|  |  | ||||||
|  | - Heikki also patched away the bad use of 'make -C' in the test suite | ||||||
|  |   makefile. make -C is not very portable and is now banned from here. | ||||||
|  |  | ||||||
|  | Version 7.9-pre2 | ||||||
|  |  | ||||||
|  | Daniel (31 August 2001) | ||||||
|  | - I just made a huge internal struct rehaul, and all the big internally used | ||||||
|  |   structs have been renamed, redesigned and stuff have been moved around a bit | ||||||
|  |   to make the source easier to follow, more logically grouped and to hopefully | ||||||
|  |   decrease future bugs. I also hope that this will make new functions to get | ||||||
|  |   easier to add, and make it less likely that we have bugs left like the URL- | ||||||
|  |   free bug from August 23. | ||||||
|  |  | ||||||
|  | Version 7.9-pre1 | ||||||
|  |  | ||||||
|  | Daniel (29 August 2001) | ||||||
|  | - The new cookie code have enabled the brand new '-c/--cookie-jar' option. Use | ||||||
|  |   that to specify the file name in which you want to have all cookies curl | ||||||
|  |   knows of, dumped to. It'll be written using the netscape cookie format. | ||||||
|  |  | ||||||
|  |   This is internally done with the new CURLOPT_COOKIEJAR option to libcurl, | ||||||
|  |   which in turn dumps this information when curl_easy_cleanup() is invoked. | ||||||
|  |   There might be reasons to re-consider my choice of putting it there. Perhaps | ||||||
|  |   it is better placed to get done just before *_perform() is done. It is all | ||||||
|  |   of course depending on how you guys want to use this feature... | ||||||
|  |  | ||||||
|  | - Added ftpupload.c in the source examples section, based on source code posted | ||||||
|  |   by Erick Nuwendam. | ||||||
|  |  | ||||||
|  | Daniel (28 August 2001) | ||||||
|  | - Now running libtool CVS branch-1-4 to generate stuff. Should fix problems | ||||||
|  |   on OpenBSD and hopefully on FreeBSD as well! | ||||||
|  |  | ||||||
|  | - Georg Huettenegger modified the curl_formadd() functionality slightly, and | ||||||
|  |   added support for error code 417 when doing form post and using the Expect: | ||||||
|  |   header. Great work! | ||||||
|  |  | ||||||
|  | - Made some tests with cached SSL session IDs, and they seem to work. There | ||||||
|  |   should be a significant speed improvement in the SSL connection phase, but | ||||||
|  |   in my tiny tests it just isn't possible to notice any difference. Like other | ||||||
|  |   caching in libcurl, you must reuse the same handle for the caching to take | ||||||
|  |   effect. SSL session ID caching is done on a per host-name and destination | ||||||
|  |   port number basis. | ||||||
|  |  | ||||||
|  |   Set verbose, and you'll get informational tests when libcurl detects and | ||||||
|  |   uses a previous SSL session ID. | ||||||
|  |  | ||||||
|  | - Upgraded to automake 1.5 on my development/release machine. | ||||||
|  |  | ||||||
|  | Daniel (27 August 2001) | ||||||
|  | - Slowly started writing SSL session ID caching code | ||||||
|  |  | ||||||
|  | Daniel (24 August 2001) | ||||||
|  | - T. Bharath removed compiler warnings on windows and updated the MS project | ||||||
|  |   files. | ||||||
|  |  | ||||||
|  | - Kevin Roth reported two kinds of command line constructs with the new -G that | ||||||
|  |   curl didn't really deal with the way one would like. | ||||||
|  |  | ||||||
|  | - Tim Costello patched away a use of strcasecmp() in the SSL code. We have our | ||||||
|  |   own portable version named strequal() that should be used! | ||||||
|  |  | ||||||
|  | - Tim also pointed out a problem in the lib/Makefile.vc6 file that made it mix | ||||||
|  |   debug object modules causing confusions. | ||||||
|  |  | ||||||
|  | Daniel (23 August 2001) | ||||||
|  | - T. Bharath accurately found a libcurl bug that would happen when doing a | ||||||
|  |   second invoke of curl_easy_perform() with a new URL when the previous invoke | ||||||
|  |   followed a Location: header. | ||||||
|  |  | ||||||
|  | - Started the improvement work on the cookie engine: | ||||||
|  |   - Now keeps cookies in the same order as the cookie file | ||||||
|  |   - A write to the possibly static string was removed | ||||||
|  |   - Added a function that can output all cookies | ||||||
|  |   - Now supports reading multiple cookie files | ||||||
|  |  | ||||||
|  | - Steve Lhomme corrected a DLL naming issue in the MSVC++ project file. | ||||||
|  |  | ||||||
|  | - Split up the monster function in lib/ftp.c to use more smallish functions to | ||||||
|  |   increase readability and maintainability. | ||||||
|  |  | ||||||
|  | Daniel (21 August 2001) | ||||||
|  | - Georg Huettenegger's big patch was applied. Now we have: | ||||||
|  |   o "Expect: 100-continue" support. We will from now on send that header in | ||||||
|  |     all rfc1867-posts, as that makes us abort much faster when the server | ||||||
|  |     rejects our POST. Posting without the Expect: header is still possible in | ||||||
|  |     the standard replace-internal-header style. | ||||||
|  |   o curl_formadd() is a new formpost building function that is introduced to | ||||||
|  |     replace the now deprecated curl_formparse() function. The latter function | ||||||
|  |     will still hang around for a while, but the curl_formadd() is the new way | ||||||
|  |     and correct way to build form posts. | ||||||
|  |   o Documentation has been updated to reflect these changes | ||||||
|  |  | ||||||
|  |   These changes are reason enough to name the next curl release 7.9... | ||||||
|  |  | ||||||
|  | - We now convert man pages to HTML pages and include them in the release | ||||||
|  |   archive. For the pleasure of everyone without nroff within reach. | ||||||
|  |  | ||||||
|  | - Andr<64>s Garc<72>a's suggested flushing of the progress meter output stream was | ||||||
|  |   added. It should make the progress meter look better on Windows. | ||||||
|  |  | ||||||
|  | - Troy Engel pointed out a mistake in the configure script that made it fail | ||||||
|  |   on many Red Hat boxes! | ||||||
|  |  | ||||||
|  | Daniel (20 August 2001) | ||||||
|  | - We need an updated libtool to make a better build environment for OpenBSD | ||||||
|  |   as well as FreeBSD | ||||||
|  |  | ||||||
|  | Version 7.8.1 | ||||||
|  |  | ||||||
|  | Daniel (20 August 2001) | ||||||
|  | - Brad pointed out that we ship two extra libtool files in the tarballs that | ||||||
|  |   we really don't need to! Removing them makes the gz-archive about 60K | ||||||
|  |   smaller! | ||||||
|  |  | ||||||
|  | - Albert Chin brought fixes for the configure script to detect socklen_t | ||||||
|  |   properly as well as moving lots of our custom autoconf macros to | ||||||
|  |   acinclude.m4. | ||||||
|  |  | ||||||
|  | Daniel (19 August 2001) | ||||||
|  | - Moonesamy improved his -G feature for host names only URLs... | ||||||
|  |  | ||||||
|  | Daniel (17 August 2001) | ||||||
|  | - Finally cleaned up the kerberos code to use Curl_ prefixes on all global | ||||||
|  |   symbols and to not use global variables. | ||||||
|  |  | ||||||
|  | Version 7.8.1-pre6 | ||||||
|  |  | ||||||
|  | Daniel (16 August 2001) | ||||||
|  | - S. Moonesamy added the -G option to curl, that converts the data specified | ||||||
|  |   with -d to a GET request. Default action when using -d is POST. When -G is | ||||||
|  |   used, the -d specified data will be appended to the URL with a '?' | ||||||
|  |   separator. As suggested previously by Kevin Roth. | ||||||
|  |  | ||||||
|  | - curl-config --libs should now display all linker options required to link | ||||||
|  |   with libcurl. It includes the path and options for libcurl itself. | ||||||
|  |   curl-config --cflags displays the compiler option(s) needed to compile | ||||||
|  |   source files that use libcurl functions. Basically, that sets the include | ||||||
|  |   path correct. | ||||||
|  |  | ||||||
|  | Daniel (15 August 2001) | ||||||
|  | - Arkadiusz Miskiewicz pointed out a mistake in how IPv6-style IP-addresses | ||||||
|  |   were parsed and used. (RFC2732-format) | ||||||
|  |  | ||||||
|  | - Bug #12733 over on php.net identified a problem in libcurl that made it core | ||||||
|  |   dump if you used CURLOPT_POST without setting any data to post with | ||||||
|  |   CURLOPT_POSTFIELDS! This is no longer the case. Not using CURLOPT_POSTFIELDS | ||||||
|  |   now equals setting it to no data at all. | ||||||
|  |  | ||||||
|  | - Ramana Mokkapati reported that curl with '-w %{http_code}' didn't work | ||||||
|  |   properly when used for multiple URLs on a single command line. Indeed, the | ||||||
|  |   variable was not reset between the requests. This is now fixed. | ||||||
|  |  | ||||||
|  | - David James fixed the Borland makefile so that libcurl still compiles and | ||||||
|  |   builds with that compiler. | ||||||
|  |  | ||||||
|  | Daniel (14 August 2001) | ||||||
|  | - Oops. I ruined Nico's socklen_t define in config-vms.h, corrected it now. | ||||||
|  |  | ||||||
|  | - An older item not mentioned here before: CURL_GLOBAL_WIN32 is a define for | ||||||
|  |   windows users to curl_global_init(), that makes libcurl init the winsock | ||||||
|  |   stuff. If libcurl is all socket stuff you do, then allowing it to fiddle | ||||||
|  |   with this is a comfortable shortcut to fame. | ||||||
|  |  | ||||||
|  | Version 7.8.1-pre5 | ||||||
|  |  | ||||||
|  | Daniel (14 August 2001) | ||||||
|  | - Nico Baggus provided more feedback from his VMS porting efforts and a few | ||||||
|  |   minor changes were necessary. | ||||||
|  |  | ||||||
|  | - I modified configure.in so that --enable-debug sets more picky gcc options. | ||||||
|  |   I then removed almost all the new warnings that appeared, and by doing so I | ||||||
|  |   corrected the size_t-treated-as-signed problem that has been discussed on | ||||||
|  |   the mailing list previously. I also removed a bunch of the just recently | ||||||
|  |   added #ifdef VMS lines. | ||||||
|  |  | ||||||
|  | - I removed the use of a global variable in the SSL code. It was once | ||||||
|  |   necessary but hasn't been needed since OpenSSL 0.9.4. The old code should | ||||||
|  |   (hopefully) still work if libcurl is built against an ancient version of | ||||||
|  |   OpenSSL. | ||||||
|  |  | ||||||
|  | Daniel (13 August 2001) | ||||||
|  | - Peter Todd posted a patch that now allows non-file rc1867-style form posts | ||||||
|  |   to be larger than 4K. | ||||||
|  |  | ||||||
|  | Daniel (10 August 2001) | ||||||
|  | - S. Moonesamy fixed bugs for building debug and SSL lib in VC makefile | ||||||
|  |  | ||||||
|  | Daniel (9 August 2001) | ||||||
|  | - The redirected error stream was closed before the curl_easy_cleanup() call | ||||||
|  |   was made, and when VERBOSE was enabled, the cleanup function tried to use | ||||||
|  |   the stream. It could lead to a segmentation fault. Also, the stream was | ||||||
|  |   closed even if we looped to get more files.  Corrects Dustin Boswell's bug | ||||||
|  |   report #441610 | ||||||
|  |  | ||||||
|  | - Now generates the release configure script with autoconf 2.52 | ||||||
|  |  | ||||||
|  | Version 7.8.1-pre4 | ||||||
|  |  | ||||||
|  | Daniel (8 August 2001) | ||||||
|  | - curl -E uses a colon to separate a file name from a passphrase. This turned | ||||||
|  |   out really bad for the windows people who wants to include a drive letter in | ||||||
|  |   the file name like "c:\cert.pem". There's now a win32 work-around | ||||||
|  |   implemented that tries work around that, when the colon seems to be used for | ||||||
|  |   this kind of construct. | ||||||
|  |  | ||||||
|  | - Patrick Bihan-Faou introduced CURLOPT_SSL_VERIFYHOST, which makes curl | ||||||
|  |   verify the server's CN field when talking https://. If --cacert is not used, | ||||||
|  |   any failures in matching is only displayed as information (-v). | ||||||
|  |  | ||||||
|  | Daniel (7 August 2001) | ||||||
|  | - Wrote up nine more test cases, more or less converted from the former test | ||||||
|  |   suite. | ||||||
|  |  | ||||||
|  | Daniel (6 August 2001) | ||||||
|  | - Heikki Korpela posted a patch that makes 'curl-config --libs' include the | ||||||
|  |   directory in which libcurl itself is installed in. While this wasn't my | ||||||
|  |   initial intention with this option, it makes sense and makes linking with | ||||||
|  |   libcurl easier. | ||||||
|  |  | ||||||
|  | - Stefan Ulrich pointed out to us that other tools and libraries treat file:// | ||||||
|  |   URLs with only one slash after the host name slighly different than libcurl | ||||||
|  |   does. Since all the others seem to agree, we better follow them. | ||||||
|  |  | ||||||
|  | - Nico Baggus provided us with a huge set of fixes to make curl compile and | ||||||
|  |   build under OpenVMS. | ||||||
|  |  | ||||||
|  | Version 7.8.1-pre3 | ||||||
|  |  | ||||||
| Daniel (6 August 2001) | Daniel (6 August 2001) | ||||||
| - Jonathan Hseu noticed that you couldn't get a header callback unless you | - Jonathan Hseu noticed that you couldn't get a header callback unless you | ||||||
|   set CURLOPT_WRITEHEADER to non-NULL, even if you didn't care about that |   set CURLOPT_WRITEHEADER to non-NULL, even if you didn't care about that | ||||||
| @@ -874,7 +1144,7 @@ Version 7.6.1-pre2 | |||||||
| Daniel (31 January 2001) | Daniel (31 January 2001) | ||||||
| - Curl_read() and curl_read() now return a ssize_t for the size, as it had to | - Curl_read() and curl_read() now return a ssize_t for the size, as it had to | ||||||
|   be able to return -1. The telnet support crashed due to this and there was a |   be able to return -1. The telnet support crashed due to this and there was a | ||||||
|   possibility to weird behaviour all over. Linus Nielsen Feltzing helped me |   possibility to weird behavior all over. Linus Nielsen Feltzing helped me | ||||||
|   find this. |   find this. | ||||||
|  |  | ||||||
| - Added a configure.in check for a working getaddrinfo() if IPv6 is requested. | - Added a configure.in check for a working getaddrinfo() if IPv6 is requested. | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								CVS-INFO
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								CVS-INFO
									
									
									
									
									
								
							| @@ -10,8 +10,8 @@ This file is only present in the CVS - never in release archives. It contains | |||||||
| information about other files and things that the CVS repository keeps in its | information about other files and things that the CVS repository keeps in its | ||||||
| inner sanctum. | inner sanctum. | ||||||
|  |  | ||||||
| Use autoconf 2.50 and no earlier. Also, try having automake 1.4 and libtool | Use autoconf 2.50 and no earlier. Also, try having automake 1.5 and libtool | ||||||
| 1.4 at least. | 1.4.1 at least. | ||||||
|  |  | ||||||
| You will need perl to generate the src/hugehelp.c file. The file | You will need perl to generate the src/hugehelp.c file. The file | ||||||
| src/hugehelp.c.cvs is a one-shot file that you can rename to src/hugehelp.c if | src/hugehelp.c.cvs is a one-shot file that you can rename to src/hugehelp.c if | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								MITX.txt
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								MITX.txt
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| COPYRIGHT AND PERMISSION NOTICE | COPYRIGHT AND PERMISSION NOTICE | ||||||
|  |  | ||||||
| Copyright (c) 2000, Daniel Stenberg, <daniel@haxx.se>. | Copyright (c) 1996 - 2001, Daniel Stenberg, <daniel@haxx.se>. | ||||||
|  |  | ||||||
| All rights reserved. | All rights reserved. | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -6,17 +6,21 @@ AUTOMAKE_OPTIONS = foreign no-dependencies | |||||||
|  |  | ||||||
| EXTRA_DIST =						\ | EXTRA_DIST =						\ | ||||||
| 	CHANGES LEGAL maketgz MITX.txt MPL-1.1.txt	\ | 	CHANGES LEGAL maketgz MITX.txt MPL-1.1.txt	\ | ||||||
| 	config-win32.h reconf packages/README Makefile.dist \ | 	config-win32.h reconf Makefile.dist		\ | ||||||
| 	curl-config.in libtool | 	curl-config.in build_vms.com config-riscos.h	\ | ||||||
|  | 	config-vms.h curl-mode.el | ||||||
|  |  | ||||||
| bin_SCRIPTS = curl-config | bin_SCRIPTS = curl-config | ||||||
|  |  | ||||||
| SUBDIRS = docs lib src include tests packages perl php | SUBDIRS = docs lib src include tests packages | ||||||
|  |  | ||||||
| # create a root makefile in the distribution: | # create a root makefile in the distribution: | ||||||
| dist-hook: | dist-hook: | ||||||
| 	cp $(srcdir)/Makefile.dist $(distdir)/Makefile | 	cp $(srcdir)/Makefile.dist $(distdir)/Makefile | ||||||
|  |  | ||||||
|  | html: | ||||||
|  | 	cd docs; make html | ||||||
|  |  | ||||||
| check: test | check: test | ||||||
|  |  | ||||||
| test: | test: | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
									
									
									
									
								
							| @@ -12,7 +12,7 @@ README | |||||||
|   document. |   document. | ||||||
|  |  | ||||||
|   libcurl is a library that Curl is using to do its job. It is readily |   libcurl is a library that Curl is using to do its job. It is readily | ||||||
|   available to be used by your software. Read the libcurl.5 man page to |   available to be used by your software. Read the libcurl.3 man page to | ||||||
|   find out how! |   find out how! | ||||||
|  |  | ||||||
|   You find answers to the most frequent questions we get in the FAQ document. |   You find answers to the most frequent questions we get in the FAQ document. | ||||||
|   | |||||||
							
								
								
									
										325
									
								
								acinclude.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										325
									
								
								acinclude.m4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,325 @@ | |||||||
|  | dnl Check for socklen_t: historically on BSD it is an int, and in | ||||||
|  | dnl POSIX 1g it is a type of its own, but some platforms use different | ||||||
|  | dnl types for the argument to getsockopt, getpeername, etc.  So we | ||||||
|  | dnl have to test to find something that will work. | ||||||
|  | AC_DEFUN([TYPE_SOCKLEN_T], | ||||||
|  | [ | ||||||
|  |    AC_CHECK_TYPE([socklen_t], ,[ | ||||||
|  |       AC_MSG_CHECKING([for socklen_t equivalent]) | ||||||
|  |       AC_CACHE_VAL([curl_cv_socklen_t_equiv], | ||||||
|  |       [ | ||||||
|  |          # Systems have either "struct sockaddr *" or | ||||||
|  |          # "void *" as the second argument to getpeername | ||||||
|  |          curl_cv_socklen_t_equiv= | ||||||
|  |          for arg2 in "struct sockaddr" void; do | ||||||
|  |             for t in int size_t unsigned long "unsigned long"; do | ||||||
|  |                AC_TRY_COMPILE([ | ||||||
|  |                   #include <sys/types.h> | ||||||
|  |                   #include <sys/socket.h> | ||||||
|  |  | ||||||
|  |                   int getpeername (int, $arg2 *, $t *); | ||||||
|  |                ],[ | ||||||
|  |                   $t len; | ||||||
|  |                   getpeername(0,0,&len); | ||||||
|  |                ],[ | ||||||
|  |                   curl_cv_socklen_t_equiv="$t" | ||||||
|  |                   break | ||||||
|  |                ]) | ||||||
|  |             done | ||||||
|  |          done | ||||||
|  |  | ||||||
|  |          if test "x$curl_cv_socklen_t_equiv" = x; then | ||||||
|  |             AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) | ||||||
|  |          fi | ||||||
|  |       ]) | ||||||
|  |       AC_MSG_RESULT($curl_cv_socklen_t_equiv) | ||||||
|  |       AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv, | ||||||
|  | 			[type to use in place of socklen_t if not defined])], | ||||||
|  |       [#include <sys/types.h> | ||||||
|  | #include <sys/socket.h>]) | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | dnl ************************************************************ | ||||||
|  | dnl check for "localhost", if it doesn't exist, we can't do the | ||||||
|  | dnl gethostbyname_r tests! | ||||||
|  | dnl  | ||||||
|  |  | ||||||
|  | AC_DEFUN(CURL_CHECK_WORKING_RESOLVER,[ | ||||||
|  | AC_MSG_CHECKING([if "localhost" resolves]) | ||||||
|  | AC_TRY_RUN([ | ||||||
|  | #include <string.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h> | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main () { | ||||||
|  | struct hostent *h; | ||||||
|  | h = gethostbyname("localhost"); | ||||||
|  | exit (h == NULL ? 1 : 0); }],[ | ||||||
|  |       AC_MSG_RESULT(yes)],[ | ||||||
|  |       AC_MSG_RESULT(no) | ||||||
|  |       AC_MSG_ERROR([can't figure out gethostbyname_r() since localhost doesn't resolve]) | ||||||
|  |  | ||||||
|  |       ] | ||||||
|  | ) | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | dnl ************************************************************ | ||||||
|  | dnl check for working getaddrinfo() | ||||||
|  | dnl | ||||||
|  | AC_DEFUN(CURL_CHECK_WORKING_GETADDRINFO,[ | ||||||
|  |   AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ | ||||||
|  |   AC_TRY_RUN( [ | ||||||
|  | #include <netdb.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <sys/socket.h> | ||||||
|  |  | ||||||
|  | void main(void) { | ||||||
|  |     struct addrinfo hints, *ai; | ||||||
|  |     int error; | ||||||
|  |  | ||||||
|  |     memset(&hints, 0, sizeof(hints)); | ||||||
|  |     hints.ai_family = AF_UNSPEC; | ||||||
|  |     hints.ai_socktype = SOCK_STREAM; | ||||||
|  |     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai); | ||||||
|  |     if (error) { | ||||||
|  |         exit(1); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         exit(0); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | ],[ | ||||||
|  |   ac_cv_working_getaddrinfo="yes" | ||||||
|  | ],[ | ||||||
|  |   ac_cv_working_getaddrinfo="no" | ||||||
|  | ],[ | ||||||
|  |   ac_cv_working_getaddrinfo="yes" | ||||||
|  | ])]) | ||||||
|  | if test "$ac_cv_working_getaddrinfo" = "yes"; then | ||||||
|  |   AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works]) | ||||||
|  |   AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support]) | ||||||
|  |  | ||||||
|  |   IPV6_ENABLED=1 | ||||||
|  |   AC_SUBST(IPV6_ENABLED) | ||||||
|  | fi | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | AC_DEFUN(CURL_CHECK_LOCALTIME_R, | ||||||
|  | [ | ||||||
|  |   dnl check for a few thread-safe functions | ||||||
|  |   AC_CHECK_FUNCS(localtime_r,[ | ||||||
|  |     AC_MSG_CHECKING(whether localtime_r is declared) | ||||||
|  |     AC_EGREP_CPP(localtime_r,[ | ||||||
|  | #include <time.h>],[ | ||||||
|  |       AC_MSG_RESULT(yes)],[ | ||||||
|  |       AC_MSG_RESULT(no) | ||||||
|  |       AC_MSG_CHECKING(whether localtime_r with -D_REENTRANT is declared) | ||||||
|  |       AC_EGREP_CPP(localtime_r,[ | ||||||
|  | #define _REENTRANT | ||||||
|  | #include <time.h>],[ | ||||||
|  | 	AC_DEFINE(NEED_REENTRANT) | ||||||
|  | 	AC_MSG_RESULT(yes)], | ||||||
|  | 	AC_MSG_RESULT(no))])]) | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | AC_DEFUN(CURL_CHECK_INET_NTOA_R, | ||||||
|  | [ | ||||||
|  |   dnl determine if function definition for inet_ntoa_r exists. | ||||||
|  |   AC_CHECK_FUNCS(inet_ntoa_r,[ | ||||||
|  |     AC_MSG_CHECKING(whether inet_ntoa_r is declared) | ||||||
|  |     AC_EGREP_CPP(inet_ntoa_r,[ | ||||||
|  | #include <arpa/inet.h>],[ | ||||||
|  |       AC_DEFINE(HAVE_INET_NTOA_R_DECL) | ||||||
|  |       AC_MSG_RESULT(yes)],[ | ||||||
|  |       AC_MSG_RESULT(no) | ||||||
|  |       AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared) | ||||||
|  |       AC_EGREP_CPP(inet_ntoa_r,[ | ||||||
|  | #define _REENTRANT | ||||||
|  | #include <arpa/inet.h>],[ | ||||||
|  | 	AC_DEFINE(HAVE_INET_NTOA_R_DECL) | ||||||
|  | 	AC_DEFINE(NEED_REENTRANT) | ||||||
|  | 	AC_MSG_RESULT(yes)], | ||||||
|  | 	AC_MSG_RESULT(no))])]) | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | AC_DEFUN(CURL_CHECK_GETHOSTBYADDR_R, | ||||||
|  | [ | ||||||
|  |   dnl check for number of arguments to gethostbyaddr_r. it might take | ||||||
|  |   dnl either 5, 7, or 8 arguments. | ||||||
|  |   AC_CHECK_FUNCS(gethostbyaddr_r,[ | ||||||
|  |     AC_MSG_CHECKING(if gethostbyaddr_r takes 5 arguments) | ||||||
|  |     AC_TRY_COMPILE([ | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h>],[ | ||||||
|  | char * address; | ||||||
|  | int length; | ||||||
|  | int type; | ||||||
|  | struct hostent h; | ||||||
|  | struct hostent_data hdata; | ||||||
|  | int rc; | ||||||
|  | rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[ | ||||||
|  |       AC_MSG_RESULT(yes) | ||||||
|  |       AC_DEFINE(HAVE_GETHOSTBYADDR_R_5) | ||||||
|  |       ac_cv_gethostbyaddr_args=5],[ | ||||||
|  |       AC_MSG_RESULT(no) | ||||||
|  |       AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments) | ||||||
|  |       AC_TRY_COMPILE([ | ||||||
|  | #define _REENTRANT | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h>],[ | ||||||
|  | char * address; | ||||||
|  | int length; | ||||||
|  | int type; | ||||||
|  | struct hostent h; | ||||||
|  | struct hostent_data hdata; | ||||||
|  | int rc; | ||||||
|  | rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[ | ||||||
|  | 	AC_MSG_RESULT(yes) | ||||||
|  | 	AC_DEFINE(HAVE_GETHOSTBYADDR_R_5) | ||||||
|  | 	AC_DEFINE(NEED_REENTRANT) | ||||||
|  | 	ac_cv_gethostbyaddr_args=5],[ | ||||||
|  | 	AC_MSG_RESULT(no) | ||||||
|  | 	AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments) | ||||||
|  | 	AC_TRY_COMPILE([ | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h>],[ | ||||||
|  | char * address; | ||||||
|  | int length; | ||||||
|  | int type; | ||||||
|  | struct hostent h; | ||||||
|  | char buffer[8192]; | ||||||
|  | int h_errnop; | ||||||
|  | struct hostent * hp; | ||||||
|  |  | ||||||
|  | hp = gethostbyaddr_r(address, length, type, &h, | ||||||
|  |                      buffer, 8192, &h_errnop);],[ | ||||||
|  | 	  AC_MSG_RESULT(yes) | ||||||
|  | 	  AC_DEFINE(HAVE_GETHOSTBYADDR_R_7) | ||||||
|  | 	  ac_cv_gethostbyaddr_args=7],[ | ||||||
|  | 	  AC_MSG_RESULT(no) | ||||||
|  | 	  AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments) | ||||||
|  | 	  AC_TRY_COMPILE([ | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h>],[ | ||||||
|  | char * address; | ||||||
|  | int length; | ||||||
|  | int type; | ||||||
|  | struct hostent h; | ||||||
|  | char buffer[8192]; | ||||||
|  | int h_errnop; | ||||||
|  | struct hostent * hp; | ||||||
|  | int rc; | ||||||
|  |  | ||||||
|  | rc = gethostbyaddr_r(address, length, type, &h, | ||||||
|  |                      buffer, 8192, &hp, &h_errnop);],[ | ||||||
|  | 	    AC_MSG_RESULT(yes) | ||||||
|  | 	    AC_DEFINE(HAVE_GETHOSTBYADDR_R_8) | ||||||
|  | 	    ac_cv_gethostbyaddr_args=8],[ | ||||||
|  | 	    AC_MSG_RESULT(no) | ||||||
|  | 	    have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ]) | ||||||
|  |  | ||||||
|  | AC_DEFUN(CURL_CHECK_GETHOSTBYNAME_R, | ||||||
|  | [ | ||||||
|  |   dnl check for number of arguments to gethostbyname_r. it might take | ||||||
|  |   dnl either 3, 5, or 6 arguments. | ||||||
|  |   AC_CHECK_FUNCS(gethostbyname_r,[ | ||||||
|  |     AC_MSG_CHECKING(if gethostbyname_r takes 3 arguments) | ||||||
|  |     AC_TRY_RUN([ | ||||||
|  | #include <string.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h> | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main () { | ||||||
|  | struct hostent h; | ||||||
|  | struct hostent_data hdata; | ||||||
|  | char *name = "localhost"; | ||||||
|  | int rc; | ||||||
|  | memset(&h, 0, sizeof(struct hostent)); | ||||||
|  | memset(&hdata, 0, sizeof(struct hostent_data)); | ||||||
|  | rc = gethostbyname_r(name, &h, &hdata); | ||||||
|  | exit (rc != 0 ? 1 : 0); }],[ | ||||||
|  |       AC_MSG_RESULT(yes) | ||||||
|  |       AC_DEFINE(HAVE_GETHOSTBYNAME_R_3) | ||||||
|  |       ac_cv_gethostbyname_args=3],[ | ||||||
|  |       AC_MSG_RESULT(no) | ||||||
|  |       AC_MSG_CHECKING(if gethostbyname_r with -D_REENTRANT takes 3 arguments) | ||||||
|  |       AC_TRY_RUN([ | ||||||
|  | #define _REENTRANT | ||||||
|  |  | ||||||
|  | #include <string.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h> | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main () { | ||||||
|  | struct hostent h; | ||||||
|  | struct hostent_data hdata; | ||||||
|  | char *name = "localhost"; | ||||||
|  | int rc; | ||||||
|  | memset(&h, 0, sizeof(struct hostent)); | ||||||
|  | memset(&hdata, 0, sizeof(struct hostent_data)); | ||||||
|  | rc = gethostbyname_r(name, &h, &hdata); | ||||||
|  | exit (rc != 0 ? 1 : 0); }],[ | ||||||
|  | 	AC_MSG_RESULT(yes) | ||||||
|  | 	AC_DEFINE(HAVE_GETHOSTBYNAME_R_3) | ||||||
|  | 	AC_DEFINE(NEED_REENTRANT) | ||||||
|  | 	ac_cv_gethostbyname_args=3],[ | ||||||
|  | 	AC_MSG_RESULT(no) | ||||||
|  | 	AC_MSG_CHECKING(if gethostbyname_r takes 5 arguments) | ||||||
|  | 	AC_TRY_RUN([ | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h> | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main () { | ||||||
|  | struct hostent *hp; | ||||||
|  | struct hostent h; | ||||||
|  | char *name = "localhost"; | ||||||
|  | char buffer[8192]; | ||||||
|  | int h_errno; | ||||||
|  | hp = gethostbyname_r(name, &h, buffer, 8192, &h_errno); | ||||||
|  | exit (hp == NULL ? 1 : 0); }],[ | ||||||
|  | 	  AC_MSG_RESULT(yes) | ||||||
|  | 	  AC_DEFINE(HAVE_GETHOSTBYNAME_R_5) | ||||||
|  |           ac_cv_gethostbyname_args=5],[ | ||||||
|  | 	  AC_MSG_RESULT(no) | ||||||
|  | 	  AC_MSG_CHECKING(if gethostbyname_r takes 6 arguments) | ||||||
|  | 	  AC_TRY_RUN([ | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <netdb.h> | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main () { | ||||||
|  | struct hostent h; | ||||||
|  | struct hostent *hp; | ||||||
|  | char *name = "localhost"; | ||||||
|  | char buf[8192]; | ||||||
|  | int rc; | ||||||
|  | int h_errno; | ||||||
|  | rc = gethostbyname_r(name, &h, buf, 8192, &hp, &h_errno); | ||||||
|  | exit (rc != 0 ? 1 : 0); }],[ | ||||||
|  | 	    AC_MSG_RESULT(yes) | ||||||
|  | 	    AC_DEFINE(HAVE_GETHOSTBYNAME_R_6) | ||||||
|  |             ac_cv_gethostbyname_args=6],[ | ||||||
|  | 	    AC_MSG_RESULT(no) | ||||||
|  | 	    have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"], | ||||||
|  | 	    [ac_cv_gethostbyname_args=0])], | ||||||
|  | 	  [ac_cv_gethostbyname_args=0])], | ||||||
|  | 	[ac_cv_gethostbyname_args=0])], | ||||||
|  |       [ac_cv_gethostbyname_args=0])]) | ||||||
|  |  | ||||||
|  | if test "$ac_cv_func_gethostbyname_r" = "yes"; then | ||||||
|  |   if test "$ac_cv_gethostbyname_args" = "0"; then | ||||||
|  |     dnl there's a gethostbyname_r() function, but we don't know how | ||||||
|  |     dnl many arguments it wants! | ||||||
|  |     AC_MSG_ERROR([couldn't figure out how to use gethostbyname_r()]) | ||||||
|  |   fi | ||||||
|  | fi | ||||||
|  | ]) | ||||||
							
								
								
									
										
											BIN
										
									
								
								build_vms.com
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								build_vms.com
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										25
									
								
								config-riscos.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								config-riscos.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  |  | ||||||
|  | #define socklen_t int | ||||||
|  |  | ||||||
|  | #define HAVE_SYS_SOCKET_H | ||||||
|  | #define HAVE_ARPA_INET_H | ||||||
|  | #define HAVE_SYS_SELECT_H | ||||||
|  | #define HAVE_FCNTL_H | ||||||
|  | #define HAVE_GETTIMEOFDAY | ||||||
|  |  | ||||||
|  | #define HAVE_SELECT | ||||||
|  | #define HAVE_SOCKET | ||||||
|  | #define ifr_dstaddr ifr_addr | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <sys/if.h> | ||||||
|  | #include <sys/fcntl.h> | ||||||
|  | #include <sys/ioctl.h> | ||||||
|  | #include <netinet/in.h> | ||||||
|  | #include <netdb.h> | ||||||
|  |  | ||||||
|  | #define ioctl(a,b,c,d) (ioctl(a,b,c) * (d==d)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #define OS "RISC OS" | ||||||
							
								
								
									
										367
									
								
								config-vms.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										367
									
								
								config-vms.h
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,367 @@ | |||||||
|  | /* config.h.in.  Generated automatically from configure.in by autoheader.  */ | ||||||
|  |  | ||||||
|  | /* 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 as the return type of signal handlers (int or void).  */ | ||||||
|  | #undef RETSIGTYPE | ||||||
|  |  | ||||||
|  | /* Define to `unsigned' if <sys/types.h> doesn't define.  */ | ||||||
|  | #undef size_t | ||||||
|  |  | ||||||
|  | /* 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 "ALPHA-COMPAQ-VMS" | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyaddr_r() function with 5 arguments */ | ||||||
|  | #undef HAVE_GETHOSTBYADDR_R_5 | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyaddr_r() function with 7 arguments */ | ||||||
|  | #undef HAVE_GETHOSTBYADDR_R_7 | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyaddr_r() function with 8 arguments */ | ||||||
|  | #undef HAVE_GETHOSTBYADDR_R_8 | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyname_r() function with 3 arguments */ | ||||||
|  | #undef HAVE_GETHOSTBYNAME_R_3 | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyname_r() function with 5 arguments */ | ||||||
|  | #undef HAVE_GETHOSTBYNAME_R_5 | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyname_r() function with 6 arguments */ | ||||||
|  | #undef HAVE_GETHOSTBYNAME_R_6 | ||||||
|  |  | ||||||
|  | /* Define if you have the inet_ntoa_r function declared. */ | ||||||
|  | #undef HAVE_INET_NTOA_R_DECL | ||||||
|  |  | ||||||
|  | /* Define if you need the _REENTRANT define for some functions */ | ||||||
|  | #undef NEED_REENTRANT | ||||||
|  |  | ||||||
|  | /* Define if you have the Kerberos4 libraries (including -ldes) */ | ||||||
|  | #undef KRB4 | ||||||
|  |  | ||||||
|  | /* Define this to 'int' if ssize_t is not an available typedefed type */ | ||||||
|  | #undef ssize_t | ||||||
|  |  | ||||||
|  | /* Define this to 'int' if socklen_t is not an available typedefed type */ | ||||||
|  | #define socklen_t size_t | ||||||
|  |  | ||||||
|  | /* Define this as a suitable file to read random data from */ | ||||||
|  | #undef RANDOM_FILE | ||||||
|  |  | ||||||
|  | /* Define this to your Entropy Gathering Daemon socket pathname */ | ||||||
|  | #undef EGD_SOCKET | ||||||
|  |  | ||||||
|  | /* The number of bytes in a long double.  */ | ||||||
|  | #define SIZEOF_LONG_DOUBLE 8 | ||||||
|  |  | ||||||
|  | /* The number of bytes in a long long.  */ | ||||||
|  | #define SIZEOF_LONG_LONG 8 | ||||||
|  |  | ||||||
|  | /* Define if you have the RAND_egd function.  */ | ||||||
|  | #undef HAVE_RAND_EGD | ||||||
|  |  | ||||||
|  | /* Define if you have the RAND_screen function.  */ | ||||||
|  | #undef HAVE_RAND_SCREEN | ||||||
|  |  | ||||||
|  | /* Define if you have the RAND_status function.  */ | ||||||
|  | #undef HAVE_RAND_STATUS | ||||||
|  |  | ||||||
|  | /* Define if you have the closesocket function.  */ | ||||||
|  | #undef HAVE_CLOSESOCKET | ||||||
|  |  | ||||||
|  | /* Define if you have the geteuid function.  */ | ||||||
|  | #define HAVE_GETEUID 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyaddr function.  */ | ||||||
|  | #define HAVE_GETHOSTBYADDR 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyaddr_r function.  */ | ||||||
|  | #undef HAVE_GETHOSTBYADDR_R | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostbyname_r function.  */ | ||||||
|  | #undef HAVE_GETHOSTBYNAME_R | ||||||
|  |  | ||||||
|  | /* Define if you have the gethostname function.  */ | ||||||
|  | #define HAVE_GETHOSTNAME 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the getpass_r function.  */ | ||||||
|  | #undef HAVE_GETPASS_R | ||||||
|  |  | ||||||
|  | /* Define if you have the getpwuid function.  */ | ||||||
|  | #define HAVE_GETPWUID 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 inet_ntoa_r function.  */ | ||||||
|  | #undef HAVE_INET_NTOA_R | ||||||
|  |  | ||||||
|  | /* Define if you have the krb_get_our_ip_for_realm function.  */ | ||||||
|  | #undef HAVE_KRB_GET_OUR_IP_FOR_REALM | ||||||
|  |  | ||||||
|  | /* Define if you have the localtime_r function.  */ | ||||||
|  | #undef HAVE_LOCALTIME_R | ||||||
|  |  | ||||||
|  | /* 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 setvbuf function.  */ | ||||||
|  | #undef HAVE_SETVBUF | ||||||
|  |  | ||||||
|  | /* Define if you have the sigaction function.  */ | ||||||
|  | #define HAVE_SIGACTION 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the signal function.  */ | ||||||
|  | #define HAVE_SIGNAL 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 strcmpi function.  */ | ||||||
|  | #define HAVE_STRCMPI 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 stricmp function.  */ | ||||||
|  | #define HAVE_STRICMP 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the strlcat function.  */ | ||||||
|  | #undef HAVE_STRLCAT | ||||||
|  |  | ||||||
|  | /* Define if you have the strlcpy function.  */ | ||||||
|  | #undef HAVE_STRLCPY | ||||||
|  |  | ||||||
|  | /* Define if you have the strstr function.  */ | ||||||
|  | #define  HAVE_STRSTR 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the tcgetattr function.  */ | ||||||
|  | #undef HAVE_TCGETATTR | ||||||
|  |  | ||||||
|  | /* Define if you have the tcsetattr function.  */ | ||||||
|  | #undef HAVE_TCSETATTR | ||||||
|  |  | ||||||
|  | /* Define if you have the uname function.  */ | ||||||
|  | #define HAVE_UNAME 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <alloca.h> header file.  */ | ||||||
|  | #undef HAVE_ALLOCA_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <arpa/inet.h> header file.  */ | ||||||
|  | #undef HAVE_ARPA_INET_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <crypto.h> header file.  */ | ||||||
|  | #undef HAVE_CRYPTO_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <des.h> header file.  */ | ||||||
|  | #undef HAVE_DES_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <dlfcn.h> header file.  */ | ||||||
|  | #undef HAVE_DLFCN_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <err.h> header file.  */ | ||||||
|  | #define HAVE_ERR_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <fcntl.h> header file.  */ | ||||||
|  | #define HAVE_FCNTL_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <getopt.h> header file.  */ | ||||||
|  | #define HAVE_GETOPT_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <io.h> header file.  */ | ||||||
|  | #undef HAVE_IO_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <krb.h> header file.  */ | ||||||
|  | #undef HAVE_KRB_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <malloc.h> header file.  */ | ||||||
|  | #define HAVE_MALLOC_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <net/if.h> header file.  */ | ||||||
|  | #define HAVE_NET_IF_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <netdb.h> header file.  */ | ||||||
|  | #define HAVE_NETDB_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <netinet/if_ether.h> header file.  */ | ||||||
|  | #define HAVE_NETINET_IF_ETHER_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <netinet/in.h> header file.  */ | ||||||
|  | #define HAVE_NETINET_IN_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <openssl/crypto.h> header file.  */ | ||||||
|  | #undef HAVE_OPENSSL_CRYPTO_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <openssl/err.h> header file.  */ | ||||||
|  | #undef HAVE_OPENSSL_ERR_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <openssl/pem.h> header file.  */ | ||||||
|  | #undef HAVE_OPENSSL_PEM_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <openssl/rsa.h> header file.  */ | ||||||
|  | #undef HAVE_OPENSSL_RSA_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <openssl/ssl.h> header file.  */ | ||||||
|  | #undef HAVE_OPENSSL_SSL_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <openssl/x509.h> header file.  */ | ||||||
|  | #undef HAVE_OPENSSL_X509_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <pem.h> header file.  */ | ||||||
|  | #undef HAVE_PEM_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <pwd.h> header file.  */ | ||||||
|  | #define HAVE_PWD_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <rsa.h> header file.  */ | ||||||
|  | #undef HAVE_RSA_H | ||||||
|  |  | ||||||
|  | /* 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 <stdlib.h> header file.  */ | ||||||
|  | #define HAVE_STDLIB_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <sys/param.h> header file.  */ | ||||||
|  | #undef HAVE_SYS_PARAM_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <sys/select.h> header file.  */ | ||||||
|  | #undef HAVE_SYS_SELECT_H | ||||||
|  |  | ||||||
|  | /* 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.  */ | ||||||
|  | #undef HAVE_SYS_SOCKIO_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <sys/stat.h> header file.  */ | ||||||
|  | #define HAVE_SYS_STAT_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <sys/time.h> header file.  */ | ||||||
|  | #define HAVE_SYS_TIME_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.  */ | ||||||
|  | #undef HAVE_TERMIO_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <termios.h> header file.  */ | ||||||
|  | #define HAVE_TERMIOS_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <time.h> header file.  */ | ||||||
|  | #define HAVE_TIME_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <unistd.h> header file.  */ | ||||||
|  | #define HAVE_UNISTD_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <winsock.h> header file.  */ | ||||||
|  | #undef HAVE_WINSOCK_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <x509.h> header file.  */ | ||||||
|  | #undef HAVE_X509_H | ||||||
|  |  | ||||||
|  | /* Define if you have the crypto library (-lcrypto).  */ | ||||||
|  | #undef HAVE_LIBCRYPTO | ||||||
|  |  | ||||||
|  | /* Define if you have the dl library (-ldl).  */ | ||||||
|  | #undef HAVE_LIBDL | ||||||
|  |  | ||||||
|  | /* Define if you have the nsl library (-lnsl).  */ | ||||||
|  | #undef HAVE_LIBNSL | ||||||
|  |  | ||||||
|  | /* Define if you have the resolv library (-lresolv).  */ | ||||||
|  | #define HAVE_LIBRESOLV 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the resolve library (-lresolve).  */ | ||||||
|  | #undef HAVE_LIBRESOLVE | ||||||
|  |  | ||||||
|  | /* Define if you have the socket library (-lsocket).  */ | ||||||
|  | #define HAVE_LIBSOCKET 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the ssl library (-lssl).  */ | ||||||
|  | #undef HAVE_LIBSSL | ||||||
|  |  | ||||||
|  | /* Define if you have the ucb library (-lucb).  */ | ||||||
|  | #undef HAVE_LIBUCB | ||||||
|  |  | ||||||
|  | /* Number of bits in a file offset, on hosts where this is settable. */ | ||||||
|  | #undef _FILE_OFFSET_BITS | ||||||
|  |  | ||||||
|  | /* Define for large files, on AIX-style hosts. */ | ||||||
|  | #undef _LARGE_FILES | ||||||
|  |  | ||||||
|  | /* Define if getaddrinfo exists and works */ | ||||||
|  | #define HAVE_GETADDRINFO 1 | ||||||
|  |  | ||||||
|  | /* Define if you want to enable IPv6 support */ | ||||||
|  | #undef ENABLE_IPV6 | ||||||
|  |  | ||||||
|  | /* Set to explicitly specify we don't want to use thread-safe functions */ | ||||||
|  | #undef DISABLED_THREADSAFE | ||||||
|  |  | ||||||
|  | #define	HAVE_TIMEVAL_H	1 | ||||||
|  |  | ||||||
|  | /* Name of this package! */ | ||||||
|  | #define PACKAGE "not-used" | ||||||
|  |  | ||||||
|  | /* Version number of this archive. */ | ||||||
|  | #define VERSION "not-used" | ||||||
|  |  | ||||||
|  | /* Define if you have the getpass function.  */ | ||||||
|  | #undef HAVE_GETPASS | ||||||
|  |  | ||||||
|  | /* Define if you have a working OpenSSL installation */ | ||||||
|  | #undef OPENSSL_ENABLED | ||||||
|  |  | ||||||
|  | /* Define if you have the `dlopen' function. */ | ||||||
|  | #undef HAVE_DLOPEN | ||||||
|  |  | ||||||
|  | /* Define if you have the <inttypes.h> header file. */ | ||||||
|  | #undef HAVE_INTTYPES_H | ||||||
|  |  | ||||||
|  | /* Define if you have the <strings.h> header file. */ | ||||||
|  | #define HAVE_STRINGS_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the <string.h> header file. */ | ||||||
|  | #define HAVE_STRING_H 1 | ||||||
|  |  | ||||||
|  | /* Define if you have the `strtok_r' function. */ | ||||||
|  | #undef HAVE_STRTOK_R | ||||||
|  |  | ||||||
|  | #define HAVE_MEMORY_H   1 | ||||||
|  |  | ||||||
| @@ -101,6 +101,9 @@ | |||||||
| /* 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*/ | ||||||
|  |  | ||||||
|  | /* Define if you have the malloc.h file.  */ | ||||||
|  | #define HAVE_MALLOC_H 1 | ||||||
|  |  | ||||||
| /* Define if you have the <arpa/inet.h> header file.  */ | /* Define if you have the <arpa/inet.h> header file.  */ | ||||||
| #define HAVE_ARPA_INET_H 1 | #define HAVE_ARPA_INET_H 1 | ||||||
|  |  | ||||||
| @@ -185,3 +188,28 @@ | |||||||
| #define HAVE_UNISTD_H 1 | #define HAVE_UNISTD_H 1 | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /************************************************** | ||||||
|  |  *This is to eliminate the warnings when compiled * | ||||||
|  |  * using MS VC++ compiler	  			  * | ||||||
|  |  **************************************************/ | ||||||
|  | #ifdef _MSC_VER | ||||||
|  |  | ||||||
|  | #pragma warning (disable: 4244)	/* truncation from 'const int' to 'char' */ | ||||||
|  | #pragma warning (disable: 4127)	/* conditional expression is constant */ | ||||||
|  | #pragma warning (disable: 4706)	/* assignment within conditional expression */ | ||||||
|  | #pragma warning (disable: 4761)	/* integral size mismatch in argument */ | ||||||
|  | #pragma warning (disable: 4101)	/* unreferenced local variable */ | ||||||
|  | #pragma warning (disable: 4131)	/* uses old-style declarator */ | ||||||
|  | #pragma warning (disable: 4057)	/* const char *' differs in indirection to | ||||||
|  |                                    slightly different base types from | ||||||
|  |                                    'unsigned char [x] */ | ||||||
|  | #pragma warning (disable: 4100)	/* unreferenced formal parameter */ | ||||||
|  | #pragma warning (disable: 4055)	/* type cast' : from data pointer 'void *' to | ||||||
|  |                                    function pointer | ||||||
|  |                                    'void *(__cdecl *)(char *,int ) */ | ||||||
|  | #pragma warning (disable: 4701)	/* local variable may be used without having | ||||||
|  |                                    been initialized */ | ||||||
|  | #pragma warning (disable: 4715)	/* ToHour' : not all control paths return a | ||||||
|  |                                    value */ | ||||||
|  | #endif | ||||||
|   | |||||||
							
								
								
									
										230
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										230
									
								
								config.guess
									
									
									
									
										vendored
									
									
								
							| @@ -3,7 +3,7 @@ | |||||||
| #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 | #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 | ||||||
| #   Free Software Foundation, Inc. | #   Free Software Foundation, Inc. | ||||||
|  |  | ||||||
| timestamp='2001-04-20' | timestamp='2001-08-23' | ||||||
|  |  | ||||||
| # This file is free software; you can redistribute it and/or modify it | # This file is free software; you can redistribute it and/or modify it | ||||||
| # under the terms of the GNU General Public License as published by | # under the terms of the GNU General Public License as published by | ||||||
| @@ -52,7 +52,7 @@ version="\ | |||||||
| GNU config.guess ($timestamp) | GNU config.guess ($timestamp) | ||||||
|  |  | ||||||
| Originally written by Per Bothner. | Originally written by Per Bothner. | ||||||
| Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 | Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 | ||||||
| Free Software Foundation, Inc. | Free Software Foundation, Inc. | ||||||
|  |  | ||||||
| This is free software; see the source for copying conditions.  There is NO | This is free software; see the source for copying conditions.  There is NO | ||||||
| @@ -95,25 +95,25 @@ trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 | |||||||
| # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still | # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still | ||||||
| # use `HOST_CC' if defined, but it is deprecated. | # use `HOST_CC' if defined, but it is deprecated. | ||||||
|  |  | ||||||
| case $CC_FOR_BUILD,$HOST_CC,$CC in | set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in | ||||||
|  ,,)    echo "int dummy(){}" > $dummy.c |  ,,)    echo "int dummy(){}" > $dummy.c ; | ||||||
| 	for c in cc gcc c89 ; do | 	for c in cc gcc c89 ; do | ||||||
| 	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 | 	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; | ||||||
| 	  if test $? = 0 ; then | 	  if test $? = 0 ; then | ||||||
| 	     CC_FOR_BUILD="$c"; break | 	     CC_FOR_BUILD="$c"; break ; | ||||||
| 	  fi | 	  fi ; | ||||||
| 	done | 	done ; | ||||||
| 	rm -f $dummy.c $dummy.o $dummy.rel | 	rm -f $dummy.c $dummy.o $dummy.rel ; | ||||||
| 	if test x"$CC_FOR_BUILD" = x ; then | 	if test x"$CC_FOR_BUILD" = x ; then | ||||||
| 	  CC_FOR_BUILD=no_compiler_found | 	  CC_FOR_BUILD=no_compiler_found ; | ||||||
| 	fi | 	fi | ||||||
| 	;; | 	;; | ||||||
|  ,,*)   CC_FOR_BUILD=$CC ;; |  ,,*)   CC_FOR_BUILD=$CC ;; | ||||||
|  ,*,*)  CC_FOR_BUILD=$HOST_CC ;; |  ,*,*)  CC_FOR_BUILD=$HOST_CC ;; | ||||||
| esac | esac' | ||||||
|  |  | ||||||
| # This is needed to find uname on a Pyramid OSx when run in the BSD universe. | # This is needed to find uname on a Pyramid OSx when run in the BSD universe. | ||||||
| # (ghazi@noc.rutgers.edu 8/24/94.) | # (ghazi@noc.rutgers.edu 1994-08-24) | ||||||
| if (test -f /.attbin/uname) >/dev/null 2>&1 ; then | if (test -f /.attbin/uname) >/dev/null 2>&1 ; then | ||||||
| 	PATH=$PATH:/.attbin ; export PATH | 	PATH=$PATH:/.attbin ; export PATH | ||||||
| fi | fi | ||||||
| @@ -150,6 +150,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in | |||||||
| 	# to ELF recently, or will in the future. | 	# to ELF recently, or will in the future. | ||||||
| 	case "${UNAME_MACHINE}" in | 	case "${UNAME_MACHINE}" in | ||||||
| 	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) | 	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) | ||||||
|  | 		eval $set_cc_for_build | ||||||
| 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | ||||||
| 			| grep __ELF__ >/dev/null | 			| grep __ELF__ >/dev/null | ||||||
| 		then | 		then | ||||||
| @@ -204,6 +205,7 @@ main: | |||||||
| 	jsr \$26,exit | 	jsr \$26,exit | ||||||
| 	.end main | 	.end main | ||||||
| EOF | EOF | ||||||
|  | 	eval $set_cc_for_build | ||||||
| 	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null | 	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null | ||||||
| 	if test "$?" = 0 ; then | 	if test "$?" = 0 ; then | ||||||
| 		case `./$dummy` in | 		case `./$dummy` in | ||||||
| @@ -225,6 +227,9 @@ EOF | |||||||
| 			2-307) | 			2-307) | ||||||
| 				UNAME_MACHINE="alphaev67" | 				UNAME_MACHINE="alphaev67" | ||||||
| 				;; | 				;; | ||||||
|  | 			2-1307) | ||||||
|  | 				UNAME_MACHINE="alphaev68" | ||||||
|  | 				;; | ||||||
| 		esac | 		esac | ||||||
| 	fi | 	fi | ||||||
| 	rm -f $dummy.s $dummy | 	rm -f $dummy.s $dummy | ||||||
| @@ -328,6 +333,9 @@ EOF | |||||||
|     aushp:SunOS:*:*) |     aushp:SunOS:*:*) | ||||||
| 	echo sparc-auspex-sunos${UNAME_RELEASE} | 	echo sparc-auspex-sunos${UNAME_RELEASE} | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|  |     sparc*:NetBSD:*) | ||||||
|  | 	echo `uname -p`-unknown-netbsd${UNAME_RELEASE} | ||||||
|  | 	exit 0 ;; | ||||||
|     atari*:OpenBSD:*:*) |     atari*:OpenBSD:*:*) | ||||||
| 	echo m68k-unknown-openbsd${UNAME_RELEASE} | 	echo m68k-unknown-openbsd${UNAME_RELEASE} | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
| @@ -406,6 +414,7 @@ EOF | |||||||
| 	  exit (-1); | 	  exit (-1); | ||||||
| 	} | 	} | ||||||
| EOF | EOF | ||||||
|  | 	eval $set_cc_for_build | ||||||
| 	$CC_FOR_BUILD $dummy.c -o $dummy \ | 	$CC_FOR_BUILD $dummy.c -o $dummy \ | ||||||
| 	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ | 	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ | ||||||
| 	  && rm -f $dummy.c $dummy && exit 0 | 	  && rm -f $dummy.c $dummy && exit 0 | ||||||
| @@ -486,6 +495,7 @@ EOF | |||||||
| 			exit(0); | 			exit(0); | ||||||
| 			} | 			} | ||||||
| EOF | EOF | ||||||
|  | 		eval $set_cc_for_build | ||||||
| 		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 | 		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 | ||||||
| 		rm -f $dummy.c $dummy | 		rm -f $dummy.c $dummy | ||||||
| 		echo rs6000-ibm-aix3.2.5 | 		echo rs6000-ibm-aix3.2.5 | ||||||
| @@ -586,6 +596,7 @@ EOF | |||||||
|                   exit (0); |                   exit (0); | ||||||
|               } |               } | ||||||
| EOF | EOF | ||||||
|  | 	eval $set_cc_for_build | ||||||
| 	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` | 	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` | ||||||
| 	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi | 	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi | ||||||
| 	rm -f $dummy.c $dummy | 	rm -f $dummy.c $dummy | ||||||
| @@ -623,6 +634,7 @@ EOF | |||||||
| 	  exit (0); | 	  exit (0); | ||||||
| 	} | 	} | ||||||
| EOF | EOF | ||||||
|  | 	eval $set_cc_for_build | ||||||
| 	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 | 	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 | ||||||
| 	rm -f $dummy.c $dummy | 	rm -f $dummy.c $dummy | ||||||
| 	echo unknown-hitachi-hiuxwe2 | 	echo unknown-hitachi-hiuxwe2 | ||||||
| @@ -633,7 +645,7 @@ EOF | |||||||
|     9000/8??:4.3bsd:*:*) |     9000/8??:4.3bsd:*:*) | ||||||
| 	echo hppa1.0-hp-bsd | 	echo hppa1.0-hp-bsd | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     *9??*:MPE/iX:*:*) |     *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) | ||||||
| 	echo hppa1.0-hp-mpeix | 	echo hppa1.0-hp-mpeix | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) |     hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) | ||||||
| @@ -677,12 +689,13 @@ EOF | |||||||
| 	echo xmp-cray-unicos | 	echo xmp-cray-unicos | ||||||
|         exit 0 ;; |         exit 0 ;; | ||||||
|     CRAY*Y-MP:*:*:*) |     CRAY*Y-MP:*:*:*) | ||||||
| 	echo ymp-cray-unicos${UNAME_RELEASE} | 	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     CRAY*[A-Z]90:*:*:*) |     CRAY*[A-Z]90:*:*:*) | ||||||
| 	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | 	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | ||||||
| 	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ | 	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ | ||||||
| 	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ | 	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ | ||||||
|  | 	      -e 's/\.[^.]*$/.X/' | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     CRAY*TS:*:*:*) |     CRAY*TS:*:*:*) | ||||||
| 	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' | 	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' | ||||||
| @@ -763,97 +776,29 @@ EOF | |||||||
| 	echo ${UNAME_MACHINE}-unknown-linux-gnu | 	echo ${UNAME_MACHINE}-unknown-linux-gnu | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     mips:Linux:*:*) |     mips:Linux:*:*) | ||||||
| 	cat >$dummy.c <<EOF | 	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in | ||||||
| #ifdef __cplusplus | 	  big)    echo mips-unknown-linux-gnu && exit 0 ;; | ||||||
| #include <stdio.h>  /* for printf() prototype */ | 	  little) echo mipsel-unknown-linux-gnu && exit 0 ;; | ||||||
| int main (int argc, char *argv[]) { | 	esac | ||||||
| #else |  | ||||||
| int main (argc, argv) int argc; char *argv[]; { |  | ||||||
| #endif |  | ||||||
| #ifdef __MIPSEB__ |  | ||||||
|   printf ("%s-unknown-linux-gnu\n", argv[1]); |  | ||||||
| #endif |  | ||||||
| #ifdef __MIPSEL__ |  | ||||||
|   printf ("%sel-unknown-linux-gnu\n", argv[1]); |  | ||||||
| #endif |  | ||||||
|   return 0; |  | ||||||
| } |  | ||||||
| EOF |  | ||||||
| 	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 |  | ||||||
| 	rm -f $dummy.c $dummy |  | ||||||
| 	;; | 	;; | ||||||
|     ppc:Linux:*:*) |     ppc:Linux:*:*) | ||||||
| 	# Determine Lib Version | 	echo powerpc-unknown-linux-gnu | ||||||
| 	cat >$dummy.c <<EOF | 	exit 0 ;; | ||||||
| #include <features.h> |     ppc64:Linux:*:*) | ||||||
| #if defined(__GLIBC__) | 	echo powerpc64-unknown-linux-gnu | ||||||
| extern char __libc_version[]; |  | ||||||
| extern char __libc_release[]; |  | ||||||
| #endif |  | ||||||
| main(argc, argv) |  | ||||||
|      int argc; |  | ||||||
|      char *argv[]; |  | ||||||
| { |  | ||||||
| #if defined(__GLIBC__) |  | ||||||
|   printf("%s %s\n", __libc_version, __libc_release); |  | ||||||
| #else |  | ||||||
|   printf("unknown\n"); |  | ||||||
| #endif |  | ||||||
|   return 0; |  | ||||||
| } |  | ||||||
| EOF |  | ||||||
| 	LIBC="" |  | ||||||
| 	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null |  | ||||||
| 	if test "$?" = 0 ; then |  | ||||||
| 		./$dummy | grep 1\.99 > /dev/null |  | ||||||
| 		if test "$?" = 0 ; then LIBC="libc1" ; fi |  | ||||||
| 	fi |  | ||||||
| 	rm -f $dummy.c $dummy |  | ||||||
| 	echo powerpc-unknown-linux-gnu${LIBC} |  | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     alpha:Linux:*:*) |     alpha:Linux:*:*) | ||||||
| 	cat <<EOF >$dummy.s | 	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in | ||||||
| 	  .data | 	  EV5)   UNAME_MACHINE=alphaev5 ;; | ||||||
| 	  \$Lformat: | 	  EV56)  UNAME_MACHINE=alphaev56 ;; | ||||||
| 		.byte 37,100,45,37,120,10,0	# "%d-%x\n" | 	  PCA56) UNAME_MACHINE=alphapca56 ;; | ||||||
| 	   .text | 	  PCA57) UNAME_MACHINE=alphapca56 ;; | ||||||
| 		.globl main | 	  EV6)   UNAME_MACHINE=alphaev6 ;; | ||||||
| 		.align 4 | 	  EV67)  UNAME_MACHINE=alphaev67 ;; | ||||||
| 		.ent main | 	  EV68*) UNAME_MACHINE=alphaev68 ;; | ||||||
| 	    main: |  | ||||||
| 		.frame \$30,16,\$26,0 |  | ||||||
| 		ldgp \$29,0(\$27) |  | ||||||
| 		.prologue 1 |  | ||||||
| 		.long 0x47e03d80 # implver \$0 |  | ||||||
| 		lda \$2,-1 |  | ||||||
| 		.long 0x47e20c21 # amask \$2,\$1 |  | ||||||
| 		lda \$16,\$Lformat |  | ||||||
| 		mov \$0,\$17 |  | ||||||
| 		not \$1,\$18 |  | ||||||
| 		jsr \$26,printf |  | ||||||
| 		ldgp \$29,0(\$26) |  | ||||||
| 		mov 0,\$16 |  | ||||||
| 		jsr \$26,exit |  | ||||||
| 		.end main |  | ||||||
| EOF |  | ||||||
| 	LIBC="" |  | ||||||
| 	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null |  | ||||||
| 	if test "$?" = 0 ; then |  | ||||||
| 		case `./$dummy` in |  | ||||||
| 		0-0)	UNAME_MACHINE="alpha" ;; |  | ||||||
| 		1-0)	UNAME_MACHINE="alphaev5" ;; |  | ||||||
| 		1-1)    UNAME_MACHINE="alphaev56" ;; |  | ||||||
| 		1-101)	UNAME_MACHINE="alphapca56" ;; |  | ||||||
| 		2-303)	UNAME_MACHINE="alphaev6" ;; |  | ||||||
| 		2-307)	UNAME_MACHINE="alphaev67" ;; |  | ||||||
|         esac |         esac | ||||||
| 		objdump --private-headers $dummy | \ | 	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null | ||||||
| 		  grep ld.so.1 > /dev/null | 	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi | ||||||
| 		if test "$?" = 0 ; then |  | ||||||
| 			LIBC="libc1" |  | ||||||
| 		fi |  | ||||||
| 	fi |  | ||||||
| 	rm -f $dummy.s $dummy |  | ||||||
| 	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} | 	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     parisc:Linux:*:* | hppa:Linux:*:*) |     parisc:Linux:*:* | hppa:Linux:*:*) | ||||||
| @@ -883,38 +828,27 @@ EOF | |||||||
| 	# The BFD linker knows what the default object file format is, so | 	# The BFD linker knows what the default object file format is, so | ||||||
| 	# first see if it will tell us. cd to the root directory to prevent | 	# first see if it will tell us. cd to the root directory to prevent | ||||||
| 	# problems with other programs or directories called `ld' in the path. | 	# problems with other programs or directories called `ld' in the path. | ||||||
| 	ld_supported_emulations=`cd /; ld --help 2>&1 \ | 	ld_supported_targets=`cd /; ld --help 2>&1 \ | ||||||
| 			 | sed -ne '/supported emulations:/!d | 			 | sed -ne '/supported targets:/!d | ||||||
| 				    s/[ 	][ 	]*/ /g | 				    s/[ 	][ 	]*/ /g | ||||||
| 				    s/.*supported emulations: *// | 				    s/.*supported targets: *// | ||||||
| 				    s/ .*// | 				    s/ .*// | ||||||
| 				    p'` | 				    p'` | ||||||
|         case "$ld_supported_emulations" in |         case "$ld_supported_targets" in | ||||||
| 	  i*86linux) | 	  elf32-i386) | ||||||
| 		echo "${UNAME_MACHINE}-pc-linux-gnuaout" |  | ||||||
| 		exit 0 |  | ||||||
| 		;; |  | ||||||
| 	  elf_i*86) |  | ||||||
| 		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" | 		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" | ||||||
| 		;; | 		;; | ||||||
| 	  i*86coff) | 	  a.out-i386-linux) | ||||||
|  | 		echo "${UNAME_MACHINE}-pc-linux-gnuaout" | ||||||
|  | 		exit 0 ;;		 | ||||||
|  | 	  coff-i386) | ||||||
| 		echo "${UNAME_MACHINE}-pc-linux-gnucoff" | 		echo "${UNAME_MACHINE}-pc-linux-gnucoff" | ||||||
| 		exit 0 | 		exit 0 ;; | ||||||
| 		;; | 	  "") | ||||||
| 	esac | 		# Either a pre-BFD a.out linker (linux-gnuoldld) or | ||||||
| 	# Either a pre-BFD a.out linker (linux-gnuoldld) | 		# one that does not give us useful --help. | ||||||
| 	# or one that does not give us useful --help. | 		echo "${UNAME_MACHINE}-pc-linux-gnuoldld" | ||||||
| 	# GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. | 		exit 0 ;; | ||||||
| 	# If ld does not provide *any* "supported emulations:" |  | ||||||
| 	# that means it is gnuoldld. |  | ||||||
| 	test -z "$ld_supported_emulations" && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 |  | ||||||
| 	case "${UNAME_MACHINE}" in |  | ||||||
| 	i*86) |  | ||||||
| 	  VENDOR=pc; |  | ||||||
| 	  ;; |  | ||||||
| 	*) |  | ||||||
| 	  VENDOR=unknown; |  | ||||||
| 	  ;; |  | ||||||
| 	esac | 	esac | ||||||
| 	# Determine whether the default compiler is a.out or elf | 	# Determine whether the default compiler is a.out or elf | ||||||
| 	cat >$dummy.c <<EOF | 	cat >$dummy.c <<EOF | ||||||
| @@ -928,26 +862,28 @@ EOF | |||||||
| #ifdef __ELF__ | #ifdef __ELF__ | ||||||
| # ifdef __GLIBC__ | # ifdef __GLIBC__ | ||||||
| #  if __GLIBC__ >= 2 | #  if __GLIBC__ >= 2 | ||||||
|     printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); |     printf ("%s-pc-linux-gnu\n", argv[1]); | ||||||
| #  else | #  else | ||||||
|     printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); |     printf ("%s-pc-linux-gnulibc1\n", argv[1]); | ||||||
| #  endif | #  endif | ||||||
| # else | # else | ||||||
|    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); |    printf ("%s-pc-linux-gnulibc1\n", argv[1]); | ||||||
| # endif | # endif | ||||||
| #else | #else | ||||||
|   printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); |   printf ("%s-pc-linux-gnuaout\n", argv[1]); | ||||||
| #endif | #endif | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
| EOF | EOF | ||||||
|  | 	eval $set_cc_for_build | ||||||
| 	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 | 	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 | ||||||
| 	rm -f $dummy.c $dummy | 	rm -f $dummy.c $dummy | ||||||
| 	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 | 	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 | ||||||
| 	;; | 	;; | ||||||
| # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions |  | ||||||
| # are messed up and put the nodename in both sysname and nodename. |  | ||||||
|     i*86:DYNIX/ptx:4*:*) |     i*86:DYNIX/ptx:4*:*) | ||||||
|  | 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. | ||||||
|  | 	# earlier versions are messed up and put the nodename in both | ||||||
|  | 	# sysname and nodename. | ||||||
| 	echo i386-sequent-sysv4 | 	echo i386-sequent-sysv4 | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     i*86:UNIX_SV:4.2MP:2.*) |     i*86:UNIX_SV:4.2MP:2.*) | ||||||
| @@ -966,14 +902,13 @@ EOF | |||||||
| 		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} | 		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} | ||||||
| 	fi | 	fi | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     i*86:*:5:7*) |     i*86:*:5:[78]*) | ||||||
|         # Fixed at (any) Pentium or better | 	case `/bin/uname -X | grep "^Machine"` in | ||||||
|         UNAME_MACHINE=i586 | 	    *486*)	     UNAME_MACHINE=i486 ;; | ||||||
|         if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then | 	    *Pentium)	     UNAME_MACHINE=i586 ;; | ||||||
| 	    echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} | 	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;; | ||||||
| 	else | 	esac | ||||||
| 	    echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} | 	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} | ||||||
| 	fi |  | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     i*86:*:3.2:*) |     i*86:*:3.2:*) | ||||||
| 	if test -f /usr/options/cb.name; then | 	if test -f /usr/options/cb.name; then | ||||||
| @@ -1067,7 +1002,7 @@ EOF | |||||||
| 		echo ns32k-sni-sysv | 		echo ns32k-sni-sysv | ||||||
| 	fi | 	fi | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|     PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort |     PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort | ||||||
|                       # says <Richard.M.Bartel@ccMail.Census.GOV> |                       # says <Richard.M.Bartel@ccMail.Census.GOV> | ||||||
|         echo i586-unisys-sysv4 |         echo i586-unisys-sysv4 | ||||||
|         exit 0 ;; |         exit 0 ;; | ||||||
| @@ -1080,6 +1015,10 @@ EOF | |||||||
| 	# From seanf@swdc.stratus.com. | 	# From seanf@swdc.stratus.com. | ||||||
| 	echo i860-stratus-sysv4 | 	echo i860-stratus-sysv4 | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|  |     *:VOS:*:*) | ||||||
|  | 	# From Paul.Green@stratus.com. | ||||||
|  | 	echo hppa1.1-stratus-vos | ||||||
|  | 	exit 0 ;; | ||||||
|     mc68*:A/UX:*:*) |     mc68*:A/UX:*:*) | ||||||
| 	echo m68k-apple-aux${UNAME_RELEASE} | 	echo m68k-apple-aux${UNAME_RELEASE} | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
| @@ -1172,6 +1111,12 @@ EOF | |||||||
|     *:ITS:*:*) |     *:ITS:*:*) | ||||||
| 	echo pdp10-unknown-its | 	echo pdp10-unknown-its | ||||||
| 	exit 0 ;; | 	exit 0 ;; | ||||||
|  |     i*86:XTS-300:*:STOP) | ||||||
|  | 	echo ${UNAME_MACHINE}-unknown-stop | ||||||
|  | 	exit 0 ;; | ||||||
|  |     i*86:atheos:*:*) | ||||||
|  | 	echo ${UNAME_MACHINE}-unknown-atheos | ||||||
|  | 	exit 0 ;; | ||||||
| esac | esac | ||||||
|  |  | ||||||
| #echo '(No uname command or uname output not recognized.)' 1>&2 | #echo '(No uname command or uname output not recognized.)' 1>&2 | ||||||
| @@ -1291,6 +1236,7 @@ main () | |||||||
| } | } | ||||||
| EOF | EOF | ||||||
|  |  | ||||||
|  | eval $set_cc_for_build | ||||||
| $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 | $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 | ||||||
| rm -f $dummy.c $dummy | rm -f $dummy.c $dummy | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										148
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										148
									
								
								config.sub
									
									
									
									
										vendored
									
									
								
							| @@ -3,7 +3,7 @@ | |||||||
| #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 | #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 | ||||||
| #   Free Software Foundation, Inc. | #   Free Software Foundation, Inc. | ||||||
|  |  | ||||||
| timestamp='2001-04-20' | timestamp='2001-08-23' | ||||||
|  |  | ||||||
| # This file is (in principle) common to ALL GNU software. | # This file is (in principle) common to ALL GNU software. | ||||||
| # The presence of a machine in this file suggests that SOME GNU software | # The presence of a machine in this file suggests that SOME GNU software | ||||||
| @@ -117,7 +117,7 @@ esac | |||||||
| # Here we must recognize all the valid KERNEL-OS combinations. | # Here we must recognize all the valid KERNEL-OS combinations. | ||||||
| maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` | maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` | ||||||
| case $maybe_os in | case $maybe_os in | ||||||
|   nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*) |   nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) | ||||||
|     os=-$maybe_os |     os=-$maybe_os | ||||||
|     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` |     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` | ||||||
|     ;; |     ;; | ||||||
| @@ -157,6 +157,14 @@ case $os in | |||||||
| 		os=-vxworks | 		os=-vxworks | ||||||
| 		basic_machine=$1 | 		basic_machine=$1 | ||||||
| 		;; | 		;; | ||||||
|  | 	-chorusos*) | ||||||
|  | 		os=-chorusos | ||||||
|  | 		basic_machine=$1 | ||||||
|  | 		;; | ||||||
|  |  	-chorusrdb) | ||||||
|  |  		os=-chorusrdb | ||||||
|  | 		basic_machine=$1 | ||||||
|  |  		;; | ||||||
| 	-hiux*) | 	-hiux*) | ||||||
| 		os=-hiuxwe2 | 		os=-hiuxwe2 | ||||||
| 		;; | 		;; | ||||||
| @@ -215,26 +223,35 @@ esac | |||||||
| case $basic_machine in | case $basic_machine in | ||||||
| 	# Recognize the basic CPU types without company name. | 	# Recognize the basic CPU types without company name. | ||||||
| 	# Some are omitted here because they have special meanings below. | 	# Some are omitted here because they have special meanings below. | ||||||
| 	tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \ | 	1750a | 580 \ | ||||||
| 	        | arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \ | 	| a29k \ | ||||||
| 		| pyramid | mn10200 | mn10300 | tron | a29k \ | 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | ||||||
| 		| 580 | i960 | h8300 \ | 	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | ||||||
| 		| x86 | ppcbe | mipsbe | mipsle | shbe | shle \ | 	| c4x | clipper \ | ||||||
| 		| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ | 	| d10v | d30v | dsp16xx \ | ||||||
| 		| hppa64 \ | 	| fr30 \ | ||||||
| 		| alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ | 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | ||||||
| 		| alphaev6[78] \ | 	| i370 | i860 | i960 | ia64 \ | ||||||
| 		| we32k | ns16k | clipper | i370 | sh | sh[34] \ | 	| m32r | m68000 | m68k | m88k | mcore \ | ||||||
| 		| powerpc | powerpcle \ | 	| mips16 | mips64 | mips64el | mips64orion | mips64orionel \ | ||||||
| 		| 1750a | dsp16xx | pdp10 | pdp11 \ | 	| mips64vr4100 | mips64vr4100el | mips64vr4300 \ | ||||||
| 		| mips16 | mips64 | mipsel | mips64el \ | 	| mips64vr4300el | mips64vr5000 | mips64vr5000el \ | ||||||
| 		| mips64orion | mips64orionel | mipstx39 | mipstx39el \ | 	| mipsbe | mipsel | mipsle | mipstx39 | mipstx39el \ | ||||||
| 		| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ | 	| mn10200 | mn10300 \ | ||||||
| 		| mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \ | 	| ns16k | ns32k \ | ||||||
| 		| sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \ | 	| openrisc \ | ||||||
| 		| v850 | c4x \ | 	| pdp10 | pdp11 | pj | pjl \ | ||||||
| 		| thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \ | 	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | ||||||
| 		| pj | pjl | h8500) | 	| pyramid \ | ||||||
|  | 	| s390 | s390x \ | ||||||
|  | 	| sh | sh[34] | sh[34]eb | shbe | shle \ | ||||||
|  | 	| sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ | ||||||
|  | 	| stormy16 | strongarm \ | ||||||
|  | 	| tahoe | thumb | tic80 | tron \ | ||||||
|  | 	| v850 \ | ||||||
|  | 	| we32k \ | ||||||
|  | 	| x86 | xscale \ | ||||||
|  | 	| z8k) | ||||||
| 		basic_machine=$basic_machine-unknown | 		basic_machine=$basic_machine-unknown | ||||||
| 		;; | 		;; | ||||||
| 	m6811 | m68hc11 | m6812 | m68hc12) | 	m6811 | m68hc11 | m6812 | m68hc12) | ||||||
| @@ -242,7 +259,7 @@ case $basic_machine in | |||||||
| 		basic_machine=$basic_machine-unknown | 		basic_machine=$basic_machine-unknown | ||||||
| 		os=-none | 		os=-none | ||||||
| 		;; | 		;; | ||||||
| 	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | w65) | 	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) | ||||||
| 		;; | 		;; | ||||||
|  |  | ||||||
| 	# We use `pc' rather than `unknown' | 	# We use `pc' rather than `unknown' | ||||||
| @@ -257,31 +274,43 @@ case $basic_machine in | |||||||
| 		exit 1 | 		exit 1 | ||||||
| 		;; | 		;; | ||||||
| 	# Recognize the basic CPU types with company name. | 	# Recognize the basic CPU types with company name. | ||||||
| 	# FIXME: clean up the formatting here. | 	580-* \ | ||||||
| 	vax-* | tahoe-* | i*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ | 	| a29k-* \ | ||||||
| 	      | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \ | 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | ||||||
| 	      | arm-*  | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \ | 	| alphapca5[67]-* | arc-* \ | ||||||
| 	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ | 	| arm-*  | armbe-* | armle-* | armv*-* \ | ||||||
| 	      | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ | 	| bs2000-* \ | ||||||
| 	      | xmp-* | ymp-* \ | 	| c[123]* | c30-* | [cjt]90-* | c54x-* \ | ||||||
| 	      | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \ | 	| clipper-* | cray2-* | cydra-* \ | ||||||
| 	      | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ | 	| d10v-* | d30v-* \ | ||||||
| 	      | hppa2.0n-* | hppa64-* \ | 	| elxsi-* \ | ||||||
| 	      | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ | 	| f30[01]-* | f700-* | fr30-* | fx80-* \ | ||||||
| 	      | alphaev6[78]-* \ | 	| h8300-* | h8500-* \ | ||||||
| 	      | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ | 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | ||||||
| 	      | clipper-* | orion-* \ | 	| i*86-* | i860-* | i960-* | ia64-* \ | ||||||
| 	      | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ | 	| m32r-* \ | ||||||
| 	      | sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \ | 	| m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ | ||||||
| 	      | mips16-* | mips64-* | mipsel-* \ | 	| m88110-* | m88k-* | mcore-* \ | ||||||
| 	      | mips64el-* | mips64orion-* | mips64orionel-* \ | 	| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ | ||||||
| 	      | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ | 	| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ | ||||||
| 	      | mipstx39-* | mipstx39el-* | mcore-* \ | 	| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipsel-* \ | ||||||
| 	      | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \ | 	| mipsle-* | mipstx39-* | mipstx39el-* \ | ||||||
| 	      | [cjt]90-* \ | 	| none-* | np1-* | ns16k-* | ns32k-* \ | ||||||
| 	      | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ | 	| orion-* \ | ||||||
| 	      | thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \ | 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | ||||||
| 	      | bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*) | 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | ||||||
|  | 	| pyramid-* \ | ||||||
|  | 	| romp-* | rs6000-* \ | ||||||
|  | 	| s390-* | s390x-* \ | ||||||
|  | 	| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ | ||||||
|  | 	| sparc-* | sparc64-* | sparc86x-* | sparclite-* \ | ||||||
|  | 	| sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \ | ||||||
|  | 	| t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ | ||||||
|  | 	| v850-* | vax-* \ | ||||||
|  | 	| we32k-* \ | ||||||
|  | 	| x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ | ||||||
|  | 	| ymp-* \ | ||||||
|  | 	| z8k-*) | ||||||
| 		;; | 		;; | ||||||
| 	# Recognize the various machine names and aliases which stand | 	# Recognize the various machine names and aliases which stand | ||||||
| 	# for a CPU type and a company and sometimes even an OS. | 	# for a CPU type and a company and sometimes even an OS. | ||||||
| @@ -727,6 +756,16 @@ case $basic_machine in | |||||||
| 	ppcle-* | powerpclittle-*) | 	ppcle-* | powerpclittle-*) | ||||||
| 		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` | 		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||||
| 		;; | 		;; | ||||||
|  | 	ppc64)	basic_machine=powerpc64-unknown | ||||||
|  | 	        ;; | ||||||
|  | 	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||||
|  | 		;; | ||||||
|  | 	ppc64le | powerpc64little | ppc64-le | powerpc64-little) | ||||||
|  | 		basic_machine=powerpc64le-unknown | ||||||
|  | 	        ;; | ||||||
|  | 	ppc64le-* | powerpc64little-*) | ||||||
|  | 		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` | ||||||
|  | 		;; | ||||||
| 	ps2) | 	ps2) | ||||||
| 		basic_machine=i386-ibm | 		basic_machine=i386-ibm | ||||||
| 		;; | 		;; | ||||||
| @@ -881,6 +920,10 @@ case $basic_machine in | |||||||
| 		basic_machine=hppa1.1-winbond | 		basic_machine=hppa1.1-winbond | ||||||
| 		os=-proelf | 		os=-proelf | ||||||
| 		;; | 		;; | ||||||
|  | 	windows32) | ||||||
|  | 		basic_machine=i386-pc | ||||||
|  | 		os=-windows32-msvcrt | ||||||
|  | 		;; | ||||||
| 	xmp) | 	xmp) | ||||||
| 		basic_machine=xmp-cray | 		basic_machine=xmp-cray | ||||||
| 		os=-unicos | 		os=-unicos | ||||||
| @@ -934,7 +977,7 @@ case $basic_machine in | |||||||
| 	we32k) | 	we32k) | ||||||
| 		basic_machine=we32k-att | 		basic_machine=we32k-att | ||||||
| 		;; | 		;; | ||||||
| 	sh3 | sh4) | 	sh3 | sh4 | sh3eb | sh4eb) | ||||||
| 		basic_machine=sh-unknown | 		basic_machine=sh-unknown | ||||||
| 		;; | 		;; | ||||||
| 	sparc | sparcv9 | sparcv9b) | 	sparc | sparcv9 | sparcv9b) | ||||||
| @@ -1018,11 +1061,13 @@ case $os in | |||||||
| 	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | 	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | ||||||
| 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | ||||||
| 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | ||||||
|  | 	      | -chorusos* | -chorusrdb* \ | ||||||
| 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | ||||||
| 	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | 	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | ||||||
| 	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | 	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | ||||||
| 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | ||||||
| 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*) | 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | ||||||
|  | 	      | -os2* | -vos*) | ||||||
| 	# Remember, each alternative MUST END IN *, to match a version number. | 	# Remember, each alternative MUST END IN *, to match a version number. | ||||||
| 		;; | 		;; | ||||||
| 	-qnx*) | 	-qnx*) | ||||||
| @@ -1346,6 +1391,9 @@ case $basic_machine in | |||||||
| 			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) | 			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) | ||||||
| 				vendor=atari | 				vendor=atari | ||||||
| 				;; | 				;; | ||||||
|  | 			-vos*) | ||||||
|  | 				vendor=stratus | ||||||
|  | 				;; | ||||||
| 		esac | 		esac | ||||||
| 		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` | 		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` | ||||||
| 		;; | 		;; | ||||||
|   | |||||||
							
								
								
									
										322
									
								
								configure.in
									
									
									
									
									
								
							
							
						
						
									
										322
									
								
								configure.in
									
									
									
									
									
								
							| @@ -58,298 +58,12 @@ AC_ARG_ENABLE(debug, | |||||||
|   *)   AC_MSG_RESULT(yes) |   *)   AC_MSG_RESULT(yes) | ||||||
|  |  | ||||||
|     CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG" |     CPPFLAGS="$CPPFLAGS -DMALLOCDEBUG" | ||||||
|     CFLAGS="-Wall -pedantic -g"  |     CFLAGS="-W -Wall -Wwrite-strings -pedantic -g"  | ||||||
|        ;; |        ;; | ||||||
|   esac ], |   esac ], | ||||||
|        AC_MSG_RESULT(no) |        AC_MSG_RESULT(no) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| dnl ************************************************************ |  | ||||||
| dnl check for "localhost", if it doesn't exist, we can't do the |  | ||||||
| dnl gethostbyname_r tests! |  | ||||||
| dnl  |  | ||||||
|  |  | ||||||
| AC_DEFUN(CURL_CHECK_WORKING_RESOLVER,[ |  | ||||||
| AC_MSG_CHECKING([if "localhost" resolves]) |  | ||||||
| AC_TRY_RUN([ |  | ||||||
| #include <string.h> |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h> |  | ||||||
|  |  | ||||||
| int |  | ||||||
| main () { |  | ||||||
| struct hostent *h; |  | ||||||
| h = gethostbyname("localhost"); |  | ||||||
| exit (h == NULL ? 1 : 0); }],[ |  | ||||||
|       AC_MSG_RESULT(yes)],[ |  | ||||||
|       AC_MSG_RESULT(no) |  | ||||||
|       AC_MSG_ERROR([can't figure out gethostbyname_r() since localhost doesn't resolve]) |  | ||||||
|  |  | ||||||
|       ] |  | ||||||
| ) |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
| dnl ************************************************************ |  | ||||||
| dnl check for working getaddrinfo() |  | ||||||
| dnl |  | ||||||
| AC_DEFUN(CURL_CHECK_WORKING_GETADDRINFO,[ |  | ||||||
|   AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ |  | ||||||
|   AC_TRY_RUN( [ |  | ||||||
| #include <netdb.h> |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <sys/socket.h> |  | ||||||
|  |  | ||||||
| void main(void) { |  | ||||||
|     struct addrinfo hints, *ai; |  | ||||||
|     int error; |  | ||||||
|  |  | ||||||
|     memset(&hints, 0, sizeof(hints)); |  | ||||||
|     hints.ai_family = AF_UNSPEC; |  | ||||||
|     hints.ai_socktype = SOCK_STREAM; |  | ||||||
|     error = getaddrinfo("127.0.0.1", "8080", &hints, &ai); |  | ||||||
|     if (error) { |  | ||||||
|         exit(1); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         exit(0); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| ],[ |  | ||||||
|   ac_cv_working_getaddrinfo="yes" |  | ||||||
| ],[ |  | ||||||
|   ac_cv_working_getaddrinfo="no" |  | ||||||
| ],[ |  | ||||||
|   ac_cv_working_getaddrinfo="yes" |  | ||||||
| ])]) |  | ||||||
| if test "$ac_cv_working_getaddrinfo" = "yes"; then |  | ||||||
|   AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works]) |  | ||||||
|   AC_DEFINE(ENABLE_IPV6, 1, [Define if you want to enable IPv6 support]) |  | ||||||
|  |  | ||||||
|   IPV6_ENABLED=1 |  | ||||||
|   AC_SUBST(IPV6_ENABLED) |  | ||||||
| fi |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| AC_DEFUN(CURL_CHECK_LOCALTIME_R, |  | ||||||
| [ |  | ||||||
|   dnl check for a few thread-safe functions |  | ||||||
|   AC_CHECK_FUNCS(localtime_r,[ |  | ||||||
|     AC_MSG_CHECKING(whether localtime_r is declared) |  | ||||||
|     AC_EGREP_CPP(localtime_r,[ |  | ||||||
| #include <time.h>],[ |  | ||||||
|       AC_MSG_RESULT(yes)],[ |  | ||||||
|       AC_MSG_RESULT(no) |  | ||||||
|       AC_MSG_CHECKING(whether localtime_r with -D_REENTRANT is declared) |  | ||||||
|       AC_EGREP_CPP(localtime_r,[ |  | ||||||
| #define _REENTRANT |  | ||||||
| #include <time.h>],[ |  | ||||||
| 	AC_DEFINE(NEED_REENTRANT) |  | ||||||
| 	AC_MSG_RESULT(yes)], |  | ||||||
| 	AC_MSG_RESULT(no))])]) |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
| AC_DEFUN(CURL_CHECK_INET_NTOA_R, |  | ||||||
| [ |  | ||||||
|   dnl determine if function definition for inet_ntoa_r exists. |  | ||||||
|   AC_CHECK_FUNCS(inet_ntoa_r,[ |  | ||||||
|     AC_MSG_CHECKING(whether inet_ntoa_r is declared) |  | ||||||
|     AC_EGREP_CPP(inet_ntoa_r,[ |  | ||||||
| #include <arpa/inet.h>],[ |  | ||||||
|       AC_DEFINE(HAVE_INET_NTOA_R_DECL) |  | ||||||
|       AC_MSG_RESULT(yes)],[ |  | ||||||
|       AC_MSG_RESULT(no) |  | ||||||
|       AC_MSG_CHECKING(whether inet_ntoa_r with -D_REENTRANT is declared) |  | ||||||
|       AC_EGREP_CPP(inet_ntoa_r,[ |  | ||||||
| #define _REENTRANT |  | ||||||
| #include <arpa/inet.h>],[ |  | ||||||
| 	AC_DEFINE(HAVE_INET_NTOA_R_DECL) |  | ||||||
| 	AC_DEFINE(NEED_REENTRANT) |  | ||||||
| 	AC_MSG_RESULT(yes)], |  | ||||||
| 	AC_MSG_RESULT(no))])]) |  | ||||||
|  |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
| AC_DEFUN(CURL_CHECK_GETHOSTBYADDR_R, |  | ||||||
| [ |  | ||||||
|   dnl check for number of arguments to gethostbyaddr_r. it might take |  | ||||||
|   dnl either 5, 7, or 8 arguments. |  | ||||||
|   AC_CHECK_FUNCS(gethostbyaddr_r,[ |  | ||||||
|     AC_MSG_CHECKING(if gethostbyaddr_r takes 5 arguments) |  | ||||||
|     AC_TRY_COMPILE([ |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h>],[ |  | ||||||
| char * address; |  | ||||||
| int length; |  | ||||||
| int type; |  | ||||||
| struct hostent h; |  | ||||||
| struct hostent_data hdata; |  | ||||||
| int rc; |  | ||||||
| rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[ |  | ||||||
|       AC_MSG_RESULT(yes) |  | ||||||
|       AC_DEFINE(HAVE_GETHOSTBYADDR_R_5) |  | ||||||
|       ac_cv_gethostbyaddr_args=5],[ |  | ||||||
|       AC_MSG_RESULT(no) |  | ||||||
|       AC_MSG_CHECKING(if gethostbyaddr_r with -D_REENTRANT takes 5 arguments) |  | ||||||
|       AC_TRY_COMPILE([ |  | ||||||
| #define _REENTRANT |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h>],[ |  | ||||||
| char * address; |  | ||||||
| int length; |  | ||||||
| int type; |  | ||||||
| struct hostent h; |  | ||||||
| struct hostent_data hdata; |  | ||||||
| int rc; |  | ||||||
| rc = gethostbyaddr_r(address, length, type, &h, &hdata);],[ |  | ||||||
| 	AC_MSG_RESULT(yes) |  | ||||||
| 	AC_DEFINE(HAVE_GETHOSTBYADDR_R_5) |  | ||||||
| 	AC_DEFINE(NEED_REENTRANT) |  | ||||||
| 	ac_cv_gethostbyaddr_args=5],[ |  | ||||||
| 	AC_MSG_RESULT(no) |  | ||||||
| 	AC_MSG_CHECKING(if gethostbyaddr_r takes 7 arguments) |  | ||||||
| 	AC_TRY_COMPILE([ |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h>],[ |  | ||||||
| char * address; |  | ||||||
| int length; |  | ||||||
| int type; |  | ||||||
| struct hostent h; |  | ||||||
| char buffer[8192]; |  | ||||||
| int h_errnop; |  | ||||||
| struct hostent * hp; |  | ||||||
|  |  | ||||||
| hp = gethostbyaddr_r(address, length, type, &h, |  | ||||||
|                      buffer, 8192, &h_errnop);],[ |  | ||||||
| 	  AC_MSG_RESULT(yes) |  | ||||||
| 	  AC_DEFINE(HAVE_GETHOSTBYADDR_R_7) |  | ||||||
| 	  ac_cv_gethostbyaddr_args=7],[ |  | ||||||
| 	  AC_MSG_RESULT(no) |  | ||||||
| 	  AC_MSG_CHECKING(if gethostbyaddr_r takes 8 arguments) |  | ||||||
| 	  AC_TRY_COMPILE([ |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h>],[ |  | ||||||
| char * address; |  | ||||||
| int length; |  | ||||||
| int type; |  | ||||||
| struct hostent h; |  | ||||||
| char buffer[8192]; |  | ||||||
| int h_errnop; |  | ||||||
| struct hostent * hp; |  | ||||||
| int rc; |  | ||||||
|  |  | ||||||
| rc = gethostbyaddr_r(address, length, type, &h, |  | ||||||
|                      buffer, 8192, &hp, &h_errnop);],[ |  | ||||||
| 	    AC_MSG_RESULT(yes) |  | ||||||
| 	    AC_DEFINE(HAVE_GETHOSTBYADDR_R_8) |  | ||||||
| 	    ac_cv_gethostbyaddr_args=8],[ |  | ||||||
| 	    AC_MSG_RESULT(no) |  | ||||||
| 	    have_missing_r_funcs="$have_missing_r_funcs gethostbyaddr_r"])])])])]) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
| AC_DEFUN(CURL_CHECK_GETHOSTBYNAME_R, |  | ||||||
| [ |  | ||||||
|   dnl check for number of arguments to gethostbyname_r. it might take |  | ||||||
|   dnl either 3, 5, or 6 arguments. |  | ||||||
|   AC_CHECK_FUNCS(gethostbyname_r,[ |  | ||||||
|     AC_MSG_CHECKING(if gethostbyname_r takes 3 arguments) |  | ||||||
|     AC_TRY_RUN([ |  | ||||||
| #include <string.h> |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h> |  | ||||||
|  |  | ||||||
| int |  | ||||||
| main () { |  | ||||||
| struct hostent h; |  | ||||||
| struct hostent_data hdata; |  | ||||||
| char *name = "localhost"; |  | ||||||
| int rc; |  | ||||||
| memset(&h, 0, sizeof(struct hostent)); |  | ||||||
| memset(&hdata, 0, sizeof(struct hostent_data)); |  | ||||||
| rc = gethostbyname_r(name, &h, &hdata); |  | ||||||
| exit (rc != 0 ? 1 : 0); }],[ |  | ||||||
|       AC_MSG_RESULT(yes) |  | ||||||
|       AC_DEFINE(HAVE_GETHOSTBYNAME_R_3) |  | ||||||
|       ac_cv_gethostbyname_args=3],[ |  | ||||||
|       AC_MSG_RESULT(no) |  | ||||||
|       AC_MSG_CHECKING(if gethostbyname_r with -D_REENTRANT takes 3 arguments) |  | ||||||
|       AC_TRY_RUN([ |  | ||||||
| #define _REENTRANT |  | ||||||
|  |  | ||||||
| #include <string.h> |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h> |  | ||||||
|  |  | ||||||
| int |  | ||||||
| main () { |  | ||||||
| struct hostent h; |  | ||||||
| struct hostent_data hdata; |  | ||||||
| char *name = "localhost"; |  | ||||||
| int rc; |  | ||||||
| memset(&h, 0, sizeof(struct hostent)); |  | ||||||
| memset(&hdata, 0, sizeof(struct hostent_data)); |  | ||||||
| rc = gethostbyname_r(name, &h, &hdata); |  | ||||||
| exit (rc != 0 ? 1 : 0); }],[ |  | ||||||
| 	AC_MSG_RESULT(yes) |  | ||||||
| 	AC_DEFINE(HAVE_GETHOSTBYNAME_R_3) |  | ||||||
| 	AC_DEFINE(NEED_REENTRANT) |  | ||||||
| 	ac_cv_gethostbyname_args=3],[ |  | ||||||
| 	AC_MSG_RESULT(no) |  | ||||||
| 	AC_MSG_CHECKING(if gethostbyname_r takes 5 arguments) |  | ||||||
| 	AC_TRY_RUN([ |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h> |  | ||||||
|  |  | ||||||
| int |  | ||||||
| main () { |  | ||||||
| struct hostent *hp; |  | ||||||
| struct hostent h; |  | ||||||
| char *name = "localhost"; |  | ||||||
| char buffer[8192]; |  | ||||||
| int h_errno; |  | ||||||
| hp = gethostbyname_r(name, &h, buffer, 8192, &h_errno); |  | ||||||
| exit (hp == NULL ? 1 : 0); }],[ |  | ||||||
| 	  AC_MSG_RESULT(yes) |  | ||||||
| 	  AC_DEFINE(HAVE_GETHOSTBYNAME_R_5) |  | ||||||
|           ac_cv_gethostbyname_args=5],[ |  | ||||||
| 	  AC_MSG_RESULT(no) |  | ||||||
| 	  AC_MSG_CHECKING(if gethostbyname_r takes 6 arguments) |  | ||||||
| 	  AC_TRY_RUN([ |  | ||||||
| #include <sys/types.h> |  | ||||||
| #include <netdb.h> |  | ||||||
|  |  | ||||||
| int |  | ||||||
| main () { |  | ||||||
| struct hostent h; |  | ||||||
| struct hostent *hp; |  | ||||||
| char *name = "localhost"; |  | ||||||
| char buf[8192]; |  | ||||||
| int rc; |  | ||||||
| int h_errno; |  | ||||||
| rc = gethostbyname_r(name, &h, buf, 8192, &hp, &h_errno); |  | ||||||
| exit (rc != 0 ? 1 : 0); }],[ |  | ||||||
| 	    AC_MSG_RESULT(yes) |  | ||||||
| 	    AC_DEFINE(HAVE_GETHOSTBYNAME_R_6) |  | ||||||
|             ac_cv_gethostbyname_args=6],[ |  | ||||||
| 	    AC_MSG_RESULT(no) |  | ||||||
| 	    have_missing_r_funcs="$have_missing_r_funcs gethostbyname_r"], |  | ||||||
| 	    [ac_cv_gethostbyname_args=0])], |  | ||||||
| 	  [ac_cv_gethostbyname_args=0])], |  | ||||||
| 	[ac_cv_gethostbyname_args=0])], |  | ||||||
|       [ac_cv_gethostbyname_args=0])]) |  | ||||||
|  |  | ||||||
| if test "$ac_cv_func_gethostbyname_r" = "yes"; then |  | ||||||
|   if test "$ac_cv_gethostbyname_args" = "0"; then |  | ||||||
|     dnl there's a gethostbyname_r() function, but we don't know how |  | ||||||
|     dnl many arguments it wants! |  | ||||||
|     AC_MSG_ERROR([couldn't figure out how to use gethostbyname_r()]) |  | ||||||
|   fi |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| ]) |  | ||||||
|  |  | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| dnl Checks for IPv6 | dnl Checks for IPv6 | ||||||
| dnl ********************************************************************** | dnl ********************************************************************** | ||||||
| @@ -591,6 +305,8 @@ else | |||||||
|   case "$OPT_SSL" in |   case "$OPT_SSL" in | ||||||
|   yes) |   yes) | ||||||
|     EXTRA_SSL=/usr/local/ssl ;; |     EXTRA_SSL=/usr/local/ssl ;; | ||||||
|  |   off) | ||||||
|  |     EXTRA_SSL= ;; | ||||||
|   *) |   *) | ||||||
|     dnl check the given spot right away! |     dnl check the given spot right away! | ||||||
|     EXTRA_SSL=$OPT_SSL |     EXTRA_SSL=$OPT_SSL | ||||||
| @@ -761,7 +477,9 @@ AC_CHECK_HEADERS( \ | |||||||
|         winsock.h \ |         winsock.h \ | ||||||
|         time.h \ |         time.h \ | ||||||
|         io.h \ |         io.h \ | ||||||
|         pwd.h |         pwd.h \ | ||||||
|  |         utime.h \ | ||||||
|  |         sys/utime.h | ||||||
| ) | ) | ||||||
|  |  | ||||||
| dnl Check for libz header | dnl Check for libz header | ||||||
| @@ -782,26 +500,7 @@ AC_CHECK_SIZEOF(long long, 4) | |||||||
| # check for ssize_t | # check for ssize_t | ||||||
| AC_CHECK_TYPE(ssize_t, int) | AC_CHECK_TYPE(ssize_t, int) | ||||||
|  |  | ||||||
| dnl | TYPE_SOCKLEN_T | ||||||
| dnl We can't just AC_CHECK_TYPE() for socklen_t since it doesn't appear |  | ||||||
| dnl in the standard headers. We egrep for it in the socket headers and |  | ||||||
| dnl if it is used there we assume we have the type defined, otherwise |  | ||||||
| dnl we search for it with AC_CHECK_TYPE() the "normal" way |  | ||||||
| dnl |  | ||||||
|  |  | ||||||
| if test "$ac_cv_header_sys_socket_h" = "yes"; then |  | ||||||
|    AC_MSG_CHECKING(for socklen_t in sys/socket.h) |  | ||||||
|    AC_EGREP_HEADER(socklen_t, |  | ||||||
|     sys/socket.h, |  | ||||||
|     socklen_t=yes |  | ||||||
|     AC_MSG_RESULT(yes), |  | ||||||
|     AC_MSG_RESULT(no)) |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| if test "$socklen_t" != "yes"; then |  | ||||||
|   # check for socklen_t the standard way if it wasn't found before |  | ||||||
|   AC_CHECK_TYPE(socklen_t, int) |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| dnl Checks for library functions. | dnl Checks for library functions. | ||||||
| dnl AC_PROG_GCC_TRADITIONAL | dnl AC_PROG_GCC_TRADITIONAL | ||||||
| @@ -834,7 +533,8 @@ AC_CHECK_FUNCS( socket \ | |||||||
|                 strlcat \ |                 strlcat \ | ||||||
|                 getpwuid \ |                 getpwuid \ | ||||||
|                 geteuid \ |                 geteuid \ | ||||||
|                 dlopen |                 dlopen \ | ||||||
|  |                 utime | ||||||
| ) | ) | ||||||
|  |  | ||||||
| dnl removed 'getpass' check on October 26, 2000 | dnl removed 'getpass' check on October 26, 2000 | ||||||
| @@ -876,10 +576,6 @@ AC_CONFIG_FILES([Makefile \ | |||||||
| 	   packages/Linux/RPM/curl.spec \ | 	   packages/Linux/RPM/curl.spec \ | ||||||
| 	   packages/Linux/RPM/curl-ssl.spec \ | 	   packages/Linux/RPM/curl-ssl.spec \ | ||||||
|            packages/Solaris/Makefile \ |            packages/Solaris/Makefile \ | ||||||
|            perl/Makefile \ |  | ||||||
|            perl/Curl_easy/Makefile \ |  | ||||||
|            php/Makefile \ |  | ||||||
|            php/examples/Makefile \ |  | ||||||
|            curl-config |            curl-config | ||||||
| ]) | ]) | ||||||
| AC_OUTPUT | AC_OUTPUT | ||||||
|   | |||||||
| @@ -73,14 +73,15 @@ while test $# -gt 0; do | |||||||
| 	;; | 	;; | ||||||
|  |  | ||||||
|     --cflags) |     --cflags) | ||||||
|        	echo @CPPFLAGS@ |        	echo -I@includedir@ | ||||||
|        	;; |        	;; | ||||||
|  |  | ||||||
|     --libs) |     --libs) | ||||||
|        	echo @LDFLAGS@ @LIBS@ |        	echo -L@libdir@ -lcurl @LDFLAGS@ @LIBS@ | ||||||
|        	;; |        	;; | ||||||
|  |  | ||||||
|     *) |     *) | ||||||
|  |         echo "unknown option: $1" | ||||||
| 	usage | 	usage | ||||||
| 	exit 1 | 	exit 1 | ||||||
| 	;; | 	;; | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								curl-mode.el
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								curl-mode.el
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | ;;;; Emacs Lisp help for writing curl code. ;;;; | ||||||
|  |  | ||||||
|  | ;;; In C files, put something like this to load this file automatically: | ||||||
|  | ;; | ||||||
|  | ;;   /* ----------------------------------------------------------------- | ||||||
|  | ;;    * local variables: | ||||||
|  | ;;    * eval: (load-file "../curl-mode.el") | ||||||
|  | ;;    * end: | ||||||
|  | ;;    */ | ||||||
|  | ;; | ||||||
|  | ;; (note: make sure to get the path right in the argument to load-file). | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ;;; The curl hacker's C conventions | ||||||
|  |  | ||||||
|  | ;;; we use intent-level 2 | ||||||
|  | (setq c-basic-offset 2) | ||||||
|  | ;;; never ever use tabs to indent! | ||||||
|  | (setq indent-tabs-mode nil) | ||||||
|  | ;;; I like this, stolen from Subversion! ;-) | ||||||
|  | (setq angry-mob-with-torches-and-pitchforks t) | ||||||
| @@ -10,6 +10,12 @@ To Think About When Contributing Source Code | |||||||
|  in mind when you decide to write a contribution to the project. This concerns |  in mind when you decide to write a contribution to the project. This concerns | ||||||
|  new features as well as corrections to existing flaws or bugs. |  new features as well as corrections to existing flaws or bugs. | ||||||
|  |  | ||||||
|  | Join the Community | ||||||
|  |  | ||||||
|  |  Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing | ||||||
|  |  list(s).  Read up on details before you post questions. Read this file before | ||||||
|  |  you start sending patches! | ||||||
|  |  | ||||||
| The License Issue | The License Issue | ||||||
|  |  | ||||||
|  When contributing with code, you agree to put your changes and new code under |  When contributing with code, you agree to put your changes and new code under | ||||||
| @@ -21,6 +27,12 @@ The License Issue | |||||||
|  GPL (as we don't want the GPL virus to attack users of libcurl) but they must |  GPL (as we don't want the GPL virus to attack users of libcurl) but they must | ||||||
|  use "GPL compatible" licenses. |  use "GPL compatible" licenses. | ||||||
|  |  | ||||||
|  | What To Read | ||||||
|  |  | ||||||
|  |  Source code, the man pages, the INTERALS document, the TODO, the most recent | ||||||
|  |  CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of | ||||||
|  |  insights on what's going on right now. | ||||||
|  |  | ||||||
| Naming | Naming | ||||||
|  |  | ||||||
|  Try using a non-confusing naming scheme for your new functions and variable |  Try using a non-confusing naming scheme for your new functions and variable | ||||||
| @@ -87,7 +99,9 @@ Write Access to CVS Repository | |||||||
|  If you are a frequent contributor, or have another good reason, you can of |  If you are a frequent contributor, or have another good reason, you can of | ||||||
|  course get write access to the CVS repository and then you'll be able to |  course get write access to the CVS repository and then you'll be able to | ||||||
|  check-in all your changes straight into the CVS tree instead of sending all |  check-in all your changes straight into the CVS tree instead of sending all | ||||||
|  changes by mail as patches. Just ask if this is what you'd want. |  changes by mail as patches. Just ask if this is what you'd want. You will be | ||||||
|  |  required to have posted a few quality patches first, before you can be | ||||||
|  |  granted write access. | ||||||
|  |  | ||||||
| Test Cases | Test Cases | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
| Updated: May 29, 2001 (http://curl.haxx.se/docs/faq.shtml) | Updated: August 23, 2001 (http://curl.haxx.se/docs/faq.shtml) | ||||||
|                                   _   _ ____  _      |                                   _   _ ____  _      | ||||||
|                               ___| | | |  _ \| |     |                               ___| | | |  _ \| |     | ||||||
|                              / __| | | | |_) | |     |                              / __| | | | |_) | |     | ||||||
| @@ -14,6 +14,7 @@ FAQ | |||||||
|   1.4 When will you make curl do XXXX ? |   1.4 When will you make curl do XXXX ? | ||||||
|   1.5 Who makes cURL? |   1.5 Who makes cURL? | ||||||
|   1.6 What do you get for making cURL? |   1.6 What do you get for making cURL? | ||||||
|  |   1.7 What about CURL from curl.com? | ||||||
|  |  | ||||||
|  2. Install Related Problems |  2. Install Related Problems | ||||||
|   2.1 configure doesn't find OpenSSL even when it is installed |   2.1 configure doesn't find OpenSSL even when it is installed | ||||||
| @@ -80,7 +81,7 @@ FAQ | |||||||
|   fact it can also be pronounced 'see URL' also helped. |   fact it can also be pronounced 'see URL' also helped. | ||||||
|  |  | ||||||
|   Curl supports a range of common Internet protocols, currently including |   Curl supports a range of common Internet protocols, currently including | ||||||
|   HTTP, HTTPS, FTP, GOPHER, LDAP, DICT, TELNET and FILE. |   HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and FILE. | ||||||
|  |  | ||||||
|   We spell it cURL or just curl. We pronounce it with an initial k sound: |   We spell it cURL or just curl. We pronounce it with an initial k sound: | ||||||
|   [kurl]. |   [kurl]. | ||||||
| @@ -170,6 +171,25 @@ FAQ | |||||||
|   sourceforge.net hosts several project tools we take advantage from like the |   sourceforge.net hosts several project tools we take advantage from like the | ||||||
|   bug tracker, mailing lists and more. |   bug tracker, mailing lists and more. | ||||||
|  |  | ||||||
|  |   If you feel you want to show support our project with a donation, a very | ||||||
|  |   nice way of doing that would be to buy "gift certificates" at useful online | ||||||
|  |   shopping sites, such as amazon.com or thinkgeek.com. | ||||||
|  |  | ||||||
|  |   1.7 What about CURL from curl.com? | ||||||
|  |  | ||||||
|  |   During the summer 2001, curl.com has been busy advertising their client-side | ||||||
|  |   programming language for the web, named CURL. | ||||||
|  |  | ||||||
|  |   We are in no way associated with curl.com or their CURL programming | ||||||
|  |   language.  | ||||||
|  |  | ||||||
|  |   Our project name curl has been in effective use since 1998. We were not the | ||||||
|  |   first computer related project to use the name "curl" and do not claim any | ||||||
|  |   first-hand rights to the name. | ||||||
|  |  | ||||||
|  |   We recognize that we will be living in parallel with curl.com and wish them | ||||||
|  |   every success. | ||||||
|  |  | ||||||
| 2. Install Related Problems | 2. Install Related Problems | ||||||
|  |  | ||||||
|   2.1. configure doesn't find OpenSSL even when it is installed |   2.1. configure doesn't find OpenSSL even when it is installed | ||||||
| @@ -447,9 +467,9 @@ FAQ | |||||||
|   4.6. Can you tell me what error code 142 means? |   4.6. Can you tell me what error code 142 means? | ||||||
|  |  | ||||||
|   All error codes that are larger than the highest documented error code means |   All error codes that are larger than the highest documented error code means | ||||||
|   that curl has existed due to a timeout. There was no nice way for curl to |   that curl has exited due to a crash. This is a serious error, and we | ||||||
|   abort from such a condition and that's why it got this undocumented |   appriciate a detailed bug report from you that describes how we could go | ||||||
|   error. This should not occur in releases after 7.4.1. |   ahead and repeat this! | ||||||
|  |  | ||||||
|   4.7. How do I keep user names and passwords secret in Curl command lines? |   4.7. How do I keep user names and passwords secret in Curl command lines? | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										86
									
								
								docs/INSTALL
									
									
									
									
									
								
							
							
						
						
									
										86
									
								
								docs/INSTALL
									
									
									
									
									
								
							| @@ -6,12 +6,10 @@ | |||||||
|  |  | ||||||
|                                 How To Compile |                                 How To Compile | ||||||
|  |  | ||||||
| Curl has been compiled and built on numerous different operating systems. The | Curl has been compiled and built on numerous different operating systems. | ||||||
| way to proceed is mainly divided in two different ways: the unix way or the  |  | ||||||
| windows way. |  | ||||||
|  |  | ||||||
| If you're using Windows (95/98/NT/ME/2000 or whatever) or OS/2, you should | If you're using Windows (95/98/NT/ME/2000 or whatever), VMS, RISC OS or OS/2, | ||||||
| continue reading from the Win32 or OS/2 headers further down. All other | you should continue reading from one the paragraphs further down. All other | ||||||
| systems should be capable of being installed as described below. | systems should be capable of being installed as described below. | ||||||
|  |  | ||||||
| UNIX | UNIX | ||||||
| @@ -255,10 +253,82 @@ IBM OS/2 | |||||||
|    If you're getting huge binaries, probably your makefiles have the -g in |    If you're getting huge binaries, probably your makefiles have the -g in | ||||||
|    CFLAGS. |    CFLAGS. | ||||||
|  |  | ||||||
|  | VMS | ||||||
|  | === | ||||||
|  |    (The VMS section is in whole contributed by the friendly Nico Baggus) | ||||||
|  |  | ||||||
|  |    This is the first attempt at porting cURL to VMS. | ||||||
|  |  | ||||||
|  |    Curl seems to work with FTP & HTTP other protocols are not tested.  (the | ||||||
|  |    perl http/ftp testing server supplied as testing too cannot work on VMS | ||||||
|  |    because vms has no concept of fork(). [ I tried to give it a whack, but | ||||||
|  |    thats of no use. | ||||||
|  |  | ||||||
|  |    SSL stuff has not been ported. | ||||||
|  |  | ||||||
|  |    Telnet has about the same issues as for Win32. When the changes for Win32 | ||||||
|  |    are clear maybe they'l work for VMS too. The basic problem is that select | ||||||
|  |    ONLY works for sockets. | ||||||
|  |  | ||||||
|  |    Marked instances of fopen/[f]stat that might become a problem, especially | ||||||
|  |    for non stream files. In this regard, the files opened for writing will be | ||||||
|  |    created stream/lf and will thus be safe. Just keep in mind that non-binary | ||||||
|  |    read/wring from/to files will have a records size limit of 32767 bytes | ||||||
|  |    imposed. | ||||||
|  |  | ||||||
|  |    Stat to get the size of the files is again only safe for stream files & | ||||||
|  |    fixed record files without implied CC. | ||||||
|  |  | ||||||
|  |    -- My guess is that only allowing access to stream files is the quickest | ||||||
|  |    way to get around the most issues. Therefore all files need to to be | ||||||
|  |    checked to be sure they will be stream/lf before processing them.  This is | ||||||
|  |    the easiest way out, I know. The reason for this is that code that needs to | ||||||
|  |    report the filesize will become a pain in the ass otherwise. | ||||||
|  |  | ||||||
|  |    Exit status.... Well we needed something done here, | ||||||
|  |  | ||||||
|  |    VMS has a structured exist status: | ||||||
|  |    | 3  |       2    |     1       |  0| | ||||||
|  |    |1098|765432109876|5432109876543|210| | ||||||
|  |    +----+------------+-------------+---+ | ||||||
|  |    |Ctrl|  Facility  | Error code  |sev| | ||||||
|  |    +----+------------+-------------+---+ | ||||||
|  |  | ||||||
|  |    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. | ||||||
|  |  | ||||||
|  |    Facility - basicaly the program ID. A code assigned to the program | ||||||
|  |    the name can be fetched from external or internal message libraries | ||||||
|  |    Errorcode - the errodes assigned by the application | ||||||
|  |    Sev. - severity: Even = error, off = non error | ||||||
|  | 		0 = Warning | ||||||
|  | 		1 = Success | ||||||
|  | 		2 = Error | ||||||
|  | 		3 = Information | ||||||
|  | 		4 = Fatal  | ||||||
|  | 		<5-7> reserved. | ||||||
|  |  | ||||||
|  |    This all presents itself with: | ||||||
|  |    %<FACILITY>-<SeV>-<Errorname>, <Error message> | ||||||
|  |  | ||||||
|  |    See also the src/curlmsg.msg file, it has the source for the messages In | ||||||
|  |    src/main.c a section is devoted to message status values, the globalvalues | ||||||
|  |    create symbols with certain values, referenced from a compiled message | ||||||
|  |    file. Have all exit function use a exit status derived from a translation | ||||||
|  |    table with the compiled message codes. | ||||||
|  |  | ||||||
|  |    This was all compiled with: | ||||||
|  |  | ||||||
|  | 	Compaq C V6.2-003 on OpenVMS Alpha V7.1-1H2 | ||||||
|  |  | ||||||
|  |    So far for porting notes as of: | ||||||
|  |    13-jul-2001 | ||||||
|  |    N. Baggus | ||||||
|  |  | ||||||
| PORTS | PORTS | ||||||
| ===== | ===== | ||||||
|    This is a probably incomplete list of known hardware and |    This is a probably incomplete list of known hardware and operating systems | ||||||
|    operating systems that curl has been compiled for: |    that curl has been compiled for: | ||||||
|  |  | ||||||
|         - Ultrix 4.3a |         - Ultrix 4.3a | ||||||
|         - SINIX-Z v5 |         - SINIX-Z v5 | ||||||
| @@ -266,6 +336,7 @@ PORTS | |||||||
|         - Alpha Digital UNIX v3.2 |         - Alpha Digital UNIX v3.2 | ||||||
|         - Alpha FreeBSD 4.1 |         - Alpha FreeBSD 4.1 | ||||||
|         - Alpha Linux 2.2.16 |         - Alpha Linux 2.2.16 | ||||||
|  |         - Alpha OpenVMS V7.1-1H2 | ||||||
|         - Alpha Tru64 v5.0 5.1 |         - Alpha Tru64 v5.0 5.1 | ||||||
|         - HP-PA HP-UX 9.X 10.X 11.X |         - HP-PA HP-UX 9.X 10.X 11.X | ||||||
|         - MIPS IRIX 6.2, 6.5 |         - MIPS IRIX 6.2, 6.5 | ||||||
| @@ -289,6 +360,7 @@ PORTS | |||||||
|         - m68k AmigaOS 3 |         - m68k AmigaOS 3 | ||||||
|         - m68k OpenBSD |         - m68k OpenBSD | ||||||
|         - StrongARM NetBSD 1.4.1 |         - StrongARM NetBSD 1.4.1 | ||||||
|  |         - StrongARM (and other ARM) RISC OS 3.1, 4.02 | ||||||
|  |  | ||||||
| OpenSSL | OpenSSL | ||||||
| ======= | ======= | ||||||
|   | |||||||
							
								
								
									
										117
									
								
								docs/LIBCURL
									
									
									
									
									
								
							
							
						
						
									
										117
									
								
								docs/LIBCURL
									
									
									
									
									
								
							| @@ -1,117 +0,0 @@ | |||||||
|                          _ _ _                     _  |  | ||||||
|                         | (_) |__   ___ _   _ _ __| | |  | ||||||
|                         | | | '_ \ / __| | | | '__| | |  | ||||||
|                         | | | |_) | (__| |_| | |  | | |  | ||||||
|                         |_|_|_.__/ \___|\__,_|_|  |_| |  | ||||||
|  |  | ||||||
|                    How To Use Libcurl In Your C/C++ Program |  | ||||||
|  |  | ||||||
|  [ libcurl can be used directly from within your Java, PHP, Perl, Ruby or Tcl |  | ||||||
|    programs as well, look elsewhere for documentation on this ] |  | ||||||
|  |  | ||||||
|  The interface is meant to be very simple for applictions/programmers, hence |  | ||||||
|  the name "easy". We have therefore minimized the number of entries. |  | ||||||
|  |  | ||||||
| The Easy Interface |  | ||||||
|  |  | ||||||
|  When using the easy interface, you init your session and get a handle, which |  | ||||||
|  you use as input to the following interface functions you use. Use |  | ||||||
|  curl_easy_init() to get the handle. |  | ||||||
|  |  | ||||||
|  You continue by setting all the options you want in the upcoming transfer, |  | ||||||
|  most important among them is the URL itself (you can't transfer anything |  | ||||||
|  without a specified URL as you may have figured out yourself). You might want |  | ||||||
|  to set some callbacks as well that will be called from the library when data |  | ||||||
|  is available etc. curl_easy_setopt() is there for this. |  | ||||||
|  |  | ||||||
|  When all is setup, you tell libcurl to perform the transfer using |  | ||||||
|  curl_easy_perform(). It will then do the entire operation and won't return |  | ||||||
|  until it is done or failed. |  | ||||||
|  |  | ||||||
|  After the transfer has been made, you cleanup the session with |  | ||||||
|  curl_easy_cleanup() and libcurl is entirely off the hook! If you want |  | ||||||
|  persistant connections, you don't cleanup immediately, but instead run ahead |  | ||||||
|  and perform other transfers. See the chapter below for Persistant |  | ||||||
|  Connections. |  | ||||||
|  |  | ||||||
|  While the above mentioned four functions are the main functions to use in the |  | ||||||
|  easy interface, there is a series of other helpful functions to use. They |  | ||||||
|  are: |  | ||||||
|  |  | ||||||
|    curl_version()        - displays the libcurl version |  | ||||||
|    curl_getdate()        - converts a date string to time_t |  | ||||||
|    curl_getenv()         - portable environment variable reader |  | ||||||
|    curl_easy_getinfo()   - get information about a performed transfer |  | ||||||
|    curl_formparse()      - helps building a HTTP form POST |  | ||||||
|    curl_formfree()       - free a list built with curl_formparse() |  | ||||||
|    curl_slist_append()   - builds a linked list |  | ||||||
|    curl_slist_free_all() - frees a whole curl_slist |  | ||||||
|  |  | ||||||
|  For details on these, read the separate man pages. |  | ||||||
|  |  | ||||||
| Linking with libcurl |  | ||||||
|  |  | ||||||
|  Staring with 7.7.2 (on unix-like machines), there's a tool named curl-config |  | ||||||
|  that gets installed with the rest of the curl stuff when 'make install' is |  | ||||||
|  performed. |  | ||||||
|  |  | ||||||
|  curl-config is added to make it easier for applications to link with |  | ||||||
|  libcurl and developers to learn about libcurl and how to use it. |  | ||||||
|  |  | ||||||
|  Run 'curl-config --libs' to get the (additional) linker options you need to |  | ||||||
|  link with the particular version of libcurl you've installed. |  | ||||||
|  |  | ||||||
|  For details, see the curl-config.1 man page. |  | ||||||
|  |  | ||||||
| libcurl symbol names |  | ||||||
|  |  | ||||||
|  All public functions in the libcurl interface are prefixed with 'curl_' (with |  | ||||||
|  a lowercase c). You can find other functions in the library source code, but |  | ||||||
|  other prefixes indicate the functions are private and may change without |  | ||||||
|  further notice in the next release. |  | ||||||
|  |  | ||||||
|  Only use documented functions and functionality! |  | ||||||
|  |  | ||||||
| Portability |  | ||||||
|  |  | ||||||
|  libcurl works *exactly* the same, on any of the platforms it compiles and |  | ||||||
|  builds on. |  | ||||||
|  |  | ||||||
|  There's only one caution, and that is the win32 platform that may(*) require |  | ||||||
|  you to init the winsock stuff before you use the libcurl functions. Details |  | ||||||
|  on this are noted on the curl_easy_init() man page. |  | ||||||
|  |  | ||||||
|  (*) = it appears as if users of the cygwin environment get this done |  | ||||||
|        automatically. |  | ||||||
|  |  | ||||||
| Threads |  | ||||||
|  |  | ||||||
|  Never *ever* call curl-functions simultaneously using the same handle from |  | ||||||
|  several threads. libcurl is thread-safe and can be used in any number of |  | ||||||
|  threads, but you must use separate curl handles if you want to use libcurl in |  | ||||||
|  more than one thread simultaneously. |  | ||||||
|  |  | ||||||
| Persistant Connections |  | ||||||
|  |  | ||||||
|  With libcurl 7.7, persistant connections were added. Persistant connections |  | ||||||
|  means that libcurl can re-use the same connection for several transfers, if |  | ||||||
|  the conditions are right. |  | ||||||
|  |  | ||||||
|  libcurl will *always* attempt to use persistant connections. Whenever you use |  | ||||||
|  curl_easy_perform(), libcurl will attempt to use an existing connection to do |  | ||||||
|  the transfer, and if none exists it'll open a new one that will be subject |  | ||||||
|  for re-use on a possible following call to curl_easy_perform(). |  | ||||||
|  |  | ||||||
|  To allow libcurl to take full advantage of persistant connections, you should |  | ||||||
|  do as many of your file transfers as possible using the same curl |  | ||||||
|  handle. When you call curl_easy_cleanup(), all the possibly open connections |  | ||||||
|  held by libcurl will be closed and forgotten. |  | ||||||
|  |  | ||||||
|  Note that the options set with curl_easy_setopt() will be used in on every |  | ||||||
|  repeat curl_easy_perform() call |  | ||||||
|  |  | ||||||
| Compatibility with older libcurls |  | ||||||
|  |  | ||||||
|  Repeated curl_easy_perform() calls on the same handle were not supported in |  | ||||||
|  pre-7.7 versions, and caused confusion and defined behaviour. |  | ||||||
|  |  | ||||||
| @@ -13,6 +13,7 @@ man_MANS = \ | |||||||
| 	curl_easy_perform.3 \ | 	curl_easy_perform.3 \ | ||||||
| 	curl_easy_setopt.3 \ | 	curl_easy_setopt.3 \ | ||||||
| 	curl_formparse.3 \ | 	curl_formparse.3 \ | ||||||
|  | 	curl_formadd.3 \ | ||||||
| 	curl_formfree.3 \ | 	curl_formfree.3 \ | ||||||
| 	curl_getdate.3 \ | 	curl_getdate.3 \ | ||||||
| 	curl_getenv.3 \ | 	curl_getenv.3 \ | ||||||
| @@ -28,8 +29,46 @@ man_MANS = \ | |||||||
| 	curl_global_cleanup.3 \ | 	curl_global_cleanup.3 \ | ||||||
| 	libcurl.3 | 	libcurl.3 | ||||||
|  |  | ||||||
|  | SUBDIRS = examples | ||||||
|  |  | ||||||
|  | HTMLPAGES = \ | ||||||
|  | 	curl.html \ | ||||||
|  | 	curl-config.html \ | ||||||
|  | 	curl_easy_cleanup.html \ | ||||||
|  | 	curl_easy_getinfo.html \ | ||||||
|  | 	curl_easy_init.html \ | ||||||
|  | 	curl_easy_perform.html \ | ||||||
|  | 	curl_easy_setopt.html \ | ||||||
|  | 	curl_formadd.html \ | ||||||
|  | 	curl_formparse.html \ | ||||||
|  | 	curl_formfree.html \ | ||||||
|  | 	curl_getdate.html \ | ||||||
|  | 	curl_getenv.html \ | ||||||
|  | 	curl_slist_append.html \ | ||||||
|  | 	curl_slist_free_all.html \ | ||||||
|  | 	curl_version.html \ | ||||||
|  | 	curl_escape.html \ | ||||||
|  | 	curl_unescape.html \ | ||||||
|  | 	curl_strequal.html \ | ||||||
|  | 	curl_strnequal.html \ | ||||||
|  | 	curl_mprintf.html \ | ||||||
|  | 	curl_global_init.html \ | ||||||
|  | 	curl_global_cleanup.html \ | ||||||
|  | 	libcurl.html | ||||||
|  |  | ||||||
| EXTRA_DIST = $(man_MANS) \ | EXTRA_DIST = $(man_MANS) \ | ||||||
| 	MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS \ | 	MANUAL BUGS CONTRIBUTE FAQ FEATURES INTERNALS \ | ||||||
| 	LIBCURL README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS | 	README.win32 RESOURCES TODO TheArtOfHttpScripting THANKS \ | ||||||
|  | 	$(HTMLPAGES) | ||||||
|  |  | ||||||
| SUBDIRS = examples | MAN2HTML= gnroff -man $< | man2html >$@ | ||||||
|  |  | ||||||
|  | SUFFIXES = .1 .3 .html | ||||||
|  |  | ||||||
|  | html: $(HTMLPAGES) | ||||||
|  |  | ||||||
|  | .3.html: | ||||||
|  | 	$(MAN2HTML) | ||||||
|  |  | ||||||
|  | .1.html: | ||||||
|  | 	$(MAN2HTML) | ||||||
|   | |||||||
| @@ -69,3 +69,9 @@ that have contributed with non-trivial parts: | |||||||
|  - S. Moonesamy |  - S. Moonesamy | ||||||
|  - Ingo Wilken <iw@WWW.Ecce-Terram.DE> |  - Ingo Wilken <iw@WWW.Ecce-Terram.DE> | ||||||
|  - Pawel A. Gajda <mis@k2.net.pl> |  - Pawel A. Gajda <mis@k2.net.pl> | ||||||
|  |  - Patrick Bihan-Faou | ||||||
|  |  - Nico Baggus <Nico.Baggus@mail.ing.nl> | ||||||
|  |  - Sergio Ballestrero | ||||||
|  |  - Andrew Francis <locust@familyhealth.com.au> | ||||||
|  |  - Tomasz Lacki <Tomasz.Lacki@primark.pl> | ||||||
|  |  - Georg Huettenegger <georg@ist.org> | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -12,29 +12,18 @@ TODO | |||||||
|  |  | ||||||
| To do in a future release (random order): | To do in a future release (random order): | ||||||
|  |  | ||||||
|  * It would be nice to be able to use "-d" (or something similar) to attach |  * FTP ASCII upload does not follow RFC959 section 3.1.1.1:  | ||||||
|    parameters of EITHER the GET or POST type... It would either require |     "The sender converts the data from an internal character representation to | ||||||
|    another curl argument to specify "GET" (obviously the default should remain |     the standard 8-bit NVT-ASCII representation (see the Telnet | ||||||
|    POST), or it would require a new curl argument (perhaps -G/--get-data). |     specification).  The receiver will convert the data from the standard form | ||||||
|  |     to his own internal form." | ||||||
|  |  | ||||||
|    I know we're running out of letters, but it somehow feels a little |  * Make the connect non-blocking so that timeouts work for connect in  | ||||||
|    "cleaner" to just tag on each of your HTTP "parameters" (data-items) one by |    multi-threaded programs  | ||||||
|    one and let curl put them together, rather than having to put them together |  | ||||||
|    myself and include them in the URL. |  | ||||||
|  |  | ||||||
|  * Add an interface that enables a user to select prefered SSL ciphers to use. |  | ||||||
|  |  | ||||||
|  * Make curl deal with cookies better. libcurl should be able to maintain a |  | ||||||
|    "cookie jar". Updating it with cookies that is received, and using it to |  | ||||||
|    pass cookies to the servers that have matching cookies in the jar. |  | ||||||
|    http://curl.haxx.se/dev/cookie-jar.txt |  | ||||||
|  |  | ||||||
|  * Consider an interface to libcurl that allows applications to easier get to |  * Consider an interface to libcurl that allows applications to easier get to | ||||||
|    know what cookies that are sent back in the response headers. |    know what cookies that are sent back in the response headers. | ||||||
|  |  | ||||||
|  * Make SSL session ids get used if multiple HTTPS documents from the same |  | ||||||
|    host is requested. http://curl.haxx.se/dev/SSL_session_id.txt |  | ||||||
|  |  | ||||||
|  * HTTP PUT for files passed on stdin. Requires libcurl to send the file |  * HTTP PUT for files passed on stdin. Requires libcurl to send the file | ||||||
|    with chunked content encoding. http://curl.haxx.se/dev/HTTP-PUT-stdin.txt |    with chunked content encoding. http://curl.haxx.se/dev/HTTP-PUT-stdin.txt | ||||||
|  |  | ||||||
| @@ -42,6 +31,11 @@ To do in a future release (random order): | |||||||
|    less copy of data and thus a faster operation. |    less copy of data and thus a faster operation. | ||||||
|    http://curl.haxx.se/dev/no_copy_callbacks.txt |    http://curl.haxx.se/dev/no_copy_callbacks.txt | ||||||
|  |  | ||||||
|  |  * An option to only download remote FTP files if they're newer than the local | ||||||
|  |    one is a good idea, and it would fit right into the same syntax as the | ||||||
|  |    already working http dito works. It of course requires that 'MDTM' works, | ||||||
|  |    and it isn't a standard FTP command. | ||||||
|  |  | ||||||
|  * Suggested on the mailing list: CURLOPT_FTP_MKDIR...! |  * Suggested on the mailing list: CURLOPT_FTP_MKDIR...! | ||||||
|  |  | ||||||
|  * Add configure options that disables certain protocols in libcurl to |  * Add configure options that disables certain protocols in libcurl to | ||||||
| @@ -53,10 +47,6 @@ To do in a future release (random order): | |||||||
|  |  | ||||||
|  * Make TELNET work on windows! |  * Make TELNET work on windows! | ||||||
|  |  | ||||||
|  * Add a command line option that allows the output file to get the same time |  | ||||||
|    stamp as the remote file. libcurl already is capable of fetching the remote |  | ||||||
|    file's date. |  | ||||||
|  |  | ||||||
|  * Make curl's SSL layer option capable of using other free SSL libraries. |  * Make curl's SSL layer option capable of using other free SSL libraries. | ||||||
|    Such as the Mozilla Security Services |    Such as the Mozilla Security Services | ||||||
|    (http://www.mozilla.org/projects/security/pki/nss/) and GNUTLS |    (http://www.mozilla.org/projects/security/pki/nss/) and GNUTLS | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
|  | Online:  http://curl.haxx.se/docs/httpscripting.shtml | ||||||
| Author:  Daniel Stenberg <daniel@haxx.se> | Author:  Daniel Stenberg <daniel@haxx.se> | ||||||
| Date:    September 15, 2000 | Date:    August 20, 2001 | ||||||
| Version: 0.3 | Version: 0.4 | ||||||
|  |  | ||||||
|                 The Art Of Scripting HTTP Requests Using Curl |                 The Art Of Scripting HTTP Requests Using Curl | ||||||
|                 ============================================= |                 ============================================= | ||||||
| @@ -174,6 +175,19 @@ Version: 0.3 | |||||||
|  |  | ||||||
|         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 | ||||||
|  |  | ||||||
|  |   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 | ||||||
|  |   way your browser does. | ||||||
|  |  | ||||||
|  |   An easy way to get to see this, is to save the HTML page with the form on | ||||||
|  |   your local disk, mofidy the 'method' to a GET, and press the submit button | ||||||
|  |   (you could also change the action URL if you want to). | ||||||
|  |  | ||||||
|  |   You will then clearly see the data get appended to the URL, separated with a | ||||||
|  |   '?'-letter as GET forms are supposed to. | ||||||
|  |  | ||||||
| 5. PUT | 5. PUT | ||||||
|  |  | ||||||
|  The perhaps best way to upload data to a HTTP server is to use PUT. Then |  The perhaps best way to upload data to a HTTP server is to use PUT. Then | ||||||
| @@ -182,7 +196,7 @@ Version: 0.3 | |||||||
|  |  | ||||||
|  Put a file to a HTTP server with curl: |  Put a file to a HTTP server with curl: | ||||||
|  |  | ||||||
|         curl -t uploadfile www.uploadhttp.com/receive.cgi |         curl -T uploadfile www.uploadhttp.com/receive.cgi | ||||||
|  |  | ||||||
| 6. AUTHENTICATION | 6. AUTHENTICATION | ||||||
|  |  | ||||||
| @@ -289,7 +303,6 @@ Version: 0.3 | |||||||
|  |  | ||||||
|         curl -b "name=Daniel" www.cookiesite.com |         curl -b "name=Daniel" www.cookiesite.com | ||||||
|  |  | ||||||
|  |  | ||||||
|  Cookies are sent as common HTTP headers. This is practical as it allows curl |  Cookies are sent as common HTTP headers. This is practical as it allows curl | ||||||
|  to record cookies simply by recording headers. Record cookies with curl by |  to record cookies simply by recording headers. Record cookies with curl by | ||||||
|  using the -D option like: |  using the -D option like: | ||||||
| @@ -304,6 +317,14 @@ Version: 0.3 | |||||||
|  |  | ||||||
|         curl -b stored_cookies_in_file www.cookiesite.com |         curl -b stored_cookies_in_file www.cookiesite.com | ||||||
|  |  | ||||||
|  |  Curl's "cookie engine" gets enabled when you use the -b option. If you only | ||||||
|  |  want curl to understand received cookies, use -b with a file that doesn't | ||||||
|  |  exist. Example, if you want to let curl understand cookies from a page and | ||||||
|  |  follow a location (and thus possibly send back cookies it received), you can | ||||||
|  |  invoke it like: | ||||||
|  |  | ||||||
|  |         curl -b nada -L www.cookiesite.com | ||||||
|  |  | ||||||
| 11. HTTPS | 11. HTTPS | ||||||
|  |  | ||||||
|  There are a few ways to do secure HTTP transfers. The by far most common |  There are a few ways to do secure HTTP transfers. The by far most common | ||||||
|   | |||||||
| @@ -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 "28 May 2001" "Curl 7.8" "curl-config manual" | .TH curl-config 1 "16 August 2001" "Curl 7.8.1" "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 | ||||||
| @@ -12,8 +12,8 @@ curl-config \- Get information about a libcurl installation | |||||||
| displays information about a previous curl and libcurl installation. | displays information about a previous curl and libcurl installation. | ||||||
| .SH OPTIONS | .SH OPTIONS | ||||||
| .IP "--cflags" | .IP "--cflags" | ||||||
| What set of CFLAGS that was used when libcurl was built. This is mostly a | Set of compiler options (CFLAGS) to use when compiling files that use | ||||||
| debug option that serves no particular use to most people. | libcurl. Currently that is only thw include path to the curl include files. | ||||||
| .IP "--feature" | .IP "--feature" | ||||||
| Lists what particular main features the installed libcurl was built with. At | Lists what particular main features the installed libcurl was built with. At | ||||||
| the time of writing, this list may include SSL, KRB4 or IPv6. Do not assume | the time of writing, this list may include SSL, KRB4 or IPv6. Do not assume | ||||||
| @@ -36,18 +36,14 @@ 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... | ||||||
| .SH "EXAMPLES" | .SH "EXAMPLES" | ||||||
| What is the path to the curl header files? | What linker options do I need when I link with libcurl? | ||||||
|  |  | ||||||
|   echo `curl-config --prefix`/include |  | ||||||
|  |  | ||||||
| What is the path to libcurl? |  | ||||||
|  |  | ||||||
|   echo `curl-config --prefix`/lib |  | ||||||
|  |  | ||||||
| What other linker options do I need when I link with libcurl? |  | ||||||
|  |  | ||||||
|   curl-config --libs |   curl-config --libs | ||||||
|  |  | ||||||
|  | What compiler options do I need when I compile using libcurl functions? | ||||||
|  |  | ||||||
|  |   curl-config --cflags | ||||||
|  |  | ||||||
| How do I know if libcurl was built with SSL support? | How do I know if libcurl was built with SSL support? | ||||||
|  |  | ||||||
|   curl-config --feature | grep SSL |   curl-config --feature | grep SSL | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -2,7 +2,7 @@ | |||||||
| .\" nroff -man curl.1 | .\" nroff -man curl.1 | ||||||
| .\" Written by Daniel Stenberg | .\" Written by Daniel Stenberg | ||||||
| .\" | .\" | ||||||
| .TH curl 1 "3 Aug 2001" "Curl 7.8" "Curl Manual" | .TH curl 1 "12 Sep 2001" "Curl 7.9" "Curl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or | curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or | ||||||
| HTTPS syntax. | HTTPS syntax. | ||||||
| @@ -91,6 +91,12 @@ also be enforced by using an URL that ends with ";type=A". This option causes | |||||||
| data sent to stdout to be in text mode for win32 systems. | data sent to stdout to be in text mode for win32 systems. | ||||||
|  |  | ||||||
| If this option is used twice, the second one will disable ASCII usage. | If this option is used twice, the second one will disable ASCII usage. | ||||||
|  | .IP "--ciphers <list of ciphers>" | ||||||
|  | (SSL) Specifies which ciphers to use in the connection. The list of ciphers | ||||||
|  | must be using valid ciphers. Read up on SSL cipher list details on this URL: | ||||||
|  | .I http://www.openssl.org/docs/apps/ciphers.html (Option added in curl 7.9) | ||||||
|  |  | ||||||
|  | If this option is used severl times, the last one will override the others. | ||||||
| .IP "--connect-timeout <seconds>" | .IP "--connect-timeout <seconds>" | ||||||
| Maximum time in seconds that you allow the connection to the server to take. | Maximum time in seconds that you allow the connection to the server to take. | ||||||
| This only limits the connection phase, once curl has connected this option is | This only limits the connection phase, once curl has connected this option is | ||||||
| @@ -100,15 +106,16 @@ also the | |||||||
| option. | option. | ||||||
|  |  | ||||||
| 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 "-c/--continue" | .IP "-c/--cookie-jar <file name>" | ||||||
| .B Deprecated. Use '-C -' instead. | Specify to which file you want curl to write all cookies after a completed | ||||||
| Continue/Resume a previous file transfer. This instructs curl to | operation. Curl writes all cookies previously read from a specified file as | ||||||
| continue appending data on the file where it was previously left, | well as all cookies received from remote server(s). If no cookies are known, | ||||||
| possibly because of a broken connection to the server. There must be | no file will be written. The file will be written using the Netscape cookie | ||||||
| a named physical file to append to for this to work. | file format. If you set the file name to a single dash, "-", the cookies will | ||||||
| Note: Upload resume is depening on a command named SIZE not always | be written to stdout. (Option added in curl 7.9) | ||||||
| present in all ftp servers! Upload resume is for FTP only. |  | ||||||
| HTTP resume is only possible with HTTP/1.1 or later servers. | If this option is used several times, the last specfied file name will be | ||||||
|  | used. | ||||||
| .IP "-C/--continue-at <offset>" | .IP "-C/--continue-at <offset>" | ||||||
| Continue/Resume a previous file transfer at the given offset. The | Continue/Resume a previous file transfer at the given offset. The | ||||||
| given offset is the exact number of bytes that will be skipped | given offset is the exact number of bytes that will be skipped | ||||||
| @@ -233,6 +240,11 @@ you can specify URLs that contain the letters {}[] without having them being | |||||||
| interpreted by curl itself. Note that these letters are not normal legal URL | interpreted by curl itself. Note that these letters are not normal legal URL | ||||||
| contents but they should be encoded according to the URI standard. (Option | contents but they should be encoded according to the URI standard. (Option | ||||||
| added in curl 7.6) | added in curl 7.6) | ||||||
|  | .IP "-G/--get" | ||||||
|  | When used, this option will make all data specified with -d/--data or | ||||||
|  | --data-binary to be used in a HTTP GET request instead of the POST request | ||||||
|  | that otherwise would be used. The data will be appended to the URL with a '?' | ||||||
|  | separator. (Option added in curl 7.9) | ||||||
| .IP "-h/--help" | .IP "-h/--help" | ||||||
| Usage help. | Usage help. | ||||||
| .IP "-H/--header <header>" | .IP "-H/--header <header>" | ||||||
| @@ -319,6 +331,8 @@ file in the user's home directory for login name and password. This is | |||||||
| typically used for ftp on unix. If used with http, curl will enable user | typically used for ftp on unix. If used with http, curl will enable user | ||||||
| authentication. See | authentication. See | ||||||
| .BR netrc(4) | .BR netrc(4) | ||||||
|  | or | ||||||
|  | .BR ftp(1) | ||||||
| for details on the file format. Curl will not complain if that file | for details on the file format. Curl will not complain if that file | ||||||
| hasn't the right permissions (it should not be world nor group | hasn't the right permissions (it should not be world nor group | ||||||
| readable). The environment variable "HOME" is used to find the home | readable). The environment variable "HOME" is used to find the home | ||||||
| @@ -447,6 +461,12 @@ FTP range downloads only support the simple syntax 'start-stop' (optionally | |||||||
| with one of the numbers omitted). It depends on the non-RFC command SIZE. | with one of the numbers omitted). It depends on the non-RFC command SIZE. | ||||||
|  |  | ||||||
| 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 "-R/--remote-time" | ||||||
|  | When used, this will make libcurl attempt to figure out the timestamp of the | ||||||
|  | remote file, and if that is available make the local file get that same | ||||||
|  | timestamp. | ||||||
|  |  | ||||||
|  | If this option is used twice, the second time disables this again. | ||||||
| .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. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| .\" nroff -man [file] | .\" nroff -man [file] | ||||||
| .\" $Id$ | .\" $Id$ | ||||||
| .\" | .\" | ||||||
| .TH curl_easy_init 3 "5 March 2001" "libcurl 7.7" "libcurl Manual" | .TH curl_easy_init 3 "14 August 2001" "libcurl 7.8.1" "libcurl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl_easy_init - Start a libcurl session | curl_easy_init - Start a libcurl session | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -17,8 +17,10 @@ intializes curl and this call MUST have a corresponding call to | |||||||
| .I curl_easy_cleanup | .I curl_easy_cleanup | ||||||
| when the operation is complete. | when the operation is complete. | ||||||
|  |  | ||||||
| On win32 systems, you need to init the winsock stuff manually, libcurl will | On win32 systems, if you want to init the winsock stuff manually, libcurl will | ||||||
| not do that for you. WSAStartup() and WSACleanup() should be used accordingly. | not do that for you. WSAStartup() and WSACleanup() should then be called | ||||||
|  | accordingly.  If you want libcurl to handle this, use the CURL_GLOBAL_WIN32 | ||||||
|  | flag in the initial curl_global_init() call. | ||||||
|  |  | ||||||
| Using libcurl 7.7 and later, you should perform all your sequential file | Using libcurl 7.7 and later, you should perform all your sequential file | ||||||
| transfers using the same curl handle. This enables libcurl to use persistant | transfers using the same curl handle. This enables libcurl to use persistant | ||||||
| @@ -27,6 +29,6 @@ connections where possible. | |||||||
| If this function returns NULL, something went wrong and you cannot use the | If this function returns NULL, something went wrong and you cannot use the | ||||||
| other curl functions. | other curl functions. | ||||||
| .SH "SEE ALSO" | .SH "SEE ALSO" | ||||||
| .BR curl_easy_cleanup "(3), " | .BR curl_easy_cleanup "(3), " curl_global_init "(3) | ||||||
| .SH BUGS | .SH BUGS | ||||||
| Surely there are some, you tell me! | Surely there are some, you tell me! | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| .\" nroff -man [file] | .\" nroff -man [file] | ||||||
| .\" $Id$ | .\" $Id$ | ||||||
| .\" | .\" | ||||||
| .TH curl_easy_setopt 3 "1 June 2001" "libcurl 7.8" "libcurl Manual" | .TH curl_easy_setopt 3 "12 Sep 2001" "libcurl 7.9" "libcurl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl_easy_setopt - Set curl easy-session options | curl_easy_setopt - Set curl easy-session options | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -140,7 +140,9 @@ CURLOPT_INFILE and CURLOPT_INFILESIZE are also interesting for uploads. | |||||||
| A non-zero parameter tells the library to do a regular HTTP post. This is a | A non-zero parameter tells the library to do a regular HTTP post. This is a | ||||||
| normal application/x-www-form-urlencoded kind, which is the most commonly used | normal application/x-www-form-urlencoded kind, which is the most commonly used | ||||||
| one by HTML forms. See the CURLOPT_POSTFIELDS option for how to specify the | one by HTML forms. See the CURLOPT_POSTFIELDS option for how to specify the | ||||||
| data to post and CURLOPT_POSTFIELDSIZE in how to set the data size. | data to post and CURLOPT_POSTFIELDSIZE in how to set the data size. Starting | ||||||
|  | with libcurl 7.8, this option is obsolete. Using the CURLOPT_POSTFIELDS option | ||||||
|  | will imply this option. | ||||||
| .TP | .TP | ||||||
| .B CURLOPT_FTPLISTONLY | .B CURLOPT_FTPLISTONLY | ||||||
| A non-zero parameter tells the library to just list the names of an ftp | A non-zero parameter tells the library to just list the names of an ftp | ||||||
| @@ -202,14 +204,17 @@ library. The buffer must be at least CURL_ERROR_SIZE big. | |||||||
| .TP | .TP | ||||||
| .B CURLOPT_TIMEOUT | .B CURLOPT_TIMEOUT | ||||||
| Pass a long as parameter containing the maximum time in seconds that you allow | Pass a long as parameter containing the maximum time in seconds that you allow | ||||||
| the libcurl transfer operation to take. Do note that normally, name lookups | the libcurl transfer operation to take. Normally, name lookups can take a | ||||||
| maky take a considerable time and that limiting the operation to less than a | considerable time and limiting operations to less than a few minutes risk | ||||||
| few minutes risk aborting perfectly normal operations. This option will cause | aborting perfectly normal operations. This option will cause curl to use the | ||||||
| curl to use the SIGALRM to enable timeouting system calls. | SIGALRM to enable timeouting system calls. | ||||||
|  | .B NOTE | ||||||
|  | that this does not work in multi-threaded programs! | ||||||
| .TP | .TP | ||||||
| .B CURLOPT_POSTFIELDS | .B CURLOPT_POSTFIELDS | ||||||
| Pass a char * as parameter, which should be the full data to post in a HTTP | Pass a char * as parameter, which should be the full data to post in a HTTP | ||||||
| post operation. See also the CURLOPT_POST. | post operation. See also the CURLOPT_POST. Since 7.8, using CURLOPT_POSTFIELDS | ||||||
|  | implies CURLOPT_POST. | ||||||
| .TP | .TP | ||||||
| .B CURLOPT_POSTFIELDSIZE | .B CURLOPT_POSTFIELDSIZE | ||||||
| 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() | ||||||
| @@ -273,7 +278,7 @@ instruct what data to pass on to the server.  Pass a pointer to a linked list | |||||||
| of HTTP post structs as parameter.  The linked list should be a fully valid | of HTTP post structs as parameter.  The linked list should be a fully valid | ||||||
| list of 'struct HttpPost' structs properly filled in. The best and most | list of 'struct HttpPost' structs properly filled in. The best and most | ||||||
| elegant way to do this, is to use | elegant way to do this, is to use | ||||||
| .I curl_formparse(3) | .I curl_formadd(3) | ||||||
| as documented. The data in this list must remained intact until you close this | as documented. The data in this list must remained intact until you close this | ||||||
| curl handle again with curl_easy_cleanup(). | curl handle again with curl_easy_cleanup(). | ||||||
| .TP | .TP | ||||||
| @@ -498,6 +503,36 @@ connection timeout (it will then only timeout on the system's internal | |||||||
| timeouts). See also the | timeouts). See also the | ||||||
| .I CURLOPT_TIMEOUT | .I CURLOPT_TIMEOUT | ||||||
| option. | option. | ||||||
|  | .B NOTE | ||||||
|  | that this does not work in multi-threaded programs! | ||||||
|  | .TP | ||||||
|  | .B CURLOPT_HTTPGET | ||||||
|  | Pass a long. If the long is non-zero, this forces the HTTP request to get back | ||||||
|  | to GET. Only really usable if POST, PUT or a custom request have been used | ||||||
|  | previously using the same curl handle. (Added in 7.8.1) | ||||||
|  | .TP | ||||||
|  | .B CURLOPT_SSL_VERIFYHOST | ||||||
|  | Pass a long. Set if we should verify the Common name from the peer certificate | ||||||
|  | in the SSL handshake, set 1 to check existence, 2 to ensure that it matches | ||||||
|  | the provided hostname. (Added in 7.8.1) | ||||||
|  | .TP | ||||||
|  | .B CURLOPT_COOKIEJAR | ||||||
|  | Pass a file name as char *, zero terminated. This will make libcurl dump all | ||||||
|  | internally known cookies to the specified file when curl_easy_cleanup() is | ||||||
|  | called. If no cookies are known, no file will be created. Specify "-" to | ||||||
|  | instead have the cookies written to stdout. | ||||||
|  | .TP | ||||||
|  | .B CURLOPT_SSL_CIPHER_LIST | ||||||
|  | Pass a char *, pointing to a zero terminated string holding the list of | ||||||
|  | ciphers to use for the SSL connection. The list must be syntactly correct, it | ||||||
|  | consists of one or more cipher strings separated by colons. Commas or spaces | ||||||
|  | are also acceptable separators but colons are normally used, \!, \- and \+ can | ||||||
|  | be used as operators. Valid examples of cipher lists include 'RC4-SHA', | ||||||
|  | \'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you | ||||||
|  | compile OpenSSL. | ||||||
|  |  | ||||||
|  | You'll find all details about cipher lists on this URL: | ||||||
|  | .I http://www.openssl.org/docs/apps/ciphers.html | ||||||
| .PP | .PP | ||||||
| .SH RETURN VALUE | .SH RETURN VALUE | ||||||
| 0 means the option was set properly, non-zero means an error as | 0 means the option was set properly, non-zero means an error as | ||||||
|   | |||||||
							
								
								
									
										121
									
								
								docs/curl_formadd.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								docs/curl_formadd.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | |||||||
|  | .\" You can view this file with: | ||||||
|  | .\" nroff -man [file] | ||||||
|  | .\" $Id$ | ||||||
|  | .\" | ||||||
|  | .TH curl_formadd 3 "27 August 2001" "libcurl 7.9" "libcurl Manual" | ||||||
|  | .SH NAME | ||||||
|  | curl_formadd - add a section to a multipart/formdata HTTP POST | ||||||
|  | .SH SYNOPSIS | ||||||
|  | .B #include <curl/curl.h> | ||||||
|  | .sp | ||||||
|  | .BI "CURLcode curl_formadd(struct HttpPost ** " firstitem, | ||||||
|  | .BI "struct HttpPost ** " lastitem, " ...);" | ||||||
|  | .ad | ||||||
|  | .SH DESCRIPTION | ||||||
|  | curl_formadd() is used to append sections when building a multipart/formdata | ||||||
|  | HTTP POST (sometimes refered to as rfc1867-style posts). Append one section at | ||||||
|  | a time until you've added all the sections you want included and then you pass | ||||||
|  | the \fIfirstitem\fP pointer as parameter to \fBCURLOPT_HTTPPOST\fP. | ||||||
|  | \fIlastitem\fP is set after each call and on repeated invokes it should be | ||||||
|  | left as set to allow repeated invokes to find the end of the list in a faster | ||||||
|  | way. | ||||||
|  |  | ||||||
|  | After \fIlastitem\fP follow the real arguments that constitute the | ||||||
|  | new section (if the following description confuses you jump directly | ||||||
|  | to the examples): | ||||||
|  |  | ||||||
|  | CURLFORM_COPYNAME or CURLFORM_PTRNAME followed by a string is used for | ||||||
|  | the name of the section. Optionally one may use CURLFORM_NAMELENGTH to | ||||||
|  | specify the length of the name (allowing null characters within the name). | ||||||
|  |  | ||||||
|  | The three options for providing values are: CURLFORM_COPYCONTENTS, | ||||||
|  | CURLFORM_PTRCONTENTS, or CURLFORM_FILE, followed by a char or void | ||||||
|  | pointer (allowed for PTRCONTENTS). | ||||||
|  |  | ||||||
|  | Other arguments may be CURLFORM_CONTENTTYPE if the | ||||||
|  | user wishes to specify one (for FILE if no type is given the library | ||||||
|  | tries to provide the correct one; for CONTENTS no Content-Type is sent | ||||||
|  | in this case) | ||||||
|  |  | ||||||
|  | For CURLFORM_PTRCONTENTS or CURLFORM_COPYNAME the user may also add | ||||||
|  | CURLFORM_CONTENTSLENGTH followed by the length as a long (if not given | ||||||
|  | the library will use strlen to determine the length). | ||||||
|  |  | ||||||
|  | For CURLFORM_FILE the user may send multiple files in one section by | ||||||
|  | providing multiple CURLFORM_FILE arguments each followed by the filename | ||||||
|  | (and each FILE is allowed to have a CONTENTTYPE). | ||||||
|  |  | ||||||
|  | The last argument always is CURLFORM_END. | ||||||
|  |  | ||||||
|  | The pointers \fI*firstitem\fP and \fI*lastitem\fP should both be pointing to | ||||||
|  | NULL in the first call to this function. All list-data will be allocated by | ||||||
|  | the function itself. You must call \fIcurl_formfree\fP after the form post has | ||||||
|  | been done to free the resources again. | ||||||
|  |  | ||||||
|  | This function will copy all input data except the data pointed to by | ||||||
|  | the arguments after CURLFORM_PTRNAME and CURLFORM_PTRCONTENTS and keep | ||||||
|  | its own version of it allocated until you call \fIcurl_formfree\fP. When | ||||||
|  | you've passed the pointer to \fIcurl_easy_setopt\fP, you must not free | ||||||
|  | the list until after you've called \fIcurl_easy_cleanup\fP for the | ||||||
|  | curl handle. If you provide a pointer as an arguments after | ||||||
|  | CURLFORM_PTRNAME or CURLFORM_PTRCONTENTS you must ensure that the pointer | ||||||
|  | stays valid until you call \fIcurl_form_free\fP and \fIcurl_easy_cleanup\fP. | ||||||
|  |  | ||||||
|  | See example below. | ||||||
|  | .SH RETURN VALUE | ||||||
|  | Returns non-zero if an error occurs. | ||||||
|  | .SH EXAMPLE | ||||||
|  | .nf | ||||||
|  |  | ||||||
|  |  HttpPost* post = NULL; | ||||||
|  |  HttpPost* last = NULL; | ||||||
|  |  char namebuffer[] = "name buffer"; | ||||||
|  |  long namelength = strlen(namebuffer); | ||||||
|  |  char buffer[] = "test buffer"; | ||||||
|  |  char htmlbuffer[] = "<HTML>test buffer</HTML>"; | ||||||
|  |  long htmlbufferlength = strlen(htmlbuffer); | ||||||
|  |  /* add null character into htmlbuffer, to demonstrate that | ||||||
|  |     transfers of buffers containing null characters actually work | ||||||
|  |  */ | ||||||
|  |  htmlbuffer[8] = '\\0'; | ||||||
|  |  | ||||||
|  |  /* Add simple name/content section */ | ||||||
|  |  curl_formadd(&post, &last, CURLFORM_COPYNAME, "name", | ||||||
|  |               CURLFORM_COPYCONTENTS, "content", CURLFORM_END);  | ||||||
|  |  /* Add simple name/content/contenttype section */ | ||||||
|  |  curl_formadd(&post, &last, CURLFORM_COPYNAME, "htmlcode", | ||||||
|  |               CURLFORM_COPYCONTENTS, "<HTML></HTML>", | ||||||
|  |               CURLFORM_CONTENTTYPE, "text/html", CURLFORM_END); | ||||||
|  |  /* Add name/ptrcontent section */ | ||||||
|  |  curl_formadd(&post, &last, CURLFORM_COPYNAME, "name_for_ptrcontent", | ||||||
|  |               CURLFORM_PTRCONTENTS, buffer, CURLFORM_END); | ||||||
|  |  /* Add ptrname/ptrcontent section */ | ||||||
|  |  curl_formadd(&post, &last, CURLFORM_PTRNAME, namebuffer, | ||||||
|  | 	      CURLFORM_PTRCONTENTS, buffer, CURLFORM_NAMELENGTH, | ||||||
|  | 	      namelength, CURLFORM_END); | ||||||
|  |  /* Add name/ptrcontent/contenttype section */ | ||||||
|  |  curl_formadd(&post, &last, CURLFORM_COPYNAME, "html_code_with_hole", | ||||||
|  |               CURLFORM_PTRCONTENTS, htmlbuffer, | ||||||
|  |               CURLFORM_CONTENTSLENGTH, htmlbufferlength, | ||||||
|  |               CURLFORM_CONTENTTYPE, "text/html", CURLFORM_END); | ||||||
|  |  /* Add simple file section */ | ||||||
|  |  curl_formadd(&post, &last, CURLFORM_COPYNAME, "picture", | ||||||
|  |               CURLFORM_FILE, "my-face.jpg", CURLFORM_END); | ||||||
|  |  /* Add file/contenttype section */ | ||||||
|  |  curl_formadd(&post, &last, CURLFORM_COPYNAME, "picture", | ||||||
|  |               CURLFORM_FILE, "my-face.jpg", | ||||||
|  |               CURLFORM_CONTENTTYPE, "image/jpeg", CURLFORM_END); | ||||||
|  |  /* Add two file section */ | ||||||
|  |  curl_formadd(&post, &last, CURLFORM_COPYNAME, "pictures", | ||||||
|  |               CURLFORM_FILE, "my-face.jpg", | ||||||
|  |               CURLFORM_FILE, "your-face.jpg", CURLFORM_END); | ||||||
|  |  /* Set the form info */ | ||||||
|  |  curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); | ||||||
|  |  | ||||||
|  | .SH "SEE ALSO" | ||||||
|  | .BR curl_easy_setopt "(3), " | ||||||
|  | .BR curl_formparse "(3) [deprecated], " | ||||||
|  | .BR curl_formfree "(3) | ||||||
|  | .SH BUGS | ||||||
|  | Surely there are some, you tell me! | ||||||
|  |  | ||||||
| @@ -12,12 +12,14 @@ curl_formfree - free a previously build multipart/formdata HTTP POST chain | |||||||
| .ad | .ad | ||||||
| .SH DESCRIPTION | .SH DESCRIPTION | ||||||
| curl_formfree() is used to clean up data previously built/appended with | curl_formfree() is used to clean up data previously built/appended with | ||||||
| curl_formparse(). This must be called when the data has been used, which | curl_formadd()/curl_formparse(). This must be called when the data has | ||||||
| typically means after the curl_easy_perform() has been called. | been used, which typically means after the curl_easy_perform() has | ||||||
|  | been called. | ||||||
| .SH RETURN VALUE | .SH RETURN VALUE | ||||||
| None | None | ||||||
| .SH "SEE ALSO" | .SH "SEE ALSO" | ||||||
| .BR curl_formparse "(3) " | .BR curl_formparse "(3) [deprecated], " | ||||||
|  | .BR curl_formadd "(3) " | ||||||
| .SH BUGS | .SH BUGS | ||||||
| libcurl 7.7.1 and earlier versions does not allow a NULL pointer to be used as | libcurl 7.7.1 and earlier versions does not allow a NULL pointer to be used as | ||||||
| argument. | argument. | ||||||
|   | |||||||
| @@ -4,7 +4,8 @@ | |||||||
| .\" | .\" | ||||||
| .TH curl_formparse 3 "21 May 2001" "libcurl 7.7.4" "libcurl Manual" | .TH curl_formparse 3 "21 May 2001" "libcurl 7.7.4" "libcurl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl_formparse - add a section to a multipart/formdata HTTP POST | curl_formparse - add a section to a multipart/formdata HTTP POST: | ||||||
|  | deprecated (use curl_formadd instead) | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| .B #include <curl/curl.h> | .B #include <curl/curl.h> | ||||||
| .sp | .sp | ||||||
| @@ -79,6 +80,7 @@ Returns non-zero if an error occurs. | |||||||
|  |  | ||||||
| .SH "SEE ALSO" | .SH "SEE ALSO" | ||||||
| .BR curl_easy_setopt "(3), " | .BR curl_easy_setopt "(3), " | ||||||
|  | .BR curl_formadd "(3), " | ||||||
| .BR curl_formfree "(3) | .BR curl_formfree "(3) | ||||||
| .SH BUGS | .SH BUGS | ||||||
| Surely there are some, you tell me! | Surely there are some, you tell me! | ||||||
|   | |||||||
| @@ -2,13 +2,13 @@ | |||||||
| .\" nroff -man [file] | .\" nroff -man [file] | ||||||
| .\" $Id$ | .\" $Id$ | ||||||
| .\" | .\" | ||||||
| .TH curl_getenv 3 "5 March 2001" "libcurl 7.0" "libcurl Manual" | .TH curl_getenv 3 "15 August 2001" "libcurl 7.8.1" "libcurl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl_getenv - return value for environment name | curl_getenv - return value for environment name | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| .B #include <curl/curl.h> | .B #include <curl/curl.h> | ||||||
| .sp | .sp | ||||||
| .BI "char *curl_getenv(char *" name "); | .BI "char *curl_getenv(const char *" name "); | ||||||
| .ad | .ad | ||||||
| .SH DESCRIPTION | .SH DESCRIPTION | ||||||
| curl_getenv() is a portable wrapper for the getenv() function, meant to | curl_getenv() is a portable wrapper for the getenv() function, meant to | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| .\" nroff -man [file] | .\" nroff -man [file] | ||||||
| .\" $Id$ | .\" $Id$ | ||||||
| .\" | .\" | ||||||
| .TH curl_global_init 3 "31 May 2001" "libcurl 7.8" "libcurl Manual" | .TH curl_global_init 3 "14 August 2001" "libcurl 7.8.1" "libcurl Manual" | ||||||
| .SH NAME | .SH NAME | ||||||
| curl_global_init - Global libcurl initialisation | curl_global_init - Global libcurl initialisation | ||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| @@ -33,7 +33,7 @@ Initialize everything possible. This sets all known bits. | |||||||
| Initialize SSL | Initialize SSL | ||||||
| .TP | .TP | ||||||
| .B CURL_GLOBAL_WIN32 | .B CURL_GLOBAL_WIN32 | ||||||
| Initialize the Win32 socket libraries. | Initialize the Win32 socket libraries. (added in libcurl 7.8.1) | ||||||
| .TP | .TP | ||||||
| .B CURL_GLOBAL_NOTHING | .B CURL_GLOBAL_NOTHING | ||||||
| Initialise nothing extra. This sets no bit. | Initialise nothing extra. This sets no bit. | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ curl_slist_append - add a string to an slist | |||||||
| .SH SYNOPSIS | .SH SYNOPSIS | ||||||
| .B #include <curl/curl.h> | .B #include <curl/curl.h> | ||||||
| .sp | .sp | ||||||
| .BI "struct curl_slist *curl_slist_append(struct curl_slit *" list, | .BI "struct curl_slist *curl_slist_append(struct curl_slist *" list, | ||||||
| .BI "const char * "string ");" | .BI "const char * "string ");" | ||||||
| .ad | .ad | ||||||
| .SH DESCRIPTION | .SH DESCRIPTION | ||||||
|   | |||||||
| @@ -4,9 +4,9 @@ | |||||||
|  |  | ||||||
| AUTOMAKE_OPTIONS = foreign no-dependencies | AUTOMAKE_OPTIONS = foreign no-dependencies | ||||||
|  |  | ||||||
| EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit.c \ | EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit.c postit2.c \ | ||||||
| 	     win32sockets.c persistant.c ftpget.c Makefile.example \ | 	     win32sockets.c persistant.c ftpget.c Makefile.example \ | ||||||
| 	     multithread.c getinmemory.c | 	     multithread.c getinmemory.c ftpupload.c | ||||||
|  |  | ||||||
| all: | all: | ||||||
| 	@echo "done" | 	@echo "done" | ||||||
|   | |||||||
							
								
								
									
										88
									
								
								docs/examples/ftpupload.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								docs/examples/ftpupload.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _      | ||||||
|  |  *  Project                     ___| | | |  _ \| |     | ||||||
|  |  *                             / __| | | | |_) | |     | ||||||
|  |  *                            | (__| |_| |  _ <| |___  | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | #include <curl/curl.h> | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * This example shows an FTP upload, with a rename of the file just after | ||||||
|  |  * a successful upload. | ||||||
|  |  * | ||||||
|  |  * Example based on source code provided by Erick Nuwendam. Thanks! | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define LOCAL_FILE      "/tmp/uploadthis.txt" | ||||||
|  | #define UPLOAD_FILE_AS  "while-uploading.txt" | ||||||
|  | #define REMOTE_URL      "ftp://localhost/"  UPLOAD_FILE_AS | ||||||
|  | #define RENAME_FILE_TO  "renamed-and-fine.txt" | ||||||
|  |  | ||||||
|  | int main(int argc, char **argv) | ||||||
|  | { | ||||||
|  |   CURL *curl; | ||||||
|  |   CURLcode res; | ||||||
|  |   FILE *ftpfile; | ||||||
|  |   FILE * hd_src ; | ||||||
|  |   int hd ; | ||||||
|  |   struct stat file_info; | ||||||
|  |  | ||||||
|  |   struct curl_slist *headerlist=NULL; | ||||||
|  |   char buf_1 [] = "RNFR " UPLOAD_FILE_AS; | ||||||
|  |   char buf_2 [] = "RNTO " RENAME_FILE_TO; | ||||||
|  |  | ||||||
|  |   /* get the file size of the local file */ | ||||||
|  |   hd = open(LOCAL_FILE, O_RDONLY) ; | ||||||
|  |   fstat(hd, &file_info); | ||||||
|  |   close(hd) ; | ||||||
|  |  | ||||||
|  |   /* get a FILE * of the same file, could also be made with | ||||||
|  |      fdopen() from the previous descriptor, but hey this is just  | ||||||
|  |      an example! */ | ||||||
|  |   hd_src = fopen(LOCAL_FILE, "rb"); | ||||||
|  |  | ||||||
|  |   /* In windows, this will init the winsock stuff */ | ||||||
|  |   curl_global_init(CURL_GLOBAL_ALL); | ||||||
|  |  | ||||||
|  |   /* get a curl handle */ | ||||||
|  |   curl = curl_easy_init(); | ||||||
|  |   if(curl) { | ||||||
|  |     /* build a list of commands to pass to libcurl */ | ||||||
|  |     headerlist = curl_slist_append(headerlist, buf_1); | ||||||
|  |     headerlist = curl_slist_append(headerlist, buf_2); | ||||||
|  |  | ||||||
|  |     /* enable uploading */ | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ; | ||||||
|  |  | ||||||
|  |     /* specify target */ | ||||||
|  |     curl_easy_setopt(curl,CURLOPT_URL, REMOTE_URL); | ||||||
|  |  | ||||||
|  |     /* pass in that last of FTP commands to run after the transfer */ | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist); | ||||||
|  |  | ||||||
|  |     /* now specify which file to upload */ | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_INFILE, hd_src); | ||||||
|  |  | ||||||
|  |     /* and give the size of the upload (optional) */ | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_INFILESIZE, file_info.st_size); | ||||||
|  |  | ||||||
|  |     /* Now run off and do what you've been told! */ | ||||||
|  |     res = curl_easy_perform(curl); | ||||||
|  |  | ||||||
|  |     /* clean up the FTP commands list */ | ||||||
|  |     curl_slist_free_all (headerlist); | ||||||
|  |  | ||||||
|  |     /* always cleanup */ | ||||||
|  |     curl_easy_cleanup(curl); | ||||||
|  |   } | ||||||
|  |   fclose(hd_src); /* close the local file */ | ||||||
|  |  | ||||||
|  |   curl_global_cleanup(); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
							
								
								
									
										92
									
								
								docs/examples/postit2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								docs/examples/postit2.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _      | ||||||
|  |  *  Project                     ___| | | |  _ \| |     | ||||||
|  |  *                             / __| | | | |_) | |     | ||||||
|  |  *                            | (__| |_| |  _ <| |___  | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  * | ||||||
|  |  * Example code that uploads a file name 'foo' to a remote script that accepts | ||||||
|  |  * "HTML form based" (as described in RFC1738) uploads using HTTP POST. | ||||||
|  |  * | ||||||
|  |  * The imaginary form we'll fill in looks like: | ||||||
|  |  * | ||||||
|  |  * <form method="post" enctype="multipart/form-data" action="examplepost.cgi"> | ||||||
|  |  * Enter file: <input type="file" name="sendfile" size="40"> | ||||||
|  |  * Enter file name: <input type="text" name="filename" size="30"> | ||||||
|  |  * <input type="submit" value="send" name="submit"> | ||||||
|  |  * </form> | ||||||
|  |  * | ||||||
|  |  * This exact source code has not been verified to work. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /* to make this work under windows, use the win32-functions from the | ||||||
|  |    win32socket.c file as well */ | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
|  | #include <curl/curl.h> | ||||||
|  | #include <curl/types.h> | ||||||
|  | #include <curl/easy.h> | ||||||
|  |  | ||||||
|  | #if LIBCURL_VERSION_NUM < 0x070900 | ||||||
|  | #error "curl_formadd() is not introduced until libcurl 7.9 and later" | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | int main(int argc, char *argv[]) | ||||||
|  | { | ||||||
|  |   CURL *curl; | ||||||
|  |   CURLcode res; | ||||||
|  |  | ||||||
|  |   struct HttpPost *formpost=NULL; | ||||||
|  |   struct HttpPost *lastptr=NULL; | ||||||
|  |   struct curl_slist *headerlist=NULL; | ||||||
|  |   char buf[] = "Expect:"; | ||||||
|  |  | ||||||
|  |   /* Fill in the file upload field */ | ||||||
|  |   curl_formadd(&formpost, | ||||||
|  |                &lastptr, | ||||||
|  |                CURLFORM_COPYNAME, "sendfile", | ||||||
|  |                CURLFORM_FILE, "postit2.c", | ||||||
|  |                CURLFORM_END); | ||||||
|  |  | ||||||
|  |   /* Fill in the filename field */ | ||||||
|  |   curl_formadd(&formpost, | ||||||
|  |                &lastptr, | ||||||
|  |                CURLFORM_COPYNAME, "filename", | ||||||
|  |                CURLFORM_COPYCONTENTS, "postit2.c", | ||||||
|  |                CURLFORM_END); | ||||||
|  |    | ||||||
|  |  | ||||||
|  |   /* Fill in the submit field too, even if this is rarely needed */ | ||||||
|  |   curl_formadd(&formpost, | ||||||
|  |                &lastptr, | ||||||
|  |                CURLFORM_COPYNAME, "submit", | ||||||
|  |                CURLFORM_COPYCONTENTS, "send", | ||||||
|  |                CURLFORM_END); | ||||||
|  |  | ||||||
|  |   curl = curl_easy_init(); | ||||||
|  |   /* initalize custom header list (stating that Expect: 100-continue is not | ||||||
|  |      wanted */ | ||||||
|  |   headerlist = curl_slist_append(headerlist, buf); | ||||||
|  |   if(curl) { | ||||||
|  |     /* what URL that receives this POST */ | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_URL, "http://curl.haxx.se/examplepost.cgi"); | ||||||
|  |     if ( (argc == 2) && (!strcmp(argv[1], "noexpectheader")) ) | ||||||
|  |       /* only disable 100-continue header if explicitly requested */ | ||||||
|  |       curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); | ||||||
|  |     curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); | ||||||
|  |     res = curl_easy_perform(curl); | ||||||
|  |  | ||||||
|  |     /* always cleanup */ | ||||||
|  |     curl_easy_cleanup(curl); | ||||||
|  |  | ||||||
|  |     /* then cleanup the formpost chain */ | ||||||
|  |     curl_formfree(formpost); | ||||||
|  |     /* free slist */ | ||||||
|  |     curl_slist_free_all (headerlist); | ||||||
|  |   } | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
| @@ -2,7 +2,7 @@ | |||||||
| .\" nroff -man [file] | .\" nroff -man [file] | ||||||
| .\" $Id$ | .\" $Id$ | ||||||
| .\" | .\" | ||||||
| .TH libcurl 5 "28 May 2001" "libcurl 7.8" "libcurl overview" | .TH libcurl 5 "14 August 2001" "libcurl 7.8.1" "libcurl overview" | ||||||
| .SH NAME | .SH NAME | ||||||
| libcurl \- client-side URL transfers | libcurl \- client-side URL transfers | ||||||
| .SH DESCRIPTION | .SH DESCRIPTION | ||||||
| @@ -53,11 +53,14 @@ portable environment variable reader | |||||||
| .B curl_easy_getinfo() | .B curl_easy_getinfo() | ||||||
| get information about a performed transfer | get information about a performed transfer | ||||||
| .TP | .TP | ||||||
| .B curl_formparse() | .B curl_formadd() | ||||||
| helps building a HTTP form POST | helps building a HTTP form POST | ||||||
| .TP | .TP | ||||||
|  | .B curl_formparse() | ||||||
|  | helps building a HTTP form POST (deprecated since 7.9 use curl_formadd()!) | ||||||
|  | .TP | ||||||
| .B curl_formfree() | .B curl_formfree() | ||||||
| free a list built with curl_formparse() | free a list built with curl_formparse()/curl_formadd() | ||||||
| .TP | .TP | ||||||
| .B curl_slist_append() | .B curl_slist_append() | ||||||
| builds a linked list | builds a linked list | ||||||
| @@ -101,7 +104,7 @@ you to init the winsock stuff before you use the libcurl functions. Details on | |||||||
| this are noted on the curl_easy_init() man page. | this are noted on the curl_easy_init() man page. | ||||||
|  |  | ||||||
| (*) = it appears as if users of the cygwin environment get this done | (*) = it appears as if users of the cygwin environment get this done | ||||||
| automatically. | automatically, also libcurl 7.8.1 and later can handle this for you. | ||||||
| .SH "THREADS" | .SH "THREADS" | ||||||
| Never ever call curl-functions simultaneously using the same handle from | Never ever call curl-functions simultaneously using the same handle from | ||||||
| several threads. libcurl is thread-safe and can be used in any number of | several threads. libcurl is thread-safe and can be used in any number of | ||||||
|   | |||||||
| @@ -58,13 +58,19 @@ extern "C" { | |||||||
| struct HttpPost { | struct HttpPost { | ||||||
|   struct HttpPost *next; /* next entry in the list */ |   struct HttpPost *next; /* next entry in the list */ | ||||||
|   char *name;     /* pointer to allocated name */ |   char *name;     /* pointer to allocated name */ | ||||||
|  |   long namelength; /* length of name length */ | ||||||
|   char *contents; /* pointer to allocated data contents */ |   char *contents; /* pointer to allocated data contents */ | ||||||
|  |   long contentslength; /* length of contents field */ | ||||||
|   char *contenttype; /* Content-Type */ |   char *contenttype; /* Content-Type */ | ||||||
|   struct HttpPost *more; /* if one field name has more than one file, this |   struct HttpPost *more; /* if one field name has more than one file, this | ||||||
| 			    link should link to following files */ | 			    link should link to following files */ | ||||||
|   long flags;     /* as defined below */ |   long flags;     /* as defined below */ | ||||||
| #define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */ | #define HTTPPOST_FILENAME (1<<0) /* specified content is a file name */ | ||||||
| #define HTTPPOST_READFILE (1<<1) /* specified content is a file name */ | #define HTTPPOST_READFILE (1<<1) /* specified content is a file name */ | ||||||
|  | #define HTTPPOST_PTRNAME (1<<2) /* name is only stored pointer | ||||||
|  |                                    do not free in formfree */ | ||||||
|  | #define HTTPPOST_PTRCONTENTS (1<<3) /* contents is only stored pointer | ||||||
|  |                                        do not free in formfree */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| typedef int (*curl_progress_callback)(void *clientp, | typedef int (*curl_progress_callback)(void *clientp, | ||||||
| @@ -84,7 +90,7 @@ typedef size_t (*curl_read_callback)(char *buffer, | |||||||
|                                      void *instream); |                                      void *instream); | ||||||
|  |  | ||||||
| typedef int (*curl_passwd_callback)(void *clientp, | typedef int (*curl_passwd_callback)(void *clientp, | ||||||
|                                     char *prompt, |                                     const char *prompt, | ||||||
|                                     char *buffer, |                                     char *buffer, | ||||||
|                                     int buflen); |                                     int buflen); | ||||||
|  |  | ||||||
| @@ -286,11 +292,6 @@ typedef enum { | |||||||
|      is simply passed to the callback unmodified */ |      is simply passed to the callback unmodified */ | ||||||
|   CINIT(WRITEHEADER, OBJECTPOINT, 29), |   CINIT(WRITEHEADER, OBJECTPOINT, 29), | ||||||
|  |  | ||||||
| #ifdef MULTIDOC |  | ||||||
|   /* send linked list of MoreDoc structs */ |  | ||||||
|   CINIT(MOREDOCS, OBJECTPOINT, 30), |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   /* point to a file to read the initial cookies from, also enables |   /* point to a file to read the initial cookies from, also enables | ||||||
|      "cookie awareness" */ |      "cookie awareness" */ | ||||||
|   CINIT(COOKIEFILE, OBJECTPOINT, 31), |   CINIT(COOKIEFILE, OBJECTPOINT, 31), | ||||||
| @@ -448,6 +449,18 @@ typedef enum { | |||||||
|    */ |    */ | ||||||
|   CINIT(HTTPGET, LONG, 80), |   CINIT(HTTPGET, LONG, 80), | ||||||
|  |  | ||||||
|  |   /* Set if we should verify the Common name from the peer certificate in ssl | ||||||
|  |    * handshake, set 1 to check existence, 2 to ensure that it matches the | ||||||
|  |    * provided hostname. */ | ||||||
|  |   CINIT(SSL_VERIFYHOST, LONG, 81), | ||||||
|  |  | ||||||
|  |   /* Specify which file name to write all known cookies in after completed | ||||||
|  |      operation. Set file name to "-" (dash) to make it go to stdout. */ | ||||||
|  |   CINIT(COOKIEJAR, OBJECTPOINT, 82), | ||||||
|  |  | ||||||
|  |   /* Specify which SSL ciphers to use */ | ||||||
|  |   CINIT(SSL_CIPHER_LIST, OBJECTPOINT, 83), | ||||||
|  |    | ||||||
|   CURLOPT_LASTENTRY /* the last unusued */ |   CURLOPT_LASTENTRY /* the last unusued */ | ||||||
| } CURLoption; | } CURLoption; | ||||||
|  |  | ||||||
| @@ -483,20 +496,48 @@ int curl_formparse(char *string, | |||||||
|                    struct HttpPost **httppost, |                    struct HttpPost **httppost, | ||||||
|                    struct HttpPost **last_post); |                    struct HttpPost **last_post); | ||||||
|  |  | ||||||
|  | /* name is uppercase CURLFORM_<name> */ | ||||||
|  | #ifdef CFINIT | ||||||
|  | #undef CFINIT | ||||||
|  | #endif | ||||||
|  | #define CFINIT(name) CURLFORM_ ## name | ||||||
|  |  | ||||||
|  | typedef enum { | ||||||
|  |   CFINIT(NOTHING),        /********* the first one is unused ************/ | ||||||
|  |    | ||||||
|  |   /*  */ | ||||||
|  |   CFINIT(COPYNAME), | ||||||
|  |   CFINIT(PTRNAME), | ||||||
|  |   CFINIT(NAMELENGTH), | ||||||
|  |   CFINIT(COPYCONTENTS), | ||||||
|  |   CFINIT(PTRCONTENTS), | ||||||
|  |   CFINIT(CONTENTSLENGTH), | ||||||
|  |   CFINIT(FILE), | ||||||
|  |   CFINIT(CONTENTTYPE), | ||||||
|  |   CFINIT(END), | ||||||
|  |  | ||||||
|  |   CURLFORM_LASTENTRY /* the last unusued */ | ||||||
|  | } CURLformoption; | ||||||
|  |  | ||||||
|  | /* new external form function */ | ||||||
|  | int curl_formadd(struct HttpPost **httppost, | ||||||
|  |                  struct HttpPost **last_post, | ||||||
|  |                  ...); | ||||||
|  |  | ||||||
| /* cleanup a form: */ | /* cleanup a form: */ | ||||||
| void curl_formfree(struct HttpPost *form); | void curl_formfree(struct HttpPost *form); | ||||||
|  |  | ||||||
| /* Unix and Win32 getenv function call, this returns a malloc()'ed string that | /* Unix and Win32 getenv function call, this returns a malloc()'ed string that | ||||||
|    MUST be free()ed after usage is complete. */ |    MUST be free()ed after usage is complete. */ | ||||||
| char *curl_getenv(char *variable); | 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); | char *curl_version(void); | ||||||
|  |  | ||||||
| /* Escape and unescape URL encoding in strings. The functions return a new | /* Escape and unescape URL encoding in strings. The functions return a new | ||||||
|  * allocated string or NULL if an error occurred.  */ |  * allocated string or NULL if an error occurred.  */ | ||||||
| char *curl_escape(char *string, int length); | char *curl_escape(const char *string, int length); | ||||||
| char *curl_unescape(char *string, int length); | char *curl_unescape(const char *string, int length); | ||||||
|  |  | ||||||
| /* 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 */ | ||||||
| @@ -506,11 +547,9 @@ CURLcode curl_global_init(long flags); | |||||||
|    that uses libcurl */ |    that uses libcurl */ | ||||||
| void curl_global_cleanup(void); | void curl_global_cleanup(void); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* This is the version number */ | /* This is the version number */ | ||||||
| #define LIBCURL_VERSION "7.8.1-pre3" | #define LIBCURL_VERSION "7.8.2-pre1" | ||||||
| #define LIBCURL_VERSION_NUM 0x070801 | #define LIBCURL_VERSION_NUM 0x070802 | ||||||
|  |  | ||||||
| /* 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 { | ||||||
|   | |||||||
| @@ -54,6 +54,7 @@ | |||||||
| #define H_MPRINTF | #define H_MPRINTF | ||||||
|  |  | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
|  | #include <stdio.h> /* needed for FILE */ | ||||||
|  |  | ||||||
| int curl_mprintf(const char *format, ...); | int curl_mprintf(const char *format, ...); | ||||||
| int curl_mfprintf(FILE *fd, const char *format, ...); | int curl_mfprintf(FILE *fd, const char *format, ...); | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								java/MANIFEST
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								java/MANIFEST
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | CurlGlue.java | ||||||
|  | CurlWrite.java | ||||||
|  | define2java.pl | ||||||
|  | javacurl.c | ||||||
|  | Makefile | ||||||
|  | README | ||||||
|  | test.java | ||||||
|  | MANIFEST | ||||||
| @@ -13,3 +13,5 @@ stuff supported. | |||||||
|  The interface is not set yet, bring your suggestions! |  The interface is not set yet, bring your suggestions! | ||||||
|  |  | ||||||
|  Feel free to grab the source files in here and help out! |  Feel free to grab the source files in here and help out! | ||||||
|  |  | ||||||
|  |  The 'test.java' is the actual program that uses the curl stuff. | ||||||
|   | |||||||
| @@ -1,3 +1,25 @@ | |||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _      | ||||||
|  |  *  Project                     ___| | | |  _ \| |     | ||||||
|  |  *                             / __| | | | |_) | |     | ||||||
|  |  *                            | (__| |_| |  _ <| |___  | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
|  |  * | ||||||
|  |  * In order to be useful for every potential user, curl and libcurl are | ||||||
|  |  * dual-licensed under the MPL and the MIT/X-derivate licenses. | ||||||
|  |  * | ||||||
|  |  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||||
|  |  * copies of the Software, and permit persons to whom the Software is | ||||||
|  |  * furnished to do so, under the terms of the MPL or the MIT/X-derivate | ||||||
|  |  * licenses. You may pick one of these licenses. | ||||||
|  |  * | ||||||
|  |  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||||
|  |  * KIND, either express or implied. | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  *****************************************************************************/ | ||||||
|  |  | ||||||
| #include <curl/curl.h> /* libcurl header */ | #include <curl/curl.h> /* libcurl header */ | ||||||
| #include "CurlGlue.h"  /* the JNI-generated glue header file */ | #include "CurlGlue.h"  /* the JNI-generated glue header file */ | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| # $Id$ | # $Id$ | ||||||
| # | # | ||||||
|  |  | ||||||
| AUTOMAKE_OPTIONS = foreign | AUTOMAKE_OPTIONS = foreign no-dependencies | ||||||
|  |  | ||||||
| EXTRA_DIST = getdate.y \ | EXTRA_DIST = getdate.y \ | ||||||
|        Makefile.b32 Makefile.b32.resp Makefile.m32 Makefile.vc6 \ |        Makefile.b32 Makefile.b32.resp Makefile.m32 Makefile.vc6 \ | ||||||
| @@ -16,7 +16,7 @@ lib_LTLIBRARIES = libcurl.la | |||||||
| INCLUDES = -I$(top_srcdir)/include | INCLUDES = -I$(top_srcdir)/include | ||||||
|  |  | ||||||
|  |  | ||||||
| libcurl_la_LDFLAGS = -version-info 2:1:0 | libcurl_la_LDFLAGS = -version-info 2:2:0 | ||||||
| # This flag accepts an argument of the form current[:revision[:age]]. So, | # This flag accepts an argument of the form current[:revision[:age]]. So, | ||||||
| # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to | # passing -version-info 3:12:1 sets current to 3, revision to 12, and age to | ||||||
| # 1. | # 1. | ||||||
| @@ -57,7 +57,7 @@ getdate.h      ldap.c         ssluse.c       version.c \ | |||||||
| getenv.c       ldap.h         ssluse.h       \ | getenv.c       ldap.h         ssluse.h       \ | ||||||
| escape.c       mprintf.c      telnet.c       \ | escape.c       mprintf.c      telnet.c       \ | ||||||
| escape.h       getpass.c      netrc.c        telnet.h       \ | escape.h       getpass.c      netrc.c        telnet.h       \ | ||||||
| getinfo.c transfer.c strequal.c strequal.h easy.c \ | getinfo.c getinfo.h transfer.c strequal.c strequal.h easy.c \ | ||||||
| security.h security.c krb4.c krb4.h memdebug.c memdebug.h inet_ntoa_r.h \ | security.h security.c krb4.c krb4.h memdebug.c memdebug.h inet_ntoa_r.h \ | ||||||
| http_chunks.c http_chunks.h strtok.c strtok.h | http_chunks.c http_chunks.h strtok.c strtok.h | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,6 @@ | |||||||
| ############################################################ | ############################################################ | ||||||
|  | # $Id$ | ||||||
|  | # | ||||||
| #  Makefile.b32 - Borland's C++ Compiler 5.X | #  Makefile.b32 - Borland's C++ Compiler 5.X | ||||||
| # | # | ||||||
| #  'lib' directory | #  'lib' directory | ||||||
|   | |||||||
| @@ -26,4 +26,6 @@ | |||||||
| +getinfo.obj & | +getinfo.obj & | ||||||
| +version.obj & | +version.obj & | ||||||
| +easy.obj & | +easy.obj & | ||||||
| +strequal.obj | +strequal.obj & | ||||||
|  | +strtok.obj | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,6 @@ | |||||||
| ############################################################# | ############################################################# | ||||||
|  | # $Id$ | ||||||
|  | # | ||||||
| ## Makefile for building libcurl.a with MingW32 (GCC-2.95) and | ## Makefile for building libcurl.a with MingW32 (GCC-2.95) and | ||||||
| ## optionally OpenSSL (0.9.6) | ## optionally OpenSSL (0.9.6) | ||||||
| ## Use: make -f Makefile.m32 | ## Use: make -f Makefile.m32 | ||||||
|   | |||||||
| @@ -1,15 +1,16 @@ | |||||||
| ############################################################# | ############################################################# | ||||||
|  | # | ||||||
| ## Makefile for building libcurl.lib with MSVC6 | ## Makefile for building libcurl.lib with MSVC6 | ||||||
| ## Use: nmake -f makefile.vc6 [release | release-ssl | debug] | ## Use: nmake -f makefile.vc6 [release | release-ssl | debug] | ||||||
| ##      (default is release) | ##      (default is release) | ||||||
| ## | ## | ||||||
| ## Comments to: Troy Engel <tengel@sonic.net> | ## Originally written by: Troy Engel <tengel@sonic.net> | ||||||
| ## Updated by: Craig Davison <cd@securityfocus.com> | ## Updated by: Craig Davison <cd@securityfocus.com> | ||||||
| ## Updated by: SM <sm@technologist.com> | ## Updated by: SM <sm@technologist.com> | ||||||
|  |  | ||||||
| PROGRAM_NAME = libcurl.lib | PROGRAM_NAME = libcurl.lib | ||||||
| PROGRAM_NAME_DEBUG = libcurld.lib | PROGRAM_NAME_DEBUG = libcurld.lib | ||||||
| #OPENSSL_PATH = ../../openssl-0.9.6a | #OPENSSL_PATH = ../../openssl-0.9.6b | ||||||
|  |  | ||||||
| ######################################################## | ######################################################## | ||||||
| ## Nothing more to do below this line! | ## Nothing more to do below this line! | ||||||
| @@ -125,7 +126,7 @@ RELEASE_SSL_OBJS= \ | |||||||
| 	versionrs.obj \ | 	versionrs.obj \ | ||||||
| 	easyrs.obj \ | 	easyrs.obj \ | ||||||
| 	strequalrs.obj \ | 	strequalrs.obj \ | ||||||
| 	strtokd.obj | 	strtokrs.obj | ||||||
|  |  | ||||||
| LINK_OBJS= \ | LINK_OBJS= \ | ||||||
| 	base64.obj \ | 	base64.obj \ | ||||||
| @@ -292,7 +293,7 @@ easyd.obj: easy.c | |||||||
| strequald.obj: strequal.c | strequald.obj: strequal.c | ||||||
| 	$(CCD) $(CFLAGS) strequal.c | 	$(CCD) $(CFLAGS) strequal.c | ||||||
| strtokd.obj:strtok.c | strtokd.obj:strtok.c | ||||||
| 	$(CCR) $(CFLAGS) strtok.c | 	$(CCD) $(CFLAGS) strtok.c | ||||||
|  |  | ||||||
| ## Release SSL | ## Release SSL | ||||||
| base64rs.obj: base64.c | base64rs.obj: base64.c | ||||||
| @@ -308,7 +309,7 @@ formdatars.obj: formdata.c | |||||||
| ftprs.obj: ftp.c | ftprs.obj: ftp.c | ||||||
| 	$(CCRS) $(CFLAGS) ftp.c | 	$(CCRS) $(CFLAGS) ftp.c | ||||||
| httprs.obj: http.c | httprs.obj: http.c | ||||||
| 	$(CCR) $(CFLAGS) http.c | 	$(CCRS) $(CFLAGS) http.c | ||||||
| http_chunksrs.obj: http_chunks.c | http_chunksrs.obj: http_chunks.c | ||||||
| 	$(CCRS) $(CFLAGS) http_chunks.c | 	$(CCRS) $(CFLAGS) http_chunks.c | ||||||
| ldaprs.obj: ldap.c | ldaprs.obj: ldap.c | ||||||
| @@ -354,7 +355,7 @@ easyrs.obj: easy.c | |||||||
| strequalrs.obj: strequal.c | strequalrs.obj: strequal.c | ||||||
| 	$(CCRS) $(CFLAGS) strequal.c | 	$(CCRS) $(CFLAGS) strequal.c | ||||||
| strtokrs.obj:strtok.c | strtokrs.obj:strtok.c | ||||||
| 	$(CCR) $(CFLAGS) strtok.c | 	$(CCRS) $(CFLAGS) strtok.c | ||||||
|  |  | ||||||
|  |  | ||||||
| clean: | clean: | ||||||
|   | |||||||
| @@ -39,7 +39,7 @@ | |||||||
| /* | /* | ||||||
|  * The telnet options represented as strings |  * The telnet options represented as strings | ||||||
|  */ |  */ | ||||||
| static char *telnetoptions[]= | static const char *telnetoptions[]= | ||||||
| { | { | ||||||
|   "BINARY",      "ECHO",           "RCP",           "SUPPRESS GO AHEAD", |   "BINARY",      "ECHO",           "RCP",           "SUPPRESS GO AHEAD", | ||||||
|   "NAME",        "STATUS"          "TIMING MARK",   "RCTE", |   "NAME",        "STATUS"          "TIMING MARK",   "RCTE", | ||||||
| @@ -78,7 +78,7 @@ static char *telnetoptions[]= | |||||||
| /* | /* | ||||||
|  * Then those numbers represented as strings: |  * Then those numbers represented as strings: | ||||||
|  */ |  */ | ||||||
| static char *telnetcmds[]= | static const char *telnetcmds[]= | ||||||
| { | { | ||||||
|   "EOF",  "SUSP",  "ABORT", "EOR",  "SE", |   "EOF",  "SUSP",  "ABORT", "EOR",  "SE", | ||||||
|   "NOP",  "DMARK", "BRK",   "IP",   "AO", |   "NOP",  "DMARK", "BRK",   "IP",   "AO", | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								lib/base64.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								lib/base64.c
									
									
									
									
									
								
							| @@ -32,11 +32,14 @@ | |||||||
|  * This code will break if int is smaller than 32 bits |  * This code will break if int is smaller than 32 bits | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifdef HAVE_CONFIG_H | #include "setup.h" | ||||||
| #include <config.h> |  | ||||||
| #endif |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  |  | ||||||
|  | #define _MPRINTF_REPLACE /* use our functions only */ | ||||||
|  | #include <curl/mprintf.h> | ||||||
|  |  | ||||||
| #include "base64.h" | #include "base64.h" | ||||||
|  |  | ||||||
| #ifdef MALLOCDEBUG | #ifdef MALLOCDEBUG | ||||||
| @@ -257,3 +260,11 @@ void *suck(int *lenptr) { | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										193
									
								
								lib/cookie.c
									
									
									
									
									
								
							
							
						
						
									
										193
									
								
								lib/cookie.c
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | |||||||
|  *                            | (__| |_| |  _ <| |___  |  *                            | (__| |_| |  _ <| |___  | ||||||
|  *                             \___|\___/|_| \_\_____| |  *                             \___|\___/|_| \_\_____| | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
|  * |  * | ||||||
|  * In order to be useful for every potential user, curl and libcurl are |  * In order to be useful for every potential user, curl and libcurl are | ||||||
|  * dual-licensed under the MPL and the MIT/X-derivate licenses. |  * dual-licensed under the MPL and the MIT/X-derivate licenses. | ||||||
| @@ -95,7 +95,7 @@ Example set of cookies: | |||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * |  * | ||||||
|  * cookie_add() |  * Curl_cookie_add() | ||||||
|  * |  * | ||||||
|  * Add a single cookie line to the cookie keeping object. |  * Add a single cookie line to the cookie keeping object. | ||||||
|  * |  * | ||||||
| @@ -112,6 +112,7 @@ Curl_cookie_add(struct CookieInfo *c, | |||||||
|   char *ptr; |   char *ptr; | ||||||
|   char *semiptr; |   char *semiptr; | ||||||
|   struct Cookie *co; |   struct Cookie *co; | ||||||
|  |   struct Cookie *lastc=NULL; | ||||||
|   time_t now = time(NULL); |   time_t now = time(NULL); | ||||||
|   bool replace_old = FALSE; |   bool replace_old = FALSE; | ||||||
|  |  | ||||||
| @@ -129,13 +130,11 @@ Curl_cookie_add(struct CookieInfo *c, | |||||||
|     semiptr=strchr(lineptr, ';'); /* first, find a semicolon */ |     semiptr=strchr(lineptr, ';'); /* first, find a semicolon */ | ||||||
|     ptr = lineptr; |     ptr = lineptr; | ||||||
|     do { |     do { | ||||||
|       if(semiptr) |  | ||||||
|         *semiptr='\0'; /* zero terminate for a while */ |  | ||||||
|       /* we have a <what>=<this> pair or a 'secure' word here */ |       /* we have a <what>=<this> pair or a 'secure' word here */ | ||||||
|       if(strchr(ptr, '=')) { |       if(strchr(ptr, '=')) { | ||||||
|         name[0]=what[0]=0; /* init the buffers */ |         name[0]=what[0]=0; /* init the buffers */ | ||||||
|         if(1 <= sscanf(ptr, "%" MAX_NAME_TXT "[^=]=%" |         if(1 <= sscanf(ptr, "%" MAX_NAME_TXT "[^=]=%" | ||||||
|                        MAX_COOKIE_LINE_TXT "[^\r\n]", |                        MAX_COOKIE_LINE_TXT "[^;\r\n]", | ||||||
|                        name, what)) { |                        name, what)) { | ||||||
|           /* this is a legal <what>=<this> pair */ |           /* this is a legal <what>=<this> pair */ | ||||||
|           if(strequal("path", name)) { |           if(strequal("path", name)) { | ||||||
| @@ -169,8 +168,8 @@ Curl_cookie_add(struct CookieInfo *c, | |||||||
|             co->name = strdup(name); |             co->name = strdup(name); | ||||||
|             co->value = strdup(what); |             co->value = strdup(what); | ||||||
|           } |           } | ||||||
|           else |           /* | ||||||
|             ;/* this is the second (or more) name we don't know |             else this is the second (or more) name we don't know | ||||||
|             about! */ |             about! */ | ||||||
|         } |         } | ||||||
|         else { |         else { | ||||||
| @@ -178,18 +177,18 @@ Curl_cookie_add(struct CookieInfo *c, | |||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       else { |       else { | ||||||
|         if(sscanf(ptr, "%" MAX_COOKIE_LINE_TXT "[^\r\n]", |         if(sscanf(ptr, "%" MAX_COOKIE_LINE_TXT "[^;\r\n]", | ||||||
|                   what)) { |                   what)) { | ||||||
|           if(strequal("secure", what)) |           if(strequal("secure", what)) | ||||||
|             co->secure = TRUE; |             co->secure = TRUE; | ||||||
|           else |           /* else, | ||||||
|             ; /* unsupported keyword without assign! */ |              unsupported keyword without assign! */ | ||||||
|  |  | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       if(!semiptr) |       if(!semiptr) | ||||||
|         continue; /* we already know there are no more cookies */ |         continue; /* we already know there are no more cookies */ | ||||||
|  |  | ||||||
|       *semiptr=';'; /* put the semicolon back */ |  | ||||||
|       ptr=semiptr+1; |       ptr=semiptr+1; | ||||||
|       while(ptr && *ptr && isspace((int)*ptr)) |       while(ptr && *ptr && isspace((int)*ptr)) | ||||||
|         ptr++; |         ptr++; | ||||||
| @@ -244,6 +243,7 @@ Curl_cookie_add(struct CookieInfo *c, | |||||||
|  |  | ||||||
|            We don't currently take advantage of this knowledge. |            We don't currently take advantage of this knowledge. | ||||||
|         */ |         */ | ||||||
|  |         co->field1=strequal(ptr, "TRUE")+1; /* store information */ | ||||||
|         break; |         break; | ||||||
|       case 2: |       case 2: | ||||||
|         /* It turns out, that sometimes the file format allows the path |         /* It turns out, that sometimes the file format allows the path | ||||||
| @@ -292,6 +292,8 @@ Curl_cookie_add(struct CookieInfo *c, | |||||||
|  |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   co->livecookie = c->running; | ||||||
|  |  | ||||||
|   /* now, we have parsed the incoming line, we must now check if this |   /* now, we have parsed the incoming line, we must now check if this | ||||||
|      superceeds an already existing cookie, which it may if the previous have |      superceeds an already existing cookie, which it may if the previous have | ||||||
|      the same domain and path as this */ |      the same domain and path as this */ | ||||||
| @@ -326,6 +328,26 @@ Curl_cookie_add(struct CookieInfo *c, | |||||||
|          |          | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |       if(replace_old && !co->livecookie && clist->livecookie) { | ||||||
|  |         /* Both cookies matched fine, except that the already present | ||||||
|  |            cookie is "live", which means it was set from a header, while | ||||||
|  |            the new one isn't "live" and thus only read from a file. We let | ||||||
|  |            live cookies stay alive */ | ||||||
|  |  | ||||||
|  |         /* Free the newcomer and get out of here! */ | ||||||
|  |         if(co->domain) | ||||||
|  |           free(co->domain); | ||||||
|  |         if(co->path) | ||||||
|  |           free(co->path); | ||||||
|  |         if(co->name) | ||||||
|  |           free(co->name); | ||||||
|  |         if(co->value) | ||||||
|  |           free(co->value); | ||||||
|  |  | ||||||
|  |         free(co); | ||||||
|  |         return NULL; | ||||||
|  |       } | ||||||
|  |  | ||||||
|       if(replace_old) { |       if(replace_old) { | ||||||
|         co->next = clist->next; /* get the next-pointer first */ |         co->next = clist->next; /* get the next-pointer first */ | ||||||
|  |  | ||||||
| @@ -350,39 +372,51 @@ Curl_cookie_add(struct CookieInfo *c, | |||||||
|       } |       } | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |     lastc = clist; | ||||||
|     clist = clist->next; |     clist = clist->next; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if(!replace_old) { |   if(!replace_old) { | ||||||
|  |     /* then make the last item point on this new one */ | ||||||
|     /* first, point to our "next" */ |     if(lastc) | ||||||
|     co->next = c->cookies; |       lastc->next = co; | ||||||
|     /* then make ourselves first in the list */ |     else | ||||||
|       c->cookies = co; |       c->cookies = co; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   c->numcookies++; /* one more cookie in the jar */ | ||||||
|  |  | ||||||
|   return co; |   return co; | ||||||
| } | } | ||||||
|  |  | ||||||
| /***************************************************************************** | /***************************************************************************** | ||||||
|  * |  * | ||||||
|  * cookie_init() |  * Curl_cookie_init() | ||||||
|  * |  * | ||||||
|  * Inits a cookie struct to read data from a local file. This is always |  * Inits a cookie struct to read data from a local file. This is always | ||||||
|  * called before any cookies are set. File may be NULL. |  * called before any cookies are set. File may be NULL. | ||||||
|  * |  * | ||||||
|  ****************************************************************************/ |  ****************************************************************************/ | ||||||
| struct CookieInfo *Curl_cookie_init(char *file) | struct CookieInfo *Curl_cookie_init(char *file, struct CookieInfo *inc) | ||||||
| { | { | ||||||
|   char line[MAX_COOKIE_LINE]; |   char line[MAX_COOKIE_LINE]; | ||||||
|   struct CookieInfo *c; |   struct CookieInfo *c; | ||||||
|   FILE *fp; |   FILE *fp; | ||||||
|   bool fromfile=TRUE; |   bool fromfile=TRUE; | ||||||
|    |    | ||||||
|  |   if(NULL == inc) { | ||||||
|  |     /* we didn't get a struct, create one */ | ||||||
|     c = (struct CookieInfo *)malloc(sizeof(struct CookieInfo)); |     c = (struct CookieInfo *)malloc(sizeof(struct CookieInfo)); | ||||||
|     if(!c) |     if(!c) | ||||||
|       return NULL; /* failed to get memory */ |       return NULL; /* failed to get memory */ | ||||||
|     memset(c, 0, sizeof(struct CookieInfo)); |     memset(c, 0, sizeof(struct CookieInfo)); | ||||||
|     c->filename = strdup(file?file:"none"); /* copy the name just in case */ |     c->filename = strdup(file?file:"none"); /* copy the name just in case */ | ||||||
|  |   } | ||||||
|  |   else { | ||||||
|  |     /* we got an already existing one, use that */ | ||||||
|  |     c = inc; | ||||||
|  |   } | ||||||
|  |   c->running = FALSE; /* this is not running, this is init */ | ||||||
|  |  | ||||||
|   if(strequal(file, "-")) { |   if(strequal(file, "-")) { | ||||||
|     fp = stdin; |     fp = stdin; | ||||||
| @@ -392,34 +426,35 @@ struct CookieInfo *Curl_cookie_init(char *file) | |||||||
|     fp = file?fopen(file, "r"):NULL; |     fp = file?fopen(file, "r"):NULL; | ||||||
|  |  | ||||||
|   if(fp) { |   if(fp) { | ||||||
|  |     char *lineptr; | ||||||
|  |     bool headerline; | ||||||
|     while(fgets(line, MAX_COOKIE_LINE, fp)) { |     while(fgets(line, MAX_COOKIE_LINE, fp)) { | ||||||
|       if(strnequal("Set-Cookie:", line, 11)) { |       if(strnequal("Set-Cookie:", line, 11)) { | ||||||
|         /* This is a cookie line, get it! */ |         /* This is a cookie line, get it! */ | ||||||
|         char *lineptr=&line[11]; |         lineptr=&line[11]; | ||||||
|         while(*lineptr && isspace((int)*lineptr)) |         headerline=TRUE; | ||||||
|           lineptr++; |  | ||||||
|  |  | ||||||
|         Curl_cookie_add(c, TRUE, lineptr); |  | ||||||
|       } |       } | ||||||
|       else { |       else { | ||||||
|         /* This might be a netscape cookie-file line, get it! */ |         lineptr=line; | ||||||
|         char *lineptr=line; |         headerline=FALSE; | ||||||
|  |       } | ||||||
|       while(*lineptr && isspace((int)*lineptr)) |       while(*lineptr && isspace((int)*lineptr)) | ||||||
|         lineptr++; |         lineptr++; | ||||||
|  |  | ||||||
|         Curl_cookie_add(c, FALSE, lineptr); |       Curl_cookie_add(c, headerline, lineptr); | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|     if(fromfile) |     if(fromfile) | ||||||
|       fclose(fp); |       fclose(fp); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   c->running = TRUE; /* now, we're running */ | ||||||
|  |  | ||||||
|   return c; |   return c; | ||||||
| } | } | ||||||
|  |  | ||||||
| /***************************************************************************** | /***************************************************************************** | ||||||
|  * |  * | ||||||
|  * cookie_getlist() |  * Curl_cookie_getlist() | ||||||
|  * |  * | ||||||
|  * For a given host and path, return a linked list of cookies that the |  * For a given host and path, return a linked list of cookies that the | ||||||
|  * client should send to the server if used now. The secure boolean informs |  * client should send to the server if used now. The secure boolean informs | ||||||
| @@ -491,9 +526,9 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c, | |||||||
|  |  | ||||||
| /***************************************************************************** | /***************************************************************************** | ||||||
|  * |  * | ||||||
|  * cookie_freelist() |  * Curl_cookie_freelist() | ||||||
|  * |  * | ||||||
|  * Free a list previously returned by cookie_getlist(); |  * Free a list of cookies previously returned by Curl_cookie_getlist(); | ||||||
|  * |  * | ||||||
|  ****************************************************************************/ |  ****************************************************************************/ | ||||||
|  |  | ||||||
| @@ -512,7 +547,7 @@ void Curl_cookie_freelist(struct Cookie *co) | |||||||
|  |  | ||||||
| /***************************************************************************** | /***************************************************************************** | ||||||
|  * |  * | ||||||
|  * cookie_cleanup() |  * Curl_cookie_cleanup() | ||||||
|  * |  * | ||||||
|  * Free a "cookie object" previous created with cookie_init(). |  * Free a "cookie object" previous created with cookie_init(). | ||||||
|  * |  * | ||||||
| @@ -551,3 +586,101 @@ void Curl_cookie_cleanup(struct CookieInfo *c) | |||||||
|    } |    } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Curl_cookie_output() | ||||||
|  |  * | ||||||
|  |  * Writes all internally known cookies to the specified file. Specify | ||||||
|  |  * "-" as file name to write to stdout. | ||||||
|  |  * | ||||||
|  |  * The function returns non-zero on write failure. | ||||||
|  |  */ | ||||||
|  | int Curl_cookie_output(struct CookieInfo *c, char *dumphere) | ||||||
|  | { | ||||||
|  |   struct Cookie *co; | ||||||
|  |   FILE *out; | ||||||
|  |   bool use_stdout=FALSE; | ||||||
|  |  | ||||||
|  |   if((NULL == c) || (0 == c->numcookies)) | ||||||
|  |     /* If there are no known cookies, we don't write or even create any | ||||||
|  |        destination file */ | ||||||
|  |     return 0; | ||||||
|  |  | ||||||
|  |   if(strequal("-", dumphere)) { | ||||||
|  |     /* use stdout */ | ||||||
|  |     out = stdout; | ||||||
|  |     use_stdout=TRUE; | ||||||
|  |   } | ||||||
|  |   else { | ||||||
|  |     out = fopen(dumphere, "w"); | ||||||
|  |     if(!out) | ||||||
|  |       return 1; /* failure */ | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if(c) { | ||||||
|  |     fputs("# Netscape HTTP Cookie File\n" | ||||||
|  |           "# http://www.netscape.com/newsref/std/cookie_spec.html\n" | ||||||
|  |           "# This is generated by libcurl! Edit on your own risk.\n\n", | ||||||
|  |           out); | ||||||
|  |     co = c->cookies; | ||||||
|  |       | ||||||
|  |     while(co) { | ||||||
|  |       fprintf(out, | ||||||
|  |               "%s\t" /* domain */ | ||||||
|  |               "%s\t" /* field1 */ | ||||||
|  |               "%s\t" /* path */ | ||||||
|  |               "%s\t" /* secure */ | ||||||
|  |               "%u\t" /* expires */ | ||||||
|  |               "%s\t" /* name */ | ||||||
|  |               "%s\n", /* value */ | ||||||
|  |               co->domain, | ||||||
|  |               co->field1==2?"TRUE":"FALSE", | ||||||
|  |               co->path, | ||||||
|  |               co->secure?"TRUE":"FALSE", | ||||||
|  |               (unsigned int)co->expires, | ||||||
|  |               co->name, | ||||||
|  |               co->value); | ||||||
|  |  | ||||||
|  |       co=co->next; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if(!use_stdout) | ||||||
|  |     fclose(out); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef CURL_COOKIE_DEBUG | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * On my Solaris box, this command line builds this test program: | ||||||
|  |  * | ||||||
|  |  * gcc -g -o cooktest -DCURL_COOKIE_DEBUG -DHAVE_CONFIG_H -I.. -I../include cookie.c strequal.o getdate.o memdebug.o mprintf.o strtok.o -lnsl -lsocket | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | int main(int argc, char **argv) | ||||||
|  | { | ||||||
|  |   struct CookieInfo *c=NULL; | ||||||
|  |   if(argc>1) { | ||||||
|  |     c = Curl_cookie_init(argv[1], c); | ||||||
|  |     Curl_cookie_add(c, TRUE, "PERSONALIZE=none;expires=Monday, 13-Jun-1988 03:04:55 GMT; domain=.fidelity.com; path=/ftgw; secure"); | ||||||
|  |     Curl_cookie_add(c, TRUE, "foobar=yes; domain=.haxx.se; path=/looser;"); | ||||||
|  |     c = Curl_cookie_init(argv[1], c); | ||||||
|  |  | ||||||
|  |     Curl_cookie_output(c); | ||||||
|  |     Curl_cookie_cleanup(c); | ||||||
|  |     return 0; | ||||||
|  |   } | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -41,11 +41,14 @@ struct Cookie { | |||||||
|   time_t expires;    /* expires = <this> */ |   time_t expires;    /* expires = <this> */ | ||||||
|   char *expirestr;   /* the plain text version */ |   char *expirestr;   /* the plain text version */ | ||||||
|  |  | ||||||
|  |   char field1;       /* read from a cookie file, 1 => FALSE, 2=> TRUE */ | ||||||
|  |    | ||||||
|   /* RFC 2109 keywords. Version=1 means 2109-compliant cookie sending */ |   /* RFC 2109 keywords. Version=1 means 2109-compliant cookie sending */ | ||||||
|   char *version;     /* Version = <value> */ |   char *version;     /* Version = <value> */ | ||||||
|   char *maxage;      /* Max-Age = <value> */ |   char *maxage;      /* Max-Age = <value> */ | ||||||
|    |    | ||||||
|   bool secure;       /* whether the 'secure' keyword was used */ |   bool secure;       /* whether the 'secure' keyword was used */ | ||||||
|  |   bool livecookie;   /* updated from a server, not a stored file */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct CookieInfo { | struct CookieInfo { | ||||||
| @@ -53,6 +56,8 @@ struct CookieInfo { | |||||||
|   struct Cookie *cookies; |   struct Cookie *cookies; | ||||||
|  |  | ||||||
|   char *filename; /* file we read from/write to */ |   char *filename; /* file we read from/write to */ | ||||||
|  |   bool running;   /* state info, for cookie adding information */ | ||||||
|  |   long numcookies; /* number of cookies in the "jar" */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* This is the maximum line length we accept for a cookie line */ | /* This is the maximum line length we accept for a cookie line */ | ||||||
| @@ -64,9 +69,10 @@ struct CookieInfo { | |||||||
| #define MAX_NAME_TXT "255" | #define MAX_NAME_TXT "255" | ||||||
|  |  | ||||||
| struct Cookie *Curl_cookie_add(struct CookieInfo *, bool, char *); | struct Cookie *Curl_cookie_add(struct CookieInfo *, bool, char *); | ||||||
| struct CookieInfo *Curl_cookie_init(char *); | struct CookieInfo *Curl_cookie_init(char *, struct CookieInfo *); | ||||||
| struct Cookie *Curl_cookie_getlist(struct CookieInfo *, char *, char *, bool); | struct Cookie *Curl_cookie_getlist(struct CookieInfo *, char *, char *, bool); | ||||||
| void Curl_cookie_freelist(struct Cookie *); | void Curl_cookie_freelist(struct Cookie *); | ||||||
| void Curl_cookie_cleanup(struct CookieInfo *); | void Curl_cookie_cleanup(struct CookieInfo *); | ||||||
|  | int Curl_cookie_output(struct CookieInfo *, char *); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -43,7 +43,8 @@ RSC=rc.exe | |||||||
| # PROP Ignore_Export_Lib 0 | # PROP Ignore_Export_Lib 0 | ||||||
| # PROP Target_Dir "" | # PROP Target_Dir "" | ||||||
| # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c | # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c | ||||||
| # ADD CPP /nologo /MT /W3 /GX /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /c | # ADD CPP /nologo /MD /W3 /GX /Zi /O2 /I "..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /c | ||||||
|  | # SUBTRACT CPP /YX | ||||||
| # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | ||||||
| # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 | ||||||
| # ADD BASE RSC /l 0x409 /d "NDEBUG" | # ADD BASE RSC /l 0x409 /d "NDEBUG" | ||||||
| @@ -53,7 +54,7 @@ BSC32=bscmake.exe | |||||||
| # ADD BSC32 /nologo | # ADD BSC32 /nologo | ||||||
| LINK32=link.exe | LINK32=link.exe | ||||||
| # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 | ||||||
| # ADD LINK32 kernel32.lib wsock32.lib /nologo /dll /machine:I386 /out:"Release/curl.dll" | # ADD LINK32 kernel32.lib wsock32.lib /nologo /dll /map /debug /machine:I386 /out:"Release/libcurl.dll" | ||||||
|  |  | ||||||
| !ELSEIF  "$(CFG)" == "curllib - Win32 Debug" | !ELSEIF  "$(CFG)" == "curllib - Win32 Debug" | ||||||
|  |  | ||||||
| @@ -69,7 +70,8 @@ LINK32=link.exe | |||||||
| # PROP Ignore_Export_Lib 0 | # PROP Ignore_Export_Lib 0 | ||||||
| # PROP Target_Dir "" | # PROP Target_Dir "" | ||||||
| # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c | # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c | ||||||
| # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /YX /FD /GZ /c | # ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CURLLIB_EXPORTS" /FR /FD /GZ /c | ||||||
|  | # SUBTRACT CPP /WX /YX | ||||||
| # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | ||||||
| # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | ||||||
| # ADD BASE RSC /l 0x409 /d "_DEBUG" | # ADD BASE RSC /l 0x409 /d "_DEBUG" | ||||||
| @@ -79,7 +81,7 @@ BSC32=bscmake.exe | |||||||
| # ADD BSC32 /nologo | # ADD BSC32 /nologo | ||||||
| LINK32=link.exe | LINK32=link.exe | ||||||
| # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept | # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept | ||||||
| # ADD LINK32 kernel32.lib wsock32.lib /nologo /dll /debug /machine:I386 /out:"Debug/curl.dll" /pdbtype:sept | # ADD LINK32 kernel32.lib wsock32.lib /nologo /dll /incremental:no /map /debug /machine:I386 /out:"Debug/libcurl.dll" /pdbtype:sept | ||||||
| # SUBTRACT LINK32 /nodefaultlib | # SUBTRACT LINK32 /nodefaultlib | ||||||
|  |  | ||||||
| !ENDIF  | !ENDIF  | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								lib/dict.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								lib/dict.c
									
									
									
									
									
								
							| @@ -80,11 +80,6 @@ | |||||||
| #define _MPRINTF_REPLACE /* use our functions only */ | #define _MPRINTF_REPLACE /* use our functions only */ | ||||||
| #include <curl/mprintf.h> | #include <curl/mprintf.h> | ||||||
|  |  | ||||||
| CURLcode Curl_dict_done(struct connectdata *conn) |  | ||||||
| { |  | ||||||
|   return CURLE_OK; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| CURLcode Curl_dict(struct connectdata *conn) | CURLcode Curl_dict(struct connectdata *conn) | ||||||
| { | { | ||||||
|   int nth; |   int nth; | ||||||
| @@ -95,7 +90,7 @@ CURLcode Curl_dict(struct connectdata *conn) | |||||||
|   char *nthdef = NULL; /* This is not part of the protocol, but required |   char *nthdef = NULL; /* This is not part of the protocol, but required | ||||||
|                           by RFC 2229 */ |                           by RFC 2229 */ | ||||||
|   CURLcode result=CURLE_OK; |   CURLcode result=CURLE_OK; | ||||||
|   struct UrlData *data=conn->data; |   struct SessionHandle *data=conn->data; | ||||||
|  |  | ||||||
|   char *path = conn->path; |   char *path = conn->path; | ||||||
|   long *bytecount = &conn->bytecount; |   long *bytecount = &conn->bytecount; | ||||||
| @@ -129,10 +124,10 @@ CURLcode Curl_dict(struct connectdata *conn) | |||||||
|       failf(data, "lookup word is missing\n"); |       failf(data, "lookup word is missing\n"); | ||||||
|     } |     } | ||||||
|     if ((database == NULL) || (*database == (char)0)) { |     if ((database == NULL) || (*database == (char)0)) { | ||||||
|       database = "!"; |       database = (char *)"!"; | ||||||
|     } |     } | ||||||
|     if ((strategy == NULL) || (*strategy == (char)0)) { |     if ((strategy == NULL) || (*strategy == (char)0)) { | ||||||
|       strategy = "."; |       strategy = (char *)"."; | ||||||
|     } |     } | ||||||
|     if ((nthdef == NULL) || (*nthdef == (char)0)) { |     if ((nthdef == NULL) || (*nthdef == (char)0)) { | ||||||
|       nth = 0; |       nth = 0; | ||||||
| @@ -182,7 +177,7 @@ CURLcode Curl_dict(struct connectdata *conn) | |||||||
|       failf(data, "lookup word is missing\n"); |       failf(data, "lookup word is missing\n"); | ||||||
|     } |     } | ||||||
|     if ((database == NULL) || (*database == (char)0)) { |     if ((database == NULL) || (*database == (char)0)) { | ||||||
|       database = "!"; |       database = (char *)"!"; | ||||||
|     } |     } | ||||||
|     if ((nthdef == NULL) || (*nthdef == (char)0)) { |     if ((nthdef == NULL) || (*nthdef == (char)0)) { | ||||||
|       nth = 0; |       nth = 0; | ||||||
| @@ -237,3 +232,11 @@ CURLcode Curl_dict(struct connectdata *conn) | |||||||
|  |  | ||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | #ifdef WIN32 | ||||||
| /* dllinit.c -- Portable DLL initialization.  | /* dllinit.c -- Portable DLL initialization.  | ||||||
|    Copyright (C) 1998, 1999 Free Software Foundation, Inc. |    Copyright (C) 1998, 1999 Free Software Foundation, Inc. | ||||||
|    Contributed by Mumit Khan (khan@xraylith.wisc.edu). |    Contributed by Mumit Khan (khan@xraylith.wisc.edu). | ||||||
| @@ -80,3 +81,12 @@ DllMain ( | |||||||
|     } |     } | ||||||
|   return TRUE; |   return TRUE; | ||||||
| } | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										92
									
								
								lib/easy.c
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								lib/easy.c
									
									
									
									
									
								
							| @@ -74,6 +74,8 @@ | |||||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||||
| #include "transfer.h" | #include "transfer.h" | ||||||
| #include "ssluse.h" | #include "ssluse.h" | ||||||
|  | #include "url.h" | ||||||
|  | #include "getinfo.h" | ||||||
|  |  | ||||||
| #define _MPRINTF_REPLACE /* use our functions only */ | #define _MPRINTF_REPLACE /* use our functions only */ | ||||||
| #include <curl/mprintf.h> | #include <curl/mprintf.h> | ||||||
| @@ -119,8 +121,9 @@ static CURLcode win32_init(void) | |||||||
| } | } | ||||||
| /* The Windows Sockets DLL is acceptable. Proceed. */  | /* The Windows Sockets DLL is acceptable. Proceed. */  | ||||||
| #else | #else | ||||||
|  | /* These functions exist merely to prevent compiler warnings */ | ||||||
| static CURLcode win32_init(void) { return CURLE_OK; } | static CURLcode win32_init(void) { return CURLE_OK; } | ||||||
| #define win32_cleanup() | static void win32_cleanup(void) { } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -172,20 +175,17 @@ void curl_global_cleanup(void) | |||||||
| CURL *curl_easy_init(void) | CURL *curl_easy_init(void) | ||||||
| { | { | ||||||
|   CURLcode res; |   CURLcode res; | ||||||
|   struct UrlData *data; |   struct SessionHandle *data; | ||||||
|  |  | ||||||
|   /* Make sure we inited the global SSL stuff */ |   /* Make sure we inited the global SSL stuff */ | ||||||
|   if (!initialized) |   if (!initialized) | ||||||
|     curl_global_init(CURL_GLOBAL_DEFAULT); |     curl_global_init(CURL_GLOBAL_DEFAULT); | ||||||
|  |  | ||||||
|   /* We use curl_open() with undefined URL so far */ |   /* We use curl_open() with undefined URL so far */ | ||||||
|   res = Curl_open((CURL **)&data, NULL); |   res = Curl_open(&data); | ||||||
|   if(res != CURLE_OK) |   if(res != CURLE_OK) | ||||||
|     return NULL; |     return NULL; | ||||||
|  |  | ||||||
|   /* SAC */ |  | ||||||
|   data->device = NULL; |  | ||||||
|  |  | ||||||
|   return data; |   return data; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -196,7 +196,7 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...) | |||||||
|   func_T param_func = (func_T)0; |   func_T param_func = (func_T)0; | ||||||
|   long param_long = 0; |   long param_long = 0; | ||||||
|   void *param_obj = NULL; |   void *param_obj = NULL; | ||||||
|   struct UrlData *data = curl; |   struct SessionHandle *data = curl; | ||||||
|  |  | ||||||
|   va_start(arg, tag); |   va_start(arg, tag); | ||||||
|  |  | ||||||
| @@ -228,20 +228,92 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...) | |||||||
|  |  | ||||||
| CURLcode curl_easy_perform(CURL *curl) | CURLcode curl_easy_perform(CURL *curl) | ||||||
| { | { | ||||||
|   return Curl_perform(curl); |   struct SessionHandle *data = (struct SessionHandle *)curl; | ||||||
|  |  | ||||||
|  |   return Curl_perform(data); | ||||||
| } | } | ||||||
|  |  | ||||||
| void curl_easy_cleanup(CURL *curl) | void curl_easy_cleanup(CURL *curl) | ||||||
| { | { | ||||||
|   Curl_close(curl); |   struct SessionHandle *data = (struct SessionHandle *)curl; | ||||||
|  |   Curl_close(data); | ||||||
| } | } | ||||||
|  |  | ||||||
| CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...) | CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...) | ||||||
| { | { | ||||||
|   va_list arg; |   va_list arg; | ||||||
|   void *paramp; |   void *paramp; | ||||||
|  |   struct SessionHandle *data = (struct SessionHandle *)curl; | ||||||
|  |  | ||||||
|   va_start(arg, info); |   va_start(arg, info); | ||||||
|   paramp = va_arg(arg, void *); |   paramp = va_arg(arg, void *); | ||||||
|  |  | ||||||
|   return Curl_getinfo(curl, info, paramp); |   return Curl_getinfo(data, info, paramp); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | CURL *curl_easy_duphandle(CURL *incurl) | ||||||
|  | { | ||||||
|  |   struct SessionHandle *data=(struct SessionHandle *)incurl; | ||||||
|  |  | ||||||
|  |   struct SessionHandle *outcurl = (struct SessionHandle *) | ||||||
|  |     malloc(sizeof(struct SessionHandle)); | ||||||
|  |  | ||||||
|  |   if(NULL == outcurl) | ||||||
|  |     return NULL; /* failure */ | ||||||
|  |  | ||||||
|  |   /* start with clearing the entire new struct */ | ||||||
|  |   memset(outcurl, 0, sizeof(struct SessionHandle)); | ||||||
|  |  | ||||||
|  |   /* | ||||||
|  |    * We setup a few buffers we need. We should probably make them | ||||||
|  |    * get setup on-demand in the code, as that would probably decrease | ||||||
|  |    * the likeliness of us forgetting to init a buffer here in the future. | ||||||
|  |    */ | ||||||
|  |   outcurl->state.headerbuff=(char*)malloc(HEADERSIZE); | ||||||
|  |   if(!outcurl->state.headerbuff) { | ||||||
|  |     free(outcurl); /* free the memory again */ | ||||||
|  |     return NULL; | ||||||
|  |   } | ||||||
|  |   outcurl->state.headersize=HEADERSIZE; | ||||||
|  |  | ||||||
|  |   /* copy all userdefined values */ | ||||||
|  |   outcurl->set = data->set; | ||||||
|  |   outcurl->state.numconnects = data->state.numconnects; | ||||||
|  |   outcurl->state.connects = (struct connectdata **) | ||||||
|  |       malloc(sizeof(struct connectdata *) * outcurl->state.numconnects); | ||||||
|  |  | ||||||
|  |   if(!outcurl->state.connects) { | ||||||
|  |     free(outcurl->state.headerbuff); | ||||||
|  |     free(outcurl); | ||||||
|  |     return NULL; | ||||||
|  |   } | ||||||
|  |   memset(outcurl->state.connects, 0, | ||||||
|  |          sizeof(struct connectdata *)*outcurl->state.numconnects); | ||||||
|  |  | ||||||
|  |   outcurl->progress.flags    = data->progress.flags; | ||||||
|  |   outcurl->progress.callback = data->progress.callback; | ||||||
|  |  | ||||||
|  |   /* duplicate all values in 'change' */ | ||||||
|  |   if(data->change.url) { | ||||||
|  |     outcurl->change.url = strdup(data->change.url); | ||||||
|  |     outcurl->change.url_alloc = TRUE; | ||||||
|  |   } | ||||||
|  |   if(data->change.proxy) { | ||||||
|  |     outcurl->change.proxy = strdup(data->change.proxy); | ||||||
|  |     outcurl->change.proxy_alloc = TRUE; | ||||||
|  |   } | ||||||
|  |   if(data->change.referer) { | ||||||
|  |     outcurl->change.referer = strdup(data->change.referer); | ||||||
|  |     outcurl->change.referer_alloc = TRUE; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return outcurl; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								lib/escape.c
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								lib/escape.c
									
									
									
									
									
								
							| @@ -37,9 +37,9 @@ | |||||||
| #include "memdebug.h" | #include "memdebug.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| char *curl_escape(char *string, int length) | char *curl_escape(const char *string, int length) | ||||||
| { | { | ||||||
|   int alloc = (length?length:strlen(string))+1;   |   int alloc = (length?length:(int)strlen(string))+1;   | ||||||
|   char *ns = malloc(alloc); |   char *ns = malloc(alloc); | ||||||
|   unsigned char in; |   unsigned char in; | ||||||
|   int newlen = alloc; |   int newlen = alloc; | ||||||
| @@ -75,9 +75,9 @@ char *curl_escape(char *string, int length) | |||||||
|   return ns; |   return ns; | ||||||
| } | } | ||||||
|  |  | ||||||
| char *curl_unescape(char *string, int length) | char *curl_unescape(const char *string, int length) | ||||||
| { | { | ||||||
|   int alloc = (length?length:strlen(string))+1; |   int alloc = (length?length:(int)strlen(string))+1; | ||||||
|   char *ns = malloc(alloc); |   char *ns = malloc(alloc); | ||||||
|   unsigned char in; |   unsigned char in; | ||||||
|   int index=0; |   int index=0; | ||||||
| @@ -110,3 +110,11 @@ char *curl_unescape(char *string, int length) | |||||||
|   return ns; |   return ns; | ||||||
|    |    | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ | |||||||
| /* Escape and unescape URL encoding in strings. The functions return a new | /* Escape and unescape URL encoding in strings. The functions return a new | ||||||
|  * allocated string or NULL if an error occurred.  */ |  * allocated string or NULL if an error occurred.  */ | ||||||
|  |  | ||||||
| char *curl_escape(char *string, int length); | char *curl_escape(const char *string, int length); | ||||||
| char *curl_unescape(char *string, int length); | char *curl_unescape(const char *string, int length); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								lib/file.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								lib/file.c
									
									
									
									
									
								
							| @@ -140,10 +140,10 @@ CURLcode Curl_file(struct connectdata *conn) | |||||||
|   */ |   */ | ||||||
|   CURLcode res = CURLE_OK; |   CURLcode res = CURLE_OK; | ||||||
|   struct stat statbuf; |   struct stat statbuf; | ||||||
|   size_t expected_size=-1; |   ssize_t expected_size=-1; | ||||||
|   size_t nread; |   ssize_t nread; | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   char *buf = data->buffer; |   char *buf = data->state.buffer; | ||||||
|   int bytecount = 0; |   int bytecount = 0; | ||||||
|   struct timeval start = Curl_tvnow(); |   struct timeval start = Curl_tvnow(); | ||||||
|   struct timeval now = start; |   struct timeval now = start; | ||||||
| @@ -152,6 +152,7 @@ CURLcode Curl_file(struct connectdata *conn) | |||||||
|   /* get the fd from the connection phase */ |   /* get the fd from the connection phase */ | ||||||
|   fd = conn->proto.file->fd; |   fd = conn->proto.file->fd; | ||||||
|  |  | ||||||
|  | /*VMS?? -- This only works reliable for STREAMLF files */ | ||||||
|   if( -1 != fstat(fd, &statbuf)) { |   if( -1 != fstat(fd, &statbuf)) { | ||||||
|     /* we could stat it, then read out the size */ |     /* we could stat it, then read out the size */ | ||||||
|     expected_size = statbuf.st_size; |     expected_size = statbuf.st_size; | ||||||
| @@ -167,11 +168,12 @@ CURLcode Curl_file(struct connectdata *conn) | |||||||
|   while (res == CURLE_OK) { |   while (res == CURLE_OK) { | ||||||
|     nread = read(fd, buf, BUFSIZE-1); |     nread = read(fd, buf, BUFSIZE-1); | ||||||
|  |  | ||||||
|     if (0 <= nread) |     if ( nread > 0) | ||||||
|       buf[nread] = 0; |       buf[nread] = 0; | ||||||
|  |  | ||||||
|     if (nread <= 0) |     if (nread <= 0) | ||||||
|       break; |       break; | ||||||
|  |  | ||||||
|     bytecount += nread; |     bytecount += nread; | ||||||
|     /* NOTE: The following call to fwrite does CR/LF translation on |     /* NOTE: The following call to fwrite does CR/LF translation on | ||||||
|        Windows systems if the target is stdout. Use -O or -o parameters |        Windows systems if the target is stdout. Use -O or -o parameters | ||||||
| @@ -194,3 +196,11 @@ CURLcode Curl_file(struct connectdata *conn) | |||||||
|  |  | ||||||
|   return res; |   return res; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										725
									
								
								lib/formdata.c
									
									
									
									
									
								
							
							
						
						
									
										725
									
								
								lib/formdata.c
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | |||||||
|  *                            | (__| |_| |  _ <| |___  |  *                            | (__| |_| |  _ <| |___  | ||||||
|  *                             \___|\___/|_| \_\_____| |  *                             \___|\___/|_| \_\_____| | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
|  * |  * | ||||||
|  * In order to be useful for every potential user, curl and libcurl are |  * In order to be useful for every potential user, curl and libcurl are | ||||||
|  * dual-licensed under the MPL and the MIT/X-derivate licenses. |  * dual-licensed under the MPL and the MIT/X-derivate licenses. | ||||||
| @@ -24,7 +24,65 @@ | |||||||
| /* | /* | ||||||
|   Debug the form generator stand-alone by compiling this source file with: |   Debug the form generator stand-alone by compiling this source file with: | ||||||
|  |  | ||||||
|   gcc -DHAVE_CONFIG_H -I../ -g -D_FORM_DEBUG -o formdata -I../include formdata.c |   gcc -DHAVE_CONFIG_H -I../ -g -D_FORM_DEBUG -o formdata -I../include formdata.c strequal.c | ||||||
|  |  | ||||||
|  |   run the 'formdata' executable the output should end with: | ||||||
|  |   All Tests seem to have worked ... | ||||||
|  |   and the following parts should be there: | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="simple_COPYCONTENTS" | ||||||
|  | value for simple COPYCONTENTS | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="COPYCONTENTS_+_CONTENTTYPE" | ||||||
|  | Content-Type: image/gif | ||||||
|  | value for COPYCONTENTS + CONTENTTYPE | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="PRNAME_+_NAMELENGTH_+_COPYNAME_+_CONTENTSLENGTH" | ||||||
|  | vlue for PTRNAME + NAMELENGTH + COPYNAME + CONTENTSLENGTH | ||||||
|  | (or you might see P^@RNAME and v^@lue at the start) | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="simple_PTRCONTENTS" | ||||||
|  | value for simple PTRCONTENTS | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="PTRCONTENTS_+_CONTENTSLENGTH" | ||||||
|  | vlue for PTRCONTENTS + CONTENTSLENGTH | ||||||
|  | (or you might see v^@lue at the start) | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="PTRCONTENTS_+_CONTENTSLENGTH_+_CONTENTTYPE" | ||||||
|  | Content-Type: text/plain | ||||||
|  | vlue for PTRCOTNENTS + CONTENTSLENGTH + CONTENTTYPE | ||||||
|  | (or you might see v^@lue at the start) | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="FILE1_+_CONTENTTYPE"; filename="inet_ntoa_r.h" | ||||||
|  | Content-Type: text/html | ||||||
|  | ... | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="FILE1_+_FILE2" | ||||||
|  | Content-Type: multipart/mixed, boundary=curlz1s0dkticx49MV1KGcYP5cvfSsz | ||||||
|  | ... | ||||||
|  | Content-Disposition: attachment; filename="inet_ntoa_r.h" | ||||||
|  | Content-Type: text/plain | ||||||
|  | ... | ||||||
|  | Content-Disposition: attachment; filename="Makefile.b32.resp" | ||||||
|  | Content-Type: text/plain | ||||||
|  | ... | ||||||
|  |  | ||||||
|  | Content-Disposition: form-data; name="FILE1_+_FILE2_+_FILE3" | ||||||
|  | Content-Type: multipart/mixed, boundary=curlirkYPmPwu6FrJ1vJ1u1BmtIufh1 | ||||||
|  | ... | ||||||
|  | Content-Disposition: attachment; filename="inet_ntoa_r.h" | ||||||
|  | Content-Type: text/plain | ||||||
|  | ... | ||||||
|  | Content-Disposition: attachment; filename="Makefile.b32.resp" | ||||||
|  | Content-Type: text/plain | ||||||
|  | ... | ||||||
|  | Content-Disposition: attachment; filename="inet_ntoa_r.h" | ||||||
|  | Content-Type: text/plain | ||||||
|  | ... | ||||||
|  |  | ||||||
|  |   For the old FormParse used by curl_formparse use: | ||||||
|  |  | ||||||
|  |   gcc -DHAVE_CONFIG_H -I../ -g -D_OLD_FORM_DEBUG -o formdata -I../include formdata.c strequal.c | ||||||
|  |  | ||||||
|   run the 'formdata' executable and make sure the output is ok! |   run the 'formdata' executable and make sure the output is ok! | ||||||
|  |  | ||||||
| @@ -64,7 +122,7 @@ | |||||||
| /* This is a silly duplicate of the function in main.c to enable this source | /* This is a silly duplicate of the function in main.c to enable this source | ||||||
|    to compile stand-alone for better debugging */ |    to compile stand-alone for better debugging */ | ||||||
| static void GetStr(char **string, | static void GetStr(char **string, | ||||||
| 		   char *value) | 		   const char *value) | ||||||
| { | { | ||||||
|   if(*string) |   if(*string) | ||||||
|     free(*string); |     free(*string); | ||||||
| @@ -102,12 +160,12 @@ int FormParse(char *input, | |||||||
|   /* nextarg MUST be a string in the format 'name=contents' and we'll |   /* nextarg MUST be a string in the format 'name=contents' and we'll | ||||||
|      build a linked list with the info */ |      build a linked list with the info */ | ||||||
|   char name[256]; |   char name[256]; | ||||||
|   char contents[4096]=""; |   char *contents; | ||||||
|   char major[128]; |   char major[128]; | ||||||
|   char minor[128]; |   char minor[128]; | ||||||
|   long flags = 0; |   long flags = 0; | ||||||
|   char *contp; |   char *contp; | ||||||
|   char *type = NULL; |   const char *type = NULL; | ||||||
|   char *prevtype = NULL; |   char *prevtype = NULL; | ||||||
|   char *sep; |   char *sep; | ||||||
|   char *sep2; |   char *sep2; | ||||||
| @@ -115,7 +173,12 @@ int FormParse(char *input, | |||||||
|   struct HttpPost *subpost; /* a sub-node */ |   struct HttpPost *subpost; /* a sub-node */ | ||||||
|   unsigned int i; |   unsigned int i; | ||||||
|  |  | ||||||
|   if(1 <= sscanf(input, "%255[^=]=%4095[^\n]", name, contents)) { |   /* Preallocate contents to the length of input to make sure we don't | ||||||
|  |      overwrite anything. */ | ||||||
|  |   contents = malloc(strlen(input)); | ||||||
|  |   contents[0] = '\000'; | ||||||
|  |   | ||||||
|  |   if(1 <= sscanf(input, "%255[^=]=%[^\n]", name, contents)) { | ||||||
|     /* the input was using the correct format */ |     /* the input was using the correct format */ | ||||||
|     contp = contents; |     contp = contents; | ||||||
|  |  | ||||||
| @@ -156,10 +219,11 @@ int FormParse(char *input, | |||||||
| 	    if(2 != sscanf(type, "%127[^/]/%127[^,\n]", | 	    if(2 != sscanf(type, "%127[^/]/%127[^,\n]", | ||||||
| 			   major, minor)) { | 			   major, minor)) { | ||||||
| 	      fprintf(stderr, "Illegally formatted content-type field!\n"); | 	      fprintf(stderr, "Illegally formatted content-type field!\n"); | ||||||
|  |               free(contents); | ||||||
| 	      return 2; /* illegal content-type syntax! */ | 	      return 2; /* illegal content-type syntax! */ | ||||||
| 	    } | 	    } | ||||||
| 	    /* now point beyond the content-type specifier */ | 	    /* now point beyond the content-type specifier */ | ||||||
| 	    sep = type + strlen(major)+strlen(minor)+1; | 	    sep = (char *)type + strlen(major)+strlen(minor)+1; | ||||||
|  |  | ||||||
| 	    /* find the following comma */ | 	    /* find the following comma */ | ||||||
| 	    sep=strchr(sep, FORM_FILE_SEPARATOR); | 	    sep=strchr(sep, FORM_FILE_SEPARATOR); | ||||||
| @@ -180,8 +244,8 @@ int FormParse(char *input, | |||||||
| 	   * extensions and pick the first we match! | 	   * extensions and pick the first we match! | ||||||
| 	   */ | 	   */ | ||||||
| 	  struct ContentType { | 	  struct ContentType { | ||||||
| 	    char *extension; | 	    const char *extension; | ||||||
| 	    char *type; | 	    const char *type; | ||||||
| 	  }; | 	  }; | ||||||
|           static struct ContentType ctts[]={ |           static struct ContentType ctts[]={ | ||||||
| 	    {".gif",  "image/gif"}, | 	    {".gif",  "image/gif"}, | ||||||
| @@ -221,9 +285,10 @@ int FormParse(char *input, | |||||||
| 	    memset(post, 0, sizeof(struct HttpPost)); | 	    memset(post, 0, sizeof(struct HttpPost)); | ||||||
| 	    GetStr(&post->name, name);      /* get the name */ | 	    GetStr(&post->name, name);      /* get the name */ | ||||||
| 	    GetStr(&post->contents, contp); /* get the contents */ | 	    GetStr(&post->contents, contp); /* get the contents */ | ||||||
|  |             post->contentslength = 0; | ||||||
| 	    post->flags = flags; | 	    post->flags = flags; | ||||||
| 	    if(type) { | 	    if(type) { | ||||||
| 	      GetStr(&post->contenttype, type); /* get type */ | 	      GetStr(&post->contenttype, (char *)type); /* get type */ | ||||||
| 	      prevtype=post->contenttype; /* point to the allocated string! */ | 	      prevtype=post->contenttype; /* point to the allocated string! */ | ||||||
| 	    } | 	    } | ||||||
| 	    /* make the previous point to this */ | 	    /* make the previous point to this */ | ||||||
| @@ -244,10 +309,11 @@ int FormParse(char *input, | |||||||
| 	     memset(subpost, 0, sizeof(struct HttpPost)); | 	     memset(subpost, 0, sizeof(struct HttpPost)); | ||||||
| 	     GetStr(&subpost->name, name);      /* get the name */ | 	     GetStr(&subpost->name, name);      /* get the name */ | ||||||
| 	     GetStr(&subpost->contents, contp); /* get the contents */ | 	     GetStr(&subpost->contents, contp); /* get the contents */ | ||||||
|  |              subpost->contentslength = 0; | ||||||
| 	     subpost->flags = flags; | 	     subpost->flags = flags; | ||||||
| 	     if(type) { | 	     if(type) { | ||||||
| 	       GetStr(&subpost->contenttype, type); /* get type */ | 	       GetStr(&subpost->contenttype, (char *)type); /* get type */ | ||||||
| 	       prevtype=subpost->contenttype; /* point to the allocated string! */ | 	       prevtype=subpost->contenttype; /* point to allocated string! */ | ||||||
| 	     } | 	     } | ||||||
| 	     /* now, point our 'more' to the original 'more' */ | 	     /* now, point our 'more' to the original 'more' */ | ||||||
| 	     subpost->more = post->more; | 	     subpost->more = post->more; | ||||||
| @@ -266,10 +332,12 @@ int FormParse(char *input, | |||||||
| 	GetStr(&post->name, name);      /* get the name */ | 	GetStr(&post->name, name);      /* get the name */ | ||||||
| 	if( contp[0]=='<' ) { | 	if( contp[0]=='<' ) { | ||||||
| 	  GetStr(&post->contents, contp+1); /* get the contents */ | 	  GetStr(&post->contents, contp+1); /* get the contents */ | ||||||
|  |           post->contentslength = 0; | ||||||
| 	  post->flags = HTTPPOST_READFILE; | 	  post->flags = HTTPPOST_READFILE; | ||||||
| 	} | 	} | ||||||
| 	else { | 	else { | ||||||
| 	  GetStr(&post->contents, contp); /* get the contents */ | 	  GetStr(&post->contents, contp); /* get the contents */ | ||||||
|  |           post->contentslength = 0; | ||||||
| 	  post->flags = 0; | 	  post->flags = 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -287,8 +355,10 @@ int FormParse(char *input, | |||||||
|   } |   } | ||||||
|   else { |   else { | ||||||
|     fprintf(stderr, "Illegally formatted input field!\n"); |     fprintf(stderr, "Illegally formatted input field!\n"); | ||||||
|  |     free(contents); | ||||||
|     return 1; |     return 1; | ||||||
|   } |   } | ||||||
|  |   free(contents); | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -299,8 +369,430 @@ int curl_formparse(char *input, | |||||||
|   return FormParse(input, httppost, last_post); |   return FormParse(input, httppost, last_post); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /*************************************************************************** | ||||||
|  |  * | ||||||
|  |  * AddHttpPost() | ||||||
|  |  *	 | ||||||
|  |  * Adds a HttpPost structure to the list, if parent_post is given becomes | ||||||
|  |  * a subpost of parent_post instead of a direct list element. | ||||||
|  |  * | ||||||
|  |  * Returns newly allocated HttpPost on success and NULL if malloc failed. | ||||||
|  |  * | ||||||
|  |  ***************************************************************************/ | ||||||
|  | static struct HttpPost * AddHttpPost (char * name, | ||||||
|  |                                       long namelength, | ||||||
|  |                                       char * value, | ||||||
|  |                                       long contentslength, | ||||||
|  | 				      char *contenttype, | ||||||
|  |                                       long flags, | ||||||
|  |                                       struct HttpPost *parent_post, | ||||||
|  |                                       struct HttpPost **httppost, | ||||||
|  |                                       struct HttpPost **last_post) | ||||||
|  | { | ||||||
|  |   struct HttpPost *post; | ||||||
|  |   post = (struct HttpPost *)malloc(sizeof(struct HttpPost)); | ||||||
|  |   if(post) { | ||||||
|  |     memset(post, 0, sizeof(struct HttpPost)); | ||||||
|  |     post->name = name; | ||||||
|  |     post->namelength = namelength; | ||||||
|  |     post->contents = value; | ||||||
|  |     post->contentslength = contentslength; | ||||||
|  |     post->contenttype = contenttype; | ||||||
|  |     post->flags = flags; | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |     return NULL; | ||||||
|  |    | ||||||
|  |   if (parent_post) { | ||||||
|  |     /* now, point our 'more' to the original 'more' */ | ||||||
|  |     post->more = parent_post->more; | ||||||
|  |      | ||||||
|  |     /* then move the original 'more' to point to ourselves */ | ||||||
|  |     parent_post->more = post;	          | ||||||
|  |   } | ||||||
|  |   else { | ||||||
|  |     /* make the previous point to this */ | ||||||
|  |     if(*last_post) | ||||||
|  |       (*last_post)->next = post; | ||||||
|  |     else | ||||||
|  |       (*httppost) = post; | ||||||
|  |      | ||||||
|  |     (*last_post) = post;   | ||||||
|  |   } | ||||||
|  |   return post; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*************************************************************************** | ||||||
|  |  * | ||||||
|  |  * AddFormInfo() | ||||||
|  |  *	 | ||||||
|  |  * Adds a FormInfo structure to the list presented by parent_form_info. | ||||||
|  |  * | ||||||
|  |  * Returns newly allocated FormInfo on success and NULL if malloc failed/ | ||||||
|  |  * parent_form_info is NULL. | ||||||
|  |  * | ||||||
|  |  ***************************************************************************/ | ||||||
|  | static FormInfo * AddFormInfo (char *value, | ||||||
|  | 			       char *contenttype, | ||||||
|  | 			       FormInfo *parent_form_info) | ||||||
|  | { | ||||||
|  |   FormInfo *form_info; | ||||||
|  |   form_info = (FormInfo *)malloc(sizeof(FormInfo)); | ||||||
|  |   if(form_info) { | ||||||
|  |     memset(form_info, 0, sizeof(FormInfo)); | ||||||
|  |     if (value) | ||||||
|  |       form_info->value = value; | ||||||
|  |     if (contenttype) | ||||||
|  |       form_info->contenttype = contenttype; | ||||||
|  |     form_info->flags = HTTPPOST_FILENAME; | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |     return NULL; | ||||||
|  |    | ||||||
|  |   if (parent_form_info) { | ||||||
|  |     /* now, point our 'more' to the original 'more' */ | ||||||
|  |     form_info->more = parent_form_info->more; | ||||||
|  |      | ||||||
|  |     /* then move the original 'more' to point to ourselves */ | ||||||
|  |     parent_form_info->more = form_info; | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |     return NULL; | ||||||
|  |  | ||||||
|  |   return form_info; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*************************************************************************** | ||||||
|  |  * | ||||||
|  |  * ContentTypeForFilename() | ||||||
|  |  *	 | ||||||
|  |  * Provides content type for filename if one of the known types (else | ||||||
|  |  * (either the prevtype or the default is returned). | ||||||
|  |  * | ||||||
|  |  * Returns some valid contenttype for filename. | ||||||
|  |  * | ||||||
|  |  ***************************************************************************/ | ||||||
|  | static const char * ContentTypeForFilename (char *filename, | ||||||
|  | 					    const char *prevtype) | ||||||
|  | { | ||||||
|  |   const char *contenttype = NULL; | ||||||
|  |   unsigned int i; | ||||||
|  |   /* | ||||||
|  |    * No type was specified, we scan through a few well-known | ||||||
|  |    * extensions and pick the first we match! | ||||||
|  |    */ | ||||||
|  |   struct ContentType { | ||||||
|  |     const char *extension; | ||||||
|  |     const char *type; | ||||||
|  |   }; | ||||||
|  |   static struct ContentType ctts[]={ | ||||||
|  |     {".gif",  "image/gif"}, | ||||||
|  |     {".jpg",  "image/jpeg"}, | ||||||
|  |     {".jpeg", "image/jpeg"}, | ||||||
|  |     {".txt",  "text/plain"}, | ||||||
|  |     {".html", "text/plain"} | ||||||
|  |   }; | ||||||
|  |    | ||||||
|  |   if(prevtype) | ||||||
|  |     /* default to the previously set/used! */ | ||||||
|  |     contenttype = prevtype; | ||||||
|  |   else | ||||||
|  |     /* It seems RFC1867 defines no Content-Type to default to | ||||||
|  |        text/plain so we don't actually need to set this: */ | ||||||
|  |     contenttype = HTTPPOST_CONTENTTYPE_DEFAULT; | ||||||
|  |    | ||||||
|  |   for(i=0; i<sizeof(ctts)/sizeof(ctts[0]); i++) { | ||||||
|  |     if(strlen(filename) >= strlen(ctts[i].extension)) { | ||||||
|  |       if(strequal(filename + | ||||||
|  | 		  strlen(filename) - strlen(ctts[i].extension), | ||||||
|  | 		  ctts[i].extension)) { | ||||||
|  | 	contenttype = ctts[i].type; | ||||||
|  | 	break; | ||||||
|  |       }	       | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   /* we have a contenttype by now */ | ||||||
|  |   return contenttype; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*************************************************************************** | ||||||
|  |  * | ||||||
|  |  * AllocAndCopy() | ||||||
|  |  *	 | ||||||
|  |  * Copies the data currently available under *buffer using newly allocated | ||||||
|  |  * buffer (that becomes *buffer). Uses buffer_length if not null, else | ||||||
|  |  * uses strlen to determine the length of the buffer to be copied | ||||||
|  |  * | ||||||
|  |  * Returns 0 on success and 1 if the malloc failed. | ||||||
|  |  * | ||||||
|  |  ***************************************************************************/ | ||||||
|  | static int AllocAndCopy (char **buffer, int buffer_length) | ||||||
|  | { | ||||||
|  |   char *src = *buffer; | ||||||
|  |   int length; | ||||||
|  |   if (buffer_length) | ||||||
|  |     length = buffer_length; | ||||||
|  |   else | ||||||
|  |     length = strlen(*buffer); | ||||||
|  |   *buffer = (char*)malloc(length); | ||||||
|  |   if (!*buffer) | ||||||
|  |     return 1; | ||||||
|  |   memcpy(*buffer, src, length); | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*************************************************************************** | ||||||
|  |  * | ||||||
|  |  * FormAdd() | ||||||
|  |  *	 | ||||||
|  |  * Stores a 'name=value' formpost parameter and builds the appropriate | ||||||
|  |  * linked list. | ||||||
|  |  * | ||||||
|  |  * Has two principal functionalities: using files and byte arrays as | ||||||
|  |  * post parts. Byte arrays are either copied or just the pointer is stored | ||||||
|  |  * (as the user requests) while for files only the filename and not the | ||||||
|  |  * content is stored. | ||||||
|  |  * | ||||||
|  |  * While you may have only one byte array for each name, multiple filenames | ||||||
|  |  * are allowed (and because of this feature CURLFORM_END is needed after | ||||||
|  |  * using CURLFORM_FILE). | ||||||
|  |  * | ||||||
|  |  * Examples: | ||||||
|  |  * | ||||||
|  |  * Simple name/value pair with copied contents: | ||||||
|  |  * curl_formadd (&post, &last, CURLFORM_COPYNAME, "name", | ||||||
|  |  * CURLFORM_COPYCONTENTS, "value"); | ||||||
|  |  * | ||||||
|  |  * name/value pair where only the content pointer is remembered: | ||||||
|  |  * curl_formadd (&post, &last, CURLFORM_COPYNAME, "name", | ||||||
|  |  * CURLFORM_PTRCONTENTS, ptr, CURLFORM_CONTENTSLENGTH, 10); | ||||||
|  |  * (if CURLFORM_CONTENTSLENGTH is missing strlen () is used) | ||||||
|  |  * | ||||||
|  |  * storing a filename (CONTENTTYPE is optional!): | ||||||
|  |  * curl_formadd (&post, &last, CURLFORM_COPYNAME, "name", | ||||||
|  |  * CURLFORM_FILE, "filename1", CURLFORM_CONTENTTYPE, "plain/text", | ||||||
|  |  * CURLFORM_END); | ||||||
|  |  * | ||||||
|  |  * storing multiple filenames: | ||||||
|  |  * curl_formadd (&post, &last, CURLFORM_COPYNAME, "name", | ||||||
|  |  * CURLFORM_FILE, "filename1", CURLFORM_FILE, "filename2", CURLFORM_END); | ||||||
|  |  * | ||||||
|  |  * Returns 0 on success, 1 if the FormInfo allocation fails, 2 if one | ||||||
|  |  * option is given twice for one Form, 3 if a null pointer was given for | ||||||
|  |  * a char *, 4 if the allocation of a FormInfo struct failed, 5 if an | ||||||
|  |  * unknown option was used, 6 if the some FormInfo is not complete (or | ||||||
|  |  * has an error), 7 if a HttpPost struct cannot be allocated, and 8 | ||||||
|  |  * if some allocation for string copying failed. | ||||||
|  |  * | ||||||
|  |  ***************************************************************************/ | ||||||
|  |  | ||||||
|  | static | ||||||
|  | int FormAdd(struct HttpPost **httppost, | ||||||
|  |             struct HttpPost **last_post, | ||||||
|  |             va_list params) | ||||||
|  | { | ||||||
|  |   FormInfo *first_form_info, *current_form_info, *form_info; | ||||||
|  |   int return_value = 0; | ||||||
|  |   const char *prevtype = NULL; | ||||||
|  |   struct HttpPost *post = NULL; | ||||||
|  |   CURLformoption next_option; | ||||||
|  |  | ||||||
|  |   first_form_info = (FormInfo *)malloc(sizeof(struct FormInfo)); | ||||||
|  |   if(first_form_info) { | ||||||
|  |     memset(first_form_info, 0, sizeof(FormInfo)); | ||||||
|  |     current_form_info = first_form_info; | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |     return 1; | ||||||
|  |  | ||||||
|  |   /** TODO: first check whether char * is not NULL | ||||||
|  |       TODO: transfer.c | ||||||
|  |   */ | ||||||
|  |   while ( ((next_option = va_arg(params, CURLformoption)) != CURLFORM_END) && | ||||||
|  |           (return_value == 0) ) | ||||||
|  |   { | ||||||
|  |     switch (next_option) | ||||||
|  |     { | ||||||
|  |       case CURLFORM_PTRNAME: | ||||||
|  |         current_form_info->flags |= HTTPPOST_PTRNAME; /* fall through */ | ||||||
|  |       case CURLFORM_COPYNAME: | ||||||
|  |         if (current_form_info->name) | ||||||
|  |           return_value = 2; | ||||||
|  |         else { | ||||||
|  |           if (next_option == CURLFORM_PTRNAME) | ||||||
|  |             current_form_info->name = va_arg(params, char *); | ||||||
|  |           else { | ||||||
|  | 	    char *name = va_arg(params, char *); | ||||||
|  | 	    if (name) | ||||||
|  | 	      current_form_info->name = name; /* store for the moment */ | ||||||
|  | 	    else | ||||||
|  | 	      return_value = 3; | ||||||
|  | 	  } | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |       case CURLFORM_NAMELENGTH: | ||||||
|  |         if (current_form_info->namelength) | ||||||
|  |           return_value = 2; | ||||||
|  |         else | ||||||
|  |           current_form_info->namelength = va_arg(params, long); | ||||||
|  |         break; | ||||||
|  |       case CURLFORM_PTRCONTENTS: | ||||||
|  |         current_form_info->flags |= HTTPPOST_PTRCONTENTS; /* fall through */ | ||||||
|  |       case CURLFORM_COPYCONTENTS: | ||||||
|  |         if (current_form_info->value) | ||||||
|  |           return_value = 2; | ||||||
|  |         else { | ||||||
|  |           if (next_option == CURLFORM_PTRCONTENTS) | ||||||
|  |             current_form_info->value = va_arg(params, char *); | ||||||
|  |           else { | ||||||
|  | 	    char *value = va_arg(params, char *); | ||||||
|  | 	    if (value) | ||||||
|  | 	      current_form_info->value = value; /* store for the moment */ | ||||||
|  | 	    else | ||||||
|  | 	      return_value = 3; | ||||||
|  | 	  } | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |       case CURLFORM_CONTENTSLENGTH: | ||||||
|  |         if (current_form_info->contentslength) | ||||||
|  |           return_value = 2; | ||||||
|  |         else | ||||||
|  |           current_form_info->contentslength = va_arg(params, long); | ||||||
|  |         break; | ||||||
|  |       case CURLFORM_FILE: { | ||||||
|  | 	char *filename = va_arg(params, char *); | ||||||
|  | 	if (current_form_info->value) { | ||||||
|  |           if (current_form_info->flags & HTTPPOST_FILENAME) { | ||||||
|  | 	    if (filename) { | ||||||
|  | 	      if (!(current_form_info = AddFormInfo (strdup(filename), | ||||||
|  | 						     NULL, current_form_info))) | ||||||
|  | 		return_value = 4; | ||||||
|  | 	    } | ||||||
|  | 	    else | ||||||
|  | 	      return_value = 3; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |             return_value = 2; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  | 	  if (filename) | ||||||
|  | 	    current_form_info->value = strdup(filename); | ||||||
|  | 	  else | ||||||
|  | 	    return_value = 3; | ||||||
|  |           current_form_info->flags |= HTTPPOST_FILENAME; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |       case CURLFORM_CONTENTTYPE: { | ||||||
|  | 	char *contenttype = va_arg(params, char *); | ||||||
|  |         if (current_form_info->contenttype) { | ||||||
|  |           if (current_form_info->flags & HTTPPOST_FILENAME) { | ||||||
|  |             if (contenttype) { | ||||||
|  |               if (!(current_form_info = AddFormInfo (NULL, | ||||||
|  |                                                      strdup(contenttype), | ||||||
|  |                                                      current_form_info))) | ||||||
|  |                 return_value = 4; | ||||||
|  |             } | ||||||
|  | 	    else | ||||||
|  | 	      return_value = 3; | ||||||
|  |           } | ||||||
|  |           else | ||||||
|  |             return_value = 2; | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  | 	  if (contenttype) | ||||||
|  | 	    current_form_info->contenttype = strdup(contenttype); | ||||||
|  | 	  else | ||||||
|  | 	    return_value = 3; | ||||||
|  | 	} | ||||||
|  |         break; | ||||||
|  |       } | ||||||
|  |       default: | ||||||
|  |         fprintf (stderr, "got unknown CURLFORM_OPTION: %d\n", next_option); | ||||||
|  |         return_value = 5; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   /* go through the list, check for copleteness and if everything is | ||||||
|  |    * alright add the HttpPost item otherwise set return_value accordingly */ | ||||||
|  |   form_info = first_form_info; | ||||||
|  |   while (form_info != NULL) | ||||||
|  |   { | ||||||
|  |     if ( (!first_form_info->name) || | ||||||
|  |          (!form_info->value) || | ||||||
|  |          ( (!form_info->namelength) && | ||||||
|  |            (form_info->flags & HTTPPOST_PTRNAME) ) || | ||||||
|  | 	 ( (form_info->contentslength) && | ||||||
|  | 	   (form_info->flags & HTTPPOST_FILENAME) ) || | ||||||
|  | 	 ( (form_info->flags & HTTPPOST_FILENAME) && | ||||||
|  | 	   (form_info->flags & HTTPPOST_PTRCONTENTS) ) | ||||||
|  |          ) { | ||||||
|  |       return_value = 6; | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |       if ( (form_info->flags & HTTPPOST_FILENAME) && | ||||||
|  | 	   (!form_info->contenttype) ) { | ||||||
|  | 	/* our contenttype is missing */ | ||||||
|  | 	form_info->contenttype | ||||||
|  | 	  = strdup(ContentTypeForFilename(form_info->value, prevtype)); | ||||||
|  |       } | ||||||
|  |       if ( !(form_info->flags & HTTPPOST_PTRNAME) && | ||||||
|  | 	   (form_info == first_form_info) ) { | ||||||
|  | 	/* copy name (without strdup; possibly contains null characters) */ | ||||||
|  | 	if (AllocAndCopy(&form_info->name, form_info->namelength)) { | ||||||
|  | 	  return_value = 8; | ||||||
|  | 	  break; | ||||||
|  | 	} | ||||||
|  |       } | ||||||
|  |       if ( !(form_info->flags & HTTPPOST_FILENAME) && | ||||||
|  | 	   !(form_info->flags & HTTPPOST_PTRCONTENTS) ) { | ||||||
|  | 	/* copy value (without strdup; possibly contains null characters) */ | ||||||
|  | 	if (AllocAndCopy(&form_info->value, form_info->contentslength)) { | ||||||
|  | 	  return_value = 8; | ||||||
|  | 	  break; | ||||||
|  | 	} | ||||||
|  |       } | ||||||
|  |       if ( (post = AddHttpPost (form_info->name, form_info->namelength, | ||||||
|  |                                 form_info->value, form_info->contentslength, | ||||||
|  |                                 form_info->contenttype, form_info->flags, | ||||||
|  | 				post, httppost, | ||||||
|  |                                 last_post)) == NULL) { | ||||||
|  |         return_value = 7; | ||||||
|  |       } | ||||||
|  |       if (form_info->contenttype) | ||||||
|  | 	prevtype = form_info->contenttype; | ||||||
|  |     } | ||||||
|  |     form_info = form_info->more; | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   /* and finally delete the allocated memory */ | ||||||
|  |   form_info = first_form_info; | ||||||
|  |   while (form_info != NULL) { | ||||||
|  |     FormInfo *delete_form_info; | ||||||
|  |      | ||||||
|  |     delete_form_info = form_info; | ||||||
|  |     form_info = form_info->more; | ||||||
|  |     free (delete_form_info); | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   return return_value; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int curl_formadd(struct HttpPost **httppost, | ||||||
|  |                  struct HttpPost **last_post, | ||||||
|  |                  ...) | ||||||
|  | { | ||||||
|  |   va_list arg; | ||||||
|  |   int result; | ||||||
|  |   va_start(arg, last_post); | ||||||
|  |   result = FormAdd(httppost, last_post, arg); | ||||||
|  |   va_end(arg); | ||||||
|  |   return result; | ||||||
|  | } | ||||||
|  |  | ||||||
| static int AddFormData(struct FormData **formp, | static int AddFormData(struct FormData **formp, | ||||||
| 			void *line, |                        const void *line, | ||||||
|                        long length) |                        long length) | ||||||
| { | { | ||||||
|   struct FormData *newform = (struct FormData *) |   struct FormData *newform = (struct FormData *) | ||||||
| @@ -328,7 +820,7 @@ static int AddFormData(struct FormData **formp, | |||||||
|  |  | ||||||
|  |  | ||||||
| static int AddFormDataf(struct FormData **formp, | static int AddFormDataf(struct FormData **formp, | ||||||
| 			 char *fmt, ...) |                         const char *fmt, ...) | ||||||
| { | { | ||||||
|   char s[4096]; |   char s[4096]; | ||||||
|   va_list ap; |   va_list ap; | ||||||
| @@ -367,8 +859,8 @@ char *Curl_FormBoundary(void) | |||||||
|   return retstring; |   return retstring; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Used from http.c */  | /* Used from http.c, this cleans a built FormData linked list */  | ||||||
| void Curl_FormFree(struct FormData *form) | void Curl_formclean(struct FormData *form) | ||||||
| { | { | ||||||
|   struct FormData *next; |   struct FormData *next; | ||||||
|  |  | ||||||
| @@ -396,9 +888,9 @@ void curl_formfree(struct HttpPost *form) | |||||||
|     if(form->more) |     if(form->more) | ||||||
|       curl_formfree(form->more); |       curl_formfree(form->more); | ||||||
|  |  | ||||||
|     if(form->name) |     if( !(form->flags & HTTPPOST_PTRNAME) && form->name) | ||||||
|       free(form->name); /* free the name */ |       free(form->name); /* free the name */ | ||||||
|     if(form->contents) |     if( !(form->flags & HTTPPOST_PTRCONTENTS) && form->contents) | ||||||
|       free(form->contents); /* free the contents */ |       free(form->contents); /* free the contents */ | ||||||
|     if(form->contenttype) |     if(form->contenttype) | ||||||
|       free(form->contenttype); /* free the content type */ |       free(form->contenttype); /* free the content type */ | ||||||
| @@ -438,9 +930,12 @@ struct FormData *Curl_getFormData(struct HttpPost *post, | |||||||
|     /* boundary */ |     /* boundary */ | ||||||
|     size += AddFormDataf(&form, "\r\n--%s\r\n", boundary); |     size += AddFormDataf(&form, "\r\n--%s\r\n", boundary); | ||||||
|  |  | ||||||
|     size += AddFormDataf(&form, |     size += AddFormData(&form, | ||||||
| 			 "Content-Disposition: form-data; name=\"%s\"", |                         "Content-Disposition: form-data; name=\"", 0); | ||||||
| 			 post->name); |  | ||||||
|  |     size += AddFormData(&form, post->name, post->namelength); | ||||||
|  |  | ||||||
|  |     size += AddFormData(&form, "\"", 0); | ||||||
|  |  | ||||||
|     if(post->more) { |     if(post->more) { | ||||||
|       /* If used, this is a link to more file names, we must then do |       /* If used, this is a link to more file names, we must then do | ||||||
| @@ -501,7 +996,9 @@ struct FormData *Curl_getFormData(struct HttpPost *post, | |||||||
|  |  | ||||||
| 	fileread = strequal("-", file->contents)?stdin: | 	fileread = strequal("-", file->contents)?stdin: | ||||||
|           /* binary read for win32 crap */ |           /* binary read for win32 crap */ | ||||||
|           fopen(file->contents, "rb"); | /*VMS??*/ fopen(file->contents, "rb");  /* ONLY ALLOWS FOR STREAM FILES ON VMS */ | ||||||
|  | /*VMS?? Stream files are OK, as are FIXED & VAR files WITHOUT implied CC */ | ||||||
|  | /*VMS?? For implied CC, every record needs to have a \n appended & 1 added to SIZE */ | ||||||
| 	if(fileread) { | 	if(fileread) { | ||||||
| 	  while((nread = fread(buffer, 1, 1024, fileread))) { | 	  while((nread = fread(buffer, 1, 1024, fileread))) { | ||||||
| 	    size += AddFormData(&form, | 	    size += AddFormData(&form, | ||||||
| @@ -515,7 +1012,7 @@ struct FormData *Curl_getFormData(struct HttpPost *post, | |||||||
| 	} | 	} | ||||||
|       } else { |       } else { | ||||||
| 	/* include the contents we got */ | 	/* include the contents we got */ | ||||||
| 	size += AddFormData(&form, post->contents, 0); | 	size += AddFormData(&form, post->contents, post->contentslength); | ||||||
|       } |       } | ||||||
|     } while((file = file->more)); /* for each specified file for this field */ |     } while((file = file->more)); /* for each specified file for this field */ | ||||||
|  |  | ||||||
| @@ -558,6 +1055,52 @@ int Curl_FormReader(char *buffer, | |||||||
|                     size_t size, |                     size_t size, | ||||||
|                     size_t nitems, |                     size_t nitems, | ||||||
|                     FILE *mydata) |                     FILE *mydata) | ||||||
|  | { | ||||||
|  |   struct Form *form; | ||||||
|  |   int wantedsize; | ||||||
|  |   int gotsize = 0; | ||||||
|  |  | ||||||
|  |   form=(struct Form *)mydata; | ||||||
|  |  | ||||||
|  |   wantedsize = size * nitems; | ||||||
|  |  | ||||||
|  |   if(!form->data) | ||||||
|  |     return -1; /* nothing, error, empty */ | ||||||
|  |  | ||||||
|  |   do { | ||||||
|  |    | ||||||
|  |     if( (form->data->length - form->sent ) > wantedsize - gotsize) { | ||||||
|  |  | ||||||
|  |       memcpy(buffer + gotsize , form->data->line + form->sent, | ||||||
|  |              wantedsize - gotsize); | ||||||
|  |  | ||||||
|  |       form->sent += wantedsize-gotsize; | ||||||
|  |  | ||||||
|  |       return wantedsize; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     memcpy(buffer+gotsize, | ||||||
|  |            form->data->line + form->sent, | ||||||
|  |            (form->data->length - form->sent) ); | ||||||
|  |     gotsize += form->data->length - form->sent; | ||||||
|  |      | ||||||
|  |     form->sent = 0; | ||||||
|  |  | ||||||
|  |     form->data = form->data->next; /* advance */ | ||||||
|  |  | ||||||
|  |   } while(form->data); | ||||||
|  |   /* If we got an empty line and we have more data, we proceed to the next | ||||||
|  |      line immediately to avoid returning zero before we've reached the end. | ||||||
|  |      This is the bug reported November 22 1999 on curl 6.3. (Daniel) */ | ||||||
|  |  | ||||||
|  |   return gotsize; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* possible (old) fread() emulation that copies at most one line */ | ||||||
|  | int Curl_FormReadOneLine(char *buffer, | ||||||
|  |                          size_t size, | ||||||
|  |                          size_t nitems, | ||||||
|  |                          FILE *mydata) | ||||||
| { | { | ||||||
|   struct Form *form; |   struct Form *form; | ||||||
|   int wantedsize; |   int wantedsize; | ||||||
| @@ -599,6 +1142,134 @@ int Curl_FormReader(char *buffer, | |||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef _FORM_DEBUG | #ifdef _FORM_DEBUG | ||||||
|  | int FormAddTest(const char * errormsg, | ||||||
|  |                  struct HttpPost **httppost, | ||||||
|  |                  struct HttpPost **last_post, | ||||||
|  |                  ...) | ||||||
|  | { | ||||||
|  |   int result; | ||||||
|  |   va_list arg; | ||||||
|  |   va_start(arg, last_post); | ||||||
|  |   if ((result = FormAdd(httppost, last_post, arg))) | ||||||
|  |     fprintf (stderr, "ERROR doing FormAdd ret: %d action: %s\n", result, | ||||||
|  |              errormsg); | ||||||
|  |   va_end(arg); | ||||||
|  |   return result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |   char name1[] = "simple_COPYCONTENTS"; | ||||||
|  |   char name2[] = "COPYCONTENTS_+_CONTENTTYPE"; | ||||||
|  |   char name3[] = "PTRNAME_+_NAMELENGTH_+_COPYNAME_+_CONTENTSLENGTH"; | ||||||
|  |   char name4[] = "simple_PTRCONTENTS"; | ||||||
|  |   char name5[] = "PTRCONTENTS_+_CONTENTSLENGTH"; | ||||||
|  |   char name6[] = "PTRCONTENTS_+_CONTENTSLENGTH_+_CONTENTTYPE"; | ||||||
|  |   char name7[] = "FILE1_+_CONTENTTYPE"; | ||||||
|  |   char name8[] = "FILE1_+_FILE2"; | ||||||
|  |   char name9[] = "FILE1_+_FILE2_+_FILE3"; | ||||||
|  |   char value1[] = "value for simple COPYCONTENTS"; | ||||||
|  |   char value2[] = "value for COPYCONTENTS + CONTENTTYPE"; | ||||||
|  |   char value3[] = "value for PTRNAME + NAMELENGTH + COPYNAME + CONTENTSLENGTH"; | ||||||
|  |   char value4[] = "value for simple PTRCONTENTS"; | ||||||
|  |   char value5[] = "value for PTRCONTENTS + CONTENTSLENGTH"; | ||||||
|  |   char value6[] = "value for PTRCOTNENTS + CONTENTSLENGTH + CONTENTTYPE"; | ||||||
|  |   char value7[] = "inet_ntoa_r.h"; | ||||||
|  |   char value8[] = "Makefile.b32.resp"; | ||||||
|  |   char type2[] = "image/gif"; | ||||||
|  |   char type6[] = "text/plain"; | ||||||
|  |   char type7[] = "text/html"; | ||||||
|  |   int name3length = strlen(name3); | ||||||
|  |   int value3length = strlen(value3); | ||||||
|  |   int value5length = strlen(value4); | ||||||
|  |   int value6length = strlen(value5); | ||||||
|  |   int errors = 0; | ||||||
|  |   int size; | ||||||
|  |   int nread; | ||||||
|  |   char buffer[4096]; | ||||||
|  |   struct HttpPost *httppost=NULL; | ||||||
|  |   struct HttpPost *last_post=NULL; | ||||||
|  |  | ||||||
|  |   struct FormData *form; | ||||||
|  |   struct Form formread; | ||||||
|  |  | ||||||
|  |   if (FormAddTest("simple COPYCONTENTS test", &httppost, &last_post, | ||||||
|  |                   CURLFORM_COPYNAME, name1, CURLFORM_COPYCONTENTS, value1, | ||||||
|  |                   CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |   if (FormAddTest("COPYCONTENTS  + CONTENTTYPE test", &httppost, &last_post, | ||||||
|  |                   CURLFORM_COPYNAME, name2, CURLFORM_COPYCONTENTS, value2, | ||||||
|  |                   CURLFORM_CONTENTTYPE, type2, CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |   /* make null character at start to check that contentslength works | ||||||
|  |      correctly */ | ||||||
|  |   name3[1] = '\0'; | ||||||
|  |   value3[1] = '\0'; | ||||||
|  |   if (FormAddTest("PTRNAME + NAMELENGTH + COPYNAME + CONTENTSLENGTH test", | ||||||
|  | 		  &httppost, &last_post, | ||||||
|  |                   CURLFORM_PTRNAME, name3, CURLFORM_COPYCONTENTS, value3, | ||||||
|  |                   CURLFORM_CONTENTSLENGTH, value3length, | ||||||
|  | 		  CURLFORM_NAMELENGTH, name3length, CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |   if (FormAddTest("simple PTRCONTENTS test", &httppost, &last_post, | ||||||
|  |                   CURLFORM_COPYNAME, name4, CURLFORM_PTRCONTENTS, value4, | ||||||
|  |                   CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |   /* make null character at start to check that contentslength works | ||||||
|  |      correctly */ | ||||||
|  |   value5[1] = '\0'; | ||||||
|  |   if (FormAddTest("PTRCONTENTS + CONTENTSLENGTH test", &httppost, &last_post, | ||||||
|  |                   CURLFORM_COPYNAME, name5, CURLFORM_PTRCONTENTS, value5, | ||||||
|  |                   CURLFORM_CONTENTSLENGTH, value5length, CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |   /* make null character at start to check that contentslength works | ||||||
|  |      correctly */ | ||||||
|  |   value6[1] = '\0'; | ||||||
|  |   if (FormAddTest("PTRCONTENTS + CONTENTSLENGTH + CONTENTTYPE test", | ||||||
|  |                   &httppost, &last_post, | ||||||
|  |                   CURLFORM_COPYNAME, name6, CURLFORM_PTRCONTENTS, value6, | ||||||
|  |                   CURLFORM_CONTENTSLENGTH, value6length, | ||||||
|  |                   CURLFORM_CONTENTTYPE, type6, CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |   if (FormAddTest("FILE + CONTENTTYPE test", &httppost, &last_post, | ||||||
|  |                   CURLFORM_COPYNAME, name7, CURLFORM_FILE, value7, | ||||||
|  |                   CURLFORM_CONTENTTYPE, type7, CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |   if (FormAddTest("FILE1 + FILE2 test", &httppost, &last_post, | ||||||
|  |                   CURLFORM_COPYNAME, name8, CURLFORM_FILE, value7, | ||||||
|  |                   CURLFORM_FILE, value8, CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |   if (FormAddTest("FILE1 + FILE2 + FILE3 test", &httppost, &last_post, | ||||||
|  |                   CURLFORM_COPYNAME, name9, CURLFORM_FILE, value7, | ||||||
|  |                   CURLFORM_FILE, value8, CURLFORM_FILE, value7, CURLFORM_END)) | ||||||
|  |     ++errors; | ||||||
|  |  | ||||||
|  |   form=Curl_getFormData(httppost, &size); | ||||||
|  |  | ||||||
|  |   Curl_FormInit(&formread, form); | ||||||
|  |  | ||||||
|  |   do { | ||||||
|  |     nread = Curl_FormReader(buffer, 1, sizeof(buffer), | ||||||
|  |                             (FILE *)&formread); | ||||||
|  |  | ||||||
|  |     if(-1 == nread) | ||||||
|  |       break; | ||||||
|  |     fwrite(buffer, nread, 1, stderr); | ||||||
|  |   } while(1); | ||||||
|  |  | ||||||
|  |   fprintf(stderr, "size: %d\n", size); | ||||||
|  |   if (errors) | ||||||
|  |     fprintf(stderr, "\n==> %d Test(s) failed!\n", errors); | ||||||
|  |   else | ||||||
|  |     fprintf(stdout, "\nAll Tests seem to have worked (please check output)\n"); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifdef _OLD_FORM_DEBUG | ||||||
|  |  | ||||||
| int main(int argc, char **argv) | int main(int argc, char **argv) | ||||||
| { | { | ||||||
| @@ -651,3 +1322,11 @@ int main(int argc, char **argv) | |||||||
| } | } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -36,6 +36,17 @@ struct Form { | |||||||
| 	       been sent in a previous invoke */ | 	       been sent in a previous invoke */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | /* used by FormAdd for temporary storage */ | ||||||
|  | typedef struct FormInfo { | ||||||
|  |   char *name; | ||||||
|  |   long namelength; | ||||||
|  |   char *value; | ||||||
|  |   long contentslength; | ||||||
|  |   char *contenttype; | ||||||
|  |   long flags; | ||||||
|  |   struct FormInfo *more; | ||||||
|  | } FormInfo; | ||||||
|  |  | ||||||
| int Curl_FormInit(struct Form *form, struct FormData *formdata ); | int Curl_FormInit(struct Form *form, struct FormData *formdata ); | ||||||
|  |  | ||||||
| struct FormData *Curl_getFormData(struct HttpPost *post, | struct FormData *Curl_getFormData(struct HttpPost *post, | ||||||
| @@ -47,8 +58,15 @@ int Curl_FormReader(char *buffer, | |||||||
|                     size_t nitems, |                     size_t nitems, | ||||||
|                     FILE *mydata); |                     FILE *mydata); | ||||||
|  |  | ||||||
|  | /* possible (old) fread() emulation that copies at most one line */ | ||||||
|  | int Curl_FormReadOneLine(char *buffer, | ||||||
|  |                          size_t size, | ||||||
|  |                          size_t nitems, | ||||||
|  |                          FILE *mydata); | ||||||
|  |  | ||||||
| char *Curl_FormBoundary(void); | char *Curl_FormBoundary(void); | ||||||
|  |  | ||||||
| void Curl_FormFree(struct FormData *); | void Curl_formclean(struct FormData *); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,7 +28,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn); | |||||||
| CURLcode Curl_ftp_connect(struct connectdata *conn); | CURLcode Curl_ftp_connect(struct connectdata *conn); | ||||||
| CURLcode Curl_ftp_disconnect(struct connectdata *conn); | CURLcode Curl_ftp_disconnect(struct connectdata *conn); | ||||||
|  |  | ||||||
| size_t Curl_ftpsendf(int fd, struct connectdata *, char *fmt, ...); | size_t Curl_ftpsendf(int fd, struct connectdata *, const char *fmt, ...); | ||||||
|  |  | ||||||
| /* The kerberos stuff needs this: */ | /* The kerberos stuff needs this: */ | ||||||
| int Curl_GetFTPResponse(int sockfd, char *buf, | int Curl_GetFTPResponse(int sockfd, char *buf, | ||||||
|   | |||||||
| @@ -1524,9 +1524,11 @@ yyerrhandle: | |||||||
|    the same signature as the function definition does. */ |    the same signature as the function definition does. */ | ||||||
| #include "getdate.h" | #include "getdate.h" | ||||||
|  |  | ||||||
|  | #ifndef WIN32 /* the windows dudes don't need these, does anyone really? */ | ||||||
| extern struct tm	*gmtime (); | extern struct tm	*gmtime (); | ||||||
| extern struct tm	*localtime (); | extern struct tm	*localtime (); | ||||||
| extern time_t		mktime (); | extern time_t		mktime (); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /* Month and day table. */ | /* Month and day table. */ | ||||||
| static TABLE const MonthDayTable[] = { | static TABLE const MonthDayTable[] = { | ||||||
| @@ -2124,3 +2126,11 @@ main (ac, av) | |||||||
|   /* NOTREACHED */ |   /* NOTREACHED */ | ||||||
| } | } | ||||||
| #endif /* defined (TEST) */ | #endif /* defined (TEST) */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -477,9 +477,11 @@ o_merid	: /* NULL */ | |||||||
|    the same signature as the function definition does. */ |    the same signature as the function definition does. */ | ||||||
| #include "getdate.h" | #include "getdate.h" | ||||||
|  |  | ||||||
|  | #ifndef WIN32 /* the windows dudes don't need these, does anyone really? */ | ||||||
| extern struct tm	*gmtime (); | extern struct tm	*gmtime (); | ||||||
| extern struct tm	*localtime (); | extern struct tm	*localtime (); | ||||||
| extern time_t		mktime (); | extern time_t		mktime (); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /* Month and day table. */ | /* Month and day table. */ | ||||||
| static TABLE const MonthDayTable[] = { | static TABLE const MonthDayTable[] = { | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								lib/getenv.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								lib/getenv.c
									
									
									
									
									
								
							| @@ -29,12 +29,16 @@ | |||||||
| #include <windows.h> | #include <windows.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef VMS | ||||||
|  | #include <unixlib.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #ifdef MALLOCDEBUG | #ifdef MALLOCDEBUG | ||||||
| #include "memdebug.h" | #include "memdebug.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static | static | ||||||
| char *GetEnv(char *variable) | char *GetEnv(const char *variable) | ||||||
| { | { | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|   /* This shit requires windows.h (HUGE) to be included */ |   /* This shit requires windows.h (HUGE) to be included */ | ||||||
| @@ -43,14 +47,30 @@ char *GetEnv(char *variable) | |||||||
|   env[0] = '\0'; |   env[0] = '\0'; | ||||||
|   if (temp != NULL) |   if (temp != NULL) | ||||||
|     ExpandEnvironmentStrings(temp, env, sizeof(env)); |     ExpandEnvironmentStrings(temp, env, sizeof(env)); | ||||||
|  | #else | ||||||
|  | #ifdef	VMS | ||||||
|  |   char *env = getenv(variable); | ||||||
|  |   if (env && strcmp("HOME",variable) == 0) { | ||||||
|  | 	env = decc$translate_vms(env); | ||||||
|  |   } | ||||||
|  | /*  printf ("Getenv: %s=%s\n",variable,env); */ | ||||||
| #else | #else | ||||||
|   /* no length control */ |   /* no length control */ | ||||||
|   char *env = getenv(variable); |   char *env = getenv(variable); | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|   return (env && env[0])?strdup(env):NULL; |   return (env && env[0])?strdup(env):NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| char *curl_getenv(char *v) | char *curl_getenv(const char *v) | ||||||
| { | { | ||||||
|   return GetEnv(v); |   return GetEnv(v); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -31,13 +31,32 @@ | |||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
|  |  | ||||||
| CURLcode Curl_getinfo(CURL *curl, CURLINFO info, ...) | /* | ||||||
|  |  * This is supposed to be called in the beginning of a permform() session | ||||||
|  |  * and should reset all session-info variables | ||||||
|  |  */ | ||||||
|  | CURLcode Curl_initinfo(struct SessionHandle *data) | ||||||
|  | { | ||||||
|  |   struct Progress *pro = &data->progress; | ||||||
|  |   struct PureInfo *info =&data->info; | ||||||
|  |  | ||||||
|  |   pro->t_nslookup = 0; | ||||||
|  |   pro->t_connect = 0; | ||||||
|  |   pro->t_pretransfer = 0; | ||||||
|  |  | ||||||
|  |   info->httpcode = 0; | ||||||
|  |   info->httpversion=0; | ||||||
|  |   info->filetime=0; | ||||||
|  |  | ||||||
|  |   return CURLE_OK; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...) | ||||||
| { | { | ||||||
|   va_list arg; |   va_list arg; | ||||||
|   long *param_longp; |   long *param_longp; | ||||||
|   double *param_doublep; |   double *param_doublep; | ||||||
|   char **param_charp; |   char **param_charp; | ||||||
|   struct UrlData *data = (struct UrlData *)curl; |  | ||||||
|   va_start(arg, info); |   va_start(arg, info); | ||||||
|  |  | ||||||
|   switch(info&CURLINFO_TYPEMASK) { |   switch(info&CURLINFO_TYPEMASK) { | ||||||
| @@ -62,19 +81,19 @@ CURLcode Curl_getinfo(CURL *curl, CURLINFO info, ...) | |||||||
|    |    | ||||||
|   switch(info) { |   switch(info) { | ||||||
|   case CURLINFO_EFFECTIVE_URL: |   case CURLINFO_EFFECTIVE_URL: | ||||||
|     *param_charp = data->url?data->url:""; |     *param_charp = data->change.url?data->change.url:(char *)""; | ||||||
|     break; |     break; | ||||||
|   case CURLINFO_HTTP_CODE: |   case CURLINFO_HTTP_CODE: | ||||||
|     *param_longp = data->progress.httpcode; |     *param_longp = data->info.httpcode; | ||||||
|     break; |     break; | ||||||
|   case CURLINFO_FILETIME: |   case CURLINFO_FILETIME: | ||||||
|     *param_longp = data->progress.filetime; |     *param_longp = data->info.filetime; | ||||||
|     break; |     break; | ||||||
|   case CURLINFO_HEADER_SIZE: |   case CURLINFO_HEADER_SIZE: | ||||||
|     *param_longp = data->header_size; |     *param_longp = data->info.header_size; | ||||||
|     break; |     break; | ||||||
|   case CURLINFO_REQUEST_SIZE: |   case CURLINFO_REQUEST_SIZE: | ||||||
|     *param_longp = data->request_size; |     *param_longp = data->info.request_size; | ||||||
|     break; |     break; | ||||||
|   case CURLINFO_TOTAL_TIME: |   case CURLINFO_TOTAL_TIME: | ||||||
|     *param_doublep = data->progress.timespent; |     *param_doublep = data->progress.timespent; | ||||||
| @@ -101,7 +120,7 @@ CURLcode Curl_getinfo(CURL *curl, CURLINFO info, ...) | |||||||
|     *param_doublep = data->progress.ulspeed; |     *param_doublep = data->progress.ulspeed; | ||||||
|     break; |     break; | ||||||
|   case CURLINFO_SSL_VERIFYRESULT: |   case CURLINFO_SSL_VERIFYRESULT: | ||||||
|     *param_longp = data->ssl.certverifyresult; |     *param_longp = data->set.ssl.certverifyresult; | ||||||
|     break; |     break; | ||||||
|   case CURLINFO_CONTENT_LENGTH_DOWNLOAD: |   case CURLINFO_CONTENT_LENGTH_DOWNLOAD: | ||||||
|     *param_doublep = data->progress.size_dl; |     *param_doublep = data->progress.size_dl; | ||||||
| @@ -114,3 +133,11 @@ CURLcode Curl_getinfo(CURL *curl, CURLINFO info, ...) | |||||||
|   } |   } | ||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								lib/getinfo.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								lib/getinfo.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | #ifndef __GETINFO_H | ||||||
|  | #define __GETINFO_H | ||||||
|  | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _      | ||||||
|  |  *  Project                     ___| | | |  _ \| |     | ||||||
|  |  *                             / __| | | | |_) | |     | ||||||
|  |  *                            | (__| |_| |  _ <| |___  | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
|  |  * | ||||||
|  |  * In order to be useful for every potential user, curl and libcurl are | ||||||
|  |  * dual-licensed under the MPL and the MIT/X-derivate licenses. | ||||||
|  |  * | ||||||
|  |  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||||
|  |  * copies of the Software, and permit persons to whom the Software is | ||||||
|  |  * furnished to do so, under the terms of the MPL or the MIT/X-derivate | ||||||
|  |  * licenses. You may pick one of these licenses. | ||||||
|  |  * | ||||||
|  |  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||||
|  |  * KIND, either express or implied. | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  *****************************************************************************/ | ||||||
|  | CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...); | ||||||
|  | CURLcode Curl_initinfo(struct SessionHandle *data); | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @@ -42,6 +42,30 @@ | |||||||
| #ifndef HAVE_GETPASS_R | #ifndef HAVE_GETPASS_R | ||||||
|  |  | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  | #ifdef	VMS | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include descrip | ||||||
|  | #include starlet | ||||||
|  | #include iodef | ||||||
|  | #include iosbdef | ||||||
|  | char *getpass_r(const char *prompt, char *buffer, size_t buflen) | ||||||
|  | { | ||||||
|  | 	long sts; | ||||||
|  | 	short chan; | ||||||
|  | 	struct _iosb iosb; | ||||||
|  | 	$DESCRIPTOR(ttdesc, "TT"); | ||||||
|  |  | ||||||
|  | 	buffer[0]='\0'; | ||||||
|  | 	if ((sts = sys$assign(&ttdesc, &chan,0,0)) & 1) { | ||||||
|  | 		if (((sts = sys$qiow(0, chan, IO$_READPROMPT | IO$M_NOECHO, &iosb, 0, 0, buffer, buflen, 0, 0, prompt, strlen(prompt))) & 1) && (iosb.iosb$w_status&1)) { | ||||||
|  | 			buffer[iosb.iosb$w_bcnt] = '\0'; | ||||||
|  | 		}  | ||||||
|  | 		sts = sys$dassgn(chan); | ||||||
|  | 	} | ||||||
|  | 	return buffer; /* we always return success */ | ||||||
|  | } | ||||||
|  | #else /* VMS */ | ||||||
| #ifdef HAVE_TERMIOS_H | #ifdef HAVE_TERMIOS_H | ||||||
| #  if !defined(HAVE_TCGETATTR) && !defined(HAVE_TCSETATTR)  | #  if !defined(HAVE_TCGETATTR) && !defined(HAVE_TCSETATTR)  | ||||||
| #    undef HAVE_TERMIOS_H | #    undef HAVE_TERMIOS_H | ||||||
| @@ -186,6 +210,7 @@ char *getpass_r(const char *prompt, char *buffer, size_t buflen) | |||||||
|  |  | ||||||
|   return buffer; /* we always return success */ |   return buffer; /* we always return success */ | ||||||
| } | } | ||||||
|  | #endif /* VMS */ | ||||||
| #else /* WIN32 */ | #else /* WIN32 */ | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <conio.h> | #include <conio.h> | ||||||
| @@ -219,3 +244,11 @@ char *getpass(const char *prompt) | |||||||
|   return getpass_r(prompt, buf, sizeof(buf)); |   return getpass_r(prompt, buf, sizeof(buf)); | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ | |||||||
| /* | /* | ||||||
|  * Returning NULL will abort the continued operation! |  * Returning NULL will abort the continued operation! | ||||||
|  */ |  */ | ||||||
| char* getpass_r(char *prompt, char* buffer, size_t buflen ); | char* getpass_r(const char *prompt, char* buffer, size_t buflen ); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								lib/hostip.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								lib/hostip.c
									
									
									
									
									
								
							| @@ -28,6 +28,7 @@ | |||||||
|  |  | ||||||
| #define _REENTRANT | #define _REENTRANT | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | #if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) | ||||||
| #include <winsock.h> | #include <winsock.h> | ||||||
| #else | #else | ||||||
| @@ -46,6 +47,10 @@ | |||||||
| #ifdef HAVE_ARPA_INET_H | #ifdef HAVE_ARPA_INET_H | ||||||
| #include <arpa/inet.h> | #include <arpa/inet.h> | ||||||
| #endif | #endif | ||||||
|  | #ifdef	VMS | ||||||
|  | #include <inet.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include "urldata.h" | #include "urldata.h" | ||||||
| @@ -84,7 +89,7 @@ static char *MakeIP(unsigned long num,char *addr, int addr_len) | |||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef ENABLE_IPV6 | #ifdef ENABLE_IPV6 | ||||||
| struct addrinfo *Curl_getaddrinfo(struct UrlData *data, | struct addrinfo *Curl_getaddrinfo(struct SessionHandle *data, | ||||||
| 			       char *hostname, | 			       char *hostname, | ||||||
| 			       int port) | 			       int port) | ||||||
| { | { | ||||||
| @@ -114,7 +119,7 @@ struct addrinfo *Curl_getaddrinfo(struct UrlData *data, | |||||||
| #define INADDR_NONE (unsigned long) ~0 | #define INADDR_NONE (unsigned long) ~0 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| struct hostent *Curl_gethost(struct UrlData *data, | struct hostent *Curl_gethost(struct SessionHandle *data, | ||||||
|                              char *hostname, |                              char *hostname, | ||||||
|                              char **bufp) |                              char **bufp) | ||||||
| { | { | ||||||
| @@ -210,3 +215,11 @@ struct hostent *Curl_gethost(struct UrlData *data, | |||||||
|   } |   } | ||||||
|   return (h); |   return (h); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -24,11 +24,11 @@ | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
|  |  | ||||||
| struct addrinfo; | struct addrinfo; | ||||||
| struct addrinfo *Curl_getaddrinfo(struct UrlData *data, | struct addrinfo *Curl_getaddrinfo(struct SessionHandle *data, | ||||||
|                              char *hostname, |                              char *hostname, | ||||||
|                              int port); |                              int port); | ||||||
|  |  | ||||||
| struct hostent *Curl_gethost(struct UrlData *data, | struct hostent *Curl_gethost(struct SessionHandle *data, | ||||||
|                              char *hostname, |                              char *hostname, | ||||||
|                              char **bufp); |                              char **bufp); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										233
									
								
								lib/http.c
									
									
									
									
									
								
							
							
						
						
									
										233
									
								
								lib/http.c
									
									
									
									
									
								
							| @@ -104,7 +104,7 @@ | |||||||
|  * be sent in one go. |  * be sent in one go. | ||||||
|  */ |  */ | ||||||
| static CURLcode | static CURLcode | ||||||
|  add_buffer(send_buffer *in, void *inptr, size_t size); |  add_buffer(send_buffer *in, const void *inptr, size_t size); | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * add_buffer_init() returns a fine buffer struct |  * add_buffer_init() returns a fine buffer struct | ||||||
| @@ -128,10 +128,10 @@ static | |||||||
| size_t add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in) | size_t add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in) | ||||||
| { | { | ||||||
|   size_t amount; |   size_t amount; | ||||||
|   if(conn->data->bits.verbose) { |   if(conn->data->set.verbose) { | ||||||
|     fputs("> ", conn->data->err); |     fputs("> ", conn->data->set.err); | ||||||
|     /* this data _may_ contain binary stuff */ |     /* this data _may_ contain binary stuff */ | ||||||
|     fwrite(in->buffer, in->size_used, 1, conn->data->err); |     fwrite(in->buffer, in->size_used, 1, conn->data->set.err); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   Curl_write(conn, sockfd, in->buffer, in->size_used, &amount); |   Curl_write(conn, sockfd, in->buffer, in->size_used, &amount); | ||||||
| @@ -148,7 +148,7 @@ size_t add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in) | |||||||
|  * add_bufferf() builds a buffer from the formatted input |  * add_bufferf() builds a buffer from the formatted input | ||||||
|  */ |  */ | ||||||
| static | static | ||||||
| CURLcode add_bufferf(send_buffer *in, char *fmt, ...) | CURLcode add_bufferf(send_buffer *in, const char *fmt, ...) | ||||||
| { | { | ||||||
|   CURLcode result = CURLE_OUT_OF_MEMORY; |   CURLcode result = CURLE_OUT_OF_MEMORY; | ||||||
|   char *s; |   char *s; | ||||||
| @@ -168,12 +168,11 @@ CURLcode add_bufferf(send_buffer *in, char *fmt, ...) | |||||||
|  * add_buffer() appends a memory chunk to the existing one |  * add_buffer() appends a memory chunk to the existing one | ||||||
|  */ |  */ | ||||||
| static | static | ||||||
| CURLcode add_buffer(send_buffer *in, void *inptr, size_t size) | CURLcode add_buffer(send_buffer *in, const void *inptr, size_t size) | ||||||
| { | { | ||||||
|   char *new_rb; |   char *new_rb; | ||||||
|   int new_size; |   int new_size; | ||||||
|  |  | ||||||
|   if(size > 0) { |  | ||||||
|   if(!in->buffer || |   if(!in->buffer || | ||||||
|      ((in->size_used + size) > (in->size_max - 1))) { |      ((in->size_used + size) > (in->size_max - 1))) { | ||||||
|     new_size = (in->size_used+size)*2; |     new_size = (in->size_used+size)*2; | ||||||
| @@ -193,7 +192,6 @@ CURLcode add_buffer(send_buffer *in, void *inptr, size_t size) | |||||||
|   memcpy(&in->buffer[in->size_used], inptr, size); |   memcpy(&in->buffer[in->size_used], inptr, size); | ||||||
|        |        | ||||||
|   in->size_used += size; |   in->size_used += size; | ||||||
|   } |  | ||||||
|  |  | ||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
| @@ -211,7 +209,7 @@ int GetLine(int sockfd, char *buf, struct connectdata *conn) | |||||||
|   ssize_t nread; |   ssize_t nread; | ||||||
|   int read_rc=1; |   int read_rc=1; | ||||||
|   char *ptr; |   char *ptr; | ||||||
|   struct UrlData *data=conn->data; |   struct SessionHandle *data=conn->data; | ||||||
|  |  | ||||||
|   ptr=buf; |   ptr=buf; | ||||||
|  |  | ||||||
| @@ -226,10 +224,10 @@ int GetLine(int sockfd, char *buf, struct connectdata *conn) | |||||||
|   } |   } | ||||||
|   *ptr=0; /* zero terminate */ |   *ptr=0; /* zero terminate */ | ||||||
|    |    | ||||||
|   if(data->bits.verbose) { |   if(data->set.verbose) { | ||||||
|     fputs("< ", data->err); |     fputs("< ", data->set.err); | ||||||
|     fwrite(buf, 1, nread, data->err); |     fwrite(buf, 1, nread, data->set.err); | ||||||
|     fputs("\n", data->err); |     fputs("\n", data->set.err); | ||||||
|   } |   } | ||||||
|   return nread>0?nread:0; |   return nread>0?nread:0; | ||||||
| } | } | ||||||
| @@ -240,12 +238,12 @@ int GetLine(int sockfd, char *buf, struct connectdata *conn) | |||||||
|  * This function checks the linked list of custom HTTP headers for a particular |  * This function checks the linked list of custom HTTP headers for a particular | ||||||
|  * header (prefix). |  * header (prefix). | ||||||
|  */ |  */ | ||||||
| bool static checkheaders(struct UrlData *data, char *thisheader) | static bool checkheaders(struct SessionHandle *data, const char *thisheader) | ||||||
| { | { | ||||||
|   struct curl_slist *head; |   struct curl_slist *head; | ||||||
|   size_t thislen = strlen(thisheader); |   size_t thislen = strlen(thisheader); | ||||||
|  |  | ||||||
|   for(head = data->headers; head; head=head->next) { |   for(head = data->set.headers; head; head=head->next) { | ||||||
|     if(strnequal(head->data, thisheader, thislen)) { |     if(strnequal(head->data, thisheader, thislen)) { | ||||||
|       return TRUE; |       return TRUE; | ||||||
|     } |     } | ||||||
| @@ -265,7 +263,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | |||||||
| { | { | ||||||
|   int httperror=0; |   int httperror=0; | ||||||
|   int subversion=0; |   int subversion=0; | ||||||
|   struct UrlData *data=conn->data; |   struct SessionHandle *data=conn->data; | ||||||
|  |  | ||||||
|   infof(data, "Establish HTTP proxy tunnel to %s:%d\n", hostname, remote_port); |   infof(data, "Establish HTTP proxy tunnel to %s:%d\n", hostname, remote_port); | ||||||
|  |  | ||||||
| @@ -277,14 +275,14 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | |||||||
|              "\r\n", |              "\r\n", | ||||||
|              hostname, remote_port, |              hostname, remote_port, | ||||||
|              (conn->bits.proxy_user_passwd)?conn->allocptr.proxyuserpwd:"", |              (conn->bits.proxy_user_passwd)?conn->allocptr.proxyuserpwd:"", | ||||||
|              (data->useragent?conn->allocptr.uagent:"") |              (data->set.useragent?conn->allocptr.uagent:"") | ||||||
|              ); |              ); | ||||||
|  |  | ||||||
|   /* wait for the proxy to send us a HTTP/1.0 200 OK header */ |   /* wait for the proxy to send us a HTTP/1.0 200 OK header */ | ||||||
|   while(GetLine(tunnelsocket, data->buffer, conn)) { |   while(GetLine(tunnelsocket, data->state.buffer, conn)) { | ||||||
|     if('\r' == data->buffer[0]) |     if('\r' == data->state.buffer[0]) | ||||||
|       break; /* end of headers */ |       break; /* end of headers */ | ||||||
|     if(2 == sscanf(data->buffer, "HTTP/1.%d %d", |     if(2 == sscanf(data->state.buffer, "HTTP/1.%d %d", | ||||||
|                    &subversion, |                    &subversion, | ||||||
|                    &httperror)) { |                    &httperror)) { | ||||||
|       ; |       ; | ||||||
| @@ -308,7 +306,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn, | |||||||
|  */ |  */ | ||||||
| CURLcode Curl_http_connect(struct connectdata *conn) | CURLcode Curl_http_connect(struct connectdata *conn) | ||||||
| { | { | ||||||
|   struct UrlData *data; |   struct SessionHandle *data; | ||||||
|   CURLcode result; |   CURLcode result; | ||||||
|  |  | ||||||
|   data=conn->data; |   data=conn->data; | ||||||
| @@ -320,7 +318,7 @@ CURLcode Curl_http_connect(struct connectdata *conn) | |||||||
|    * has occured, can we start talking SSL |    * has occured, can we start talking SSL | ||||||
|    */ |    */ | ||||||
|   if (conn->protocol & PROT_HTTPS) { |   if (conn->protocol & PROT_HTTPS) { | ||||||
|     if (data->bits.httpproxy) { |     if (data->change.proxy) { | ||||||
|       /* HTTPS through a proxy can only be done with a tunnel */ |       /* HTTPS through a proxy can only be done with a tunnel */ | ||||||
|       result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket, |       result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket, | ||||||
|                                            conn->hostname, conn->remote_port); |                                            conn->hostname, conn->remote_port); | ||||||
| @@ -334,10 +332,10 @@ CURLcode Curl_http_connect(struct connectdata *conn) | |||||||
|       return result; |       return result; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if(conn->bits.user_passwd && !data->bits.this_is_a_follow) { |   if(conn->bits.user_passwd && !data->state.this_is_a_follow) { | ||||||
|     /* Authorization: is requested, this is not a followed location, get the |     /* Authorization: is requested, this is not a followed location, get the | ||||||
|        original host name */ |        original host name */ | ||||||
|     data->auth_host = strdup(conn->hostname); |     data->state.auth_host = strdup(conn->hostname); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| @@ -347,29 +345,29 @@ CURLcode Curl_http_connect(struct connectdata *conn) | |||||||
|    protocol-specific resources */ |    protocol-specific resources */ | ||||||
| CURLcode Curl_http_close(struct connectdata *conn) | CURLcode Curl_http_close(struct connectdata *conn) | ||||||
| { | { | ||||||
|   if(conn->data->auth_host) |   if(conn->data->state.auth_host) | ||||||
|     free(conn->data->auth_host); |     free(conn->data->state.auth_host); | ||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
| CURLcode Curl_http_done(struct connectdata *conn) | CURLcode Curl_http_done(struct connectdata *conn) | ||||||
| { | { | ||||||
|   struct UrlData *data; |   struct SessionHandle *data; | ||||||
|   long *bytecount = &conn->bytecount; |   long *bytecount = &conn->bytecount; | ||||||
|   struct HTTP *http; |   struct HTTP *http; | ||||||
|  |  | ||||||
|   data=conn->data; |   data=conn->data; | ||||||
|   http=conn->proto.http; |   http=conn->proto.http; | ||||||
|  |  | ||||||
|   if(HTTPREQ_POST_FORM == data->httpreq) { |   if(HTTPREQ_POST_FORM == data->set.httpreq) { | ||||||
|     *bytecount = http->readbytecount + http->writebytecount; |     *bytecount = http->readbytecount + http->writebytecount; | ||||||
|        |        | ||||||
|     Curl_FormFree(http->sendit); /* Now free that whole lot */ |     Curl_formclean(http->sendit); /* Now free that whole lot */ | ||||||
|  |  | ||||||
|     data->fread = http->storefread; /* restore */ |     data->set.fread = http->storefread; /* restore */ | ||||||
|     data->in = http->in; /* restore */ |     data->set.in = http->in; /* restore */ | ||||||
|   } |   } | ||||||
|   else if(HTTPREQ_PUT == data->httpreq) { |   else if(HTTPREQ_PUT == data->set.httpreq) { | ||||||
|     *bytecount = http->readbytecount + http->writebytecount; |     *bytecount = http->readbytecount + http->writebytecount; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -379,8 +377,8 @@ CURLcode Curl_http_done(struct connectdata *conn) | |||||||
|  |  | ||||||
| CURLcode Curl_http(struct connectdata *conn) | CURLcode Curl_http(struct connectdata *conn) | ||||||
| { | { | ||||||
|   struct UrlData *data=conn->data; |   struct SessionHandle *data=conn->data; | ||||||
|   char *buf = data->buffer; /* this is a short cut to the buffer */ |   char *buf = data->state.buffer; /* this is a short cut to the buffer */ | ||||||
|   CURLcode result=CURLE_OK; |   CURLcode result=CURLE_OK; | ||||||
|   struct HTTP *http; |   struct HTTP *http; | ||||||
|   struct Cookie *co=NULL; /* no cookies from start */ |   struct Cookie *co=NULL; /* no cookies from start */ | ||||||
| @@ -404,8 +402,8 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|   conn->bits.close = FALSE; |   conn->bits.close = FALSE; | ||||||
|  |  | ||||||
|   if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) && |   if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) && | ||||||
|        data->bits.upload) { |        data->set.upload) { | ||||||
|     data->httpreq = HTTPREQ_PUT; |     data->set.httpreq = HTTPREQ_PUT; | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   /* The User-Agent string has been built in url.c already, because it might |   /* The User-Agent string has been built in url.c already, because it might | ||||||
| @@ -422,11 +420,12 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|  |  | ||||||
|     /* 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 */ | ||||||
|     if(!data->bits.this_is_a_follow || |     if(!data->state.this_is_a_follow || | ||||||
|        !data->auth_host || |        !data->state.auth_host || | ||||||
|        strequal(data->auth_host, conn->hostname)) { |        strequal(data->state.auth_host, conn->hostname)) { | ||||||
|       sprintf(data->buffer, "%s:%s", data->user, data->passwd); |       sprintf(data->state.buffer, "%s:%s", | ||||||
|       if(Curl_base64_encode(data->buffer, strlen(data->buffer), |               data->state.user, data->state.passwd); | ||||||
|  |       if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer), | ||||||
|                             &authorization) >= 0) { |                             &authorization) >= 0) { | ||||||
|         if(conn->allocptr.userpwd) |         if(conn->allocptr.userpwd) | ||||||
|           free(conn->allocptr.userpwd); |           free(conn->allocptr.userpwd); | ||||||
| @@ -436,31 +435,30 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   if((data->bits.http_set_referer) && !checkheaders(data, "Referer:")) { |   if((data->change.referer) && !checkheaders(data, "Referer:")) { | ||||||
|     if(conn->allocptr.ref) |     if(conn->allocptr.ref) | ||||||
|       free(conn->allocptr.ref); |       free(conn->allocptr.ref); | ||||||
|     conn->allocptr.ref = aprintf("Referer: %s\015\012", data->referer); |     conn->allocptr.ref = aprintf("Referer: %s\015\012", data->change.referer); | ||||||
|   } |   } | ||||||
|   if(data->cookie && !checkheaders(data, "Cookie:")) { |   if(data->set.cookie && !checkheaders(data, "Cookie:")) { | ||||||
|     if(conn->allocptr.cookie) |     if(conn->allocptr.cookie) | ||||||
|       free(conn->allocptr.cookie); |       free(conn->allocptr.cookie); | ||||||
|     conn->allocptr.cookie = aprintf("Cookie: %s\015\012", data->cookie); |     conn->allocptr.cookie = aprintf("Cookie: %s\015\012", data->set.cookie); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if(data->cookies) { |   if(data->cookies) { | ||||||
|     co = Curl_cookie_getlist(data->cookies, |     co = Curl_cookie_getlist(data->cookies, | ||||||
|                              host, |                              host, ppath, | ||||||
|                              ppath, |  | ||||||
|                              conn->protocol&PROT_HTTPS?TRUE:FALSE); |                              conn->protocol&PROT_HTTPS?TRUE:FALSE); | ||||||
|   } |   } | ||||||
|   if ((data->bits.httpproxy) && !(conn->protocol&PROT_HTTPS))  { |   if ((data->change.proxy) && !(conn->protocol&PROT_HTTPS))  { | ||||||
|     /* The path sent to the proxy is in fact the entire URL */ |     /* The path sent to the proxy is in fact the entire URL */ | ||||||
|     ppath = data->url; |     ppath = data->change.url; | ||||||
|   } |   } | ||||||
|   if(HTTPREQ_POST_FORM == data->httpreq) { |   if(HTTPREQ_POST_FORM == data->set.httpreq) { | ||||||
|     /* we must build the whole darned post sequence first, so that we have |     /* we must build the whole darned post sequence first, so that we have | ||||||
|        a size of the whole shebang before we start to send it */ |        a size of the whole shebang before we start to send it */ | ||||||
|     http->sendit = Curl_getFormData(data->httppost, &http->postsize); |     http->sendit = Curl_getFormData(data->set.httppost, &http->postsize); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if(!checkheaders(data, "Host:")) { |   if(!checkheaders(data, "Host:")) { | ||||||
| @@ -488,9 +486,9 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|   if(!checkheaders(data, "Accept:")) |   if(!checkheaders(data, "Accept:")) | ||||||
|     http->p_accept = "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n"; |     http->p_accept = "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n"; | ||||||
|  |  | ||||||
|   if(( (HTTPREQ_POST == data->httpreq) || |   if(( (HTTPREQ_POST == data->set.httpreq) || | ||||||
|        (HTTPREQ_POST_FORM == data->httpreq) || |        (HTTPREQ_POST_FORM == data->set.httpreq) || | ||||||
|        (HTTPREQ_PUT == data->httpreq) ) && |        (HTTPREQ_PUT == data->set.httpreq) ) && | ||||||
|      conn->resume_from) { |      conn->resume_from) { | ||||||
|     /********************************************************************** |     /********************************************************************** | ||||||
|      * Resuming upload in HTTP means that we PUT or POST and that we have |      * Resuming upload in HTTP means that we PUT or POST and that we have | ||||||
| @@ -523,7 +521,8 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|           readthisamountnow = BUFSIZE; |           readthisamountnow = BUFSIZE; | ||||||
|  |  | ||||||
|         actuallyread = |         actuallyread = | ||||||
|           data->fread(data->buffer, 1, readthisamountnow, data->in); |           data->set.fread(data->state.buffer, 1, readthisamountnow, | ||||||
|  |                           data->set.in); | ||||||
|  |  | ||||||
|         passed += actuallyread; |         passed += actuallyread; | ||||||
|         if(actuallyread != readthisamountnow) { |         if(actuallyread != readthisamountnow) { | ||||||
| @@ -534,10 +533,10 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|       } while(passed != conn->resume_from); /* loop until done */ |       } while(passed != conn->resume_from); /* loop until done */ | ||||||
|  |  | ||||||
|       /* now, decrease the size of the read */ |       /* now, decrease the size of the read */ | ||||||
|       if(data->infilesize>0) { |       if(data->set.infilesize>0) { | ||||||
|         data->infilesize -= conn->resume_from; |         data->set.infilesize -= conn->resume_from; | ||||||
|  |  | ||||||
|         if(data->infilesize <= 0) { |         if(data->set.infilesize <= 0) { | ||||||
|           failf(data, "File already completely uploaded\n"); |           failf(data, "File already completely uploaded\n"); | ||||||
|           return CURLE_PARTIAL_FILE; |           return CURLE_PARTIAL_FILE; | ||||||
|         } |         } | ||||||
| @@ -551,16 +550,16 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|      * or uploading and we always let customized headers override our internal |      * or uploading and we always let customized headers override our internal | ||||||
|      * ones if any such are specified. |      * ones if any such are specified. | ||||||
|      */ |      */ | ||||||
|     if((data->httpreq == HTTPREQ_GET) && |     if((data->set.httpreq == HTTPREQ_GET) && | ||||||
|        !checkheaders(data, "Range:")) { |        !checkheaders(data, "Range:")) { | ||||||
|       conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n", conn->range); |       conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n", conn->range); | ||||||
|     } |     } | ||||||
|     else if((data->httpreq != HTTPREQ_GET) && |     else if((data->set.httpreq != HTTPREQ_GET) && | ||||||
|             !checkheaders(data, "Content-Range:")) { |             !checkheaders(data, "Content-Range:")) { | ||||||
|  |  | ||||||
|       if(conn->resume_from) { |       if(conn->resume_from) { | ||||||
|         /* This is because "resume" was selected */ |         /* This is because "resume" was selected */ | ||||||
|         long total_expected_size= conn->resume_from + data->infilesize; |         long total_expected_size= conn->resume_from + data->set.infilesize; | ||||||
|         conn->allocptr.rangeline = aprintf("Content-Range: bytes %s%ld/%ld\r\n", |         conn->allocptr.rangeline = aprintf("Content-Range: bytes %s%ld/%ld\r\n", | ||||||
|                                       conn->range, total_expected_size-1, |                                       conn->range, total_expected_size-1, | ||||||
|                                       total_expected_size); |                                       total_expected_size); | ||||||
| @@ -569,14 +568,14 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|         /* Range was selected and then we just pass the incoming range and  |         /* Range was selected and then we just pass the incoming range and  | ||||||
|            append total size */ |            append total size */ | ||||||
|         conn->allocptr.rangeline = aprintf("Content-Range: bytes %s/%d\r\n", |         conn->allocptr.rangeline = aprintf("Content-Range: bytes %s/%d\r\n", | ||||||
|                                       conn->range, data->infilesize); |                                       conn->range, data->set.infilesize); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   do { |   do { | ||||||
|     send_buffer *req_buffer; |     send_buffer *req_buffer; | ||||||
|     struct curl_slist *headers=data->headers; |     struct curl_slist *headers=data->set.headers; | ||||||
|  |  | ||||||
|     /* initialize a dynamic send-buffer */ |     /* initialize a dynamic send-buffer */ | ||||||
|     req_buffer = add_buffer_init(); |     req_buffer = add_buffer_init(); | ||||||
| @@ -595,11 +594,11 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|                 "%s" /* accept */ |                 "%s" /* accept */ | ||||||
|                 "%s", /* referer */ |                 "%s", /* referer */ | ||||||
|  |  | ||||||
|                 data->customrequest?data->customrequest: |                 data->set.customrequest?data->set.customrequest: | ||||||
|                 (data->bits.no_body?"HEAD": |                 (data->set.no_body?"HEAD": | ||||||
|                  ((HTTPREQ_POST == data->httpreq) || |                  ((HTTPREQ_POST == data->set.httpreq) || | ||||||
|                   (HTTPREQ_POST_FORM == data->httpreq))?"POST": |                   (HTTPREQ_POST_FORM == data->set.httpreq))?"POST": | ||||||
|                  (HTTPREQ_PUT == data->httpreq)?"PUT":"GET"), |                  (HTTPREQ_PUT == data->set.httpreq)?"PUT":"GET"), | ||||||
|                 ppath, |                 ppath, | ||||||
|                 (conn->bits.proxy_user_passwd && |                 (conn->bits.proxy_user_passwd && | ||||||
|                  conn->allocptr.proxyuserpwd)?conn->allocptr.proxyuserpwd:"", |                  conn->allocptr.proxyuserpwd)?conn->allocptr.proxyuserpwd:"", | ||||||
| @@ -607,13 +606,13 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|                 conn->allocptr.userpwd:"", |                 conn->allocptr.userpwd:"", | ||||||
|                 (conn->bits.use_range && conn->allocptr.rangeline)? |                 (conn->bits.use_range && conn->allocptr.rangeline)? | ||||||
|                 conn->allocptr.rangeline:"", |                 conn->allocptr.rangeline:"", | ||||||
|                 (data->useragent && *data->useragent && conn->allocptr.uagent)? |                 (data->set.useragent && *data->set.useragent && conn->allocptr.uagent)? | ||||||
|                 conn->allocptr.uagent:"", |                 conn->allocptr.uagent:"", | ||||||
|                 (conn->allocptr.cookie?conn->allocptr.cookie:""), /* Cookie: <data> */ |                 (conn->allocptr.cookie?conn->allocptr.cookie:""), /* Cookie: <data> */ | ||||||
|                 (conn->allocptr.host?conn->allocptr.host:""), /* Host: host */ |                 (conn->allocptr.host?conn->allocptr.host:""), /* Host: host */ | ||||||
|                 http->p_pragma?http->p_pragma:"", |                 http->p_pragma?http->p_pragma:"", | ||||||
|                 http->p_accept?http->p_accept:"", |                 http->p_accept?http->p_accept:"", | ||||||
|                 (data->bits.http_set_referer && conn->allocptr.ref)?conn->allocptr.ref:"" /* Referer: <data> <CRLF> */ |                 (data->change.referer && conn->allocptr.ref)?conn->allocptr.ref:"" /* Referer: <data> <CRLF> */ | ||||||
|                 ); |                 ); | ||||||
|  |  | ||||||
|     if(co) { |     if(co) { | ||||||
| @@ -638,7 +637,7 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|       co=NULL; |       co=NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if(data->timecondition) { |     if(data->set.timecondition) { | ||||||
|       struct tm *thistime; |       struct tm *thistime; | ||||||
|  |  | ||||||
|       /* Phil Karn (Fri, 13 Apr 2001) pointed out that the If-Modified-Since |       /* Phil Karn (Fri, 13 Apr 2001) pointed out that the If-Modified-Since | ||||||
| @@ -653,9 +652,9 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|       /* We assume that the presense of localtime_r() proves the presense |       /* We assume that the presense of localtime_r() proves the presense | ||||||
|          of gmtime_r() which is a bit ugly but might work */ |          of gmtime_r() which is a bit ugly but might work */ | ||||||
|       struct tm keeptime; |       struct tm keeptime; | ||||||
|       thistime = (struct tm *)gmtime_r(&data->timevalue, &keeptime); |       thistime = (struct tm *)gmtime_r(&data->set.timevalue, &keeptime); | ||||||
| #else | #else | ||||||
|       thistime = gmtime(&data->timevalue); |       thistime = gmtime(&data->set.timevalue); | ||||||
| #endif | #endif | ||||||
|       if(NULL == thistime) { |       if(NULL == thistime) { | ||||||
|         failf(data, "localtime() failed!"); |         failf(data, "localtime() failed!"); | ||||||
| @@ -669,7 +668,7 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|       /* TODO: Right, we *could* write a replacement here */ |       /* TODO: Right, we *could* write a replacement here */ | ||||||
|       strcpy(buf, "no strftime() support"); |       strcpy(buf, "no strftime() support"); | ||||||
| #endif | #endif | ||||||
|       switch(data->timecondition) { |       switch(data->set.timecondition) { | ||||||
|       case TIMECOND_IFMODSINCE: |       case TIMECOND_IFMODSINCE: | ||||||
|       default: |       default: | ||||||
|         add_bufferf(req_buffer, |         add_bufferf(req_buffer, | ||||||
| @@ -704,53 +703,80 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|       headers = headers->next; |       headers = headers->next; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if(HTTPREQ_POST_FORM == data->httpreq) { |     if(HTTPREQ_POST_FORM == data->set.httpreq) { | ||||||
|  |       char contentType[256]; | ||||||
|  |       int linelength=0; | ||||||
|       if(Curl_FormInit(&http->form, http->sendit)) { |       if(Curl_FormInit(&http->form, http->sendit)) { | ||||||
|         failf(data, "Internal HTTP POST error!\n"); |         failf(data, "Internal HTTP POST error!\n"); | ||||||
|         return CURLE_HTTP_POST_ERROR; |         return CURLE_HTTP_POST_ERROR; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       http->storefread = data->fread; /* backup */ |       http->storefread = data->set.fread; /* backup */ | ||||||
|       http->in = data->in; /* backup */ |       http->in = data->set.in; /* backup */ | ||||||
|            |            | ||||||
|       data->fread = (curl_read_callback) |       data->set.fread = (curl_read_callback) | ||||||
|         Curl_FormReader; /* set the read function to read from the |         Curl_FormReader; /* set the read function to read from the | ||||||
|                             generated form data */ |                             generated form data */ | ||||||
|       data->in = (FILE *)&http->form; |       data->set.in = (FILE *)&http->form; | ||||||
|  |  | ||||||
|       add_bufferf(req_buffer, |       add_bufferf(req_buffer, | ||||||
|                   "Content-Length: %d\r\n", http->postsize-2); |                   "Content-Length: %d\r\n", http->postsize-2); | ||||||
|  |  | ||||||
|  |       if(!checkheaders(data, "Expect:")) { | ||||||
|  |         /* if not disabled explicitly we add a Expect: 100-continue | ||||||
|  |            to the headers which actually speeds up post operations (as | ||||||
|  |            there is one packet coming back from the web server) */ | ||||||
|  |         add_bufferf(req_buffer, | ||||||
|  |                     "Expect: 100-continue\r\n"); | ||||||
|  |         data->set.expect100header = TRUE; | ||||||
|  |  | ||||||
|  |         /* Get Content-Type: line from Curl_FormReadOneLine, which happens | ||||||
|  |            to always be the first line. We can know this for sure since | ||||||
|  |            we always build the formpost linked list the same way! */ | ||||||
|  |         linelength = Curl_FormReadOneLine (contentType, | ||||||
|  |                                            sizeof(contentType), | ||||||
|  |                                            1, | ||||||
|  |                                            (FILE *)&http->form); | ||||||
|  |         if(linelength == -1) { | ||||||
|  |           failf(data, "Could not get Content-Type header line!\n"); | ||||||
|  |           return CURLE_HTTP_POST_ERROR; | ||||||
|  |         } | ||||||
|  |         add_buffer(req_buffer, contentType, linelength); | ||||||
|  |       } | ||||||
|  |  | ||||||
|       /* set upload size to the progress meter */ |       /* set upload size to the progress meter */ | ||||||
|       Curl_pgrsSetUploadSize(data, http->postsize); |       Curl_pgrsSetUploadSize(data, http->postsize); | ||||||
|  |  | ||||||
|       data->request_size =  |       /* fire away the whole request to the server */ | ||||||
|  |       data->info.request_size =  | ||||||
|         add_buffer_send(conn->firstsocket, conn, req_buffer); |         add_buffer_send(conn->firstsocket, conn, req_buffer); | ||||||
|  |  | ||||||
|  |       /* setup variables for the upcoming transfer */ | ||||||
|       result = Curl_Transfer(conn, conn->firstsocket, -1, TRUE, |       result = Curl_Transfer(conn, conn->firstsocket, -1, TRUE, | ||||||
|                              &http->readbytecount, |                              &http->readbytecount, | ||||||
|                              conn->firstsocket, |                              conn->firstsocket, | ||||||
|                              &http->writebytecount); |                              &http->writebytecount); | ||||||
|       if(result) { |       if(result) { | ||||||
|         Curl_FormFree(http->sendit); /* free that whole lot */ |         Curl_formclean(http->sendit); /* free that whole lot */ | ||||||
|         return result; |         return result; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     else if(HTTPREQ_PUT == data->httpreq) { |     else if(HTTPREQ_PUT == data->set.httpreq) { | ||||||
|       /* Let's PUT the data to the server! */ |       /* Let's PUT the data to the server! */ | ||||||
|  |  | ||||||
|       if(data->infilesize>0) { |       if(data->set.infilesize>0) { | ||||||
|         add_bufferf(req_buffer, |         add_bufferf(req_buffer, | ||||||
|                     "Content-Length: %d\r\n\r\n", /* file size */ |                     "Content-Length: %d\r\n\r\n", /* file size */ | ||||||
|                     data->infilesize ); |                     data->set.infilesize ); | ||||||
|       } |       } | ||||||
|       else |       else | ||||||
|         add_bufferf(req_buffer, "\015\012"); |         add_bufferf(req_buffer, "\015\012"); | ||||||
|  |  | ||||||
|       /* set the upload size to the progress meter */ |       /* set the upload size to the progress meter */ | ||||||
|       Curl_pgrsSetUploadSize(data, data->infilesize); |       Curl_pgrsSetUploadSize(data, data->set.infilesize); | ||||||
|  |  | ||||||
|       /* this sends the buffer and frees all the buffer resources */ |       /* this sends the buffer and frees all the buffer resources */ | ||||||
|       data->request_size =  |       data->info.request_size =  | ||||||
|         add_buffer_send(conn->firstsocket, conn, req_buffer); |         add_buffer_send(conn->firstsocket, conn, req_buffer); | ||||||
|  |  | ||||||
|       /* prepare for transfer */ |       /* prepare for transfer */ | ||||||
| @@ -763,40 +789,51 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|        |        | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       if(HTTPREQ_POST == data->httpreq) { |       if(HTTPREQ_POST == data->set.httpreq) { | ||||||
|         /* this is the simple POST, using x-www-form-urlencoded style */ |         /* this is the simple POST, using x-www-form-urlencoded style */ | ||||||
|  |  | ||||||
|  |         if(!data->set.postfields) { | ||||||
|  |           /* | ||||||
|  |            * This is an attempt to do a POST without having anything to | ||||||
|  |            * actually send. Let's make a NULL pointer equal "" here. Good/bad | ||||||
|  |            * ? | ||||||
|  |            */ | ||||||
|  |           data->set.postfields = (char *)""; | ||||||
|  |           data->set.postfieldsize = 0; /* it might been set to something illegal, | ||||||
|  |                                       anything > 0 would be! */ | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if(!checkheaders(data, "Content-Length:")) |         if(!checkheaders(data, "Content-Length:")) | ||||||
|           /* we allow replacing this header, although it isn't very wise to |           /* we allow replacing this header, although it isn't very wise to | ||||||
|              actually set your own */ |              actually set your own */ | ||||||
|           add_bufferf(req_buffer, |           add_bufferf(req_buffer, | ||||||
|                       "Content-Length: %d\r\n", |                       "Content-Length: %d\r\n", | ||||||
|                       (data->postfieldsize?data->postfieldsize: |                       (data->set.postfieldsize?data->set.postfieldsize: | ||||||
|                        strlen(data->postfields)) ); |                        strlen(data->set.postfields)) ); | ||||||
|  |  | ||||||
|         if(!checkheaders(data, "Content-Type:")) |         if(!checkheaders(data, "Content-Type:")) | ||||||
|           add_bufferf(req_buffer, |           add_bufferf(req_buffer, | ||||||
|                       "Content-Type: application/x-www-form-urlencoded\r\n"); |                       "Content-Type: application/x-www-form-urlencoded\r\n"); | ||||||
|  |  | ||||||
|         /* and here comes the actual data */ |         /* and here comes the actual data */ | ||||||
|         if(data->postfieldsize) { |         if(data->set.postfieldsize) { | ||||||
|           add_buffer(req_buffer, "\r\n", 2); |           add_buffer(req_buffer, "\r\n", 2); | ||||||
|           add_buffer(req_buffer, data->postfields, |           add_buffer(req_buffer, data->set.postfields, | ||||||
|                      data->postfieldsize); |                      data->set.postfieldsize); | ||||||
|           add_buffer(req_buffer, "\r\n", 2); |           add_buffer(req_buffer, "\r\n", 2); | ||||||
|         } |         } | ||||||
|         else { |         else { | ||||||
|           add_bufferf(req_buffer, |           add_bufferf(req_buffer, | ||||||
|                       "\r\n" |                       "\r\n" | ||||||
|                       "%s\r\n", |                       "%s\r\n", | ||||||
|                       data->postfields ); |                       data->set.postfields ); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|       else |       else | ||||||
|         add_buffer(req_buffer, "\r\n", 2); |         add_buffer(req_buffer, "\r\n", 2); | ||||||
|  |  | ||||||
|       /* issue the request */ |       /* issue the request */ | ||||||
|       data->request_size =  |       data->info.request_size =  | ||||||
|         add_buffer_send(conn->firstsocket, conn, req_buffer); |         add_buffer_send(conn->firstsocket, conn, req_buffer); | ||||||
|  |  | ||||||
|       /* HTTP GET/HEAD download: */ |       /* HTTP GET/HEAD download: */ | ||||||
| @@ -811,3 +848,11 @@ CURLcode Curl_http(struct connectdata *conn) | |||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -44,7 +44,7 @@ | |||||||
|  * Chunk format (simplified): |  * Chunk format (simplified): | ||||||
|  * |  * | ||||||
|  * <HEX SIZE>[ chunk extension ] CRLF |  * <HEX SIZE>[ chunk extension ] CRLF | ||||||
|  * <DATA> |  * <DATA> CRLF | ||||||
|  * |  * | ||||||
|  * Highlights from RFC2616 section 3.6 say: |  * Highlights from RFC2616 section 3.6 say: | ||||||
|  |  | ||||||
| @@ -96,8 +96,8 @@ void Curl_httpchunk_init(struct connectdata *conn) | |||||||
|  */ |  */ | ||||||
| CHUNKcode Curl_httpchunk_read(struct connectdata *conn, | CHUNKcode Curl_httpchunk_read(struct connectdata *conn, | ||||||
|                               char *datap, |                               char *datap, | ||||||
|                               ssize_t length, |                               size_t length, | ||||||
|                               ssize_t *wrote) |                               size_t *wrote) | ||||||
| { | { | ||||||
|   CURLcode result; |   CURLcode result; | ||||||
|   struct Curl_chunker *ch = &conn->proto.http->chunk; |   struct Curl_chunker *ch = &conn->proto.http->chunk; | ||||||
| @@ -220,3 +220,11 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn, | |||||||
|   } |   } | ||||||
|   return CHUNKE_OK; |   return CHUNKE_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								lib/if2ip.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								lib/if2ip.c
									
									
									
									
									
								
							| @@ -66,6 +66,11 @@ | |||||||
| #include "inet_ntoa_r.h" | #include "inet_ntoa_r.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef	VMS | ||||||
|  | #define	IOCTL_3_ARGS | ||||||
|  | #include <inet.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /* The last #include file should be: */ | /* The last #include file should be: */ | ||||||
| #ifdef MALLOCDEBUG | #ifdef MALLOCDEBUG | ||||||
| #include "memdebug.h" | #include "memdebug.h" | ||||||
| @@ -90,7 +95,11 @@ char *Curl_if2ip(char *interface, char *buf, int buf_size) | |||||||
|     memset(&req, 0, sizeof(req)); |     memset(&req, 0, sizeof(req)); | ||||||
|     strcpy(req.ifr_name, interface); |     strcpy(req.ifr_name, interface); | ||||||
|     req.ifr_addr.sa_family = AF_INET; |     req.ifr_addr.sa_family = AF_INET; | ||||||
|  | #ifdef	IOCTL_3_ARGS | ||||||
|  |     if (SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req)) { | ||||||
|  | #else | ||||||
|     if (SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req, sizeof(req))) { |     if (SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req, sizeof(req))) { | ||||||
|  | #endif | ||||||
|       sclose(dummy); |       sclose(dummy); | ||||||
|       return NULL; |       return NULL; | ||||||
|     } |     } | ||||||
| @@ -115,3 +124,11 @@ char *Curl_if2ip(char *interface, char *buf, int buf_size) | |||||||
| #else | #else | ||||||
| #define if2ip(x) NULL | #define if2ip(x) NULL | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										230
									
								
								lib/krb4.c
									
									
									
									
									
								
							
							
						
						
									
										230
									
								
								lib/krb4.c
									
									
									
									
									
								
							| @@ -1,8 +1,12 @@ | |||||||
| /* modified by Martin Hedenfalk <mhe@stacken.kth.se> for use in Curl | /* This source code was modified by Martin Hedenfalk <mhe@stacken.kth.se> for | ||||||
|  * last modified 2000-09-18 |  * use in Curl. His latest changes were done 2000-09-18. | ||||||
|  */ |  * | ||||||
|  |  * It has since been patched away like a madman by Daniel Stenberg | ||||||
| /* |  * <daniel@haxx.se> to make it better applied to curl conditions, and to make | ||||||
|  |  * it not use globals, pollute name space and more. This source code awaits a | ||||||
|  |  * rewrite to work around the paragraph 2 in the BSD licenses as explained | ||||||
|  |  * below. | ||||||
|  |  * | ||||||
|  * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska H<>gskolan |  * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska H<>gskolan | ||||||
|  * (Royal Institute of Technology, Stockholm, Sweden). |  * (Royal Institute of Technology, Stockholm, Sweden). | ||||||
|  * All rights reserved. |  * All rights reserved. | ||||||
| @@ -32,8 +36,7 @@ | |||||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||||
|  * SUCH DAMAGE. |  * SUCH DAMAGE.  */ | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
|  |  | ||||||
| @@ -47,6 +50,10 @@ | |||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <krb.h> | #include <krb.h> | ||||||
|  |  | ||||||
|  | #ifdef HAVE_UNISTD_H | ||||||
|  | #include <unistd.h> /* for getpid() */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include "ftp.h" | #include "ftp.h" | ||||||
| #include "sendf.h" | #include "sendf.h" | ||||||
|  |  | ||||||
| @@ -55,23 +62,11 @@ | |||||||
| #include "memdebug.h" | #include "memdebug.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef FTP_SERVER | #define LOCAL_ADDR (&conn->local_addr) | ||||||
| #define LOCAL_ADDR ctrl_addr |  | ||||||
| #define REMOTE_ADDR his_addr |  | ||||||
| #else |  | ||||||
| /*#define LOCAL_ADDR myctladdr***/ |  | ||||||
| /*#define REMOTE_ADDR hisctladdr***/ |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /*extern struct sockaddr *LOCAL_ADDR, *REMOTE_ADDR;***/ |  | ||||||
|  |  | ||||||
| #define LOCAL_ADDR (&local_addr) |  | ||||||
| #define REMOTE_ADDR (&conn->serv_addr) | #define REMOTE_ADDR (&conn->serv_addr) | ||||||
| #define myctladdr LOCAL_ADDR | #define myctladdr LOCAL_ADDR | ||||||
| #define hisctladdr REMOTE_ADDR | #define hisctladdr REMOTE_ADDR | ||||||
|  |  | ||||||
| static struct sockaddr_in local_addr; |  | ||||||
|  |  | ||||||
| struct krb4_data { | struct krb4_data { | ||||||
|     des_cblock key; |     des_cblock key; | ||||||
|     des_key_schedule schedule; |     des_key_schedule schedule; | ||||||
| @@ -105,6 +100,7 @@ size_t strlcpy (char *dst, const char *src, size_t dst_sz); | |||||||
| static int | static int | ||||||
| krb4_check_prot(void *app_data, int level) | krb4_check_prot(void *app_data, int level) | ||||||
| { | { | ||||||
|  |   app_data = NULL; /* prevent compiler warning */ | ||||||
|   if(level == prot_confidential) |   if(level == prot_confidential) | ||||||
|     return -1; |     return -1; | ||||||
|   return 0; |   return 0; | ||||||
| @@ -137,6 +133,10 @@ krb4_decode(void *app_data, void *buf, int len, int level, | |||||||
| static int | static int | ||||||
| krb4_overhead(void *app_data, int level, int len) | krb4_overhead(void *app_data, int level, int len) | ||||||
| { | { | ||||||
|  |   /* no arguments are used, just init them to prevent compiler warnings */ | ||||||
|  |   app_data = NULL; | ||||||
|  |   level = 0; | ||||||
|  |   len = 0; | ||||||
|   return 31; |   return 31; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -158,98 +158,9 @@ krb4_encode(void *app_data, void *from, int length, int level, void **to, | |||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifdef FTP_SERVER |  | ||||||
|  |  | ||||||
| static int |  | ||||||
| krb4_adat(void *app_data, void *buf, size_t len) |  | ||||||
| { |  | ||||||
|     KTEXT_ST tkt; |  | ||||||
|     AUTH_DAT auth_dat; |  | ||||||
|     char *p; |  | ||||||
|     int kerror; |  | ||||||
|     u_int32_t cs; |  | ||||||
|     char msg[35]; /* size of encrypted block */ |  | ||||||
|     int tmp_len; |  | ||||||
|     struct krb4_data *d = app_data; |  | ||||||
|     char inst[INST_SZ]; |  | ||||||
|     struct sockaddr_in *his_addr_sin = (struct sockaddr_in *)his_addr; |  | ||||||
|  |  | ||||||
|     memcpy(tkt.dat, buf, len); |  | ||||||
|     tkt.length = len; |  | ||||||
|  |  | ||||||
|     k_getsockinst(0, inst, sizeof(inst)); |  | ||||||
|     kerror = krb_rd_req(&tkt, "ftp", inst,  |  | ||||||
| 			his_addr_sin->sin_addr.s_addr, &auth_dat, ""); |  | ||||||
|     if(kerror == RD_AP_UNDEC){ |  | ||||||
| 	k_getsockinst(0, inst, sizeof(inst)); |  | ||||||
| 	kerror = krb_rd_req(&tkt, "rcmd", inst,  |  | ||||||
| 			    his_addr_sin->sin_addr.s_addr, &auth_dat, ""); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if(kerror){ |  | ||||||
| 	reply(535, "Error reading request: %s.", krb_get_err_text(kerror)); |  | ||||||
| 	return -1; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     memcpy(d->key, auth_dat.session, sizeof(d->key)); |  | ||||||
|     des_set_key(&d->key, d->schedule); |  | ||||||
|  |  | ||||||
|     strlcpy(d->name, auth_dat.pname, sizeof(d->name)); |  | ||||||
|     strlcpy(d->instance, auth_dat.pinst, sizeof(d->instance)); |  | ||||||
|     strlcpy(d->realm, auth_dat.prealm, sizeof(d->instance)); |  | ||||||
|  |  | ||||||
|     cs = auth_dat.checksum + 1; |  | ||||||
|     { |  | ||||||
| 	unsigned char tmp[4]; |  | ||||||
| 	KRB_PUT_INT(cs, tmp, 4, sizeof(tmp)); |  | ||||||
| 	tmp_len = krb_mk_safe(tmp, msg, 4, &d->key, |  | ||||||
| 			      (struct sockaddr_in *)LOCAL_ADDR, |  | ||||||
| 			      (struct sockaddr_in *)REMOTE_ADDR); |  | ||||||
|     } |  | ||||||
|     if(tmp_len < 0){ |  | ||||||
| 	reply(535, "Error creating reply: %s.", strerror(errno)); |  | ||||||
| 	return -1; |  | ||||||
|     } |  | ||||||
|     len = tmp_len; |  | ||||||
|     if(base64_encode(msg, len, &p) < 0) { |  | ||||||
| 	reply(535, "Out of memory base64-encoding."); |  | ||||||
| 	return -1; |  | ||||||
|     } |  | ||||||
|     reply(235, "ADAT=%s", p); |  | ||||||
|     sec_complete = 1; |  | ||||||
|     free(p); |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static int |  | ||||||
| krb4_userok(void *app_data, char *user) |  | ||||||
| { |  | ||||||
|     struct krb4_data *d = app_data; |  | ||||||
|     return krb_kuserok(d->name, d->instance, d->realm, user); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| struct sec_server_mech krb4_server_mech = { |  | ||||||
|     "KERBEROS_V4", |  | ||||||
|     sizeof(struct krb4_data), |  | ||||||
|     NULL, /* init */ |  | ||||||
|     NULL, /* end */ |  | ||||||
|     krb4_check_prot, |  | ||||||
|     krb4_overhead, |  | ||||||
|     krb4_encode, |  | ||||||
|     krb4_decode, |  | ||||||
|     /* */ |  | ||||||
|     NULL, |  | ||||||
|     krb4_adat, |  | ||||||
|     NULL, /* pbsz */ |  | ||||||
|     NULL, /* ccc */ |  | ||||||
|     krb4_userok |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #else /* FTP_SERVER */ |  | ||||||
|  |  | ||||||
| static int | static int | ||||||
| mk_auth(struct krb4_data *d, KTEXT adat,  | mk_auth(struct krb4_data *d, KTEXT adat,  | ||||||
| 	char *service, char *host, int checksum) | 	const char *service, char *host, int checksum) | ||||||
| { | { | ||||||
|     int ret; |     int ret; | ||||||
|     CREDENTIALS cred; |     CREDENTIALS cred; | ||||||
| @@ -283,12 +194,9 @@ krb4_auth(void *app_data, struct connectdata *conn) | |||||||
|   u_int32_t cs; |   u_int32_t cs; | ||||||
|   struct krb4_data *d = app_data; |   struct krb4_data *d = app_data; | ||||||
|   struct sockaddr_in *localaddr  = (struct sockaddr_in *)LOCAL_ADDR; |   struct sockaddr_in *localaddr  = (struct sockaddr_in *)LOCAL_ADDR; | ||||||
| #if 0 |  | ||||||
|     struct sockaddr_in *remoteaddr = (struct sockaddr_in *)REMOTE_ADDR; |  | ||||||
| #endif |  | ||||||
|   char *host = conn->hp->h_name; |   char *host = conn->hp->h_name; | ||||||
|     size_t nread; |   ssize_t nread; | ||||||
|     int l = sizeof(local_addr); |   int l = sizeof(conn->local_addr); | ||||||
|  |  | ||||||
|   if(getsockname(conn->firstsocket, |   if(getsockname(conn->firstsocket, | ||||||
|                  (struct sockaddr *)LOCAL_ADDR, &l) < 0) |                  (struct sockaddr *)LOCAL_ADDR, &l) < 0) | ||||||
| @@ -298,7 +206,7 @@ krb4_auth(void *app_data, struct connectdata *conn) | |||||||
|   ret = mk_auth(d, &adat, "ftp", host, checksum); |   ret = mk_auth(d, &adat, "ftp", host, checksum); | ||||||
|   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) { | ||||||
|     printf("%s\n", krb_get_err_text(ret)); |     printf("%s\n", krb_get_err_text(ret)); | ||||||
|     return AUTH_CONTINUE; |     return AUTH_CONTINUE; | ||||||
|   } |   } | ||||||
| @@ -319,10 +227,8 @@ krb4_auth(void *app_data, struct connectdata *conn) | |||||||
|         localaddr->sin_addr = natAddr; |         localaddr->sin_addr = natAddr; | ||||||
|          |          | ||||||
|         /* |         /* | ||||||
| 	   * This not the best place to do this, but it |          * This not the best place to do this, but it is here we know that | ||||||
| 	   * is here we know that (probably) NAT is in |          * (probably) NAT is in use!  */ | ||||||
| 	   * use! |  | ||||||
| 	   */ |  | ||||||
|  |  | ||||||
|         /*passivemode = 1;***/ |         /*passivemode = 1;***/ | ||||||
|         /*printf("Setting: Passive mode on.\n");***/ |         /*printf("Setting: Passive mode on.\n");***/ | ||||||
| @@ -338,21 +244,21 @@ krb4_auth(void *app_data, struct connectdata *conn) | |||||||
|     printf("Out of memory base64-encoding.\n"); |     printf("Out of memory base64-encoding.\n"); | ||||||
|     return AUTH_CONTINUE; |     return AUTH_CONTINUE; | ||||||
|   } |   } | ||||||
|     /*ret = command("ADAT %s", p)*/ |  | ||||||
|   Curl_ftpsendf(conn->firstsocket, conn, "ADAT %s", p); |   Curl_ftpsendf(conn->firstsocket, conn, "ADAT %s", p); | ||||||
|     /* wait for feedback */ |  | ||||||
|   nread = Curl_GetFTPResponse(conn->firstsocket, |   nread = Curl_GetFTPResponse(conn->firstsocket, | ||||||
|                                 conn->data->buffer, conn, NULL); |                               conn->data->state.buffer, conn, NULL); | ||||||
|   if(nread < 0) |   if(nread < 0) | ||||||
|     return /*CURLE_OPERATION_TIMEOUTED*/-1; |     return /*CURLE_OPERATION_TIMEOUTED*/-1; | ||||||
|   free(p); |   free(p); | ||||||
|  |  | ||||||
|     if(/*ret != COMPLETE*/conn->data->buffer[0] != '2'){ |   if(/*ret != COMPLETE*/conn->data->state.buffer[0] != '2'){ | ||||||
|     printf("Server didn't accept auth data.\n"); |     printf("Server didn't accept auth data.\n"); | ||||||
|     return AUTH_ERROR; |     return AUTH_ERROR; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|     p = strstr(/*reply_string*/conn->data->buffer, "ADAT="); |   p = strstr(conn->data->state.buffer, "ADAT="); | ||||||
|   if(!p){ |   if(!p){ | ||||||
|     printf("Remote host didn't send adat reply.\n"); |     printf("Remote host didn't send adat reply.\n"); | ||||||
|     return AUTH_ERROR; |     return AUTH_ERROR; | ||||||
| @@ -380,7 +286,7 @@ krb4_auth(void *app_data, struct connectdata *conn) | |||||||
|   return AUTH_OK; |   return AUTH_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
| struct sec_client_mech krb4_client_mech = { | struct Curl_sec_client_mech Curl_krb4_client_mech = { | ||||||
|     "KERBEROS_V4", |     "KERBEROS_V4", | ||||||
|     sizeof(struct krb4_data), |     sizeof(struct krb4_data), | ||||||
|     NULL, /* init */ |     NULL, /* init */ | ||||||
| @@ -392,9 +298,7 @@ struct sec_client_mech krb4_client_mech = { | |||||||
|     krb4_decode |     krb4_decode | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* FTP_SERVER */ | void Curl_krb_kauth(struct connectdata *conn) | ||||||
|  |  | ||||||
| void krb_kauth(struct connectdata *conn) |  | ||||||
| { | { | ||||||
|   des_cblock key; |   des_cblock key; | ||||||
|   des_key_schedule schedule; |   des_key_schedule schedule; | ||||||
| @@ -403,63 +307,54 @@ void krb_kauth(struct connectdata *conn) | |||||||
|   char *p; |   char *p; | ||||||
|   char passwd[100]; |   char passwd[100]; | ||||||
|   int tmp; |   int tmp; | ||||||
|     size_t nread; |   ssize_t nread; | ||||||
| 	 | 	 | ||||||
|   int save; |   int save; | ||||||
|  |  | ||||||
|     save = set_command_prot(conn, prot_private); |   save = Curl_set_command_prot(conn, prot_private); | ||||||
|     /*ret = command("SITE KAUTH %s", name);***/ |  | ||||||
|   Curl_ftpsendf(conn->firstsocket, conn, |   Curl_ftpsendf(conn->firstsocket, conn, | ||||||
|              "SITE KAUTH %s", conn->data->user); |                 "SITE KAUTH %s", conn->data->state.user); | ||||||
|     /* wait for feedback */ |  | ||||||
|     nread = Curl_GetFTPResponse(conn->firstsocket, conn->data->buffer, |   nread = Curl_GetFTPResponse(conn->firstsocket, conn->data->state.buffer, | ||||||
|                               conn, NULL); |                               conn, NULL); | ||||||
|   if(nread < 0) |   if(nread < 0) | ||||||
|     return /*CURLE_OPERATION_TIMEOUTED*/; |     return /*CURLE_OPERATION_TIMEOUTED*/; | ||||||
|  |  | ||||||
|     if(/*ret != CONTINUE*/conn->data->buffer[0] != '3'){ |   if(/*ret != CONTINUE*/conn->data->state.buffer[0] != '3'){ | ||||||
| 	set_command_prot(conn, save); |     Curl_set_command_prot(conn, save); | ||||||
|     /*code = -1;***/ |     /*code = -1;***/ | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|     p = strstr(/*reply_string***/conn->data->buffer, "T="); |  | ||||||
|     if(!p){ |   p = strstr(conn->data->state.buffer, "T="); | ||||||
|  |   if(!p) { | ||||||
|     printf("Bad reply from server.\n"); |     printf("Bad reply from server.\n"); | ||||||
| 	set_command_prot(conn, save); |     Curl_set_command_prot(conn, save); | ||||||
| 	/*code = -1;***/ |  | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   p += 2; |   p += 2; | ||||||
|   tmp = Curl_base64_decode(p, &tkt.dat); |   tmp = Curl_base64_decode(p, &tkt.dat); | ||||||
|     if(tmp < 0){ |   if(tmp < 0) { | ||||||
|     printf("Failed to decode base64 in reply.\n"); |     printf("Failed to decode base64 in reply.\n"); | ||||||
| 	set_command_prot(conn, save); |     Curl_set_command_prot(conn, save); | ||||||
| 	/*code = -1;***/ |  | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|   tkt.length = tmp; |   tkt.length = tmp; | ||||||
|   tktcopy.length = tkt.length; |   tktcopy.length = tkt.length; | ||||||
|      |      | ||||||
|     p = strstr(/*reply_string***/conn->data->buffer, "P="); |   p = strstr(conn->data->state.buffer, "P="); | ||||||
|     if(!p){ |   if(!p) { | ||||||
|     printf("Bad reply from server.\n"); |     printf("Bad reply from server.\n"); | ||||||
| 	set_command_prot(conn, save); |     Curl_set_command_prot(conn, save); | ||||||
| 	/*code = -1;***/ |  | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|   name = p + 2; |   name = p + 2; | ||||||
|   for(; *p && *p != ' ' && *p != '\r' && *p != '\n'; p++); |   for(; *p && *p != ' ' && *p != '\r' && *p != '\n'; p++); | ||||||
|   *p = 0; |   *p = 0; | ||||||
|  |  | ||||||
| #if 0 |   des_string_to_key (conn->data->state.passwd, &key); | ||||||
|     snprintf(buf, sizeof(buf), "Password for %s:", name); |  | ||||||
|     if (des_read_pw_string (passwd, sizeof(passwd)-1, buf, 0)) |  | ||||||
|         *passwd = '\0'; |  | ||||||
|     des_string_to_key (passwd, &key); |  | ||||||
| #else |  | ||||||
|     des_string_to_key (conn->data->passwd, &key); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   des_key_sched(&key, schedule); |   des_key_sched(&key, schedule); | ||||||
|      |      | ||||||
|   des_pcbc_encrypt((des_cblock*)tkt.dat, (des_cblock*)tktcopy.dat, |   des_pcbc_encrypt((des_cblock*)tkt.dat, (des_cblock*)tktcopy.dat, | ||||||
| @@ -468,7 +363,7 @@ void krb_kauth(struct connectdata *conn) | |||||||
|   if (strcmp ((char*)tktcopy.dat + 8, |   if (strcmp ((char*)tktcopy.dat + 8, | ||||||
|               KRB_TICKET_GRANTING_TICKET) != 0) { |               KRB_TICKET_GRANTING_TICKET) != 0) { | ||||||
|     afs_string_to_key (passwd, |     afs_string_to_key (passwd, | ||||||
| 			   krb_realmofhost(/*hostname***/conn->hp->h_name), |                        krb_realmofhost(/*hostname*/conn->hp->h_name), | ||||||
|                        &key); |                        &key); | ||||||
|     des_key_sched (&key, schedule); |     des_key_sched (&key, schedule); | ||||||
|     des_pcbc_encrypt((des_cblock*)tkt.dat, (des_cblock*)tktcopy.dat, |     des_pcbc_encrypt((des_cblock*)tkt.dat, (des_cblock*)tktcopy.dat, | ||||||
| @@ -480,21 +375,28 @@ void krb_kauth(struct connectdata *conn) | |||||||
|   memset(passwd, 0, sizeof(passwd)); |   memset(passwd, 0, sizeof(passwd)); | ||||||
|   if(Curl_base64_encode(tktcopy.dat, tktcopy.length, &p) < 0) { |   if(Curl_base64_encode(tktcopy.dat, tktcopy.length, &p) < 0) { | ||||||
|     failf(conn->data, "Out of memory base64-encoding.\n"); |     failf(conn->data, "Out of memory base64-encoding.\n"); | ||||||
|       set_command_prot(conn, save); |     Curl_set_command_prot(conn, save); | ||||||
|       /*code = -1;***/ |  | ||||||
|     return; |     return; | ||||||
|   } |   } | ||||||
|   memset (tktcopy.dat, 0, tktcopy.length); |   memset (tktcopy.dat, 0, tktcopy.length); | ||||||
|     /*ret = command("SITE KAUTH %s %s", name, p);***/ |  | ||||||
|   Curl_ftpsendf(conn->firstsocket, conn, |   Curl_ftpsendf(conn->firstsocket, conn, | ||||||
|                 "SITE KAUTH %s %s", name, p); |                 "SITE KAUTH %s %s", name, p); | ||||||
|     /* wait for feedback */ |  | ||||||
|     nread = Curl_GetFTPResponse(conn->firstsocket, conn->data->buffer, |   nread = Curl_GetFTPResponse(conn->firstsocket, conn->data->state.buffer, | ||||||
|                               conn, NULL); |                               conn, NULL); | ||||||
|   if(nread < 0) |   if(nread < 0) | ||||||
|     return /*CURLE_OPERATION_TIMEOUTED*/; |     return /*CURLE_OPERATION_TIMEOUTED*/; | ||||||
|   free(p); |   free(p); | ||||||
|     set_command_prot(conn, save); |   Curl_set_command_prot(conn, save); | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif /* KRB4 */ | #endif /* KRB4 */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -22,6 +22,6 @@ | |||||||
|  * |  * | ||||||
|  * $Id$ |  * $Id$ | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| void krb_kauth(struct connectdata *conn); | void Curl_krb_kauth(struct connectdata *conn); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										32
									
								
								lib/ldap.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								lib/ldap.c
									
									
									
									
									
								
							| @@ -101,7 +101,7 @@ static void DynaClose(void) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static void * DynaGetFunction(char *name) | static void * DynaGetFunction(const char *name) | ||||||
| { | { | ||||||
|   void *func = NULL; |   void *func = NULL; | ||||||
|  |  | ||||||
| @@ -116,16 +116,12 @@ static void * DynaGetFunction(char *name) | |||||||
|  |  | ||||||
| static int WriteProc(void *param, char *text, int len) | static int WriteProc(void *param, char *text, int len) | ||||||
| { | { | ||||||
|   struct UrlData *data = (struct UrlData *)param; |   struct SessionHandle *data = (struct SessionHandle *)param; | ||||||
|  |   len = 0; /* prevent compiler warning */ | ||||||
|   Curl_client_write(data, CLIENTWRITE_BODY, text, 0); |   Curl_client_write(data, CLIENTWRITE_BODY, text, 0); | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| CURLcode Curl_ldap_done(struct connectdata *conn) |  | ||||||
| { |  | ||||||
|   return CURLE_OK; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /*********************************************************************** | /*********************************************************************** | ||||||
|  */ |  */ | ||||||
| CURLcode Curl_ldap(struct connectdata *conn) | CURLcode Curl_ldap(struct connectdata *conn) | ||||||
| @@ -146,9 +142,9 @@ CURLcode Curl_ldap(struct connectdata *conn) | |||||||
|   void *entryIterator; |   void *entryIterator; | ||||||
|  |  | ||||||
|   int ldaptext; |   int ldaptext; | ||||||
|   struct UrlData *data=conn->data; |   struct SessionHandle *data=conn->data; | ||||||
|    |    | ||||||
|   infof(data, "LDAP: %s %s\n", data->url); |   infof(data, "LDAP: %s %s\n", data->change.url); | ||||||
|  |  | ||||||
|   DynaOpen(); |   DynaOpen(); | ||||||
|   if (libldap == NULL) { |   if (libldap == NULL) { | ||||||
| @@ -156,7 +152,7 @@ CURLcode Curl_ldap(struct connectdata *conn) | |||||||
|     return CURLE_LIBRARY_NOT_FOUND; |     return CURLE_LIBRARY_NOT_FOUND; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ldaptext = data->bits.ftp_ascii; /* This is a dirty hack */ |   ldaptext = data->set.ftp_ascii; /* This is a dirty hack */ | ||||||
|    |    | ||||||
|   /* 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. | ||||||
| @@ -177,12 +173,12 @@ CURLcode Curl_ldap(struct connectdata *conn) | |||||||
| 	  conn->hostname, conn->port); | 	  conn->hostname, conn->port); | ||||||
|     status = CURLE_COULDNT_CONNECT; |     status = CURLE_COULDNT_CONNECT; | ||||||
|   } else { |   } else { | ||||||
|     rc = ldap_simple_bind_s(server, data->user, data->passwd); |     rc = ldap_simple_bind_s(server, data->state.user, data->state.passwd); | ||||||
|     if (rc != 0) { |     if (rc != 0) { | ||||||
|       failf(data, "LDAP: %s", ldap_err2string(rc)); |       failf(data, "LDAP: %s", ldap_err2string(rc)); | ||||||
|       status = CURLE_LDAP_CANNOT_BIND; |       status = CURLE_LDAP_CANNOT_BIND; | ||||||
|     } else { |     } else { | ||||||
|       rc = ldap_url_search_s(server, data->url, 0, &result); |       rc = ldap_url_search_s(server, data->change.url, 0, &result); | ||||||
|       if (rc != 0) { |       if (rc != 0) { | ||||||
| 	failf(data, "LDAP: %s", ldap_err2string(rc)); | 	failf(data, "LDAP: %s", ldap_err2string(rc)); | ||||||
| 	status = CURLE_LDAP_SEARCH_FAILED; | 	status = CURLE_LDAP_SEARCH_FAILED; | ||||||
| @@ -194,7 +190,7 @@ CURLcode Curl_ldap(struct connectdata *conn) | |||||||
| 	    if (ldaptext) { | 	    if (ldaptext) { | ||||||
| 	      rc = ldap_entry2text(server, NULL, entryIterator, NULL, | 	      rc = ldap_entry2text(server, NULL, entryIterator, NULL, | ||||||
| 				   NULL, NULL, WriteProc, data, | 				   NULL, NULL, WriteProc, data, | ||||||
| 				   "", 0, 0); | 				   (char *)"", 0, 0); | ||||||
| 	      if (rc != 0) { | 	      if (rc != 0) { | ||||||
| 		failf(data, "LDAP: %s", ldap_err2string(rc)); | 		failf(data, "LDAP: %s", ldap_err2string(rc)); | ||||||
| 		status = CURLE_LDAP_SEARCH_FAILED; | 		status = CURLE_LDAP_SEARCH_FAILED; | ||||||
| @@ -202,7 +198,7 @@ CURLcode Curl_ldap(struct connectdata *conn) | |||||||
| 	    } else { | 	    } else { | ||||||
| 	      rc = ldap_entry2html(server, NULL, entryIterator, NULL, | 	      rc = ldap_entry2html(server, NULL, entryIterator, NULL, | ||||||
| 				   NULL, NULL, WriteProc, data, | 				   NULL, NULL, WriteProc, data, | ||||||
| 				   "", 0, 0, NULL, NULL); | 				   (char *)"", 0, 0, NULL, NULL); | ||||||
| 	      if (rc != 0) { | 	      if (rc != 0) { | ||||||
| 		failf(data, "LDAP: %s", ldap_err2string(rc)); | 		failf(data, "LDAP: %s", ldap_err2string(rc)); | ||||||
| 		status = CURLE_LDAP_SEARCH_FAILED; | 		status = CURLE_LDAP_SEARCH_FAILED; | ||||||
| @@ -217,3 +213,11 @@ CURLcode Curl_ldap(struct connectdata *conn) | |||||||
|    |    | ||||||
|   return status; |   return status; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -58,13 +58,13 @@ | |||||||
| FILE *logfile; | FILE *logfile; | ||||||
|  |  | ||||||
| /* this sets the log file name */ | /* this sets the log file name */ | ||||||
| void curl_memdebug(char *logname) | void curl_memdebug(const char *logname) | ||||||
| { | { | ||||||
|   logfile = fopen(logname, "w"); |   logfile = fopen(logname, "w"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void *curl_domalloc(size_t size, int line, char *source) | void *curl_domalloc(size_t size, int line, const char *source) | ||||||
| { | { | ||||||
|   void *mem=(malloc)(size); |   void *mem=(malloc)(size); | ||||||
|   fprintf(logfile?logfile:stderr, "MEM %s:%d malloc(%d) = %p\n", |   fprintf(logfile?logfile:stderr, "MEM %s:%d malloc(%d) = %p\n", | ||||||
| @@ -72,7 +72,7 @@ void *curl_domalloc(size_t size, int line, char *source) | |||||||
|   return mem; |   return mem; | ||||||
| } | } | ||||||
|  |  | ||||||
| char *curl_dostrdup(const char *str, int line, char *source) | char *curl_dostrdup(const char *str, int line, const char *source) | ||||||
| { | { | ||||||
|   char *mem; |   char *mem; | ||||||
|   size_t len; |   size_t len; | ||||||
| @@ -90,7 +90,7 @@ char *curl_dostrdup(const char *str, int line, char *source) | |||||||
|   return mem; |   return mem; | ||||||
| } | } | ||||||
|  |  | ||||||
| void *curl_dorealloc(void *ptr, size_t size, int line, char *source) | void *curl_dorealloc(void *ptr, size_t size, int line, const char *source) | ||||||
| { | { | ||||||
|   void *mem=(realloc)(ptr, size); |   void *mem=(realloc)(ptr, size); | ||||||
|   fprintf(logfile?logfile:stderr, "MEM %s:%d realloc(%p, %d) = %p\n", |   fprintf(logfile?logfile:stderr, "MEM %s:%d realloc(%p, %d) = %p\n", | ||||||
| @@ -98,7 +98,7 @@ void *curl_dorealloc(void *ptr, size_t size, int line, char *source) | |||||||
|   return mem; |   return mem; | ||||||
| } | } | ||||||
|  |  | ||||||
| void curl_dofree(void *ptr, int line, char *source) | void curl_dofree(void *ptr, int line, const char *source) | ||||||
| { | { | ||||||
|   if(NULL == ptr) { |   if(NULL == ptr) { | ||||||
|     fprintf(stderr, "ILLEGAL free() on NULL at %s:%d\n", |     fprintf(stderr, "ILLEGAL free() on NULL at %s:%d\n", | ||||||
| @@ -121,7 +121,7 @@ int curl_socket(int domain, int type, int protocol, int line, char *source) | |||||||
| } | } | ||||||
|  |  | ||||||
| int curl_accept(int s, struct sockaddr *addr, socklen_t *addrlen, | int curl_accept(int s, struct sockaddr *addr, socklen_t *addrlen, | ||||||
|                 int line, char *source) |                 int line, const char *source) | ||||||
| { | { | ||||||
|   int sockfd=(accept)(s, addr, addrlen); |   int sockfd=(accept)(s, addr, addrlen); | ||||||
|   fprintf(logfile?logfile:stderr, "FD %s:%d accept() = %d\n", |   fprintf(logfile?logfile:stderr, "FD %s:%d accept() = %d\n", | ||||||
| @@ -138,7 +138,8 @@ int curl_sclose(int sockfd, int line, char *source) | |||||||
|   return res; |   return res; | ||||||
| } | } | ||||||
|  |  | ||||||
| FILE *curl_fopen(char *file, char *mode, int line, char *source) | FILE *curl_fopen(const char *file, const char *mode, | ||||||
|  |                  int line, const char *source) | ||||||
| { | { | ||||||
|   FILE *res=(fopen)(file, mode); |   FILE *res=(fopen)(file, mode); | ||||||
|   fprintf(logfile?logfile:stderr, "FILE %s:%d fopen(\"%s\") = %p\n", |   fprintf(logfile?logfile:stderr, "FILE %s:%d fopen(\"%s\") = %p\n", | ||||||
| @@ -146,7 +147,7 @@ FILE *curl_fopen(char *file, char *mode, int line, char *source) | |||||||
|   return res; |   return res; | ||||||
| } | } | ||||||
|  |  | ||||||
| int curl_fclose(FILE *file, int line, char *source) | int curl_fclose(FILE *file, int line, const char *source) | ||||||
| { | { | ||||||
|   int res=(fclose)(file); |   int res=(fclose)(file); | ||||||
|   fprintf(logfile?logfile:stderr, "FILE %s:%d fclose(%p)\n", |   fprintf(logfile?logfile:stderr, "FILE %s:%d fclose(%p)\n", | ||||||
| @@ -155,3 +156,11 @@ int curl_fclose(FILE *file, int line, char *source) | |||||||
| } | } | ||||||
|  |  | ||||||
| #endif /* MALLOCDEBUG */ | #endif /* MALLOCDEBUG */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -2,23 +2,27 @@ | |||||||
|  |  | ||||||
| #include <sys/socket.h> | #include <sys/socket.h> | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  | #ifdef HAVE_MEMORY_H | ||||||
|  | #include <memory.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /* memory functions */ | /* memory functions */ | ||||||
| void *curl_domalloc(size_t size, int line, char *source); | void *curl_domalloc(size_t size, int line, const char *source); | ||||||
| void *curl_dorealloc(void *ptr, size_t size, int line, char *source); | void *curl_dorealloc(void *ptr, size_t size, int line, const char *source); | ||||||
| void curl_dofree(void *ptr, int line, char *source); | void curl_dofree(void *ptr, int line, const char *source); | ||||||
| char *curl_dostrdup(const char *str, int line, char *source); | char *curl_dostrdup(const char *str, int line, const char *source); | ||||||
| void curl_memdebug(char *logname); | void curl_memdebug(const char *logname); | ||||||
|  |  | ||||||
| /* file descriptor manipulators */ | /* file descriptor manipulators */ | ||||||
| int curl_socket(int domain, int type, int protocol, int, char *); | int curl_socket(int domain, int type, int protocol, int, const char *); | ||||||
| int curl_sclose(int sockfd, int, char *); | int curl_sclose(int sockfd, int, const char *source); | ||||||
| int curl_accept(int s, struct sockaddr *addr, socklen_t *addrlen, | int curl_accept(int s, struct sockaddr *addr, socklen_t *addrlen, | ||||||
|                 int line, char *source); |                 int line, const char *source); | ||||||
|  |  | ||||||
| /* FILE functions */ | /* FILE functions */ | ||||||
| FILE *curl_fopen(char *file, char *mode, int line, char *source); | FILE *curl_fopen(const char *file, const char *mode, int line, | ||||||
| int curl_fclose(FILE *file, int line, char *source); |                  const char *source); | ||||||
|  | int curl_fclose(FILE *file, int line, const char *source); | ||||||
|  |  | ||||||
| /* Set this symbol on the command-line, recompile all lib-sources */ | /* Set this symbol on the command-line, recompile all lib-sources */ | ||||||
| #define strdup(ptr) curl_dostrdup(ptr, __LINE__, __FILE__) | #define strdup(ptr) curl_dostrdup(ptr, __LINE__, __FILE__) | ||||||
|   | |||||||
| @@ -446,7 +446,7 @@ static int dprintf_Pass1(char *format, va_stack_t *vto, char **endpos, va_list a | |||||||
| 	case '1': case '2': case '3': case '4': | 	case '1': case '2': case '3': case '4': | ||||||
| 	case '5': case '6': case '7': case '8': case '9': | 	case '5': case '6': case '7': case '8': case '9': | ||||||
| 	  flags |= FLAGS_WIDTH; | 	  flags |= FLAGS_WIDTH; | ||||||
| 	  width = strtol(--fmt, &fmt, 10); | 	  width = strtol(fmt-1, &fmt, 10); | ||||||
| 	  break; | 	  break; | ||||||
| 	case '*':  /* Special case */ | 	case '*':  /* Special case */ | ||||||
| 	  flags |= FLAGS_WIDTHPARAM; | 	  flags |= FLAGS_WIDTHPARAM; | ||||||
| @@ -864,7 +864,7 @@ static int dprintf_formatf( | |||||||
| 	    p->flags &= (~FLAGS_ALT); | 	    p->flags &= (~FLAGS_ALT); | ||||||
| 	  } | 	  } | ||||||
| 	  else { | 	  else { | ||||||
| 	    str = ""; | 	    str = (char *)""; | ||||||
| 	    len = 0; | 	    len = 0; | ||||||
| 	  } | 	  } | ||||||
| 	} | 	} | ||||||
| @@ -1151,7 +1151,9 @@ int curl_msprintf(char *buffer, const char *format, ...) | |||||||
|   return retcode; |   return retcode; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifndef WIN32 /* not needed on win32 */ | ||||||
| extern int fputc(int, FILE *); | extern int fputc(int, FILE *); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| int curl_mprintf(const char *format, ...) | int curl_mprintf(const char *format, ...) | ||||||
| { | { | ||||||
| @@ -1230,3 +1232,11 @@ int main() | |||||||
| } | } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								lib/netrc.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								lib/netrc.c
									
									
									
									
									
								
							| @@ -36,7 +36,9 @@ | |||||||
| #ifdef HAVE_PWD_H | #ifdef HAVE_PWD_H | ||||||
| #include <pwd.h> | #include <pwd.h> | ||||||
| #endif | #endif | ||||||
|  | #ifdef VMS | ||||||
|  | #include <unixlib.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include <curl/curl.h> | #include <curl/curl.h> | ||||||
|  |  | ||||||
| @@ -88,8 +90,13 @@ int Curl_parsenetrc(char *host, | |||||||
| #if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) | #if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) | ||||||
|   struct passwd *pw; |   struct passwd *pw; | ||||||
|   pw= getpwuid(geteuid()); |   pw= getpwuid(geteuid()); | ||||||
|   if (pw) |   if (pw) { | ||||||
|  | #ifdef	VMS | ||||||
|  |     home = decc$translate_vms(pw->pw_dir); | ||||||
|  | #else | ||||||
|     home = pw->pw_dir; |     home = pw->pw_dir; | ||||||
|  | #endif | ||||||
|  |   } | ||||||
| #else | #else | ||||||
|   void *pw=NULL; |   void *pw=NULL; | ||||||
| #endif | #endif | ||||||
| @@ -194,3 +201,11 @@ int main(int argc, char **argv) | |||||||
| } | } | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -93,17 +93,17 @@ static char *max5data(double bytes, char *max5) | |||||||
|  |  | ||||||
| void Curl_pgrsDone(struct connectdata *conn) | void Curl_pgrsDone(struct connectdata *conn) | ||||||
| { | { | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   if(!(data->progress.flags & PGRS_HIDE)) { |   if(!(data->progress.flags & PGRS_HIDE)) { | ||||||
|     data->progress.lastshow=0; |     data->progress.lastshow=0; | ||||||
|     Curl_pgrsUpdate(conn); /* the final (forced) update */ |     Curl_pgrsUpdate(conn); /* the final (forced) update */ | ||||||
|     if(!data->progress.callback) |     if(!data->progress.callback) | ||||||
|       /* only output if we don't use progress callback */ |       /* only output if we don't use progress callback */ | ||||||
|       fprintf(data->err, "\n"); |       fprintf(data->set.err, "\n"); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| void Curl_pgrsTime(struct UrlData *data, timerid timer) | void Curl_pgrsTime(struct SessionHandle *data, timerid timer) | ||||||
| { | { | ||||||
|   switch(timer) { |   switch(timer) { | ||||||
|   default: |   default: | ||||||
| @@ -135,23 +135,23 @@ void Curl_pgrsTime(struct UrlData *data, timerid timer) | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| void Curl_pgrsStartNow(struct UrlData *data) | void Curl_pgrsStartNow(struct SessionHandle *data) | ||||||
| { | { | ||||||
|   data->progress.speeder_c = 0; /* reset the progress meter display */ |   data->progress.speeder_c = 0; /* reset the progress meter display */ | ||||||
|   data->progress.start = Curl_tvnow(); |   data->progress.start = Curl_tvnow(); | ||||||
| } | } | ||||||
|  |  | ||||||
| void Curl_pgrsSetDownloadCounter(struct UrlData *data, double size) | void Curl_pgrsSetDownloadCounter(struct SessionHandle *data, double size) | ||||||
| { | { | ||||||
|   data->progress.downloaded = size; |   data->progress.downloaded = size; | ||||||
| } | } | ||||||
|  |  | ||||||
| void Curl_pgrsSetUploadCounter(struct UrlData *data, double size) | void Curl_pgrsSetUploadCounter(struct SessionHandle *data, double size) | ||||||
| { | { | ||||||
|   data->progress.uploaded = size; |   data->progress.uploaded = size; | ||||||
| } | } | ||||||
|  |  | ||||||
| void Curl_pgrsSetDownloadSize(struct UrlData *data, double size) | void Curl_pgrsSetDownloadSize(struct SessionHandle *data, double size) | ||||||
| { | { | ||||||
|   if(size > 0) { |   if(size > 0) { | ||||||
|     data->progress.size_dl = size; |     data->progress.size_dl = size; | ||||||
| @@ -159,7 +159,7 @@ void Curl_pgrsSetDownloadSize(struct UrlData *data, double size) | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| void Curl_pgrsSetUploadSize(struct UrlData *data, double size) | void Curl_pgrsSetUploadSize(struct SessionHandle *data, double size) | ||||||
| { | { | ||||||
|   if(size > 0) { |   if(size > 0) { | ||||||
|     data->progress.size_ul = size; |     data->progress.size_ul = size; | ||||||
| @@ -188,7 +188,7 @@ int Curl_pgrsUpdate(struct connectdata *conn) | |||||||
|   double total_transfer; |   double total_transfer; | ||||||
|   double total_expected_transfer; |   double total_expected_transfer; | ||||||
|  |  | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|  |  | ||||||
|   int nowindex = data->progress.speeder_c% CURR_TIME; |   int nowindex = data->progress.speeder_c% CURR_TIME; | ||||||
|   int checkindex; |   int checkindex; | ||||||
| @@ -211,9 +211,9 @@ int Curl_pgrsUpdate(struct connectdata *conn) | |||||||
|   else if(!(data->progress.flags & PGRS_HEADERS_OUT)) { |   else if(!(data->progress.flags & PGRS_HEADERS_OUT)) { | ||||||
|     if (!data->progress.callback) { |     if (!data->progress.callback) { | ||||||
|       if(conn->resume_from) |       if(conn->resume_from) | ||||||
|         fprintf(data->err, "** Resuming transfer from byte position %d\n", |         fprintf(data->set.err, "** Resuming transfer from byte position %d\n", | ||||||
|                 conn->resume_from); |                 conn->resume_from); | ||||||
|       fprintf(data->err, |       fprintf(data->set.err, | ||||||
|               "  %% Total    %% Received %% Xferd  Average Speed          Time             Curr.\n" |               "  %% Total    %% Received %% Xferd  Average Speed          Time             Curr.\n" | ||||||
|               "                                 Dload  Upload Total    Current  Left    Speed\n"); |               "                                 Dload  Upload Total    Current  Left    Speed\n"); | ||||||
|     } |     } | ||||||
| @@ -225,20 +225,19 @@ int Curl_pgrsUpdate(struct connectdata *conn) | |||||||
|   /* The exact time spent so far */ |   /* The exact time spent so far */ | ||||||
|   data->progress.timespent = Curl_tvdiff (now, data->progress.start); |   data->progress.timespent = Curl_tvdiff (now, data->progress.start); | ||||||
|  |  | ||||||
|   if(data->progress.lastshow == Curl_tvlong(now)) |  | ||||||
|     return 0; /* never update this more than once a second if the end isn't  |  | ||||||
|                  reached */ |  | ||||||
|   data->progress.lastshow = now.tv_sec; |  | ||||||
|  |  | ||||||
|   /* The average download speed this far */ |   /* The average download speed this far */ | ||||||
|   data->progress.dlspeed = data->progress.downloaded/(data->progress.timespent!=0.0?data->progress.timespent:1.0); |   data->progress.dlspeed = data->progress.downloaded/(data->progress.timespent!=0.0?data->progress.timespent:1.0); | ||||||
|  |  | ||||||
|   /* The average upload speed this far */ |   /* The average upload speed this far */ | ||||||
|   data->progress.ulspeed = data->progress.uploaded/(data->progress.timespent!=0.0?data->progress.timespent:1.0); |   data->progress.ulspeed = data->progress.uploaded/(data->progress.timespent!=0.0?data->progress.timespent:1.0); | ||||||
|  |  | ||||||
|  |   if(data->progress.lastshow == Curl_tvlong(now)) | ||||||
|  |     return 0; /* never update this more than once a second if the end isn't  | ||||||
|  |                  reached */ | ||||||
|  |   data->progress.lastshow = now.tv_sec; | ||||||
|  |  | ||||||
|   /* Let's do the "current speed" thing, which should use the fastest |   /* Let's do the "current speed" thing, which should use the fastest | ||||||
|          of the dl/ul speeds */ |          of the dl/ul speeds */ | ||||||
|  |  | ||||||
|   data->progress.speeder[ nowindex ] = |   data->progress.speeder[ nowindex ] = | ||||||
|     data->progress.downloaded>data->progress.uploaded? |     data->progress.downloaded>data->progress.uploaded? | ||||||
|     data->progress.downloaded:data->progress.uploaded; |     data->progress.downloaded:data->progress.uploaded; | ||||||
| @@ -255,8 +254,8 @@ int Curl_pgrsUpdate(struct connectdata *conn) | |||||||
|  |  | ||||||
|   if(data->progress.flags & PGRS_HIDE) |   if(data->progress.flags & PGRS_HIDE) | ||||||
|     return 0; |     return 0; | ||||||
|   else if(data->fprogress) { |   else if(data->set.fprogress) { | ||||||
|     result= data->fprogress(data->progress_client, |     result= data->set.fprogress(data->set.progress_client, | ||||||
|                                 data->progress.size_dl, |                                 data->progress.size_dl, | ||||||
|                                 data->progress.downloaded, |                                 data->progress.downloaded, | ||||||
|                                 data->progress.size_ul, |                                 data->progress.size_ul, | ||||||
| @@ -311,7 +310,7 @@ int Curl_pgrsUpdate(struct connectdata *conn) | |||||||
|   if(total_expected_transfer) |   if(total_expected_transfer) | ||||||
|     total_percen=(double)(total_transfer/total_expected_transfer)*100; |     total_percen=(double)(total_transfer/total_expected_transfer)*100; | ||||||
|  |  | ||||||
|   fprintf(data->err, |   fprintf(data->set.err, | ||||||
|           "\r%3d %s  %3d %s  %3d %s  %s  %s %s %s %s %s", |           "\r%3d %s  %3d %s  %3d %s  %s  %s %s %s %s %s", | ||||||
|           (int)total_percen,                            /* total % */ |           (int)total_percen,                            /* total % */ | ||||||
|           max5data(total_expected_transfer, max5[2]),   /* total size */ |           max5data(total_expected_transfer, max5[2]),   /* total size */ | ||||||
| @@ -328,5 +327,16 @@ int Curl_pgrsUpdate(struct connectdata *conn) | |||||||
|           max5data(data->progress.current_speed, max5[5]) /* current speed */ |           max5data(data->progress.current_speed, max5[5]) /* current speed */ | ||||||
|           ); |           ); | ||||||
|  |  | ||||||
|  |   /* we flush the output stream to make it appear as soon as possible */ | ||||||
|  |   fflush(data->set.err); | ||||||
|  |  | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -37,13 +37,13 @@ typedef enum { | |||||||
| } timerid; | } timerid; | ||||||
|    |    | ||||||
| void Curl_pgrsDone(struct connectdata *); | void Curl_pgrsDone(struct connectdata *); | ||||||
| void Curl_pgrsStartNow(struct UrlData *data); | void Curl_pgrsStartNow(struct SessionHandle *data); | ||||||
| void Curl_pgrsSetDownloadSize(struct UrlData *data, double size); | void Curl_pgrsSetDownloadSize(struct SessionHandle *data, double size); | ||||||
| void Curl_pgrsSetUploadSize(struct UrlData *data, double size); | void Curl_pgrsSetUploadSize(struct SessionHandle *data, double size); | ||||||
| void Curl_pgrsSetDownloadCounter(struct UrlData *data, double size); | void Curl_pgrsSetDownloadCounter(struct SessionHandle *data, double size); | ||||||
| void Curl_pgrsSetUploadCounter(struct UrlData *data, double size); | void Curl_pgrsSetUploadCounter(struct SessionHandle *data, double size); | ||||||
| int Curl_pgrsUpdate(struct connectdata *); | int Curl_pgrsUpdate(struct connectdata *); | ||||||
| void Curl_pgrsTime(struct UrlData *data, timerid timer); | void Curl_pgrsTime(struct SessionHandle *data, timerid timer); | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Don't show progress for sizes smaller than: */ | /* Don't show progress for sizes smaller than: */ | ||||||
|   | |||||||
							
								
								
									
										267
									
								
								lib/security.c
									
									
									
									
									
								
							
							
						
						
									
										267
									
								
								lib/security.c
									
									
									
									
									
								
							| @@ -1,9 +1,12 @@ | |||||||
| /* modified by Martin Hedenfalk <mhe@stacken.kth.se> for use in Curl | /* This source code was modified by Martin Hedenfalk <mhe@stacken.kth.se> for | ||||||
|  * last modified 2000-09-18 |  * use in Curl. His latest changes were done 2000-09-18. | ||||||
|  * Even more obscurified to merge better into libcurl by Daniel Stenberg. |  * | ||||||
|  */ |  * It has since been patched and modified a lot by Daniel Stenberg | ||||||
|  |  * <daniel@haxx.se> to make it better applied to curl conditions, and to make | ||||||
| /* |  * it not use globals, pollute name space and more. This source code awaits a | ||||||
|  |  * rewrite to work around the paragraph 2 in the BSD licenses as explained | ||||||
|  |  * below. | ||||||
|  |  * | ||||||
|  * Copyright (c) 1998, 1999 Kungliga Tekniska H<>gskolan |  * Copyright (c) 1998, 1999 Kungliga Tekniska H<>gskolan | ||||||
|  * (Royal Institute of Technology, Stockholm, Sweden). |  * (Royal Institute of Technology, Stockholm, Sweden). | ||||||
|  * All rights reserved. |  * All rights reserved. | ||||||
| @@ -33,8 +36,7 @@ | |||||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||||
|  * SUCH DAMAGE. |  * SUCH DAMAGE.  */ | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
|  |  | ||||||
| @@ -73,69 +75,36 @@ static struct { | |||||||
|     { prot_private, "private" } |     { prot_private, "private" } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #if 0 |  | ||||||
| static const char * |  | ||||||
| level_to_name(enum protection_level level) |  | ||||||
| { |  | ||||||
|     int i; |  | ||||||
|     for(i = 0; i < sizeof(level_names) / sizeof(level_names[0]); i++) |  | ||||||
| 	if(level_names[i].level == level) |  | ||||||
| 	    return level_names[i].name; |  | ||||||
|     return "unknown"; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef FTP_SERVER /* not used in server */ |  | ||||||
| static enum protection_level  | static enum protection_level  | ||||||
| name_to_level(const char *name) | name_to_level(const char *name) | ||||||
| { | { | ||||||
|   int i; |   int i; | ||||||
|     for(i = 0; i < sizeof(level_names) / sizeof(level_names[0]); i++) |   for(i = 0; i < (int)sizeof(level_names)/(int)sizeof(level_names[0]); i++) | ||||||
|     if(!strncasecmp(level_names[i].name, name, strlen(name))) |     if(!strncasecmp(level_names[i].name, name, strlen(name))) | ||||||
|       return level_names[i].level; |       return level_names[i].level; | ||||||
|   return (enum protection_level)-1; |   return (enum protection_level)-1; | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef FTP_SERVER | static struct Curl_sec_client_mech *mechs[] = { | ||||||
|  |  | ||||||
| static struct sec_server_mech *mechs[] = { |  | ||||||
| #ifdef KRB5 | #ifdef KRB5 | ||||||
|     &gss_server_mech, |   /* not supported */ | ||||||
| #endif | #endif | ||||||
| #ifdef KRB4 | #ifdef KRB4 | ||||||
|     &krb4_server_mech, |     &Curl_krb4_client_mech, | ||||||
| #endif | #endif | ||||||
|     NULL |     NULL | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static struct sec_server_mech *mech; |  | ||||||
|  |  | ||||||
| #else |  | ||||||
|  |  | ||||||
| static struct sec_client_mech *mechs[] = { |  | ||||||
| #ifdef KRB5 |  | ||||||
|     &gss_client_mech, |  | ||||||
| #endif |  | ||||||
| #ifdef KRB4 |  | ||||||
|     &krb4_client_mech, |  | ||||||
| #endif |  | ||||||
|     NULL |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| static struct sec_client_mech *mech; |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_getc(struct connectdata *conn, FILE *F) | Curl_sec_getc(struct connectdata *conn, FILE *F) | ||||||
| { | { | ||||||
|   if(conn->sec_complete && conn->data_prot) { |   if(conn->sec_complete && conn->data_prot) { | ||||||
|     char c; |     char c; | ||||||
|     if(sec_read(conn, fileno(F), &c, 1) <= 0) |     if(Curl_sec_read(conn, fileno(F), &c, 1) <= 0) | ||||||
|       return EOF; |       return EOF; | ||||||
|     return c; |     return c; | ||||||
|   } else |   } | ||||||
|  |   else | ||||||
|     return getc(F); |     return getc(F); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -173,7 +142,7 @@ block_write(int fd, void *buf, size_t len) | |||||||
|  |  | ||||||
| static int | static int | ||||||
| sec_get_data(struct connectdata *conn, | sec_get_data(struct connectdata *conn, | ||||||
|              int fd, struct krb4buffer *buf, int level) |              int fd, struct krb4buffer *buf) | ||||||
| { | { | ||||||
|   int len; |   int len; | ||||||
|   int b; |   int b; | ||||||
| @@ -190,7 +159,7 @@ sec_get_data(struct connectdata *conn, | |||||||
|     return 0; |     return 0; | ||||||
|   else if (b < 0) |   else if (b < 0) | ||||||
|     return -1; |     return -1; | ||||||
|   buf->size = (*mech->decode)(conn->app_data, buf->data, len, |   buf->size = (conn->mech->decode)(conn->app_data, buf->data, len, | ||||||
|                                    conn->data_prot, conn); |                                    conn->data_prot, conn); | ||||||
|   buf->index = 0; |   buf->index = 0; | ||||||
|   return 0; |   return 0; | ||||||
| @@ -225,7 +194,7 @@ buffer_write(struct krb4buffer *buf, void *data, size_t len) | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_read(struct connectdata *conn, int fd, void *buffer, int length) | Curl_sec_read(struct connectdata *conn, int fd, void *buffer, int length) | ||||||
| { | { | ||||||
|     size_t len; |     size_t len; | ||||||
|     int rx = 0; |     int rx = 0; | ||||||
| @@ -244,7 +213,7 @@ sec_read(struct connectdata *conn, int fd, void *buffer, int length) | |||||||
|     buffer = (char*)buffer + len; |     buffer = (char*)buffer + len; | ||||||
|      |      | ||||||
|     while(length) { |     while(length) { | ||||||
|       if(sec_get_data(conn, fd, &conn->in_buffer, conn->data_prot) < 0) |       if(sec_get_data(conn, fd, &conn->in_buffer) < 0) | ||||||
|         return -1; |         return -1; | ||||||
|       if(conn->in_buffer.size == 0) { |       if(conn->in_buffer.size == 0) { | ||||||
|         if(rx) |         if(rx) | ||||||
| @@ -264,7 +233,8 @@ sec_send(struct connectdata *conn, int fd, char *from, int length) | |||||||
| { | { | ||||||
|   int bytes; |   int bytes; | ||||||
|   void *buf; |   void *buf; | ||||||
|   bytes = (*mech->encode)(conn->app_data, from, length, conn->data_prot, &buf, conn); |   bytes = (conn->mech->encode)(conn->app_data, from, length, conn->data_prot, | ||||||
|  |                                &buf, conn); | ||||||
|   bytes = htonl(bytes); |   bytes = htonl(bytes); | ||||||
|   block_write(fd, &bytes, sizeof(bytes)); |   block_write(fd, &bytes, sizeof(bytes)); | ||||||
|   block_write(fd, buf, ntohl(bytes)); |   block_write(fd, buf, ntohl(bytes)); | ||||||
| @@ -273,26 +243,11 @@ sec_send(struct connectdata *conn, int fd, char *from, int length) | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_fflush(struct connectdata *conn, FILE *F) | Curl_sec_fflush_fd(struct connectdata *conn, int fd) | ||||||
| { | { | ||||||
|   if(conn->data_prot != prot_clear) { |   if(conn->data_prot != prot_clear) { | ||||||
|     if(conn->out_buffer.index > 0){ |     if(conn->out_buffer.index > 0){ | ||||||
|       sec_write(conn, fileno(F), |       Curl_sec_write(conn, fd, | ||||||
|                 conn->out_buffer.data, conn->out_buffer.index); |  | ||||||
|       conn->out_buffer.index = 0; |  | ||||||
|     } |  | ||||||
|     sec_send(conn, fileno(F), NULL, 0); |  | ||||||
|   } |  | ||||||
|   fflush(F); |  | ||||||
|   return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int |  | ||||||
| sec_fflush_fd(struct connectdata *conn, int fd) |  | ||||||
| { |  | ||||||
|   if(conn->data_prot != prot_clear) { |  | ||||||
|     if(conn->out_buffer.index > 0){ |  | ||||||
|       sec_write(conn, fd, |  | ||||||
|                 conn->out_buffer.data, conn->out_buffer.index); |                 conn->out_buffer.data, conn->out_buffer.index); | ||||||
|       conn->out_buffer.index = 0; |       conn->out_buffer.index = 0; | ||||||
|     } |     } | ||||||
| @@ -302,7 +257,7 @@ sec_fflush_fd(struct connectdata *conn, int fd) | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_write(struct connectdata *conn, int fd, char *buffer, int length) | Curl_sec_write(struct connectdata *conn, int fd, char *buffer, int length) | ||||||
| { | { | ||||||
|   int len = conn->buffer_size; |   int len = conn->buffer_size; | ||||||
|   int tx = 0; |   int tx = 0; | ||||||
| @@ -310,7 +265,7 @@ sec_write(struct connectdata *conn, int fd, char *buffer, int length) | |||||||
|   if(conn->data_prot == prot_clear) |   if(conn->data_prot == prot_clear) | ||||||
|     return write(fd, buffer, length); |     return write(fd, buffer, length); | ||||||
|  |  | ||||||
|   len -= (*mech->overhead)(conn->app_data, conn->data_prot, len); |   len -= (conn->mech->overhead)(conn->app_data, conn->data_prot, len); | ||||||
|   while(length){ |   while(length){ | ||||||
|     if(length < len) |     if(length < len) | ||||||
|       len = length; |       len = length; | ||||||
| @@ -323,7 +278,7 @@ sec_write(struct connectdata *conn, int fd, char *buffer, int length) | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_vfprintf2(struct connectdata *conn, FILE *f, const char *fmt, va_list ap) | Curl_sec_vfprintf2(struct connectdata *conn, FILE *f, const char *fmt, va_list ap) | ||||||
| { | { | ||||||
|   char *buf; |   char *buf; | ||||||
|   int ret; |   int ret; | ||||||
| @@ -338,18 +293,18 @@ sec_vfprintf2(struct connectdata *conn, FILE *f, const char *fmt, va_list ap) | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_fprintf2(struct connectdata *conn, FILE *f, const char *fmt, ...) | Curl_sec_fprintf2(struct connectdata *conn, FILE *f, const char *fmt, ...) | ||||||
| { | { | ||||||
|     int ret; |     int ret; | ||||||
|     va_list ap; |     va_list ap; | ||||||
|     va_start(ap, fmt); |     va_start(ap, fmt); | ||||||
|     ret = sec_vfprintf2(conn, f, fmt, ap); |     ret = Curl_sec_vfprintf2(conn, f, fmt, ap); | ||||||
|     va_end(ap); |     va_end(ap); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_putc(struct connectdata *conn, int c, FILE *F) | Curl_sec_putc(struct connectdata *conn, int c, FILE *F) | ||||||
| { | { | ||||||
|   char ch = c; |   char ch = c; | ||||||
|   if(conn->data_prot == prot_clear) |   if(conn->data_prot == prot_clear) | ||||||
| @@ -357,14 +312,14 @@ sec_putc(struct connectdata *conn, int c, FILE *F) | |||||||
|      |      | ||||||
|   buffer_write(&conn->out_buffer, &ch, 1); |   buffer_write(&conn->out_buffer, &ch, 1); | ||||||
|   if(c == '\n' || conn->out_buffer.index >= 1024 /* XXX */) { |   if(c == '\n' || conn->out_buffer.index >= 1024 /* XXX */) { | ||||||
|     sec_write(conn, fileno(F), conn->out_buffer.data, conn->out_buffer.index); |     Curl_sec_write(conn, fileno(F), conn->out_buffer.data, conn->out_buffer.index); | ||||||
|     conn->out_buffer.index = 0; |     conn->out_buffer.index = 0; | ||||||
|   } |   } | ||||||
|   return c; |   return c; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_read_msg(struct connectdata *conn, char *s, int level) | Curl_sec_read_msg(struct connectdata *conn, char *s, int level) | ||||||
| { | { | ||||||
|     int len; |     int len; | ||||||
|     char *buf; |     char *buf; | ||||||
| @@ -373,7 +328,7 @@ sec_read_msg(struct connectdata *conn, char *s, int level) | |||||||
|     buf = malloc(strlen(s)); |     buf = malloc(strlen(s)); | ||||||
|     len = Curl_base64_decode(s + 4, buf); /* XXX */ |     len = Curl_base64_decode(s + 4, buf); /* XXX */ | ||||||
|      |      | ||||||
|     len = (*mech->decode)(conn->app_data, buf, len, level, conn); |     len = (conn->mech->decode)(conn->app_data, buf, len, level, conn); | ||||||
|     if(len < 0) |     if(len < 0) | ||||||
| 	return -1; | 	return -1; | ||||||
|      |      | ||||||
| @@ -392,7 +347,7 @@ sec_read_msg(struct connectdata *conn, char *s, int level) | |||||||
|  |  | ||||||
| /* modified to return how many bytes written, or -1 on error ***/ | /* modified to return how many bytes written, or -1 on error ***/ | ||||||
| int | int | ||||||
| sec_vfprintf(struct connectdata *conn, FILE *f, const char *fmt, va_list ap) | Curl_sec_vfprintf(struct connectdata *conn, FILE *f, const char *fmt, va_list ap) | ||||||
| { | { | ||||||
|     int ret = 0; |     int ret = 0; | ||||||
|     char *buf; |     char *buf; | ||||||
| @@ -402,7 +357,7 @@ sec_vfprintf(struct connectdata *conn, FILE *f, const char *fmt, va_list ap) | |||||||
| 	return vfprintf(f, fmt, ap); | 	return vfprintf(f, fmt, ap); | ||||||
|      |      | ||||||
|     buf = aprintf(fmt, ap); |     buf = aprintf(fmt, ap); | ||||||
|     len = (*mech->encode)(conn->app_data, buf, strlen(buf), |     len = (conn->mech->encode)(conn->app_data, buf, strlen(buf), | ||||||
|                                conn->command_prot, &enc, |                                conn->command_prot, &enc, | ||||||
|                                conn); |                                conn); | ||||||
|     free(buf); |     free(buf); | ||||||
| @@ -414,67 +369,43 @@ sec_vfprintf(struct connectdata *conn, FILE *f, const char *fmt, va_list ap) | |||||||
|       failf(conn->data, "Out of memory base64-encoding.\n"); |       failf(conn->data, "Out of memory base64-encoding.\n"); | ||||||
|       return -1; |       return -1; | ||||||
|     } |     } | ||||||
| #ifdef FTP_SERVER |  | ||||||
|     if(command_prot == prot_safe) |  | ||||||
| 	fprintf(f, "631 %s\r\n", buf); |  | ||||||
|     else if(command_prot == prot_private) |  | ||||||
| 	fprintf(f, "632 %s\r\n", buf); |  | ||||||
|     else if(command_prot == prot_confidential) |  | ||||||
| 	fprintf(f, "633 %s\r\n", buf); |  | ||||||
| #else |  | ||||||
|     if(conn->command_prot == prot_safe) |     if(conn->command_prot == prot_safe) | ||||||
| 	ret = fprintf(f, "MIC %s", buf); | 	ret = fprintf(f, "MIC %s", buf); | ||||||
|     else if(conn->command_prot == prot_private) |     else if(conn->command_prot == prot_private) | ||||||
| 	ret = fprintf(f, "ENC %s", buf); | 	ret = fprintf(f, "ENC %s", buf); | ||||||
|     else if(conn->command_prot == prot_confidential) |     else if(conn->command_prot == prot_confidential) | ||||||
| 	ret = fprintf(f, "CONF %s", buf); | 	ret = fprintf(f, "CONF %s", buf); | ||||||
| #endif |  | ||||||
|     free(buf); |     free(buf); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_fprintf(struct connectdata *conn, FILE *f, const char *fmt, ...) | Curl_sec_fprintf(struct connectdata *conn, FILE *f, const char *fmt, ...) | ||||||
| { | { | ||||||
|     va_list ap; |     va_list ap; | ||||||
|     int ret; |     int ret; | ||||||
|     va_start(ap, fmt); |     va_start(ap, fmt); | ||||||
|     ret = sec_vfprintf(conn, f, fmt, ap); |     ret = Curl_sec_vfprintf(conn, f, fmt, ap); | ||||||
|     va_end(ap); |     va_end(ap); | ||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| /* end common stuff */ |  | ||||||
|  |  | ||||||
| #ifdef FTP_SERVER | enum protection_level | ||||||
|  | Curl_set_command_prot(struct connectdata *conn, enum protection_level level) | ||||||
| /* snip */ |  | ||||||
|  |  | ||||||
| #else /* FTP_SERVER */ |  | ||||||
|  |  | ||||||
| #if 0 |  | ||||||
| void |  | ||||||
| sec_status(void) |  | ||||||
| { | { | ||||||
|     if(conn->sec_complete){ |     enum protection_level old = conn->command_prot; | ||||||
| 	printf("Using %s for authentication.\n", mech->name); |     conn->command_prot = level; | ||||||
| 	printf("Using %s command channel.\n", level_to_name(command_prot)); |     return old; | ||||||
| 	printf("Using %s data channel.\n", level_to_name(data_prot)); |  | ||||||
| 	if(buffer_size > 0) |  | ||||||
| 	    printf("Protection buffer size: %lu.\n",  |  | ||||||
| 		   (unsigned long)buffer_size); |  | ||||||
|     }else{ |  | ||||||
| 	printf("Not using any security mechanism.\n"); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| static int | static int | ||||||
| sec_prot_internal(struct connectdata *conn, int level) | sec_prot_internal(struct connectdata *conn, int level) | ||||||
| { | { | ||||||
|   char *p; |   char *p; | ||||||
|   unsigned int s = 1048576; |   unsigned int s = 1048576; | ||||||
|     size_t nread; |   ssize_t nread; | ||||||
|  |  | ||||||
|   if(!conn->sec_complete){ |   if(!conn->sec_complete){ | ||||||
|     infof(conn->data, "No security data exchange has taken place.\n"); |     infof(conn->data, "No security data exchange has taken place.\n"); | ||||||
| @@ -486,15 +417,15 @@ sec_prot_internal(struct connectdata *conn, int level) | |||||||
|                   "PBSZ %u", s); |                   "PBSZ %u", s); | ||||||
|     /* wait for feedback */ |     /* wait for feedback */ | ||||||
|     nread = Curl_GetFTPResponse(conn->firstsocket, |     nread = Curl_GetFTPResponse(conn->firstsocket, | ||||||
|                                   conn->data->buffer, conn, NULL); |                                 conn->data->state.buffer, conn, NULL); | ||||||
|     if(nread < 0) |     if(nread < 0) | ||||||
|       return /*CURLE_OPERATION_TIMEOUTED*/-1; |       return /*CURLE_OPERATION_TIMEOUTED*/-1; | ||||||
|       if(/*ret != COMPLETE*/conn->data->buffer[0] != '2'){ |     if(/*ret != COMPLETE*/conn->data->state.buffer[0] != '2'){ | ||||||
|       failf(conn->data, "Failed to set protection buffer size.\n"); |       failf(conn->data, "Failed to set protection buffer size.\n"); | ||||||
|       return -1; |       return -1; | ||||||
|     } |     } | ||||||
|     conn->buffer_size = s; |     conn->buffer_size = s; | ||||||
|       p = strstr(/*reply_string*/conn->data->buffer, "PBSZ="); |     p = strstr(/*reply_string*/conn->data->state.buffer, "PBSZ="); | ||||||
|     if(p) |     if(p) | ||||||
|       sscanf(p, "PBSZ=%u", &s); |       sscanf(p, "PBSZ=%u", &s); | ||||||
|     if(s < conn->buffer_size) |     if(s < conn->buffer_size) | ||||||
| @@ -505,10 +436,10 @@ sec_prot_internal(struct connectdata *conn, int level) | |||||||
|                 "PROT %c", level["CSEP"]); |                 "PROT %c", level["CSEP"]); | ||||||
|   /* wait for feedback */ |   /* wait for feedback */ | ||||||
|   nread = Curl_GetFTPResponse(conn->firstsocket, |   nread = Curl_GetFTPResponse(conn->firstsocket, | ||||||
|                                 conn->data->buffer, conn, NULL); |                               conn->data->state.buffer, conn, NULL); | ||||||
|   if(nread < 0) |   if(nread < 0) | ||||||
|     return /*CURLE_OPERATION_TIMEOUTED*/-1; |     return /*CURLE_OPERATION_TIMEOUTED*/-1; | ||||||
|     if(/*ret != COMPLETE*/conn->data->buffer[0] != '2'){ |   if(/*ret != COMPLETE*/conn->data->state.buffer[0] != '2'){ | ||||||
|     failf(conn->data, "Failed to set protection level.\n"); |     failf(conn->data, "Failed to set protection level.\n"); | ||||||
|     return -1; |     return -1; | ||||||
|   } |   } | ||||||
| @@ -517,59 +448,8 @@ sec_prot_internal(struct connectdata *conn, int level) | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| enum protection_level |  | ||||||
| set_command_prot(struct connectdata *conn, enum protection_level level) |  | ||||||
| { |  | ||||||
|     enum protection_level old = conn->command_prot; |  | ||||||
|     conn->command_prot = level; |  | ||||||
|     return old; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #if 0 |  | ||||||
| void | void | ||||||
| sec_prot(int argc, char **argv) | Curl_sec_set_protection_level(struct connectdata *conn) | ||||||
| { |  | ||||||
|     int level = -1; |  | ||||||
|  |  | ||||||
|     if(argc < 2 || argc > 3) |  | ||||||
| 	goto usage; |  | ||||||
|     if(!sec_complete) { |  | ||||||
| 	printf("No security data exchange has taken place.\n"); |  | ||||||
| 	code = -1; |  | ||||||
| 	return; |  | ||||||
|     } |  | ||||||
|     level = name_to_level(argv[argc - 1]); |  | ||||||
|      |  | ||||||
|     if(level == -1) |  | ||||||
| 	goto usage; |  | ||||||
|      |  | ||||||
|     if((*mech->check_prot)(conn->app_data, level)) { |  | ||||||
| 	printf("%s does not implement %s protection.\n",  |  | ||||||
| 	       mech->name, level_to_name(level)); |  | ||||||
| 	code = -1; |  | ||||||
| 	return; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if(argc == 2 || strncasecmp(argv[1], "data", strlen(argv[1])) == 0) { |  | ||||||
| 	if(sec_prot_internal(level) < 0){ |  | ||||||
| 	    code = -1; |  | ||||||
| 	    return; |  | ||||||
| 	} |  | ||||||
|     } else if(strncasecmp(argv[1], "command", strlen(argv[1])) == 0) |  | ||||||
| 	set_command_prot(level); |  | ||||||
|     else |  | ||||||
| 	goto usage; |  | ||||||
|     code = 0; |  | ||||||
|     return; |  | ||||||
|  usage: |  | ||||||
|     printf("usage: %s [command|data] [clear|safe|confidential|private]\n", |  | ||||||
| 	   argv[0]); |  | ||||||
|     code = -1; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| void |  | ||||||
| sec_set_protection_level(struct connectdata *conn) |  | ||||||
| { | { | ||||||
|   if(conn->sec_complete && conn->data_prot != conn->request_data_prot) |   if(conn->sec_complete && conn->data_prot != conn->request_data_prot) | ||||||
|     sec_prot_internal(conn, conn->request_data_prot); |     sec_prot_internal(conn, conn->request_data_prot); | ||||||
| @@ -577,7 +457,7 @@ sec_set_protection_level(struct connectdata *conn) | |||||||
|  |  | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_request_prot(struct connectdata *conn, char *level) | Curl_sec_request_prot(struct connectdata *conn, const char *level) | ||||||
| { | { | ||||||
|   int l = name_to_level(level); |   int l = name_to_level(level); | ||||||
|   if(l == -1) |   if(l == -1) | ||||||
| @@ -587,12 +467,12 @@ sec_request_prot(struct connectdata *conn, char *level) | |||||||
| } | } | ||||||
|  |  | ||||||
| int | int | ||||||
| sec_login(struct connectdata *conn) | Curl_sec_login(struct connectdata *conn) | ||||||
| { | { | ||||||
|   int ret; |   int ret; | ||||||
|     struct sec_client_mech **m; |   struct Curl_sec_client_mech **m; | ||||||
|     size_t nread; |   ssize_t nread; | ||||||
|     struct UrlData *data=conn->data; |   struct SessionHandle *data=conn->data; | ||||||
|  |  | ||||||
|   for(m = mechs; *m && (*m)->name; m++) { |   for(m = mechs; *m && (*m)->name; m++) { | ||||||
|     void *tmp; |     void *tmp; | ||||||
| @@ -614,18 +494,18 @@ sec_login(struct connectdata *conn) | |||||||
|                   "AUTH %s", (*m)->name); |                   "AUTH %s", (*m)->name); | ||||||
|     /* wait for feedback */ |     /* wait for feedback */ | ||||||
|     nread = Curl_GetFTPResponse(conn->firstsocket, |     nread = Curl_GetFTPResponse(conn->firstsocket, | ||||||
|                                     conn->data->buffer, conn, NULL); |                                 conn->data->state.buffer, conn, NULL); | ||||||
|     if(nread < 0) |     if(nread < 0) | ||||||
|       return /*CURLE_OPERATION_TIMEOUTED*/-1; |       return /*CURLE_OPERATION_TIMEOUTED*/-1; | ||||||
| 	if(/*ret != CONTINUE*/conn->data->buffer[0] != '3'){ |     if(/*ret != CONTINUE*/conn->data->state.buffer[0] != '3'){ | ||||||
| 	    if(/*code == 504*/strncmp(conn->data->buffer,"504",3) == 0) { |       if(/*code == 504*/strncmp(conn->data->state.buffer,"504",3) == 0) { | ||||||
|         infof(data, |         infof(data, | ||||||
|               "%s is not supported by the server.\n", (*m)->name); |               "%s is not supported by the server.\n", (*m)->name); | ||||||
|       } |       } | ||||||
|             else if(/*code == 534*/strncmp(conn->data->buffer,"534",3) == 0) { |       else if(/*code == 534*/strncmp(conn->data->state.buffer,"534",3) == 0) { | ||||||
|         infof(data, "%s rejected as security mechanism.\n", (*m)->name); |         infof(data, "%s rejected as security mechanism.\n", (*m)->name); | ||||||
|       } |       } | ||||||
|             else if(/*ret == ERROR*/conn->data->buffer[0] == '5') { |       else if(/*ret == ERROR*/conn->data->state.buffer[0] == '5') { | ||||||
|         infof(data, "The server doesn't support the FTP " |         infof(data, "The server doesn't support the FTP " | ||||||
|               "security extensions.\n"); |               "security extensions.\n"); | ||||||
|         return -1; |         return -1; | ||||||
| @@ -641,7 +521,7 @@ sec_login(struct connectdata *conn) | |||||||
|       /* mechanism is supposed to output error string */ |       /* mechanism is supposed to output error string */ | ||||||
|       return -1; |       return -1; | ||||||
|     } |     } | ||||||
| 	mech = *m; |     conn->mech = *m; | ||||||
|     conn->sec_complete = 1; |     conn->sec_complete = 1; | ||||||
|     conn->command_prot = prot_safe; |     conn->command_prot = prot_safe; | ||||||
|     break; |     break; | ||||||
| @@ -651,19 +531,26 @@ sec_login(struct connectdata *conn) | |||||||
| } | } | ||||||
|  |  | ||||||
| void | void | ||||||
| sec_end(struct connectdata *conn) | Curl_sec_end(struct connectdata *conn) | ||||||
| { | { | ||||||
|     if (mech != NULL) { |   if (conn->mech != NULL) { | ||||||
| 	if(mech->end) |     if(conn->mech->end) | ||||||
| 	    (*mech->end)(conn->app_data); |       (conn->mech->end)(conn->app_data); | ||||||
| 	memset(conn->app_data, 0, mech->size); |     memset(conn->app_data, 0, conn->mech->size); | ||||||
|     free(conn->app_data); |     free(conn->app_data); | ||||||
|     conn->app_data = NULL; |     conn->app_data = NULL; | ||||||
|   } |   } | ||||||
|   conn->sec_complete = 0; |   conn->sec_complete = 0; | ||||||
|   conn->data_prot = (enum protection_level)0; |   conn->data_prot = (enum protection_level)0; | ||||||
|  |   conn->mech=NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif /* FTP_SERVER */ |  | ||||||
|  |  | ||||||
| #endif /* KRB4 */ | #endif /* KRB4 */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										152
									
								
								lib/security.h
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								lib/security.h
									
									
									
									
									
								
							| @@ -1,50 +1,35 @@ | |||||||
| /* modified by Martin Hedenfalk <mhe@stacken.kth.se> for use in Curl | #ifndef __SECURITY_H | ||||||
|  * last modified 2000-09-18 | #define __SECURITY_H | ||||||
|  */ | /***************************************************************************** | ||||||
|  |  *                                  _   _ ____  _      | ||||||
|  |  *  Project                     ___| | | |  _ \| |     | ||||||
|  |  *                             / __| | | | |_) | |     | ||||||
|  |  *                            | (__| |_| |  _ <| |___  | ||||||
|  |  *                             \___|\___/|_| \_\_____| | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
|  |  * | ||||||
|  |  * In order to be useful for every potential user, curl and libcurl are | ||||||
|  |  * dual-licensed under the MPL and the MIT/X-derivate licenses. | ||||||
|  |  * | ||||||
|  |  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||||
|  |  * copies of the Software, and permit persons to whom the Software is | ||||||
|  |  * furnished to do so, under the terms of the MPL or the MIT/X-derivate | ||||||
|  |  * licenses. You may pick one of these licenses. | ||||||
|  |  * | ||||||
|  |  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||||
|  |  * KIND, either express or implied. | ||||||
|  |  * | ||||||
|  |  * $Id$ | ||||||
|  |  *****************************************************************************/ | ||||||
|  |  | ||||||
| /* | /* this is a re-write */ | ||||||
|  * Copyright (c) 1998, 1999 Kungliga Tekniska H<>gskolan |  | ||||||
|  * (Royal Institute of Technology, Stockholm, Sweden).  |  | ||||||
|  * All rights reserved.  |  | ||||||
|  * |  | ||||||
|  * Redistribution and use in source and binary forms, with or without  |  | ||||||
|  * modification, are permitted provided that the following conditions  |  | ||||||
|  * are met:  |  | ||||||
|  * |  | ||||||
|  * 1. Redistributions of source code must retain the above copyright  |  | ||||||
|  *    notice, this list of conditions and the following disclaimer.  |  | ||||||
|  * |  | ||||||
|  * 2. Redistributions in binary form must reproduce the above copyright  |  | ||||||
|  *    notice, this list of conditions and the following disclaimer in the  |  | ||||||
|  *    documentation and/or other materials provided with the distribution.  |  | ||||||
|  * |  | ||||||
|  * 3. Neither the name of the Institute nor the names of its contributors  |  | ||||||
|  *    may be used to endorse or promote products derived from this software  |  | ||||||
|  *    without specific prior written permission.  |  | ||||||
|  * |  | ||||||
|  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  |  | ||||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  |  | ||||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  |  | ||||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  |  | ||||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  |  | ||||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  |  | ||||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  |  | ||||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  |  | ||||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  |  | ||||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  |  | ||||||
|  * SUCH DAMAGE.  |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| /* $Id$ */ |  | ||||||
|  |  | ||||||
| #ifndef __security_h__ |  | ||||||
| #define __security_h__ |  | ||||||
|  |  | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| #include "urldata.h"  /* for struct connectdata * */ | #include "urldata.h"  /* for struct connectdata * */ | ||||||
|  |  | ||||||
| struct sec_client_mech { | struct Curl_sec_client_mech { | ||||||
|     char *name; |   const char *name; | ||||||
|   size_t size; |   size_t size; | ||||||
|   int (*init)(void *); |   int (*init)(void *); | ||||||
|   int (*auth)(void *, struct connectdata *); |   int (*auth)(void *, struct connectdata *); | ||||||
| @@ -55,80 +40,33 @@ struct sec_client_mech { | |||||||
|   int (*decode)(void *, void*, int, int, struct connectdata *); |   int (*decode)(void *, void*, int, int, struct connectdata *); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct sec_server_mech { |  | ||||||
|     char *name; |  | ||||||
|     size_t size; |  | ||||||
|     int (*init)(void *); |  | ||||||
|     void (*end)(void *); |  | ||||||
|     int (*check_prot)(void *, int); |  | ||||||
|     int (*overhead)(void *, int, int); |  | ||||||
|     int (*encode)(void *, void*, int, int, void**); |  | ||||||
|     int (*decode)(void *, void*, int, int); |  | ||||||
|  |  | ||||||
|     int (*auth)(void *); |  | ||||||
|     int (*adat)(void *, void*, size_t); |  | ||||||
|     size_t (*pbsz)(void *, size_t); |  | ||||||
|     int (*ccc)(void*); |  | ||||||
|     int (*userok)(void*, char*); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #define AUTH_OK		0 | #define AUTH_OK		0 | ||||||
| #define AUTH_CONTINUE	1 | #define AUTH_CONTINUE	1 | ||||||
| #define AUTH_ERROR	2 | #define AUTH_ERROR	2 | ||||||
|  |  | ||||||
| #ifdef FTP_SERVER | extern struct Curl_sec_client_mech Curl_krb4_client_mech; | ||||||
| extern struct sec_server_mech krb4_server_mech, gss_server_mech; |  | ||||||
| #else |  | ||||||
| extern struct sec_client_mech krb4_client_mech, gss_client_mech; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| extern int sec_complete; | int Curl_sec_fflush_fd(struct connectdata *conn, int fd); | ||||||
|  | int Curl_sec_fprintf (struct connectdata *, FILE *, const char *, ...); | ||||||
|  | int Curl_sec_getc (struct connectdata *conn, FILE *); | ||||||
|  | int Curl_sec_putc (struct connectdata *conn, int, FILE *); | ||||||
|  | int Curl_sec_read (struct connectdata *conn, int, void *, int); | ||||||
|  | int Curl_sec_read_msg (struct connectdata *conn, char *, int); | ||||||
|  |  | ||||||
| #ifdef FTP_SERVER | int Curl_sec_vfprintf(struct connectdata *, FILE *, const char *, va_list); | ||||||
| extern char *ftp_command; | int Curl_sec_fprintf2(struct connectdata *conn, FILE *f, const char *fmt, ...); | ||||||
| void new_ftp_command(char*); | int Curl_sec_vfprintf2(struct connectdata *conn, FILE *, const char *, va_list); | ||||||
| void delete_ftp_command(void); | int Curl_sec_write (struct connectdata *conn, int, char *, int); | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* ---- */ | void Curl_sec_end (struct connectdata *); | ||||||
|  | int Curl_sec_login (struct connectdata *); | ||||||
|  | void Curl_sec_prot (int, char **); | ||||||
|  | int Curl_sec_request_prot (struct connectdata *conn, const char *level); | ||||||
|  | void Curl_sec_set_protection_level(struct connectdata *conn); | ||||||
|  | void Curl_sec_status (void); | ||||||
|  |  | ||||||
|  | enum protection_level Curl_set_command_prot(struct connectdata *, | ||||||
| int sec_fflush (struct connectdata *conn, FILE *); |  | ||||||
| int sec_fflush_fd(struct connectdata *conn, int fd); |  | ||||||
| int sec_fprintf (struct connectdata *, FILE *, const char *, ...); |  | ||||||
| int sec_getc (struct connectdata *conn, FILE *); |  | ||||||
| int sec_putc (struct connectdata *conn, int, FILE *); |  | ||||||
| int sec_read (struct connectdata *conn, int, void *, int); |  | ||||||
| int sec_read_msg (struct connectdata *conn, char *, int); |  | ||||||
|  |  | ||||||
| int sec_vfprintf(struct connectdata *, FILE *, const char *, va_list); |  | ||||||
| int sec_fprintf2(struct connectdata *conn, FILE *f, const char *fmt, ...); |  | ||||||
| int sec_vfprintf2(struct connectdata *conn, FILE *, const char *, va_list); |  | ||||||
| int sec_write (struct connectdata *conn, int, char *, int); |  | ||||||
|  |  | ||||||
| #ifdef FTP_SERVER |  | ||||||
| void adat (char *); |  | ||||||
| void auth (char *); |  | ||||||
| void ccc (void); |  | ||||||
| void mec (char *, enum protection_level); |  | ||||||
| void pbsz (int); |  | ||||||
| void prot (char *); |  | ||||||
| void delete_ftp_command (void); |  | ||||||
| void new_ftp_command (char *); |  | ||||||
| int sec_userok (char *); |  | ||||||
| int secure_command (void); |  | ||||||
| enum protection_level get_command_prot(void); |  | ||||||
| #else |  | ||||||
| void sec_end (struct connectdata *); |  | ||||||
| int sec_login (struct connectdata *); |  | ||||||
| void sec_prot (int, char **); |  | ||||||
| int sec_request_prot (struct connectdata *conn, char *); |  | ||||||
| void sec_set_protection_level(struct connectdata *conn); |  | ||||||
| void sec_status (void); |  | ||||||
|  |  | ||||||
| enum protection_level set_command_prot(struct connectdata *, |  | ||||||
|                                             enum protection_level); |                                             enum protection_level); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* __security_h__ */   |  | ||||||
|   | |||||||
							
								
								
									
										56
									
								
								lib/sendf.c
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								lib/sendf.c
									
									
									
									
									
								
							| @@ -122,13 +122,13 @@ void curl_slist_free_all(struct curl_slist *list) | |||||||
|  |  | ||||||
| /* Curl_infof() is for info message along the way */ | /* Curl_infof() is for info message along the way */ | ||||||
|  |  | ||||||
| void Curl_infof(struct UrlData *data, char *fmt, ...) | void Curl_infof(struct SessionHandle *data, const char *fmt, ...) | ||||||
| { | { | ||||||
|   va_list ap; |   va_list ap; | ||||||
|   if(data->bits.verbose) { |   if(data->set.verbose) { | ||||||
|     va_start(ap, fmt); |     va_start(ap, fmt); | ||||||
|     fputs("* ", data->err); |     fputs("* ", data->set.err); | ||||||
|     vfprintf(data->err, fmt, ap); |     vfprintf(data->set.err, fmt, ap); | ||||||
|     va_end(ap); |     va_end(ap); | ||||||
|   } |   } | ||||||
| } | } | ||||||
| @@ -136,20 +136,20 @@ void Curl_infof(struct UrlData *data, char *fmt, ...) | |||||||
| /* Curl_failf() is for messages stating why we failed, the LAST one will be | /* Curl_failf() is for messages stating why we failed, the LAST one will be | ||||||
|    returned for the user (if requested) */ |    returned for the user (if requested) */ | ||||||
|  |  | ||||||
| void Curl_failf(struct UrlData *data, char *fmt, ...) | void Curl_failf(struct SessionHandle *data, const char *fmt, ...) | ||||||
| { | { | ||||||
|   va_list ap; |   va_list ap; | ||||||
|   va_start(ap, fmt); |   va_start(ap, fmt); | ||||||
|   if(data->errorbuffer) |   if(data->set.errorbuffer) | ||||||
|     vsnprintf(data->errorbuffer, CURL_ERROR_SIZE, fmt, ap); |     vsnprintf(data->set.errorbuffer, CURL_ERROR_SIZE, fmt, ap); | ||||||
|   va_end(ap); |   va_end(ap); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Curl_sendf() sends formated data to the server */ | /* Curl_sendf() sends formated data to the server */ | ||||||
| size_t Curl_sendf(int sockfd, struct connectdata *conn, | size_t Curl_sendf(int sockfd, struct connectdata *conn, | ||||||
|                   char *fmt, ...) |                   const char *fmt, ...) | ||||||
| { | { | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   size_t bytes_written; |   size_t bytes_written; | ||||||
|   char *s; |   char *s; | ||||||
|   va_list ap; |   va_list ap; | ||||||
| @@ -158,8 +158,8 @@ size_t Curl_sendf(int sockfd, struct connectdata *conn, | |||||||
|   va_end(ap); |   va_end(ap); | ||||||
|   if(!s) |   if(!s) | ||||||
|     return 0; /* failure */ |     return 0; /* failure */ | ||||||
|   if(data->bits.verbose) |   if(data->set.verbose) | ||||||
|     fprintf(data->err, "> %s", s); |     fprintf(data->set.err, "> %s", s); | ||||||
|  |  | ||||||
|   /* Write the buffer to the socket */ |   /* Write the buffer to the socket */ | ||||||
|   Curl_write(conn, sockfd, s, strlen(s), &bytes_written); |   Curl_write(conn, sockfd, s, strlen(s), &bytes_written); | ||||||
| @@ -181,21 +181,27 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd, | |||||||
|   size_t bytes_written; |   size_t bytes_written; | ||||||
|  |  | ||||||
| #ifdef USE_SSLEAY | #ifdef USE_SSLEAY | ||||||
|  |   /* SSL_write() is said to return 'int' while write() and send() returns | ||||||
|  |      'size_t' */ | ||||||
|  |   int ssl_bytes; | ||||||
|   if (conn->ssl.use) { |   if (conn->ssl.use) { | ||||||
|     int loop=100; /* just a precaution to never loop endlessly */ |     int loop=100; /* just a precaution to never loop endlessly */ | ||||||
|     while(loop--) { |     while(loop--) { | ||||||
|       bytes_written = SSL_write(conn->ssl.handle, mem, len); |       ssl_bytes = SSL_write(conn->ssl.handle, mem, len); | ||||||
|       if((-1 != bytes_written) || |       if((0 >= ssl_bytes) || | ||||||
|          (SSL_ERROR_WANT_WRITE != SSL_get_error(conn->ssl.handle, |          (SSL_ERROR_WANT_WRITE != SSL_get_error(conn->ssl.handle, | ||||||
|                                                 bytes_written) )) |                                                 ssl_bytes) )) { | ||||||
|  |         /* this converts from signed to unsigned... */ | ||||||
|  |         bytes_written = ssl_bytes; | ||||||
|         break; |         break; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |   } | ||||||
|   else { |   else { | ||||||
| #endif | #endif | ||||||
| #ifdef KRB4 | #ifdef KRB4 | ||||||
|     if(conn->sec_complete) { |     if(conn->sec_complete) { | ||||||
|       bytes_written = sec_write(conn, sockfd, mem, len); |       bytes_written = Curl_sec_write(conn, sockfd, mem, len); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
| #endif /* KRB4 */ | #endif /* KRB4 */ | ||||||
| @@ -213,7 +219,7 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd, | |||||||
|    The bit pattern defines to what "streams" to write to. Body and/or header. |    The bit pattern defines to what "streams" to write to. Body and/or header. | ||||||
|    The defines are in sendf.h of course. |    The defines are in sendf.h of course. | ||||||
|  */ |  */ | ||||||
| CURLcode Curl_client_write(struct UrlData *data, | CURLcode Curl_client_write(struct SessionHandle *data, | ||||||
|                            int type, |                            int type, | ||||||
|                            char *ptr, |                            char *ptr, | ||||||
|                            size_t len) |                            size_t len) | ||||||
| @@ -224,22 +230,22 @@ CURLcode Curl_client_write(struct UrlData *data, | |||||||
|     len = strlen(ptr); |     len = strlen(ptr); | ||||||
|  |  | ||||||
|   if(type & CLIENTWRITE_BODY) { |   if(type & CLIENTWRITE_BODY) { | ||||||
|     wrote = data->fwrite(ptr, 1, len, data->out); |     wrote = data->set.fwrite(ptr, 1, len, data->set.out); | ||||||
|     if(wrote != len) { |     if(wrote != len) { | ||||||
|       failf (data, "Failed writing body"); |       failf (data, "Failed writing body"); | ||||||
|       return CURLE_WRITE_ERROR; |       return CURLE_WRITE_ERROR; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   if((type & CLIENTWRITE_HEADER) && |   if((type & CLIENTWRITE_HEADER) && | ||||||
|      (data->fwrite_header || data->writeheader) ) { |      (data->set.fwrite_header || data->set.writeheader) ) { | ||||||
|     /* |     /* | ||||||
|      * Write headers to the same callback or to the especially setup |      * Write headers to the same callback or to the especially setup | ||||||
|      * header callback function (added after version 7.7.1). |      * header callback function (added after version 7.7.1). | ||||||
|      */ |      */ | ||||||
|     curl_write_callback writeit= |     curl_write_callback writeit= | ||||||
|       data->fwrite_header?data->fwrite_header:data->fwrite; |       data->set.fwrite_header?data->set.fwrite_header:data->set.fwrite; | ||||||
|  |  | ||||||
|     wrote = writeit(ptr, 1, len, data->writeheader); |     wrote = writeit(ptr, 1, len, data->set.writeheader); | ||||||
|     if(wrote != len) { |     if(wrote != len) { | ||||||
|       failf (data, "Failed writing header"); |       failf (data, "Failed writing header"); | ||||||
|       return CURLE_WRITE_ERROR; |       return CURLE_WRITE_ERROR; | ||||||
| @@ -274,7 +280,7 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd, | |||||||
| #endif | #endif | ||||||
| #ifdef KRB4 | #ifdef KRB4 | ||||||
|     if(conn->sec_complete) |     if(conn->sec_complete) | ||||||
|       nread = sec_read(conn, sockfd, buf, buffersize); |       nread = Curl_sec_read(conn, sockfd, buf, buffersize); | ||||||
|     else |     else | ||||||
| #endif | #endif | ||||||
|       nread = sread (sockfd, buf, buffersize); |       nread = sread (sockfd, buf, buffersize); | ||||||
| @@ -285,3 +291,11 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd, | |||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								lib/sendf.h
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								lib/sendf.h
									
									
									
									
									
								
							| @@ -23,17 +23,17 @@ | |||||||
|  * $Id$ |  * $Id$ | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
|  |  | ||||||
| size_t Curl_sendf(int fd, struct connectdata *, char *fmt, ...); | size_t Curl_sendf(int fd, struct connectdata *, const char *fmt, ...); | ||||||
| void Curl_infof(struct UrlData *, char *fmt, ...); | void Curl_infof(struct SessionHandle *, const char *fmt, ...); | ||||||
| void Curl_failf(struct UrlData *, char *fmt, ...); | void Curl_failf(struct SessionHandle *, const char *fmt, ...); | ||||||
|  |  | ||||||
| #define infof Curl_infof | #define infof Curl_infof | ||||||
| #define failf Curl_failf | #define failf Curl_failf | ||||||
|  |  | ||||||
| struct send_buffer { | struct send_buffer { | ||||||
|   char *buffer; |   char *buffer; | ||||||
|   long size_max; |   size_t size_max; | ||||||
|   long size_used; |   size_t size_used; | ||||||
| }; | }; | ||||||
| typedef struct send_buffer send_buffer; | typedef struct send_buffer send_buffer; | ||||||
|  |  | ||||||
| @@ -41,7 +41,7 @@ typedef struct send_buffer send_buffer; | |||||||
| #define CLIENTWRITE_HEADER 2 | #define CLIENTWRITE_HEADER 2 | ||||||
| #define CLIENTWRITE_BOTH   (CLIENTWRITE_BODY|CLIENTWRITE_HEADER) | #define CLIENTWRITE_BOTH   (CLIENTWRITE_BODY|CLIENTWRITE_HEADER) | ||||||
|  |  | ||||||
| CURLcode Curl_client_write(struct UrlData *data, int type, char *ptr, | CURLcode Curl_client_write(struct SessionHandle *data, int type, char *ptr, | ||||||
|                            size_t len); |                            size_t len); | ||||||
|  |  | ||||||
| /* internal read-function, does plain socket, SSL and krb4 */ | /* internal read-function, does plain socket, SSL and krb4 */ | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								lib/setup.h
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								lib/setup.h
									
									
									
									
									
								
							| @@ -32,7 +32,13 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef HAVE_CONFIG_H | #ifdef HAVE_CONFIG_H | ||||||
|  |  | ||||||
|  | #ifdef VMS | ||||||
|  | #include "config-vms.h" | ||||||
|  | #else | ||||||
| #include "config.h" /* the configure script results */ | #include "config.h" /* the configure script results */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #else | #else | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
| /* include the hand-modified win32 adjusted config.h! */ | /* include the hand-modified win32 adjusted config.h! */ | ||||||
| @@ -79,31 +85,17 @@ defined(HAVE_LIBSSL) && defined(HAVE_LIBCRYPTO) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef STDC_HEADERS /* no standard C headers! */ | #ifndef STDC_HEADERS /* no standard C headers! */ | ||||||
|  | #ifdef	VMS | ||||||
|  | #include "../include/curl/stdcheaders.h" | ||||||
|  | #else | ||||||
| #include "curl/stdcheaders.h" | #include "curl/stdcheaders.h" | ||||||
|  | #endif | ||||||
| #else | #else | ||||||
| #ifdef _AIX | #ifdef _AIX | ||||||
| #include "curl/stdcheaders.h" | #include "curl/stdcheaders.h" | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if 0 /* zlib experiments are halted 17th october, 1999 (Daniel) */ |  | ||||||
| #if defined(HAVE_ZLIB_H) && defined(HAVE_LIBZ) |  | ||||||
|      /* Both lib and header file exist, we have libz! */ |  | ||||||
| #define USE_ZLIB |  | ||||||
| #endif |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if 0 |  | ||||||
| #ifdef HAVE_STRCASECMP |  | ||||||
| #define strnequal(x,y,z) !(strncasecmp)(x,y,z) |  | ||||||
| #define strequal(x,y) !(strcasecmp)(x,y) |  | ||||||
|  |  | ||||||
| #else |  | ||||||
| #define strnequal(x,y,z) !strnicmp(x,y,z) |  | ||||||
| #define strequal(x,y) !stricmp(x,y) |  | ||||||
| #endif |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* Below we define four functions. They should | /* Below we define four functions. They should | ||||||
|    1. close a socket |    1. close a socket | ||||||
|    2. read from a socket |    2. read from a socket | ||||||
|   | |||||||
| @@ -34,37 +34,44 @@ | |||||||
| #include "sendf.h" | #include "sendf.h" | ||||||
| #include "speedcheck.h" | #include "speedcheck.h" | ||||||
|  |  | ||||||
| void Curl_speedinit(struct UrlData *data) | void Curl_speedinit(struct SessionHandle *data) | ||||||
| { | { | ||||||
|   memset(&data->keeps_speed, 0, sizeof(struct timeval)); |   memset(&data->state.keeps_speed, 0, sizeof(struct timeval)); | ||||||
| } | } | ||||||
|  |  | ||||||
| CURLcode Curl_speedcheck(struct UrlData *data, | CURLcode Curl_speedcheck(struct SessionHandle *data, | ||||||
|                          struct timeval now) |                          struct timeval now) | ||||||
| { | { | ||||||
|   if((data->progress.current_speed >= 0) && |   if((data->progress.current_speed >= 0) && | ||||||
|      data->low_speed_time && |      data->set.low_speed_time && | ||||||
|      (Curl_tvlong(data->keeps_speed) != 0) && |      (Curl_tvlong(data->state.keeps_speed) != 0) && | ||||||
|      (data->progress.current_speed < data->low_speed_limit)) { |      (data->progress.current_speed < data->set.low_speed_limit)) { | ||||||
|  |  | ||||||
|     /* We are now below the "low speed limit". If we are below it |     /* We are now below the "low speed limit". If we are below it | ||||||
|        for "low speed time" seconds we consider that enough reason |        for "low speed time" seconds we consider that enough reason | ||||||
|        to abort the download. */ |        to abort the download. */ | ||||||
|      |      | ||||||
|     if( Curl_tvdiff(now, data->keeps_speed) > data->low_speed_time) { |     if( Curl_tvdiff(now, data->state.keeps_speed) > data->set.low_speed_time) { | ||||||
|       /* we have been this slow for long enough, now die */ |       /* we have been this slow for long enough, now die */ | ||||||
|       failf(data, |       failf(data, | ||||||
| 	    "Operation too slow. " | 	    "Operation too slow. " | ||||||
| 	    "Less than %d bytes/sec transfered the last %d seconds", | 	    "Less than %d bytes/sec transfered the last %d seconds", | ||||||
| 	    data->low_speed_limit, | 	    data->set.low_speed_limit, | ||||||
| 	    data->low_speed_time); | 	    data->set.low_speed_time); | ||||||
|       return CURLE_OPERATION_TIMEOUTED; |       return CURLE_OPERATION_TIMEOUTED; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   else { |   else { | ||||||
|     /* we keep up the required speed all right */ |     /* we keep up the required speed all right */ | ||||||
|     data->keeps_speed = now; |     data->state.keeps_speed = now; | ||||||
|   } |   } | ||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -27,8 +27,8 @@ | |||||||
|  |  | ||||||
| #include "timeval.h" | #include "timeval.h" | ||||||
|  |  | ||||||
| void Curl_speedinit(struct UrlData *data); | void Curl_speedinit(struct SessionHandle *data); | ||||||
| CURLcode Curl_speedcheck(struct UrlData *data, | CURLcode Curl_speedcheck(struct SessionHandle *data, | ||||||
|                          struct timeval now); |                          struct timeval now); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										370
									
								
								lib/ssluse.c
									
									
									
									
									
								
							
							
						
						
									
										370
									
								
								lib/ssluse.c
									
									
									
									
									
								
							| @@ -42,21 +42,29 @@ | |||||||
| #include "memdebug.h" | #include "memdebug.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #if OPENSSL_VERSION_NUMBER >= 0x00904100L | ||||||
|  | #define HAVE_USERDATA_IN_PWD_CALLBACK 1 | ||||||
|  | #else | ||||||
|  | #undef HAVE_USERDATA_IN_PWD_CALLBACK | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef HAVE_USERDATA_IN_PWD_CALLBACK | ||||||
| static char global_passwd[64]; | static char global_passwd[64]; | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static int passwd_callback(char *buf, int num, int verify | static int passwd_callback(char *buf, int num, int verify | ||||||
| #if OPENSSL_VERSION_NUMBER >= 0x00904100L | #if HAVE_USERDATA_IN_PWD_CALLBACK | ||||||
|                            /* This was introduced in 0.9.4, we can set this |                            /* This was introduced in 0.9.4, we can set this | ||||||
|                               using SSL_CTX_set_default_passwd_cb_userdata() |                               using SSL_CTX_set_default_passwd_cb_userdata() | ||||||
|                               */ |                               */ | ||||||
|                            , void *userdata |                            , void *global_passwd | ||||||
| #endif | #endif | ||||||
|                            ) |                            ) | ||||||
| { | { | ||||||
|   if(verify) |   if(verify) | ||||||
|     fprintf(stderr, "%s\n", buf); |     fprintf(stderr, "%s\n", buf); | ||||||
|   else { |   else { | ||||||
|     if(num > strlen(global_passwd)) { |     if(num > (int)strlen((char *)global_passwd)) { | ||||||
|       strcpy(buf, global_passwd); |       strcpy(buf, global_passwd); | ||||||
|       return strlen(buf); |       return strlen(buf); | ||||||
|     } |     } | ||||||
| @@ -68,7 +76,10 @@ static | |||||||
| bool seed_enough(struct connectdata *conn, /* unused for now */ | bool seed_enough(struct connectdata *conn, /* unused for now */ | ||||||
|                  int nread) |                  int nread) | ||||||
| { | { | ||||||
|  |   conn = NULL; /* to prevent compiler warnings */ | ||||||
| #ifdef HAVE_RAND_STATUS | #ifdef HAVE_RAND_STATUS | ||||||
|  |   nread = 0; /* to prevent compiler warnings */ | ||||||
|  |  | ||||||
|   /* only available in OpenSSL 0.9.5a and later */ |   /* only available in OpenSSL 0.9.5a and later */ | ||||||
|   if(RAND_status()) |   if(RAND_status()) | ||||||
|     return TRUE; |     return TRUE; | ||||||
| @@ -83,9 +94,9 @@ bool seed_enough(struct connectdata *conn, /* unused for now */ | |||||||
| static | static | ||||||
| int random_the_seed(struct connectdata *conn) | int random_the_seed(struct connectdata *conn) | ||||||
| { | { | ||||||
|   char *buf = conn->data->buffer; /* point to the big buffer */ |   char *buf = conn->data->state.buffer; /* point to the big buffer */ | ||||||
|   int nread=0; |   int nread=0; | ||||||
|   struct UrlData *data=conn->data; |   struct SessionHandle *data=conn->data; | ||||||
|  |  | ||||||
|   /* Q: should we add support for a random file name as a libcurl option? |   /* Q: should we add support for a random file name as a libcurl option? | ||||||
|      A: Yes, it is here */ |      A: Yes, it is here */ | ||||||
| @@ -93,13 +104,13 @@ int random_the_seed(struct connectdata *conn) | |||||||
| #ifndef RANDOM_FILE | #ifndef RANDOM_FILE | ||||||
|   /* if RANDOM_FILE isn't defined, we only perform this if an option tells |   /* if RANDOM_FILE isn't defined, we only perform this if an option tells | ||||||
|      us to! */ |      us to! */ | ||||||
|   if(data->ssl.random_file) |   if(data->set.ssl.random_file) | ||||||
| #define RANDOM_FILE "" /* doesn't matter won't be used */ | #define RANDOM_FILE "" /* doesn't matter won't be used */ | ||||||
| #endif | #endif | ||||||
|   { |   { | ||||||
|     /* let the option override the define */ |     /* let the option override the define */ | ||||||
|     nread += RAND_load_file((data->ssl.random_file? |     nread += RAND_load_file((data->set.ssl.random_file? | ||||||
|                              data->ssl.random_file:RANDOM_FILE), |                              data->set.ssl.random_file:RANDOM_FILE), | ||||||
|                             16384); |                             16384); | ||||||
|     if(seed_enough(conn, nread)) |     if(seed_enough(conn, nread)) | ||||||
|       return nread; |       return nread; | ||||||
| @@ -111,13 +122,13 @@ int random_the_seed(struct connectdata *conn) | |||||||
| #ifndef EGD_SOCKET | #ifndef EGD_SOCKET | ||||||
|   /* If we don't have the define set, we only do this if the egd-option |   /* If we don't have the define set, we only do this if the egd-option | ||||||
|      is set */ |      is set */ | ||||||
|   if(data->ssl.egdsocket) |   if(data->set.ssl.egdsocket) | ||||||
| #define EGD_SOCKET "" /* doesn't matter won't be used */ | #define EGD_SOCKET "" /* doesn't matter won't be used */ | ||||||
| #endif | #endif | ||||||
|   { |   { | ||||||
|     /* If there's an option and a define, the option overrides the |     /* If there's an option and a define, the option overrides the | ||||||
|        define */ |        define */ | ||||||
|     int ret = RAND_egd(data->ssl.egdsocket?data->ssl.egdsocket:EGD_SOCKET); |     int ret = RAND_egd(data->set.ssl.egdsocket?data->set.ssl.egdsocket:EGD_SOCKET); | ||||||
|     if(-1 != ret) { |     if(-1 != ret) { | ||||||
|       nread += ret; |       nread += ret; | ||||||
|       if(seed_enough(conn, nread)) |       if(seed_enough(conn, nread)) | ||||||
| @@ -165,17 +176,24 @@ int cert_stuff(struct connectdata *conn, | |||||||
|                char *cert_file, |                char *cert_file, | ||||||
|                char *key_file) |                char *key_file) | ||||||
| { | { | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   if (cert_file != NULL) { |   if (cert_file != NULL) { | ||||||
|     SSL *ssl; |     SSL *ssl; | ||||||
|     X509 *x509; |     X509 *x509; | ||||||
|  |  | ||||||
|     if(data->cert_passwd) { |     if(data->set.cert_passwd) { | ||||||
|  | #ifndef HAVE_USERDATA_IN_PWD_CALLBACK | ||||||
|       /* |       /* | ||||||
|        * If password has been given, we store that in the global |        * If password has been given, we store that in the global | ||||||
|        * area (*shudder*) for a while: |        * area (*shudder*) for a while: | ||||||
|        */ |        */ | ||||||
|       strcpy(global_passwd, data->cert_passwd); |       strcpy(global_passwd, data->set.cert_passwd); | ||||||
|  | #else | ||||||
|  |       /* | ||||||
|  |        * We set the password in the callback userdata | ||||||
|  |        */ | ||||||
|  |       SSL_CTX_set_default_passwd_cb_userdata(conn->ssl.ctx, data->set.cert_passwd); | ||||||
|  | #endif | ||||||
|       /* Set passwd callback: */ |       /* Set passwd callback: */ | ||||||
|       SSL_CTX_set_default_passwd_cb(conn->ssl.ctx, passwd_callback); |       SSL_CTX_set_default_passwd_cb(conn->ssl.ctx, passwd_callback); | ||||||
|     } |     } | ||||||
| @@ -214,9 +232,10 @@ int cert_stuff(struct connectdata *conn, | |||||||
|       failf(data, "Private key does not match the certificate public key\n"); |       failf(data, "Private key does not match the certificate public key\n"); | ||||||
|       return(0); |       return(0); | ||||||
|     } |     } | ||||||
|      | #ifndef HAVE_USERDATA_IN_PWD_CALLBACK     | ||||||
|     /* erase it now */ |     /* erase it now */ | ||||||
|     memset(global_passwd, 0, sizeof(global_passwd)); |     memset(global_passwd, 0, sizeof(global_passwd)); | ||||||
|  | #endif | ||||||
|   } |   } | ||||||
|   return(1); |   return(1); | ||||||
| } | } | ||||||
| @@ -244,7 +263,6 @@ static int init_ssl=0; | |||||||
| void Curl_SSL_init(void) | void Curl_SSL_init(void) | ||||||
| { | { | ||||||
| #ifdef USE_SSLEAY | #ifdef USE_SSLEAY | ||||||
|  |  | ||||||
|   /* make sure this is only done once */ |   /* make sure this is only done once */ | ||||||
|   if(0 != init_ssl) |   if(0 != init_ssl) | ||||||
|     return; |     return; | ||||||
| @@ -256,6 +274,8 @@ void Curl_SSL_init(void) | |||||||
|  |  | ||||||
|   /* Setup all the global SSL stuff */ |   /* Setup all the global SSL stuff */ | ||||||
|   SSLeay_add_ssl_algorithms(); |   SSLeay_add_ssl_algorithms(); | ||||||
|  | #else | ||||||
|  |   /* SSL disabled, do nothing */ | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -273,9 +293,233 @@ void Curl_SSL_cleanup(void) | |||||||
|        table. */ |        table. */ | ||||||
|     EVP_cleanup(); |     EVP_cleanup(); | ||||||
|   } |   } | ||||||
|  | #else | ||||||
|  |   /* SSL disabled, do nothing */ | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifdef USE_SSLEAY | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * This function is called when an SSL connection is closed. | ||||||
|  |  */ | ||||||
|  | void Curl_SSL_Close(struct connectdata *conn) | ||||||
|  | { | ||||||
|  |   if (conn->ssl.use) { | ||||||
|  |     /* | ||||||
|  |       ERR_remove_state() frees the error queue associated with | ||||||
|  |       thread pid.  If pid == 0, the current thread will have its | ||||||
|  |       error queue removed. | ||||||
|  |  | ||||||
|  |       Since error queue data structures are allocated | ||||||
|  |       automatically for new threads, they must be freed when | ||||||
|  |       threads are terminated in oder to avoid memory leaks. | ||||||
|  |     */ | ||||||
|  |     ERR_remove_state(0); | ||||||
|  |  | ||||||
|  |     if(conn->ssl.handle) { | ||||||
|  |       (void)SSL_shutdown(conn->ssl.handle); | ||||||
|  |       SSL_set_connect_state(conn->ssl.handle); | ||||||
|  |  | ||||||
|  |       SSL_free (conn->ssl.handle); | ||||||
|  |       conn->ssl.handle = NULL; | ||||||
|  |     } | ||||||
|  |     if(conn->ssl.ctx) { | ||||||
|  |       SSL_CTX_free (conn->ssl.ctx); | ||||||
|  |       conn->ssl.ctx = NULL; | ||||||
|  |     } | ||||||
|  |     conn->ssl.use = FALSE; /* get back to ordinary socket usage */ | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * This sets up a session cache to the specified size. | ||||||
|  |  */ | ||||||
|  | CURLcode Curl_SSL_InitSessions(struct SessionHandle *data, long amount) | ||||||
|  | { | ||||||
|  |   struct curl_ssl_session *session; | ||||||
|  |  | ||||||
|  |   if(data->state.session) | ||||||
|  |     /* this is just a precaution to prevent multiple inits */ | ||||||
|  |     return CURLE_OK; | ||||||
|  |  | ||||||
|  |   session = (struct curl_ssl_session *) | ||||||
|  |     malloc(amount * sizeof(struct curl_ssl_session)); | ||||||
|  |   if(!session) | ||||||
|  |     return CURLE_OUT_OF_MEMORY; | ||||||
|  |  | ||||||
|  |   /* "blank out" the newly allocated memory */ | ||||||
|  |   memset(session, 0, amount * sizeof(struct curl_ssl_session)); | ||||||
|  |  | ||||||
|  |   /* store the info in the SSL section */ | ||||||
|  |   data->set.ssl.numsessions = amount; | ||||||
|  |   data->state.session = session; | ||||||
|  |   data->state.sessionage = 1; /* this is brand new */ | ||||||
|  |  | ||||||
|  |   return CURLE_OK; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Check if there's a session ID for the given connection in the cache, | ||||||
|  |  * and if there's one suitable, it is returned. | ||||||
|  |  */ | ||||||
|  | static int Get_SSL_Session(struct connectdata *conn, | ||||||
|  |                            SSL_SESSION **ssl_sessionid) | ||||||
|  | { | ||||||
|  |   struct curl_ssl_session *check; | ||||||
|  |   struct SessionHandle *data = conn->data; | ||||||
|  |   long i; | ||||||
|  |  | ||||||
|  |   for(i=0; i< data->set.ssl.numsessions; i++) { | ||||||
|  |     check = &data->state.session[i]; | ||||||
|  |     if(!check->sessionid) | ||||||
|  |       /* not session ID means blank entry */ | ||||||
|  |       continue; | ||||||
|  |     if(strequal(conn->name, check->name) && | ||||||
|  |        (conn->remote_port == check->remote_port) ) { | ||||||
|  |       /* yes, we have a session ID! */ | ||||||
|  |       data->state.sessionage++;            /* increase general age */ | ||||||
|  |       check->age = data->state.sessionage; /* set this as used in this age */ | ||||||
|  |       *ssl_sessionid = check->sessionid; | ||||||
|  |       return FALSE; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   *ssl_sessionid = (SSL_SESSION *)NULL; | ||||||
|  |   return TRUE; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Kill a single session ID entry in the cache. | ||||||
|  |  */ | ||||||
|  | static int Kill_Single_Session(struct curl_ssl_session *session) | ||||||
|  | { | ||||||
|  |   if(session->sessionid) { | ||||||
|  |     /* defensive check */ | ||||||
|  |  | ||||||
|  |     /* free the ID */ | ||||||
|  |     SSL_SESSION_free(session->sessionid); | ||||||
|  |     session->sessionid=NULL; | ||||||
|  |     session->age = 0; /* fresh */ | ||||||
|  |     free(session->name); | ||||||
|  |     session->name = NULL; /* no name */ | ||||||
|  |  | ||||||
|  |     return 0; /* ok */ | ||||||
|  |   } | ||||||
|  |   else | ||||||
|  |     return 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * This function is called when the 'data' struct is going away. Close | ||||||
|  |  * down everything and free all resources! | ||||||
|  |  */ | ||||||
|  | int Curl_SSL_Close_All(struct SessionHandle *data) | ||||||
|  | { | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   if(data->state.session) {     | ||||||
|  |     for(i=0; i< data->set.ssl.numsessions; i++) | ||||||
|  |       /* the single-killer function handles empty table slots */ | ||||||
|  |       Kill_Single_Session(&data->state.session[i]); | ||||||
|  |      | ||||||
|  |     /* free the cache data */ | ||||||
|  |     free(data->state.session); | ||||||
|  |   } | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Extract the session id and store it in the session cache. | ||||||
|  |  */ | ||||||
|  | static int Store_SSL_Session(struct connectdata *conn) | ||||||
|  | { | ||||||
|  |   SSL_SESSION *ssl_sessionid; | ||||||
|  |   struct curl_ssl_session *store; | ||||||
|  |   int i; | ||||||
|  |   struct SessionHandle *data=conn->data; /* the mother of all structs */ | ||||||
|  |   int oldest_age=data->state.session[0].age; /* zero if unused */ | ||||||
|  |  | ||||||
|  |   /* ask OpenSSL, say please */ | ||||||
|  |   ssl_sessionid = SSL_get1_session(conn->ssl.handle); | ||||||
|  |  | ||||||
|  |   /* SSL_get1_session() will increment the reference | ||||||
|  |      count and the session will stay in memory until explicitly freed with | ||||||
|  |      SSL_SESSION_free(3), regardless of its state. */ | ||||||
|  |  | ||||||
|  |   /* Now we should add the session ID and the host name to the cache, (remove | ||||||
|  |      the oldest if necessary) */ | ||||||
|  |  | ||||||
|  |   /* find an empty slot for us, or find the oldest */ | ||||||
|  |   for(i=0; (i<data->set.ssl.numsessions) && data->state.session[i].sessionid; i++) { | ||||||
|  |     if(data->state.session[i].age < oldest_age) { | ||||||
|  |       oldest_age = data->state.session[i].age; | ||||||
|  |       store = &data->state.session[i]; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   if(i == data->set.ssl.numsessions) | ||||||
|  |     /* cache is full, we must "kill" the oldest entry! */ | ||||||
|  |     Kill_Single_Session(store); | ||||||
|  |   else | ||||||
|  |     store = &data->state.session[i]; /* use this slot */ | ||||||
|  |    | ||||||
|  |   /* now init the session struct wisely */ | ||||||
|  |   store->sessionid = ssl_sessionid; | ||||||
|  |   store->age = data->state.sessionage;      /* set current age */ | ||||||
|  |   store->name = strdup(conn->name);       /* clone host name */ | ||||||
|  |   store->remote_port = conn->remote_port; /* port number */ | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int Curl_ASN1_UTCTIME_output(struct connectdata *conn, | ||||||
|  |                                     const char *prefix, | ||||||
|  |                                     ASN1_UTCTIME *tm) | ||||||
|  | { | ||||||
|  |   char *asn1_string; | ||||||
|  |   int gmt=FALSE; | ||||||
|  |   int i; | ||||||
|  |   int year=0,month=0,day=0,hour=0,minute=0,second=0; | ||||||
|  |   struct SessionHandle *data = conn->data; | ||||||
|  |  | ||||||
|  |   if(!data->set.verbose) | ||||||
|  |     return 0; | ||||||
|  |  | ||||||
|  |   i=tm->length; | ||||||
|  |   asn1_string=(char *)tm->data; | ||||||
|  |  | ||||||
|  |   if (i < 10) | ||||||
|  |     return 1; | ||||||
|  |   if (asn1_string[i-1] == 'Z') | ||||||
|  |     gmt=TRUE; | ||||||
|  |   for (i=0; i<10; i++) | ||||||
|  |     if ((asn1_string[i] > '9') || (asn1_string[i] < '0')) | ||||||
|  |       return 2; | ||||||
|  |  | ||||||
|  |   year= (asn1_string[0]-'0')*10+(asn1_string[1]-'0'); | ||||||
|  |   if (year < 50) | ||||||
|  |     year+=100; | ||||||
|  |  | ||||||
|  |   month= (asn1_string[2]-'0')*10+(asn1_string[3]-'0'); | ||||||
|  |   if ((month > 12) || (month < 1)) | ||||||
|  |     return 3; | ||||||
|  |  | ||||||
|  |   day= (asn1_string[4]-'0')*10+(asn1_string[5]-'0'); | ||||||
|  |   hour= (asn1_string[6]-'0')*10+(asn1_string[7]-'0'); | ||||||
|  |   minute=  (asn1_string[8]-'0')*10+(asn1_string[9]-'0'); | ||||||
|  |  | ||||||
|  |   if ( (asn1_string[10] >= '0') && (asn1_string[10] <= '9') && | ||||||
|  |        (asn1_string[11] >= '0') && (asn1_string[11] <= '9')) | ||||||
|  |     second= (asn1_string[10]-'0')*10+(asn1_string[11]-'0'); | ||||||
|  |    | ||||||
|  |   infof(data, | ||||||
|  |         "%s%04d-%02d-%02d %02d:%02d:%02d %s\n", | ||||||
|  |         prefix, year+1900, month, day, hour, minute, second, (gmt?"GMT":"")); | ||||||
|  |  | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif   | ||||||
|  |  | ||||||
| /* ====================================================== */ | /* ====================================================== */ | ||||||
| CURLcode | CURLcode | ||||||
| @@ -284,10 +528,12 @@ Curl_SSLConnect(struct connectdata *conn) | |||||||
|   CURLcode retcode = CURLE_OK; |   CURLcode retcode = CURLE_OK; | ||||||
|  |  | ||||||
| #ifdef USE_SSLEAY | #ifdef USE_SSLEAY | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   int err; |   int err; | ||||||
|   char * str; |   char * str; | ||||||
|   SSL_METHOD *req_method; |   SSL_METHOD *req_method; | ||||||
|  |   SSL_SESSION *ssl_sessionid=NULL; | ||||||
|  |   ASN1_TIME *certdate; | ||||||
|  |  | ||||||
|   /* mark this is being ssl enabled from here on out. */ |   /* mark this is being ssl enabled from here on out. */ | ||||||
|   conn->ssl.use = TRUE; |   conn->ssl.use = TRUE; | ||||||
| @@ -295,7 +541,7 @@ Curl_SSLConnect(struct connectdata *conn) | |||||||
|   /* Make funny stuff to get random input */ |   /* Make funny stuff to get random input */ | ||||||
|   random_the_seed(conn); |   random_the_seed(conn); | ||||||
|      |      | ||||||
|   switch(data->ssl.version) { |   switch(data->set.ssl.version) { | ||||||
|   default: |   default: | ||||||
|     req_method = SSLv23_client_method(); |     req_method = SSLv23_client_method(); | ||||||
|     break; |     break; | ||||||
| @@ -314,21 +560,29 @@ Curl_SSLConnect(struct connectdata *conn) | |||||||
|     return CURLE_OUT_OF_MEMORY; |     return CURLE_OUT_OF_MEMORY; | ||||||
|   } |   } | ||||||
|      |      | ||||||
|   if(data->cert) { |   if(data->set.cert) { | ||||||
|     if (!cert_stuff(conn, data->cert, data->cert)) { |     if (!cert_stuff(conn, data->set.cert, data->set.cert)) { | ||||||
|       /* failf() is already done in cert_stuff() */ |       /* failf() is already done in cert_stuff() */ | ||||||
|       return CURLE_SSL_CONNECT_ERROR; |       return CURLE_SSL_CONNECT_ERROR; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   if(data->ssl.verifypeer){ |   if(data->set.ssl.cipher_list) { | ||||||
|  |     if (!SSL_CTX_set_cipher_list(conn->ssl.ctx, | ||||||
|  |                                  data->set.ssl.cipher_list)) { | ||||||
|  |       failf(data, "failed setting cipher list\n"); | ||||||
|  |       return CURLE_SSL_CONNECT_ERROR; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   if(data->set.ssl.verifypeer){ | ||||||
|     SSL_CTX_set_verify(conn->ssl.ctx, |     SSL_CTX_set_verify(conn->ssl.ctx, | ||||||
|                        SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT| |                        SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT| | ||||||
|                        SSL_VERIFY_CLIENT_ONCE, |                        SSL_VERIFY_CLIENT_ONCE, | ||||||
|                        cert_verify_callback); |                        cert_verify_callback); | ||||||
|     if (!SSL_CTX_load_verify_locations(conn->ssl.ctx, |     if (!SSL_CTX_load_verify_locations(conn->ssl.ctx, | ||||||
|                                        data->ssl.CAfile, |                                        data->set.ssl.CAfile, | ||||||
|                                        data->ssl.CApath)) { |                                        data->set.ssl.CApath)) { | ||||||
|       failf(data,"error setting cerficate verify locations\n"); |       failf(data,"error setting cerficate verify locations\n"); | ||||||
|       return CURLE_SSL_CONNECT_ERROR; |       return CURLE_SSL_CONNECT_ERROR; | ||||||
|     } |     } | ||||||
| @@ -343,6 +597,17 @@ Curl_SSLConnect(struct connectdata *conn) | |||||||
|  |  | ||||||
|   conn->ssl.server_cert = 0x0; |   conn->ssl.server_cert = 0x0; | ||||||
|  |  | ||||||
|  |   if(!conn->bits.reuse) { | ||||||
|  |     /* We're not re-using a connection, check if there's a cached ID we | ||||||
|  |        can/should use here! */ | ||||||
|  |     if(!Get_SSL_Session(conn, &ssl_sessionid)) { | ||||||
|  |       /* we got a session id, use it! */ | ||||||
|  |       SSL_set_session(conn->ssl.handle, ssl_sessionid); | ||||||
|  |       /* Informational message */ | ||||||
|  |       infof (data, "SSL re-using session ID\n"); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /* pass the raw socket into the SSL layers */ |   /* pass the raw socket into the SSL layers */ | ||||||
|   SSL_set_fd (conn->ssl.handle, conn->firstsocket); |   SSL_set_fd (conn->ssl.handle, conn->firstsocket); | ||||||
|   err = SSL_connect (conn->ssl.handle); |   err = SSL_connect (conn->ssl.handle); | ||||||
| @@ -357,6 +622,13 @@ Curl_SSLConnect(struct connectdata *conn) | |||||||
|   infof (data, "SSL connection using %s\n", |   infof (data, "SSL connection using %s\n", | ||||||
|          SSL_get_cipher(conn->ssl.handle)); |          SSL_get_cipher(conn->ssl.handle)); | ||||||
|  |  | ||||||
|  |   if(!ssl_sessionid) { | ||||||
|  |     /* Since this is not a cached session ID, then we want to stach this one | ||||||
|  |        in the cache! */ | ||||||
|  |     Store_SSL_Session(conn); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |    | ||||||
|   /* Get server's certificate (note: beware of dynamic allocation) - opt */ |   /* Get server's certificate (note: beware of dynamic allocation) - opt */ | ||||||
|   /* major serious hack alert -- we should check certificates |   /* major serious hack alert -- we should check certificates | ||||||
|    * to authenticate the server; otherwise we risk man-in-the-middle |    * to authenticate the server; otherwise we risk man-in-the-middle | ||||||
| @@ -374,15 +646,51 @@ Curl_SSLConnect(struct connectdata *conn) | |||||||
|                            NULL, 0); |                            NULL, 0); | ||||||
|   if(!str) { |   if(!str) { | ||||||
|     failf(data, "SSL: couldn't get X509-subject!"); |     failf(data, "SSL: couldn't get X509-subject!"); | ||||||
|  |     X509_free(conn->ssl.server_cert); | ||||||
|     return CURLE_SSL_CONNECT_ERROR; |     return CURLE_SSL_CONNECT_ERROR; | ||||||
|   } |   } | ||||||
|   infof(data, "\t subject: %s\n", str); |   infof(data, "\t subject: %s\n", str); | ||||||
|   CRYPTO_free(str); |   CRYPTO_free(str); | ||||||
|  |  | ||||||
|  |   certdate = X509_get_notBefore(conn->ssl.server_cert); | ||||||
|  |   Curl_ASN1_UTCTIME_output(conn, "\t start date: ", certdate); | ||||||
|  |  | ||||||
|  |   certdate = X509_get_notAfter(conn->ssl.server_cert); | ||||||
|  |   Curl_ASN1_UTCTIME_output(conn, "\t expire date: ", certdate); | ||||||
|  |  | ||||||
|  |   if (data->set.ssl.verifyhost) { | ||||||
|  |     char peer_CN[257]; | ||||||
|  |     if (X509_NAME_get_text_by_NID(X509_get_subject_name(conn->ssl.server_cert), | ||||||
|  |                                   NID_commonName, | ||||||
|  |                                   peer_CN, | ||||||
|  |                                   sizeof(peer_CN)) < 0) { | ||||||
|  |       failf(data, "SSL: unable to obtain common name from peer certificate"); | ||||||
|  |       X509_free(conn->ssl.server_cert); | ||||||
|  |       return CURLE_SSL_PEER_CERTIFICATE; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (!strequal(peer_CN, conn->hostname)) { | ||||||
|  |       if (data->set.ssl.verifyhost > 1) { | ||||||
|  |         failf(data, "SSL: certificate subject name '%s' does not match " | ||||||
|  |               "target host name '%s'", | ||||||
|  |               peer_CN, conn->hostname); | ||||||
|  |         X509_free(conn->ssl.server_cert); | ||||||
|  |         return CURLE_SSL_PEER_CERTIFICATE; | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |         infof(data, | ||||||
|  |               "\t common name: %s (does not match '%s')\n", | ||||||
|  |               peer_CN, conn->hostname); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |       infof(data, "\t common name: %s (matched)\n", peer_CN); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   str = X509_NAME_oneline (X509_get_issuer_name  (conn->ssl.server_cert), |   str = X509_NAME_oneline (X509_get_issuer_name  (conn->ssl.server_cert), | ||||||
|                            NULL, 0); |                            NULL, 0); | ||||||
|   if(!str) { |   if(!str) { | ||||||
|     failf(data, "SSL: couldn't get X509-issuer name!"); |     failf(data, "SSL: couldn't get X509-issuer name!"); | ||||||
|  |     X509_free(conn->ssl.server_cert); | ||||||
|     return CURLE_SSL_CONNECT_ERROR; |     return CURLE_SSL_CONNECT_ERROR; | ||||||
|   } |   } | ||||||
|   infof(data, "\t issuer: %s\n", str); |   infof(data, "\t issuer: %s\n", str); | ||||||
| @@ -391,14 +699,16 @@ Curl_SSLConnect(struct connectdata *conn) | |||||||
|   /* We could do all sorts of certificate verification stuff here before |   /* We could do all sorts of certificate verification stuff here before | ||||||
|      deallocating the certificate. */ |      deallocating the certificate. */ | ||||||
|  |  | ||||||
|   if(data->ssl.verifypeer) { |   if(data->set.ssl.verifypeer) { | ||||||
|     data->ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle); |     data->set.ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle); | ||||||
|  |     if (data->set.ssl.certverifyresult != X509_V_OK) { | ||||||
|       failf(data, "SSL certificate verify result: %d\n", |       failf(data, "SSL certificate verify result: %d\n", | ||||||
|           data->ssl.certverifyresult); |             data->set.ssl.certverifyresult); | ||||||
|       retcode = CURLE_SSL_PEER_CERTIFICATE; |       retcode = CURLE_SSL_PEER_CERTIFICATE; | ||||||
|     } |     } | ||||||
|  |   } | ||||||
|   else |   else | ||||||
|     data->ssl.certverifyresult=0; |     data->set.ssl.certverifyresult=0; | ||||||
|  |  | ||||||
|   X509_free(conn->ssl.server_cert); |   X509_free(conn->ssl.server_cert); | ||||||
| #else /* USE_SSLEAY */ | #else /* USE_SSLEAY */ | ||||||
| @@ -407,3 +717,11 @@ Curl_SSLConnect(struct connectdata *conn) | |||||||
| #endif | #endif | ||||||
|   return retcode; |   return retcode; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								lib/ssluse.h
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								lib/ssluse.h
									
									
									
									
									
								
							| @@ -24,8 +24,15 @@ | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #include "urldata.h" | #include "urldata.h" | ||||||
| CURLcode Curl_SSLConnect(struct connectdata *conn); | CURLcode Curl_SSLConnect(struct connectdata *conn); | ||||||
| /* Global SSL init */ |  | ||||||
| void Curl_SSL_init(void); | void Curl_SSL_init(void);    /* Global SSL init */ | ||||||
| /* Global SSL cleanup */ | void Curl_SSL_cleanup(void); /* Global SSL cleanup */ | ||||||
| void Curl_SSL_cleanup(void); |  | ||||||
|  | /* init the SSL session ID cache */ | ||||||
|  | CURLcode Curl_SSL_InitSessions(struct SessionHandle *, long); | ||||||
|  | void Curl_SSL_Close(struct connectdata *conn); /* close a SSL connection */ | ||||||
|  |  | ||||||
|  | /* tell the SSL stuff to close down all open information regarding  | ||||||
|  |    connections (and thus session ID caching etc) */ | ||||||
|  | int Curl_SSL_Close_All(struct SessionHandle *data); | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -28,11 +28,11 @@ | |||||||
| int curl_strequal(const char *first, const char *second) | int curl_strequal(const char *first, const char *second) | ||||||
| { | { | ||||||
| #if defined(HAVE_STRCASECMP) | #if defined(HAVE_STRCASECMP) | ||||||
|   return !strcasecmp(first, second); |   return !(strcasecmp)(first, second); | ||||||
| #elif defined(HAVE_STRCMPI) | #elif defined(HAVE_STRCMPI) | ||||||
|   return !strcmpi(first, second); |   return !(strcmpi)(first, second); | ||||||
| #elif defined(HAVE_STRICMP) | #elif defined(HAVE_STRICMP) | ||||||
|   return !stricmp(first, second); |   return !(stricmp)(first, second); | ||||||
| #else | #else | ||||||
|   while (*first && *second) { |   while (*first && *second) { | ||||||
|     if (toupper(*first) != toupper(*second)) { |     if (toupper(*first) != toupper(*second)) { | ||||||
| @@ -107,3 +107,11 @@ size_t Curl_strlcat(char *dst, const char *src, size_t siz) | |||||||
|   return(dlen + (s - src));	/* count does not include NUL */ |   return(dlen + (s - src));	/* count does not include NUL */ | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										134
									
								
								lib/strtok.c
									
									
									
									
									
								
							
							
						
						
									
										134
									
								
								lib/strtok.c
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | |||||||
|  *                            | (__| |_| |  _ <| |___  |  *                            | (__| |_| |  _ <| |___  | ||||||
|  *                             \___|\___/|_| \_\_____| |  *                             \___|\___/|_| \_\_____| | ||||||
|  * |  * | ||||||
|  * Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al. |  * Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||||
|  * |  * | ||||||
|  * In order to be useful for every potential user, curl and libcurl are |  * In order to be useful for every potential user, curl and libcurl are | ||||||
|  * dual-licensed under the MPL and the MIT/X-derivate licenses. |  * dual-licensed under the MPL and the MIT/X-derivate licenses. | ||||||
| @@ -21,108 +21,54 @@ | |||||||
|  * $Id$ |  * $Id$ | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "setup.h" | #include "setup.h" | ||||||
|  |  | ||||||
| #ifndef HAVE_STRTOK_R | #ifndef HAVE_STRTOK_R | ||||||
|  |  | ||||||
| /* |  | ||||||
|  * Copyright (c) 1998 Softweyr LLC.  All rights reserved. |  | ||||||
|  * |  | ||||||
|  * strtok_r, from Berkeley strtok |  | ||||||
|  * Oct 13, 1998 by Wes Peters <wes@softweyr.com> |  | ||||||
|  * |  | ||||||
|  * Copyright (c) 1988, 1993 |  | ||||||
|  *	The Regents of the University of California.  All rights reserved. |  | ||||||
|  * |  | ||||||
|  * Redistribution and use in source and binary forms, with or without |  | ||||||
|  * modification, are permitted provided that the following conditions |  | ||||||
|  * are met: |  | ||||||
|  * |  | ||||||
|  * 1. Redistributions of source code must retain the above copyright |  | ||||||
|  *    notices, this list of conditions and the following disclaimer. |  | ||||||
|  *  |  | ||||||
|  * 2. Redistributions in binary form must reproduce the above copyright |  | ||||||
|  *    notices, this list of conditions and the following disclaimer in the |  | ||||||
|  *    documentation and/or other materials provided with the distribution. |  | ||||||
|  *  |  | ||||||
|  * 3. All advertising materials mentioning features or use of this software |  | ||||||
|  *    must display the following acknowledgement: |  | ||||||
|  * |  | ||||||
|  *	This product includes software developed by Softweyr LLC, the |  | ||||||
|  *      University of California, Berkeley, and its contributors. |  | ||||||
|  * |  | ||||||
|  * 4. Neither the name of the University nor the names of its contributors |  | ||||||
|  *    may be used to endorse or promote products derived from this software |  | ||||||
|  *    without specific prior written permission. |  | ||||||
|  * |  | ||||||
|  * THIS SOFTWARE IS PROVIDED BY SOFTWEYR LLC, THE REGENTS AND CONTRIBUTORS |  | ||||||
|  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |  | ||||||
|  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |  | ||||||
|  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL SOFTWEYR LLC, THE |  | ||||||
|  * REGENTS, OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |  | ||||||
|  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |  | ||||||
|  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |  | ||||||
|  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |  | ||||||
|  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |  | ||||||
|  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |  | ||||||
|  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
|  | #include <string.h> | ||||||
|  |  | ||||||
| char * | char * | ||||||
| Curl_strtok_r(char *s, const char *delim, char **last) | Curl_strtok_r(char *ptr, const char *sep, char **end) | ||||||
| { | { | ||||||
|   char *spanp; |   if (!ptr) | ||||||
|   int c, sc; |     /* we got NULL input so then we get our last position instead */ | ||||||
|   char *tok; |     ptr = *end; | ||||||
|  |  | ||||||
|   if (s == NULL && (s = *last) == NULL) { |   /* pass all letters that are including in the separator string */ | ||||||
|  |   while (*ptr && strchr(sep, *ptr)) | ||||||
|  |     ++ptr; | ||||||
|  |  | ||||||
|  |   if (*ptr) { | ||||||
|  |     /* so this is where the next piece of string starts */ | ||||||
|  |     char *start = ptr; | ||||||
|  |  | ||||||
|  |     /* set the end pointer to the first byte after the start */ | ||||||
|  |     *end = start + 1; | ||||||
|  |  | ||||||
|  |     /* scan through the string to find where it ends, it ends on a | ||||||
|  |        null byte or a character that exists in the separator string */ | ||||||
|  |     while (**end && !strchr(sep, **end)) | ||||||
|  |       ++*end; | ||||||
|  |  | ||||||
|  |     if (**end) { | ||||||
|  |       /* the end is not a null byte */ | ||||||
|  |       **end = '\0';  /* zero terminate it! */ | ||||||
|  |       ++*end;        /* advance the last pointer to beyond the null byte */ | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return start; /* return the position where the string starts */ | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   /* we ended up on a null byte, there are no more strings to find! */ | ||||||
|   return NULL; |   return NULL; | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /* |  | ||||||
|    * Skip (span) leading delimiters (s += strspn(s, delim), sort of). |  | ||||||
|    */ |  | ||||||
|  cont: |  | ||||||
|   c = *s++; |  | ||||||
|   for (spanp = (char *)delim; (sc = *spanp++) != 0; ) { |  | ||||||
|     if (c == sc) { |  | ||||||
|       goto cont; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   if (c == 0) {		/* no non-delimiter characters */ |  | ||||||
|     *last = NULL; |  | ||||||
|     return NULL; |  | ||||||
|   } |  | ||||||
|   tok = s - 1; |  | ||||||
|    |  | ||||||
|   /* |  | ||||||
|    * Scan token (scan for delimiters: s += strcspn(s, delim), sort of). |  | ||||||
|    * Note that delim must have one NUL; we stop if we see that, too. |  | ||||||
|    */ |  | ||||||
|   for (;;) { |  | ||||||
|     c = *s++; |  | ||||||
|     spanp = (char *)delim; |  | ||||||
|     do { |  | ||||||
|       if ((sc = *spanp++) == c) { |  | ||||||
|         if (c == 0) { |  | ||||||
|           s = NULL; |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|           char *w = s - 1; |  | ||||||
|           *w = '\0'; |  | ||||||
|         } |  | ||||||
|         *last = s; |  | ||||||
|         return tok; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     while (sc != 0); |  | ||||||
|   } |  | ||||||
|   /* NOTREACHED */ |  | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif | #endif /* this was only compiled if strtok_r wasn't present */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								lib/telnet.c
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								lib/telnet.c
									
									
									
									
									
								
							| @@ -105,7 +105,7 @@ void telrcv(struct connectdata *, | |||||||
| 	    unsigned char *inbuf,	/* Data received from socket */ | 	    unsigned char *inbuf,	/* Data received from socket */ | ||||||
| 	    int count);			/* Number of bytes received */ | 	    int count);			/* Number of bytes received */ | ||||||
|  |  | ||||||
| static void printoption(struct UrlData *data, | static void printoption(struct SessionHandle *data, | ||||||
| 			const char *direction, | 			const char *direction, | ||||||
| 			int cmd, int option); | 			int cmd, int option); | ||||||
|  |  | ||||||
| @@ -114,7 +114,7 @@ static void send_negotiation(struct connectdata *, int cmd, int option); | |||||||
| static void set_local_option(struct connectdata *, int cmd, int option); | static void set_local_option(struct connectdata *, int cmd, int option); | ||||||
| static void set_remote_option(struct connectdata *, int cmd, int option); | static void set_remote_option(struct connectdata *, int cmd, int option); | ||||||
|  |  | ||||||
| static void printsub(struct UrlData *data, | static void printsub(struct SessionHandle *data, | ||||||
| 		     int direction, unsigned char *pointer, int length); | 		     int direction, unsigned char *pointer, int length); | ||||||
| static void suboption(struct connectdata *); | static void suboption(struct connectdata *); | ||||||
|  |  | ||||||
| @@ -215,13 +215,13 @@ static void negotiate(struct connectdata *conn) | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| static void printoption(struct UrlData *data, | static void printoption(struct SessionHandle *data, | ||||||
| 			const char *direction, int cmd, int option) | 			const char *direction, int cmd, int option) | ||||||
| { | { | ||||||
|   char *fmt; |   const char *fmt; | ||||||
|   char *opt; |   const char *opt; | ||||||
|     |     | ||||||
|   if (data->bits.verbose) |   if (data->set.verbose) | ||||||
|   { |   { | ||||||
|     if (cmd == IAC) |     if (cmd == IAC) | ||||||
|     { |     { | ||||||
| @@ -627,14 +627,14 @@ void rec_dont(struct connectdata *conn, int option) | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static void printsub(struct UrlData *data, | static void printsub(struct SessionHandle *data, | ||||||
| 		     int direction,		/* '<' or '>' */ | 		     int direction,		/* '<' or '>' */ | ||||||
| 		     unsigned char *pointer,	/* where suboption data is */ | 		     unsigned char *pointer,	/* where suboption data is */ | ||||||
| 		     int length)		/* length of suboption data */ | 		     int length)		/* length of suboption data */ | ||||||
| { | { | ||||||
|   int i = 0; |   int i = 0; | ||||||
|  |  | ||||||
|   if (data->bits.verbose) |   if (data->set.verbose) | ||||||
|   { |   { | ||||||
|     if (direction) |     if (direction) | ||||||
|     { |     { | ||||||
| @@ -745,7 +745,7 @@ static int check_telnet_options(struct connectdata *conn) | |||||||
|   char option_keyword[128]; |   char option_keyword[128]; | ||||||
|   char option_arg[256]; |   char option_arg[256]; | ||||||
|   char *buf; |   char *buf; | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   struct TELNET *tn = (struct TELNET *)conn->proto.telnet; |   struct TELNET *tn = (struct TELNET *)conn->proto.telnet; | ||||||
|  |  | ||||||
|   /* Add the user name as an environment variable if it |   /* Add the user name as an environment variable if it | ||||||
| @@ -753,13 +753,13 @@ static int check_telnet_options(struct connectdata *conn) | |||||||
|   if(conn->bits.user_passwd) |   if(conn->bits.user_passwd) | ||||||
|   { |   { | ||||||
|     char *buf = malloc(256); |     char *buf = malloc(256); | ||||||
|     sprintf(buf, "USER,%s", data->user); |     sprintf(buf, "USER,%s", data->state.user); | ||||||
|     tn->telnet_vars = curl_slist_append(tn->telnet_vars, buf); |     tn->telnet_vars = curl_slist_append(tn->telnet_vars, buf); | ||||||
|  |  | ||||||
|     tn->us_preferred[TELOPT_NEW_ENVIRON] = YES; |     tn->us_preferred[TELOPT_NEW_ENVIRON] = YES; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   for(head = data->telnet_options; head; head=head->next) { |   for(head = data->set.telnet_options; head; head=head->next) { | ||||||
|     if(sscanf(head->data, "%127[^= ]%*[ =]%255s", |     if(sscanf(head->data, "%127[^= ]%*[ =]%255s", | ||||||
|               option_keyword, option_arg) == 2) { |               option_keyword, option_arg) == 2) { | ||||||
|  |  | ||||||
| @@ -814,7 +814,7 @@ static void suboption(struct connectdata *conn) | |||||||
|   int tmplen; |   int tmplen; | ||||||
|   char varname[128]; |   char varname[128]; | ||||||
|   char varval[128]; |   char varval[128]; | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   struct TELNET *tn = (struct TELNET *)conn->proto.telnet; |   struct TELNET *tn = (struct TELNET *)conn->proto.telnet; | ||||||
|  |  | ||||||
|   printsub(data, '<', (unsigned char *)tn->subbuffer, SB_LEN(tn)+2); |   printsub(data, '<', (unsigned char *)tn->subbuffer, SB_LEN(tn)+2); | ||||||
| @@ -843,7 +843,7 @@ static void suboption(struct connectdata *conn) | |||||||
|       for(v = tn->telnet_vars;v;v = v->next) { |       for(v = tn->telnet_vars;v;v = v->next) { | ||||||
|         tmplen = (strlen(v->data) + 1); |         tmplen = (strlen(v->data) + 1); | ||||||
|         /* Add the variable only if it fits */ |         /* Add the variable only if it fits */ | ||||||
|         if(len + tmplen < sizeof(temp)-6) { |         if(len + tmplen < (int)sizeof(temp)-6) { | ||||||
|           sscanf(v->data, "%127[^,],%s", varname, varval); |           sscanf(v->data, "%127[^,],%s", varname, varval); | ||||||
|           snprintf((char *)&temp[len], sizeof(temp) - len, |           snprintf((char *)&temp[len], sizeof(temp) - len, | ||||||
|                    "%c%s%c%s", NEW_ENV_VAR, varname, |                    "%c%s%c%s", NEW_ENV_VAR, varname, | ||||||
| @@ -868,7 +868,7 @@ void telrcv(struct connectdata *conn, | |||||||
| { | { | ||||||
|   unsigned char c; |   unsigned char c; | ||||||
|   int index = 0; |   int index = 0; | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   struct TELNET *tn = (struct TELNET *)conn->proto.telnet; |   struct TELNET *tn = (struct TELNET *)conn->proto.telnet; | ||||||
|  |  | ||||||
|   while(count--) |   while(count--) | ||||||
| @@ -1031,13 +1031,13 @@ CURLcode Curl_telnet_done(struct connectdata *conn) | |||||||
| CURLcode Curl_telnet(struct connectdata *conn) | CURLcode Curl_telnet(struct connectdata *conn) | ||||||
| { | { | ||||||
|   CURLcode code; |   CURLcode code; | ||||||
|   struct UrlData *data = conn->data; |   struct SessionHandle *data = conn->data; | ||||||
|   int sockfd = conn->firstsocket; |   int sockfd = conn->firstsocket; | ||||||
|   fd_set readfd; |   fd_set readfd; | ||||||
|   fd_set keepfd; |   fd_set keepfd; | ||||||
|  |  | ||||||
|   bool keepon = TRUE; |   bool keepon = TRUE; | ||||||
|   char *buf = data->buffer; |   char *buf = data->state.buffer; | ||||||
|   ssize_t nread; |   ssize_t nread; | ||||||
|   struct TELNET *tn; |   struct TELNET *tn; | ||||||
|  |  | ||||||
| @@ -1111,3 +1111,11 @@ CURLcode Curl_telnet(struct connectdata *conn) | |||||||
|   /* mark this as "no further transfer wanted" */ |   /* mark this as "no further transfer wanted" */ | ||||||
|   return Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL); |   return Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -74,3 +74,11 @@ long Curl_tvlong (struct timeval t1) | |||||||
| { | { | ||||||
|  return t1.tv_sec; |  return t1.tv_sec; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
							
								
								
									
										219
									
								
								lib/transfer.c
									
									
									
									
									
								
							
							
						
						
									
										219
									
								
								lib/transfer.c
									
									
									
									
									
								
							| @@ -90,6 +90,9 @@ | |||||||
| #include "progress.h" | #include "progress.h" | ||||||
| #include "getdate.h" | #include "getdate.h" | ||||||
| #include "http.h" | #include "http.h" | ||||||
|  | #include "url.h" | ||||||
|  | #include "getinfo.h" | ||||||
|  | #include "ssluse.h" | ||||||
|  |  | ||||||
| #define _MPRINTF_REPLACE /* use our functions only */ | #define _MPRINTF_REPLACE /* use our functions only */ | ||||||
| #include <curl/mprintf.h> | #include <curl/mprintf.h> | ||||||
| @@ -111,8 +114,8 @@ | |||||||
|  */ |  */ | ||||||
| static bool | static bool | ||||||
| compareheader(char *headerline, /* line to check */ | compareheader(char *headerline, /* line to check */ | ||||||
|               char *header,     /* header keyword _with_ colon */ |               const char *header,     /* header keyword _with_ colon */ | ||||||
|               char *content)    /* content string to find */ |               const char *content)    /* content string to find */ | ||||||
| { | { | ||||||
|   /* RFC2616, section 4.2 says: "Each header field consists of a name followed |   /* RFC2616, section 4.2 says: "Each header field consists of a name followed | ||||||
|    * by a colon (":") and the field value. Field names are case-insensitive. |    * by a colon (":") and the field value. Field names are case-insensitive. | ||||||
| @@ -172,7 +175,7 @@ compareheader(char *headerline, /* line to check */ | |||||||
|  * <butlerm@xmission.com>. |  * <butlerm@xmission.com>. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| CURLcode static | static CURLcode | ||||||
| Transfer(struct connectdata *c_conn) | Transfer(struct connectdata *c_conn) | ||||||
| { | { | ||||||
|   ssize_t nread;                /* number of bytes read */ |   ssize_t nread;                /* number of bytes read */ | ||||||
| @@ -195,6 +198,9 @@ Transfer(struct connectdata *c_conn) | |||||||
|                                    Content-Range: header */ |                                    Content-Range: header */ | ||||||
|   int httpcode = 0;		/* error code from the 'HTTP/1.? XXX' line */ |   int httpcode = 0;		/* error code from the 'HTTP/1.? XXX' line */ | ||||||
|   int httpversion = -1;			/* the HTTP version*10 */ |   int httpversion = -1;			/* the HTTP version*10 */ | ||||||
|  |   bool write_after_100_header = FALSE;  /* should we enable the write after | ||||||
|  |                                            we received a 100-continue/timeout | ||||||
|  |                                            or directly */ | ||||||
|  |  | ||||||
|   /* for the low speed checks: */ |   /* for the low speed checks: */ | ||||||
|   CURLcode urg; |   CURLcode urg; | ||||||
| @@ -203,16 +209,16 @@ Transfer(struct connectdata *c_conn) | |||||||
|   int writetype; |   int writetype; | ||||||
|  |  | ||||||
|   /* the highest fd we use + 1 */ |   /* the highest fd we use + 1 */ | ||||||
|   struct UrlData *data; |   struct SessionHandle *data; | ||||||
|   struct connectdata *conn = (struct connectdata *)c_conn; |   struct connectdata *conn = (struct connectdata *)c_conn; | ||||||
|   char *buf; |   char *buf; | ||||||
|   int maxfd; |   int maxfd; | ||||||
|  |  | ||||||
|   data = conn->data; /* there's the root struct */ |   data = conn->data; /* there's the root struct */ | ||||||
|   buf = data->buffer; |   buf = data->state.buffer; | ||||||
|   maxfd = (conn->sockfd>conn->writesockfd?conn->sockfd:conn->writesockfd)+1; |   maxfd = (conn->sockfd>conn->writesockfd?conn->sockfd:conn->writesockfd)+1; | ||||||
|  |  | ||||||
|   hbufp = data->headerbuff; |   hbufp = data->state.headerbuff; | ||||||
|  |  | ||||||
|   myalarm (0);			/* switch off the alarm-style timeout */ |   myalarm (0);			/* switch off the alarm-style timeout */ | ||||||
|  |  | ||||||
| @@ -238,7 +244,7 @@ Transfer(struct connectdata *c_conn) | |||||||
|   } |   } | ||||||
|   /* we want header and/or body, if neither then don't do this! */ |   /* we want header and/or body, if neither then don't do this! */ | ||||||
|   if(conn->getheader || |   if(conn->getheader || | ||||||
|      !data->bits.no_body) { |      !data->set.no_body) { | ||||||
|     fd_set readfd; |     fd_set readfd; | ||||||
|     fd_set writefd; |     fd_set writefd; | ||||||
|     fd_set rkeepfd; |     fd_set rkeepfd; | ||||||
| @@ -261,9 +267,14 @@ Transfer(struct connectdata *c_conn) | |||||||
|  |  | ||||||
|     FD_ZERO (&writefd);		/* clear it */ |     FD_ZERO (&writefd);		/* clear it */ | ||||||
|     if(conn->writesockfd != -1) { |     if(conn->writesockfd != -1) { | ||||||
|  |       if (data->set.expect100header) | ||||||
|  |         /* wait with write until we either got 100-continue or a timeout */ | ||||||
|  |         write_after_100_header = TRUE; | ||||||
|  |       else { | ||||||
|         FD_SET (conn->writesockfd, &writefd); /* write socket */ |         FD_SET (conn->writesockfd, &writefd); /* write socket */ | ||||||
|         keepon |= KEEP_WRITE; |         keepon |= KEEP_WRITE; | ||||||
|       } |       } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /* get these in backup variables to be able to restore them on each lap in |     /* get these in backup variables to be able to restore them on each lap in | ||||||
|        the select() loop */ |        the select() loop */ | ||||||
| @@ -288,6 +299,12 @@ Transfer(struct connectdata *c_conn) | |||||||
|           keepon = 0; /* no more read or write */ |           keepon = 0; /* no more read or write */ | ||||||
| 	continue; | 	continue; | ||||||
|       case 0:			/* timeout */ |       case 0:			/* timeout */ | ||||||
|  |         if (write_after_100_header) { | ||||||
|  |           write_after_100_header = FALSE; | ||||||
|  |           FD_SET (conn->writesockfd, &writefd); /* write socket */ | ||||||
|  |           keepon |= KEEP_WRITE; | ||||||
|  |           wkeepfd = writefd; | ||||||
|  |         } | ||||||
| 	break; | 	break; | ||||||
|       default: |       default: | ||||||
|         if((keepon & KEEP_READ) && FD_ISSET(conn->sockfd, &readfd)) { |         if((keepon & KEEP_READ) && FD_ISSET(conn->sockfd, &readfd)) { | ||||||
| @@ -333,19 +350,19 @@ Transfer(struct connectdata *c_conn) | |||||||
|                  * We enlarge the header buffer if it seems to be too |                  * We enlarge the header buffer if it seems to be too | ||||||
|                  * smallish |                  * smallish | ||||||
|                  */ |                  */ | ||||||
|                 if (hbuflen + (int)str_length >= data->headersize) { |                 if (hbuflen + (int)str_length >= data->state.headersize) { | ||||||
|                   char *newbuff; |                   char *newbuff; | ||||||
|                   long newsize=MAX((hbuflen+str_length)*3/2, |                   long newsize=MAX((hbuflen+str_length)*3/2, | ||||||
|                                    data->headersize*2); |                                    data->state.headersize*2); | ||||||
|                   hbufp_index = hbufp - data->headerbuff; |                   hbufp_index = hbufp - data->state.headerbuff; | ||||||
|                   newbuff = (char *)realloc(data->headerbuff, newsize); |                   newbuff = (char *)realloc(data->state.headerbuff, newsize); | ||||||
|                   if(!newbuff) { |                   if(!newbuff) { | ||||||
|                     failf (data, "Failed to alloc memory for big header!"); |                     failf (data, "Failed to alloc memory for big header!"); | ||||||
|                     return CURLE_READ_ERROR; |                     return CURLE_READ_ERROR; | ||||||
|                   } |                   } | ||||||
|                   data->headersize=newsize; |                   data->state.headersize=newsize; | ||||||
|                   data->headerbuff = newbuff; |                   data->state.headerbuff = newbuff; | ||||||
|                   hbufp = data->headerbuff + hbufp_index; |                   hbufp = data->state.headerbuff + hbufp_index; | ||||||
|                 } |                 } | ||||||
|                 strcpy (hbufp, str); |                 strcpy (hbufp, str); | ||||||
|                 hbufp += strlen (str); |                 hbufp += strlen (str); | ||||||
| @@ -361,19 +378,19 @@ Transfer(struct connectdata *c_conn) | |||||||
|                * fit in the allocated header buffer, or else we enlarge  |                * fit in the allocated header buffer, or else we enlarge  | ||||||
|                * it. |                * it. | ||||||
|                */ |                */ | ||||||
|               if (hbuflen + (str - str_start) >= data->headersize) { |               if (hbuflen + (str - str_start) >= data->state.headersize) { | ||||||
|                 char *newbuff; |                 char *newbuff; | ||||||
|                 long newsize=MAX((hbuflen+(str-str_start))*3/2, |                 long newsize=MAX((hbuflen+(str-str_start))*3/2, | ||||||
|                                  data->headersize*2); |                                  data->state.headersize*2); | ||||||
|                 hbufp_index = hbufp - data->headerbuff; |                 hbufp_index = hbufp - data->state.headerbuff; | ||||||
|                 newbuff = (char *)realloc(data->headerbuff, newsize); |                 newbuff = (char *)realloc(data->state.headerbuff, newsize); | ||||||
|                 if(!newbuff) { |                 if(!newbuff) { | ||||||
|                   failf (data, "Failed to alloc memory for big header!"); |                   failf (data, "Failed to alloc memory for big header!"); | ||||||
|                   return CURLE_READ_ERROR; |                   return CURLE_READ_ERROR; | ||||||
|                 } |                 } | ||||||
|                 data->headersize= newsize; |                 data->state.headersize= newsize; | ||||||
|                 data->headerbuff = newbuff; |                 data->state.headerbuff = newbuff; | ||||||
|                 hbufp = data->headerbuff + hbufp_index; |                 hbufp = data->state.headerbuff + hbufp_index; | ||||||
|               } |               } | ||||||
|  |  | ||||||
|               /* copy to end of line */ |               /* copy to end of line */ | ||||||
| @@ -382,7 +399,7 @@ Transfer(struct connectdata *c_conn) | |||||||
|               hbuflen += str - str_start; |               hbuflen += str - str_start; | ||||||
|               *hbufp = 0; |               *hbufp = 0; | ||||||
|                |                | ||||||
|               p = data->headerbuff; |               p = data->state.headerbuff; | ||||||
|                |                | ||||||
|               /**** |               /**** | ||||||
|                * We now have a FULL header line that p points to |                * We now have a FULL header line that p points to | ||||||
| @@ -406,22 +423,41 @@ Transfer(struct connectdata *c_conn) | |||||||
|                    */ |                    */ | ||||||
|                   header = TRUE; |                   header = TRUE; | ||||||
|                   headerline = 0; /* we restart the header line counter */ |                   headerline = 0; /* we restart the header line counter */ | ||||||
|  |                   /* if we did wait for this do enable write now! */ | ||||||
|  |                   if (write_after_100_header) { | ||||||
|  |                     write_after_100_header = FALSE; | ||||||
|  |                     FD_SET (conn->writesockfd, &writefd); /* write socket */ | ||||||
|  |                     keepon |= KEEP_WRITE; | ||||||
|  |                     wkeepfd = writefd; | ||||||
|  |                   } | ||||||
|                 } |                 } | ||||||
| 		else | 		else | ||||||
|                   header = FALSE;	/* no more header to parse! */ |                   header = FALSE;	/* no more header to parse! */ | ||||||
|  |  | ||||||
|  | 		if (417 == httpcode) { | ||||||
|  | 		  /* | ||||||
|  | 		   * we got: "417 Expectation Failed" this means: | ||||||
|  | 		   * we have made a HTTP call and our Expect Header | ||||||
|  | 		   * seems to cause a problem => abort the write operations | ||||||
|  | 		   * (or prevent them from starting | ||||||
|  | 		   */ | ||||||
|  | 		  write_after_100_header = FALSE; | ||||||
|  | 		  keepon &= ~KEEP_WRITE; | ||||||
|  | 		  FD_ZERO(&wkeepfd); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|                 /* now, only output this if the header AND body are requested: |                 /* now, only output this if the header AND body are requested: | ||||||
|                  */ |                  */ | ||||||
|                 writetype = CLIENTWRITE_HEADER; |                 writetype = CLIENTWRITE_HEADER; | ||||||
|                 if (data->bits.http_include_header) |                 if (data->set.http_include_header) | ||||||
|                   writetype |= CLIENTWRITE_BODY; |                   writetype |= CLIENTWRITE_BODY; | ||||||
|  |  | ||||||
|                 urg = Curl_client_write(data, writetype, data->headerbuff, |                 urg = Curl_client_write(data, writetype, data->state.headerbuff, | ||||||
|                                         p - data->headerbuff); |                                         p - data->state.headerbuff); | ||||||
|                 if(urg) |                 if(urg) | ||||||
|                   return urg; |                   return urg; | ||||||
|  |  | ||||||
|                 data->header_size += p - data->headerbuff; |                 data->info.header_size += p - data->state.headerbuff; | ||||||
|  |  | ||||||
|                 if(!header) { |                 if(!header) { | ||||||
|                   /* |                   /* | ||||||
| @@ -430,7 +466,7 @@ Transfer(struct connectdata *c_conn) | |||||||
|                    * If we requested a "no body", this is a good time to get |                    * If we requested a "no body", this is a good time to get | ||||||
|                    * out and return home. |                    * out and return home. | ||||||
|                    */ |                    */ | ||||||
|                   if(data->bits.no_body) |                   if(data->set.no_body) | ||||||
|                     return CURLE_OK; |                     return CURLE_OK; | ||||||
|  |  | ||||||
|                   if(!conn->bits.close) { |                   if(!conn->bits.close) { | ||||||
| @@ -453,7 +489,7 @@ Transfer(struct connectdata *c_conn) | |||||||
|  |  | ||||||
|                 /* We continue reading headers, so reset the line-based |                 /* We continue reading headers, so reset the line-based | ||||||
|                    header parsing variables hbufp && hbuflen */ |                    header parsing variables hbufp && hbuflen */ | ||||||
|                 hbufp = data->headerbuff; |                 hbufp = data->state.headerbuff; | ||||||
|                 hbuflen = 0; |                 hbuflen = 0; | ||||||
|                 continue; |                 continue; | ||||||
|               } |               } | ||||||
| @@ -480,17 +516,17 @@ Transfer(struct connectdata *c_conn) | |||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if (nc) { |                 if (nc) { | ||||||
|                   data->progress.httpcode = httpcode; |                   data->info.httpcode = httpcode; | ||||||
|                   data->progress.httpversion = httpversion; |                   data->info.httpversion = httpversion; | ||||||
|  |  | ||||||
|                   /* 404 -> URL not found! */ |                   /* 404 -> URL not found! */ | ||||||
|                   if ( |                   if ( | ||||||
|                       ( ((data->bits.http_follow_location) && |                       ( ((data->set.http_follow_location) && | ||||||
|                          (httpcode >= 400)) |                          (httpcode >= 400)) | ||||||
|                         || |                         || | ||||||
|                         (!data->bits.http_follow_location && |                         (!data->set.http_follow_location && | ||||||
|                          (httpcode >= 300))) |                          (httpcode >= 300))) | ||||||
|                       && (data->bits.http_fail_on_error)) { |                       && (data->set.http_fail_on_error)) { | ||||||
|                     /* If we have been told to fail hard on HTTP-errors, |                     /* If we have been told to fail hard on HTTP-errors, | ||||||
|                        here is the check for that: */ |                        here is the check for that: */ | ||||||
|                     /* serious error, go home! */ |                     /* serious error, go home! */ | ||||||
| @@ -588,14 +624,14 @@ Transfer(struct connectdata *c_conn) | |||||||
|               } |               } | ||||||
|               else if(strnequal("Last-Modified:", p, |               else if(strnequal("Last-Modified:", p, | ||||||
|                                 strlen("Last-Modified:")) && |                                 strlen("Last-Modified:")) && | ||||||
|                       (data->timecondition || data->bits.get_filetime) ) { |                       (data->set.timecondition || data->set.get_filetime) ) { | ||||||
|                 time_t secs=time(NULL); |                 time_t secs=time(NULL); | ||||||
|                 timeofdoc = curl_getdate(p+strlen("Last-Modified:"), &secs); |                 timeofdoc = curl_getdate(p+strlen("Last-Modified:"), &secs); | ||||||
|                 if(data->bits.get_filetime) |                 if(data->set.get_filetime) | ||||||
|                   data->progress.filetime = timeofdoc; |                   data->info.filetime = timeofdoc; | ||||||
|               } |               } | ||||||
|               else if ((httpcode >= 300 && httpcode < 400) && |               else if ((httpcode >= 300 && httpcode < 400) && | ||||||
|                        (data->bits.http_follow_location) && |                        (data->set.http_follow_location) && | ||||||
|                        strnequal("Location:", p, 9)) { |                        strnequal("Location:", p, 9)) { | ||||||
|                 /* this is the URL that the server advices us to get instead */ |                 /* this is the URL that the server advices us to get instead */ | ||||||
|                 char *ptr; |                 char *ptr; | ||||||
| @@ -624,17 +660,17 @@ Transfer(struct connectdata *c_conn) | |||||||
|                */ |                */ | ||||||
|  |  | ||||||
|               writetype = CLIENTWRITE_HEADER; |               writetype = CLIENTWRITE_HEADER; | ||||||
|               if (data->bits.http_include_header) |               if (data->set.http_include_header) | ||||||
|                 writetype |= CLIENTWRITE_BODY; |                 writetype |= CLIENTWRITE_BODY; | ||||||
|  |  | ||||||
|               urg = Curl_client_write(data, writetype, p, hbuflen); |               urg = Curl_client_write(data, writetype, p, hbuflen); | ||||||
|               if(urg) |               if(urg) | ||||||
|                 return urg; |                 return urg; | ||||||
|  |  | ||||||
|               data->header_size += hbuflen; |               data->info.header_size += hbuflen; | ||||||
|                |                | ||||||
|               /* reset hbufp pointer && hbuflen */ |               /* reset hbufp pointer && hbuflen */ | ||||||
|               hbufp = data->headerbuff; |               hbufp = data->state.headerbuff; | ||||||
|               hbuflen = 0; |               hbuflen = 0; | ||||||
|             } |             } | ||||||
|             while (*str);		/* header line within buffer */ |             while (*str);		/* header line within buffer */ | ||||||
| @@ -670,7 +706,7 @@ Transfer(struct connectdata *c_conn) | |||||||
|                 } |                 } | ||||||
|                 else if (conn->resume_from && |                 else if (conn->resume_from && | ||||||
|                          !content_range && |                          !content_range && | ||||||
|                          (data->httpreq==HTTPREQ_GET)) { |                          (data->set.httpreq==HTTPREQ_GET)) { | ||||||
|                   /* we wanted to resume a download, although the server |                   /* we wanted to resume a download, although the server | ||||||
|                      doesn't seem to support this and we did this with a GET |                      doesn't seem to support this and we did this with a GET | ||||||
|                      (if it wasn't a GET we did a POST or PUT resume) */ |                      (if it wasn't a GET we did a POST or PUT resume) */ | ||||||
| @@ -678,23 +714,23 @@ Transfer(struct connectdata *c_conn) | |||||||
|                          "byte ranges. Cannot resume."); |                          "byte ranges. Cannot resume."); | ||||||
|                   return CURLE_HTTP_RANGE_ERROR; |                   return CURLE_HTTP_RANGE_ERROR; | ||||||
|                 } |                 } | ||||||
|                 else if(data->timecondition && !conn->range) { |                 else if(data->set.timecondition && !conn->range) { | ||||||
|                   /* A time condition has been set AND no ranges have been |                   /* A time condition has been set AND no ranges have been | ||||||
|                      requested. This seems to be what chapter 13.3.4 of |                      requested. This seems to be what chapter 13.3.4 of | ||||||
|                      RFC 2616 defines to be the correct action for a |                      RFC 2616 defines to be the correct action for a | ||||||
|                      HTTP/1.1 client */ |                      HTTP/1.1 client */ | ||||||
|                   if((timeofdoc > 0) && (data->timevalue > 0)) { |                   if((timeofdoc > 0) && (data->set.timevalue > 0)) { | ||||||
|                     switch(data->timecondition) { |                     switch(data->set.timecondition) { | ||||||
|                     case TIMECOND_IFMODSINCE: |                     case TIMECOND_IFMODSINCE: | ||||||
|                     default: |                     default: | ||||||
|                       if(timeofdoc < data->timevalue) { |                       if(timeofdoc < data->set.timevalue) { | ||||||
|                         infof(data, |                         infof(data, | ||||||
|                               "The requested document is not new enough\n"); |                               "The requested document is not new enough\n"); | ||||||
|                         return CURLE_OK; |                         return CURLE_OK; | ||||||
|                       } |                       } | ||||||
|                       break; |                       break; | ||||||
|                     case TIMECOND_IFUNMODSINCE: |                     case TIMECOND_IFUNMODSINCE: | ||||||
|                       if(timeofdoc > data->timevalue) { |                       if(timeofdoc > data->set.timevalue) { | ||||||
|                         infof(data, |                         infof(data, | ||||||
|                               "The requested document is not old enough\n"); |                               "The requested document is not old enough\n"); | ||||||
|                         return CURLE_OK; |                         return CURLE_OK; | ||||||
| @@ -761,14 +797,10 @@ Transfer(struct connectdata *c_conn) | |||||||
|         if((keepon & KEEP_WRITE) && FD_ISSET(conn->writesockfd, &writefd)) { |         if((keepon & KEEP_WRITE) && FD_ISSET(conn->writesockfd, &writefd)) { | ||||||
|           /* write */ |           /* write */ | ||||||
|  |  | ||||||
|           char scratch[BUFSIZE * 2]; |  | ||||||
|           int i, si; |           int i, si; | ||||||
|           size_t bytes_written; |           size_t bytes_written; | ||||||
|  |  | ||||||
|           if(data->crlf) |           nread = data->set.fread(buf, 1, conn->upload_bufsize, data->set.in); | ||||||
|             buf = data->buffer; /* put it back on the buffer */ |  | ||||||
|  |  | ||||||
|           nread = data->fread(buf, 1, conn->upload_bufsize, data->in); |  | ||||||
|  |  | ||||||
|           /* the signed int typecase of nread of for systems that has |           /* the signed int typecase of nread of for systems that has | ||||||
|              unsigned size_t */ |              unsigned size_t */ | ||||||
| @@ -782,28 +814,30 @@ Transfer(struct connectdata *c_conn) | |||||||
|           Curl_pgrsSetUploadCounter(data, (double)writebytecount);             |           Curl_pgrsSetUploadCounter(data, (double)writebytecount);             | ||||||
|  |  | ||||||
|           /* convert LF to CRLF if so asked */ |           /* convert LF to CRLF if so asked */ | ||||||
|           if (data->crlf) { |           if (data->set.crlf) { | ||||||
|             for(i = 0, si = 0; i < (int)nread; i++, si++) { |             for(i = 0, si = 0; i < (int)nread; i++, si++) { | ||||||
|               if (buf[i] == 0x0a) { |               if (buf[i] == 0x0a) { | ||||||
|                 scratch[si++] = 0x0d; |                 data->state.scratch[si++] = 0x0d; | ||||||
|                 scratch[si] = 0x0a; |                 data->state.scratch[si] = 0x0a; | ||||||
|               } |               } | ||||||
|               else { |               else { | ||||||
|                 scratch[si] = buf[i]; |                 data->state.scratch[si] = buf[i]; | ||||||
|               } |               } | ||||||
|             } |             } | ||||||
|             nread = si; |             nread = si; | ||||||
|             buf = scratch; /* point to the new buffer */ |             buf = data->state.scratch; /* point to the new buffer */ | ||||||
|           } |           } | ||||||
|  |  | ||||||
|           /* write to socket */ |           /* write to socket */ | ||||||
|           urg = Curl_write(conn, conn->writesockfd, buf, nread, |           urg = Curl_write(conn, conn->writesockfd, buf, nread, | ||||||
|                            &bytes_written); |                            &bytes_written); | ||||||
|  |  | ||||||
|           if(nread != bytes_written) { |           if(nread != (int)bytes_written) { | ||||||
|             failf(data, "Failed uploading data"); |             failf(data, "Failed uploading data"); | ||||||
|             return CURLE_WRITE_ERROR; |             return CURLE_WRITE_ERROR; | ||||||
|           } |           } | ||||||
|  |           if(data->set.crlf) | ||||||
|  |             buf = data->state.buffer; /* put it back on the buffer */ | ||||||
|  |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -827,7 +861,7 @@ Transfer(struct connectdata *c_conn) | |||||||
|         conn->upload_bufsize=(long)min(data->progress.ulspeed, BUFSIZE); |         conn->upload_bufsize=(long)min(data->progress.ulspeed, BUFSIZE); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|       if (data->timeout && (Curl_tvdiff (now, start) > data->timeout)) { |       if (data->set.timeout && (Curl_tvdiff (now, start) > data->set.timeout)) { | ||||||
| 	failf (data, "Operation timed out with %d out of %d bytes received", | 	failf (data, "Operation timed out with %d out of %d bytes received", | ||||||
| 	       bytecount, conn->size); | 	       bytecount, conn->size); | ||||||
| 	return CURLE_OPERATION_TIMEOUTED; | 	return CURLE_OPERATION_TIMEOUTED; | ||||||
| @@ -840,7 +874,7 @@ Transfer(struct connectdata *c_conn) | |||||||
|    * returning. |    * returning. | ||||||
|    */ |    */ | ||||||
|  |  | ||||||
|   if(!(data->bits.no_body) && contentlength && |   if(!(data->set.no_body) && contentlength && | ||||||
|      (bytecount != contentlength)) { |      (bytecount != contentlength)) { | ||||||
|     failf(data, "transfer closed with %d bytes remaining to read", |     failf(data, "transfer closed with %d bytes remaining to read", | ||||||
|           contentlength-bytecount); |           contentlength-bytecount); | ||||||
| @@ -862,20 +896,28 @@ Transfer(struct connectdata *c_conn) | |||||||
|   return CURLE_OK; |   return CURLE_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
| CURLcode Curl_perform(CURL *curl) | CURLcode Curl_perform(struct SessionHandle *data) | ||||||
| { | { | ||||||
|   CURLcode res; |   CURLcode res; | ||||||
|   struct UrlData *data = (struct UrlData *)curl; |  | ||||||
|   struct connectdata *conn=NULL; |   struct connectdata *conn=NULL; | ||||||
|   bool port=TRUE; /* allow data->use_port to set port to use */ |   bool port=TRUE; /* allow data->set.use_port to set port to use */ | ||||||
|   char *newurl = NULL; /* possibly a new URL to follow to! */ |   char *newurl = NULL; /* possibly a new URL to follow to! */ | ||||||
|  |  | ||||||
|   if(!data->url) |   if(!data->change.url) | ||||||
|     /* we can't do anything wihout URL */ |     /* we can't do anything wihout URL */ | ||||||
|     return CURLE_URL_MALFORMAT; |     return CURLE_URL_MALFORMAT; | ||||||
|  |  | ||||||
|   data->followlocation=0; /* reset the location-follow counter */ | #ifdef USE_SSLEAY | ||||||
|   data->bits.this_is_a_follow = FALSE; /* reset this */ |   /* Init the SSL session ID cache here. We do it here since we want to | ||||||
|  |      do it after the *_setopt() calls (that could change the size) but | ||||||
|  |      before any transfer. */ | ||||||
|  |   Curl_SSL_InitSessions(data, data->set.ssl.numsessions); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |   data->set.followlocation=0; /* reset the location-follow counter */ | ||||||
|  |   data->state.this_is_a_follow = FALSE; /* reset this */ | ||||||
|  |  | ||||||
|  |   Curl_initinfo(data); /* reset session-specific information "variables" */ | ||||||
|  |  | ||||||
|   Curl_pgrsStartNow(data); |   Curl_pgrsStartNow(data); | ||||||
|  |  | ||||||
| @@ -920,30 +962,28 @@ CURLcode Curl_perform(CURL *curl) | |||||||
|         port=TRUE; /* by default we use the user set port number even after |         port=TRUE; /* by default we use the user set port number even after | ||||||
|                       a Location: */ |                       a Location: */ | ||||||
|  |  | ||||||
| 	if (data->maxredirs && (data->followlocation >= data->maxredirs)) { | 	if (data->set.maxredirs && (data->set.followlocation >= data->set.maxredirs)) { | ||||||
| 	  failf(data,"Maximum (%d) redirects followed", data->maxredirs); | 	  failf(data,"Maximum (%d) redirects followed", data->set.maxredirs); | ||||||
|           res=CURLE_TOO_MANY_REDIRECTS; |           res=CURLE_TOO_MANY_REDIRECTS; | ||||||
| 	  break; | 	  break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|         /* mark the next request as a followed location: */ |         /* mark the next request as a followed location: */ | ||||||
|         data->bits.this_is_a_follow = TRUE; |         data->state.this_is_a_follow = TRUE; | ||||||
|  |  | ||||||
|         data->followlocation++; /* count location-followers */ |         data->set.followlocation++; /* count location-followers */ | ||||||
|  |  | ||||||
|         if(data->bits.http_auto_referer) { |         if(data->set.http_auto_referer) { | ||||||
|           /* We are asked to automatically set the previous URL as the |           /* We are asked to automatically set the previous URL as the | ||||||
|              referer when we get the next URL. We pick the ->url field, |              referer when we get the next URL. We pick the ->url field, | ||||||
|              which may or may not be 100% correct */ |              which may or may not be 100% correct */ | ||||||
|  |  | ||||||
|           if(data->free_referer) { |           if(data->change.referer_alloc) | ||||||
|             /* If we already have an allocated referer, free this first */ |             /* If we already have an allocated referer, free this first */ | ||||||
|             free(data->referer); |             free(data->change.referer); | ||||||
|           } |  | ||||||
|  |  | ||||||
|           data->referer = strdup(data->url); |           data->change.referer = strdup(data->change.url); | ||||||
|           data->free_referer = TRUE;          /* yes, free this later */ |           data->change.referer_alloc = TRUE; /* yes, free this later */ | ||||||
|           data->bits.http_set_referer = TRUE; /* might have been false */ |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if(2 != sscanf(newurl, "%15[^:]://%c", prot, &letter)) { |         if(2 != sscanf(newurl, "%15[^:]://%c", prot, &letter)) { | ||||||
| @@ -961,7 +1001,7 @@ CURLcode Curl_perform(CURL *curl) | |||||||
|  |  | ||||||
|           /* we must make our own copy of the URL to play with, as it may |           /* we must make our own copy of the URL to play with, as it may | ||||||
|              point to read-only data */ |              point to read-only data */ | ||||||
|           char *url_clone=strdup(data->url); |           char *url_clone=strdup(data->change.url); | ||||||
|  |  | ||||||
|           if(!url_clone) |           if(!url_clone) | ||||||
|             return CURLE_OUT_OF_MEMORY; |             return CURLE_OUT_OF_MEMORY; | ||||||
| @@ -1011,16 +1051,16 @@ CURLcode Curl_perform(CURL *curl) | |||||||
|           port = FALSE; |           port = FALSE; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if(data->bits.urlstringalloc) |         if(data->change.url_alloc) | ||||||
|           free(data->url); |           free(data->change.url); | ||||||
|  |         else | ||||||
|  |           data->change.url_alloc = TRUE; /* the URL is allocated */ | ||||||
|        |        | ||||||
|         /* TBD: set the URL with curl_setopt() */ |         /* TBD: set the URL with curl_setopt() */ | ||||||
|         data->url = newurl; |         data->change.url = newurl; | ||||||
|         newurl = NULL; /* don't free! */ |         newurl = NULL; /* don't free! */ | ||||||
|  |  | ||||||
|         data->bits.urlstringalloc = TRUE; /* the URL is allocated */ |         infof(data, "Follows Location: to new URL: '%s'\n", data->change.url); | ||||||
|  |  | ||||||
|         infof(data, "Follows Location: to new URL: '%s'\n", data->url); |  | ||||||
|  |  | ||||||
|         /* |         /* | ||||||
|          * We get here when the HTTP code is 300-399. We need to perform |          * We get here when the HTTP code is 300-399. We need to perform | ||||||
| @@ -1028,7 +1068,7 @@ CURLcode Curl_perform(CURL *curl) | |||||||
|          * Discussed on the curl mailing list and posted about on the 26th |          * Discussed on the curl mailing list and posted about on the 26th | ||||||
|          * of January 2001. |          * of January 2001. | ||||||
|          */ |          */ | ||||||
|         switch(data->progress.httpcode) { |         switch(data->info.httpcode) { | ||||||
|         case 300: /* Multiple Choices */ |         case 300: /* Multiple Choices */ | ||||||
|         case 301: /* Moved Permanently */ |         case 301: /* Moved Permanently */ | ||||||
|         case 306: /* Not used */ |         case 306: /* Not used */ | ||||||
| @@ -1059,7 +1099,7 @@ CURLcode Curl_perform(CURL *curl) | |||||||
|         case 303: /* See Other */ |         case 303: /* See Other */ | ||||||
|           /* Disable both types of POSTs, since doing a second POST when |           /* Disable both types of POSTs, since doing a second POST when | ||||||
|            * following isn't what anyone would want! */ |            * following isn't what anyone would want! */ | ||||||
|           data->httpreq = HTTPREQ_GET; /* enforce GET request */ |           data->set.httpreq = HTTPREQ_GET; /* enforce GET request */ | ||||||
|           infof(data, "Disables POST, goes with GET\n"); |           infof(data, "Disables POST, goes with GET\n"); | ||||||
|           break; |           break; | ||||||
|         case 304: /* Not Modified */ |         case 304: /* Not Modified */ | ||||||
| @@ -1088,7 +1128,7 @@ CURLcode Curl_perform(CURL *curl) | |||||||
|     free(newurl); |     free(newurl); | ||||||
|  |  | ||||||
|   /* make sure the alarm is switched off! */ |   /* make sure the alarm is switched off! */ | ||||||
|   if(data->timeout || data->connecttimeout) |   if(data->set.timeout || data->set.connecttimeout) | ||||||
|     myalarm(0); |     myalarm(0); | ||||||
|  |  | ||||||
|   return res; |   return res; | ||||||
| @@ -1122,3 +1162,10 @@ Curl_Transfer(struct connectdata *c_conn, /* connection data */ | |||||||
|  |  | ||||||
| } | } | ||||||
|            |            | ||||||
|  | /* | ||||||
|  |  * local variables: | ||||||
|  |  * eval: (load-file "../curl-mode.el") | ||||||
|  |  * end: | ||||||
|  |  * vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker | ||||||
|  |  * vim<600: et sw=2 ts=2 sts=2 tw=78 | ||||||
|  |  */ | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ | |||||||
|  * |  * | ||||||
|  * $Id$ |  * $Id$ | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| CURLcode Curl_perform(CURL *curl); | CURLcode Curl_perform(struct SessionHandle *data); | ||||||
|  |  | ||||||
| /* This sets up a forthcoming transfer */ | /* This sets up a forthcoming transfer */ | ||||||
| CURLcode  | CURLcode  | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								lib/url.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								lib/url.h
									
									
									
									
									
								
							| @@ -23,6 +23,18 @@ | |||||||
|  * $Id$ |  * $Id$ | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
|  |  | ||||||
| /* empty */ | /* | ||||||
|  |  * Prototypes for library-wide functions provided by url.c | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | CURLcode Curl_open(struct SessionHandle **curl); | ||||||
|  | CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...); | ||||||
|  | CURLcode Curl_close(struct SessionHandle *data); /* the opposite of curl_open() */ | ||||||
|  | CURLcode Curl_connect(struct SessionHandle *, | ||||||
|  |                       struct connectdata **, | ||||||
|  |                       bool allow_port); | ||||||
|  | CURLcode Curl_do(struct connectdata *); | ||||||
|  | CURLcode Curl_done(struct connectdata *); | ||||||
|  | CURLcode Curl_disconnect(struct connectdata *); | ||||||
|  |  | ||||||
| #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