Compare commits
	
		
			214 Commits
		
	
	
		
			curl-7_13_
			...
			pre-sockfi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 6063dff8d0 | ||
|   | 7fba9ed398 | ||
|   | 53280a196b | ||
|   | 0bf9a5704b | ||
|   | 8182d17ae1 | ||
|   | 69b1ac7dcd | ||
|   | b15507aac3 | ||
|   | 6c2f583f51 | ||
|   | a72eaddda3 | ||
|   | dc050e45df | ||
|   | 2fcbf13920 | ||
|   | 099ae31523 | ||
|   | c2fcdf3a02 | ||
|   | 2056a538b9 | ||
|   | cd1144dc24 | ||
|   | e9d068b913 | ||
|   | ec2ad57c32 | ||
|   | 316adac511 | ||
|   | d7b11d4c33 | ||
|   | c52aa6df33 | ||
|   | a19b23b59f | ||
|   | 4e26b2a65b | ||
|   | 7c4feac6db | ||
|   | e01e364c37 | ||
|   | c13a3d7b84 | ||
|   | 67805b6dc5 | ||
|   | 0050ab2a3d | ||
|   | 60e66c6cbf | ||
|   | 5ad2a253e8 | ||
|   | b5d50e9298 | ||
|   | 37f7362aca | ||
|   | bee198def5 | ||
|   | f09e479fd6 | ||
|   | 80fe93bc33 | ||
|   | ea03ad3bee | ||
|   | feec421744 | ||
|   | 634982840e | ||
|   | fb3c85ab2f | ||
|   | a9b7c3531c | ||
|   | a7ba0d908d | ||
|   | 2fc70e2c5d | ||
|   | 7ae3f0e70c | ||
|   | 9afaa51e3f | ||
|   | c736a719f1 | ||
|   | 37a547842b | ||
|   | b9f1d43921 | ||
|   | bec6423c02 | ||
|   | 241b2b4ae3 | ||
|   | 14d9b56937 | ||
|   | 1c3766eb46 | ||
|   | 70024d61eb | ||
|   | 2085f133d6 | ||
|   | 2a045dfceb | ||
|   | 893cbaaf2f | ||
|   | 6e61939382 | ||
|   | 015a618172 | ||
|   | 2a8b91cdb9 | ||
|   | bebd5dbc5a | ||
|   | 018dbfe058 | ||
|   | c6ea597817 | ||
|   | 175b00c0a2 | ||
|   | 5ebc6e305e | ||
|   | 993600761f | ||
|   | 1d9fff80b7 | ||
|   | c712b84dd5 | ||
|   | dcf8dd4b5e | ||
|   | ba26c3fb22 | ||
|   | 41563607a8 | ||
|   | 2d4dcfb740 | ||
|   | 34854e70cf | ||
|   | 758d9fe852 | ||
|   | 6a6c0e7a73 | ||
|   | ee44eec3e1 | ||
|   | eccd0d8e37 | ||
|   | 983be0ec60 | ||
|   | 243a45d840 | ||
|   | 60ec804047 | ||
|   | c53e9ccf4a | ||
|   | 6e8e0418fc | ||
|   | e9eb52305f | ||
|   | 8501ae748c | ||
|   | da59692067 | ||
|   | bae77c0a46 | ||
|   | b42bc7329e | ||
|   | 9b3c2b6ae2 | ||
|   | 833b6df969 | ||
|   | 0b45431139 | ||
|   | 5d1349031c | ||
|   | 82388a5e4c | ||
|   | 74816fed6c | ||
|   | b4c9789d5f | ||
|   | f96fadc074 | ||
|   | f6b1173437 | ||
|   | 346992c366 | ||
|   | ab4086bc24 | ||
|   | d8e7f2b2c7 | ||
|   | 93fcb94b62 | ||
|   | 32a446cf19 | ||
|   | 94459cab98 | ||
|   | 158588640a | ||
|   | f00f050d1b | ||
|   | c4f34c60a5 | ||
|   | 371ef80dc3 | ||
|   | 84b4e9ff7c | ||
|   | 677a74fa1b | ||
|   | 8a076d1dba | ||
|   | 970722483c | ||
|   | 31443724c6 | ||
|   | 0e7614919b | ||
|   | 2bf72937d2 | ||
|   | 4e555c7b32 | ||
|   | bd7021d05b | ||
|   | 1a14555605 | ||
|   | cb3fb371ea | ||
|   | 6c6dda1b74 | ||
|   | a712808006 | ||
|   | e19c203728 | ||
|   | 8817779f23 | ||
|   | 3e5a32671c | ||
|   | d34f32b39e | ||
|   | c85a77e0b1 | ||
|   | 9406e517e6 | ||
|   | 4a56049225 | ||
|   | 04ea4b4d75 | ||
|   | 5b6b6283f3 | ||
|   | 38f07ce0fb | ||
|   | 987cdebefb | ||
|   | 6b978db369 | ||
|   | 5840c8cb70 | ||
|   | 44f2024bab | ||
|   | 410942e9df | ||
|   | 5b3730feae | ||
|   | 38f797ccd6 | ||
|   | 553c5a7501 | ||
|   | bbba9d568f | ||
|   | 11e43dd021 | ||
|   | e8ddf84871 | ||
|   | 67f04d2d5f | ||
|   | 8f646eef45 | ||
|   | d26e932858 | ||
|   | 73b9d0840c | ||
|   | 2ea4326c40 | ||
|   | 8b80ac2877 | ||
|   | 233237740d | ||
|   | f5cdac38bd | ||
|   | 760565dcad | ||
|   | b5d97b3d94 | ||
|   | 4a6cc54eb5 | ||
|   | 61133545f6 | ||
|   | bf87d13f5b | ||
|   | efaf688650 | ||
|   | 9a5c21c16f | ||
|   | 06ffb47ef2 | ||
|   | 1acbda97e0 | ||
|   | d6460aff36 | ||
|   | a357f77c4c | ||
|   | d5bdd2b2f9 | ||
|   | 562d2de303 | ||
|   | 1f68fa19c7 | ||
|   | 677ddd6160 | ||
|   | 228e627475 | ||
|   | ec4e653c6f | ||
|   | 3916d1e6cb | ||
|   | 387aaba810 | ||
|   | 9f3d9da119 | ||
|   | 76c24a0d82 | ||
|   | ffd65a1956 | ||
|   | de8947f92f | ||
|   | d2b4dedbe4 | ||
|   | 34865ffb4a | ||
|   | 62970da675 | ||
|   | 8ed31c48e0 | ||
|   | 13d40e33a4 | ||
|   | c765213aaa | ||
|   | 983bf93a24 | ||
|   | 2f8085af15 | ||
|   | 88a4dc2795 | ||
|   | b5112096d7 | ||
|   | fc80c714e8 | ||
|   | 84bc23b92f | ||
|   | d90472dd64 | ||
|   | 3b63ed8230 | ||
|   | e75441e027 | ||
|   | 0ae8b51230 | ||
|   | 547c136b4f | ||
|   | 4ed13bde55 | ||
|   | 80e01deba0 | ||
|   | fb9ae9d0e2 | ||
|   | dd54d8551b | ||
|   | 205f8b266c | ||
|   | c4ce9ac4de | ||
|   | 0e4e28fdda | ||
|   | db2370a12f | ||
|   | d1d35ba85f | ||
|   | 2ab2e7675c | ||
|   | 0472629222 | ||
|   | c4f7570a23 | ||
|   | d26cfd5791 | ||
|   | b7ffc6bb45 | ||
|   | 8a96aec567 | ||
|   | 5cd9f57137 | ||
|   | 702664e959 | ||
|   | 18d87edd6d | ||
|   | dc59795629 | ||
|   | cb9bb31f7d | ||
|   | 02706bec94 | ||
|   | 7657186bf6 | ||
|   | 42ac24448c | ||
|   | 31891b55a4 | ||
|   | aa47ac4c06 | ||
|   | b01151e81c | ||
|   | 67bd6f9ccd | ||
|   | 4869fa285b | ||
|   | d221e01406 | 
							
								
								
									
										1994
									
								
								CHANGES.2004
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1994
									
								
								CHANGES.2004
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								COPYING
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								COPYING
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| COPYRIGHT AND PERMISSION NOTICE | ||||
|  | ||||
| Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se>. | ||||
| Copyright (c) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se>. | ||||
|  | ||||
| All rights reserved. | ||||
|  | ||||
|   | ||||
							
								
								
									
										13
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # | ||||
| # This software is licensed as described in the file COPYING, which | ||||
| # you should have received as part of this distribution. The terms | ||||
| @@ -48,6 +48,15 @@ pdf: | ||||
|  | ||||
| check: test | ||||
|  | ||||
| if CROSSCOMPILING | ||||
| test-full: test | ||||
| test-torture: test | ||||
|  | ||||
| test: | ||||
| 	@echo "NOTICE: we can't run the tests when cross-compiling!" | ||||
|  | ||||
| else | ||||
|  | ||||
| test: | ||||
| 	@(cd tests; $(MAKE) all quiet-test) | ||||
|  | ||||
| @@ -57,6 +66,8 @@ test-full: | ||||
| test-torture: | ||||
| 	@(cd tests; $(MAKE) all torture-test) | ||||
|  | ||||
| endif | ||||
|  | ||||
| # | ||||
| # Build source and binary rpms. For rpm-3.0 and above, the ~/.rpmmacros | ||||
| # must contain the following line: | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # | ||||
| # This software is licensed as described in the file COPYING, which | ||||
| # you should have received as part of this distribution. The terms | ||||
| @@ -174,6 +174,12 @@ vc-zlib-dll: | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release-zlib-dll | ||||
|  | ||||
| vc-sspi: | ||||
| 	cd lib | ||||
| 	nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1 | ||||
| 	cd ..\src | ||||
| 	nmake /f Makefile.vc6 cfg=release WINDOWS_SSPI=1 | ||||
|  | ||||
| djgpp: | ||||
| 	$(MAKE) -C lib -f Makefile.dj | ||||
| 	$(MAKE) -C src -f Makefile.dj | ||||
|   | ||||
| @@ -1,47 +1,31 @@ | ||||
| Curl and libcurl 7.13.1 | ||||
| Curl and libcurl 7.14.0 | ||||
|  | ||||
|  Public curl release number:               86 | ||||
|  Releases counted from the very beginning: 113 | ||||
|  Available command line options:           104 | ||||
|  Public curl release number:               88 | ||||
|  Releases counted from the very beginning: 115 | ||||
|  Available command line options:           106 | ||||
|  Available curl_easy_setopt() options:     122 | ||||
|  Number of public functions in libcurl:    46 | ||||
|  Amount of public web site mirrors:        18 | ||||
|  Number of known libcurl bindings:         30 | ||||
|  Amount of public web site mirrors:        21 | ||||
|  Number of known libcurl bindings:         31 | ||||
|  | ||||
| This release includes the following changes: | ||||
|  | ||||
|  o CURLOPT_COOKIEFILE set to "" is now activating the cookie engine | ||||
|  o FTP code overhaul => multi interface much less blocking | ||||
|  o Added CURLE_LOGIN_DENIED to be returned when curl is denied login to FTP | ||||
|    servers | ||||
|  o GnuTLS support, use configure --with-gnutls. Work on this was sponsored | ||||
|    by The Written Word. | ||||
|  | ||||
| This release includes the following bugfixes: | ||||
|  | ||||
|  o -# crash when more data than expected was retrieved | ||||
|  o NTLM/krb4 buffer overflow fixed (CAN-2005-0490) | ||||
|  o proxy auth bug when following redirects to another host | ||||
|  o socket leak when local bind failed | ||||
|  o HTTP POST with --anyauth picking NTLM | ||||
|  o SSL problems when downloading exactly 16KB data | ||||
|  o out of memory conditions preserve error codes better | ||||
|  o a few crashes at out of memory | ||||
|  o inflate buffer usage bugfix | ||||
|  o better DICT protocol adherence | ||||
|  o disable valgrind-checking while testing if libcurl is built shared | ||||
|  o locale names in some date strings | ||||
|  o HTTP 304 response with Content-Length: header | ||||
|  o time-conditioned FTP uploads | ||||
|  | ||||
| Other curl-related news since the previous public release: | ||||
|  | ||||
|  o libcurl-vb 1.0 http://sf.net/projects/libcurl-vb/ | ||||
|  o pycurl 7.13.0: http://pycurl.sf.net/ | ||||
|  o new german mirror: http://curl.mons-new-media.de | ||||
|  o new US mirror: http://curl.islandofpoker.com | ||||
|  o http://curl.mirroring.de/ is a new german curl mirror | ||||
|  o pycurl 7.13.2: http://pycurl.sf.net/ | ||||
|  | ||||
| This release would not have looked like this without help, code, reports and | ||||
| advice from friends like these: | ||||
|  | ||||
|  Gisle Vanem, David Byron, Marty Kuhrt, Maruko, Eric Vergnaud, Christopher | ||||
|  R. Palmer, Mike Dobbs, David in bug report #1124588, Ralph Mitchell, | ||||
|  Rene Rebe, Dave Dribin, Dan Fandrich | ||||
|  Christophe Legry,Cory Nelson  | ||||
|  | ||||
|         Thanks! (and sorry if I forgot to mention someone) | ||||
|   | ||||
							
								
								
									
										13
									
								
								TODO-RELEASE
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								TODO-RELEASE
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| Issues not sorted in any particular order. | ||||
|  | ||||
| To get fixed in 7.13.2 (planned release: April 2005) | ||||
| To get fixed in 7.14.1 (planned release: June 2005) | ||||
| ====================== | ||||
|  | ||||
| 58 - Fix KNOWN_BUGS #19: "FTP 3rd party transfers with the multi interface | ||||
| @@ -10,11 +10,7 @@ To get fixed in 7.13.2 (planned release: April 2005) | ||||
|      Awaits OpenSSL support for this, no need to support this in libcurl before | ||||
|      there's an OpenSSL release that does it. | ||||
|  | ||||
| 58 - SSPI for libcurl on Windows | ||||
|  | ||||
| 59 - --form-string and --form-file as discussed on curl-users list | ||||
|  | ||||
| To get fixed in 7.14.0 | ||||
| To get fixed in 7.15.0 | ||||
| ====================== | ||||
|  | ||||
| 55 - Add a function to the multi interface that gets file descriptors, as an | ||||
| @@ -28,7 +24,12 @@ To get fixed in 7.14.0 | ||||
|      internally use and assume the multi interface. The select()-loop should | ||||
|      use the new function from (55). | ||||
|  | ||||
| To get fixed in 7.16.0 | ||||
| ====================== | ||||
|  | ||||
| 57 - Add an interface to libcurl for getting and setting cookies from an easy | ||||
|      handle. One idea: http://curl.haxx.se/mail/lib-2004-12/0195.html the | ||||
|      older idea: http://curl.haxx.se/dev/COOKIES. We need to settle on some | ||||
|      middle ground I guess. | ||||
|  | ||||
| 60 -  | ||||
|   | ||||
							
								
								
									
										89
									
								
								acinclude.m4
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								acinclude.m4
									
									
									
									
									
								
							| @@ -322,8 +322,24 @@ dnl program worked: | ||||
| [ ac_cv_working_ni_withscopeid="yes" ], | ||||
| dnl program failed: | ||||
| [ ac_cv_working_ni_withscopeid="no" ], | ||||
| dnl we cross-compile: | ||||
| [ ac_cv_working_ni_withscopeid="yes" ] | ||||
| dnl we cross-compile, check the headers using the preprocessor | ||||
| [ | ||||
|  | ||||
|  AC_EGREP_CPP(WORKS, | ||||
| [ | ||||
| #include <stdio.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/socket.h> | ||||
| #include <netdb.h> | ||||
|  | ||||
| #ifdef NI_WITHSCOPEID | ||||
| WORKS | ||||
| #endif | ||||
| ], | ||||
|   ac_cv_working_ni_withscopeid="yes", | ||||
|   ac_cv_working_ni_withscopeid="no" ) | ||||
|  | ||||
|  ] | ||||
| ) dnl end of AC_RUN_IFELSE | ||||
|  | ||||
| ]) dnl end of AC_CACHE_CHECK | ||||
| @@ -766,3 +782,72 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS], | ||||
|  | ||||
| ]) dnl end of AC_DEFUN() | ||||
|  | ||||
|  | ||||
| dnl Determine the name of the library to pass to dlopen() based on the name | ||||
| dnl that would normally be given to AC_CHECK_LIB.  The preprocessor symbol | ||||
| dnl given is set to the quoted library file name.  | ||||
| dnl The standard dynamic library file name is first generated, based on the | ||||
| dnl current system type, then a search is performed for that file on the | ||||
| dnl standard dynamic library path.  If it is a symbolic link, the destination | ||||
| dnl of the link is used as the file name, after stripping off any minor | ||||
| dnl version numbers. If a library file can't be found, a guess is made. | ||||
| dnl This macro assumes AC_PROG_LIBTOOL has been called and requires perl | ||||
| dnl to be available in the PATH, or $PERL to be set to its location. | ||||
| dnl | ||||
| dnl CURL_DLLIB_NAME(VARIABLE, library_name) | ||||
| dnl e.g. CURL_DLLIB_NAME(LDAP_NAME, ldap) on a Linux system might result | ||||
| dnl in LDAP_NAME holding the string "libldap.so.2". | ||||
|  | ||||
| AC_DEFUN([CURL_DLLIB_NAME], | ||||
| [ | ||||
| AC_MSG_CHECKING([name of dynamic library $2]) | ||||
| dnl The shared library extension variable name changes from version to | ||||
| dnl version of libtool.  Try a few names then just set one statically. | ||||
| test -z "$shared_ext" && shared_ext="$shrext_cmds" | ||||
| test -z "$shared_ext" && shared_ext="$shrext" | ||||
| test -z "$shared_ext" && shared_ext=".so" | ||||
|  | ||||
| dnl Create the library link name of the correct form for this platform | ||||
| LIBNAME_LINK_SPEC=`echo "$library_names_spec" | $SED 's/^.* //'` | ||||
| DLGUESSLIB=`name=$2 eval echo "$libname_spec"` | ||||
| DLGUESSFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$LIBNAME_LINK_SPEC"` | ||||
|  | ||||
| dnl Synthesize a likely dynamic library name in case we can't find an actual one | ||||
| SO_NAME_SPEC="$soname_spec" | ||||
| dnl soname_spec undefined when identical to the 1st entry in library_names_spec | ||||
| test -z "$SO_NAME_SPEC" && SO_NAME_SPEC=`echo "$library_names_spec" | $SED 's/ .*$//'` | ||||
| DLGUESSSOFILE=`libname="$DLGUESSLIB" release="" major="" versuffix="" eval echo "$SO_NAME_SPEC"` | ||||
|  | ||||
| if test "$cross_compiling" = yes; then | ||||
|   dnl Can't look at filesystem when cross-compiling | ||||
|   AC_DEFINE_UNQUOTED($1, "$DLGUESSSOFILE", [$2 dynamic library file]) | ||||
|   AC_MSG_RESULT([$DLGUESSSOFILE (guess while cross-compiling)]) | ||||
| else | ||||
|  | ||||
|   DLFOUNDFILE="" | ||||
|   if test "$sys_lib_dlsearch_path_spec" ; then | ||||
|     dnl Search for the link library name and see what it points to. | ||||
|     for direc in $sys_lib_dlsearch_path_spec ; do | ||||
|       DLTRYFILE="$direc/$DLGUESSFILE" | ||||
|       dnl Find where the symbolic link for this name points | ||||
|       changequote(<<, >>)dnl | ||||
|       << | ||||
|       DLFOUNDFILE=`${PERL:-perl} -e 'use File::Basename; (basename(readlink($ARGV[0])) =~ /^(.*[^\d]\.\d+)[\d\.]*$/ && print ${1}) || exit 1;' "$DLTRYFILE" 2>&5` | ||||
|       >> | ||||
|       changequote([, ])dnl | ||||
|       if test "$?" -eq "0"; then | ||||
|         dnl Found the file link | ||||
|         break | ||||
|       fi | ||||
|     done | ||||
|   fi | ||||
|  | ||||
|   if test -z "$DLFOUNDFILE" ; then | ||||
|     dnl Couldn't find a link library, so guess at a name. | ||||
|     DLFOUNDFILE="$DLGUESSSOFILE" | ||||
|   fi | ||||
|  | ||||
|   AC_DEFINE_UNQUOTED($1, "$DLFOUNDFILE", [$2 dynamic library file]) | ||||
|   AC_MSG_RESULT($DLFOUNDFILE) | ||||
| fi | ||||
| ]) | ||||
|   | ||||
							
								
								
									
										13
									
								
								ares/AUTHORS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								ares/AUTHORS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| c-ares is based on ares, and these are the people that have worked on it since | ||||
| the fork was made: | ||||
|  | ||||
| Daniel Stenberg | ||||
| Dominick Meglio | ||||
| liren at vivisimo.com | ||||
| James Bursa | ||||
| Duncan Wilcox | ||||
| Dirk Manske | ||||
| Dan Fandrich | ||||
| Gisle Vanem | ||||
| Gunter Knauf | ||||
| Henrik Stoerner | ||||
							
								
								
									
										32
									
								
								ares/CHANGES
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								ares/CHANGES
									
									
									
									
									
								
							| @@ -1,5 +1,37 @@ | ||||
|   Changelog for the c-ares project | ||||
|  | ||||
| * April 9 | ||||
|  | ||||
| - Made sortlist support IPv6 (this can probably use some testing). | ||||
|  | ||||
| - Made sortlist support CIDR matching for IPv4. | ||||
|  | ||||
| * April 8 | ||||
|  | ||||
| - Added preliminary IPv6 support to ares_gethostbyname. Currently, sortlist | ||||
|   does not work with IPv6. Also provided an implementation of bitncmp from | ||||
|   BIND for systems that do not supply this function. This will be used to add | ||||
|   IPv6 support to sortlist. | ||||
|  | ||||
| - Made ares_gethostbyaddr support IPv6 by specifying AF_INET6 as the family. | ||||
|   The function can lookup IPv6 addresses both from files (/etc/hosts) and | ||||
|   DNS lookups. | ||||
|  | ||||
| * April 7 | ||||
|  | ||||
| - Tupone Alfredo fixed includes of arpa/nameser_compat.h to build fine on Mac | ||||
|   OS X. | ||||
|  | ||||
| * April 5 | ||||
|  | ||||
| - Dominick Meglio: Provided implementations of inet_net_pton and inet_pton | ||||
|   from BIND for systems that do not include these functions. | ||||
|  | ||||
| * March 11, 2005 | ||||
|  | ||||
| - Dominick Meglio added ares_parse_aaaa_reply.c and did various | ||||
|   adjustments. The first little steps towards IPv6 support! | ||||
|  | ||||
| * November 7 | ||||
|  | ||||
| - Fixed the VC project and makefile to use ares_cancel and ares_version | ||||
|   | ||||
| @@ -12,7 +12,7 @@ MSVCFILES = vc/adig/adig.dep vc/adig/adig.dsp vc/adig/adig.mak	\ | ||||
| # adig and ahost are just sample programs and thus not mentioned with the | ||||
| # regular sources and headers | ||||
| EXTRA_DIST = CHANGES README.cares Makefile.inc adig.c ahost.c $(man_MANS) \ | ||||
|  $(MSVCFILES) | ||||
|  $(MSVCFILES) AUTHORS | ||||
|  | ||||
|  | ||||
| VER=-version-info 0:0:0 | ||||
|   | ||||
| @@ -3,13 +3,15 @@ ares__close_sockets.c ares_free_string.c ares_search.c ares__get_hostent.c \ | ||||
| ares_gethostbyaddr.c ares_send.c ares__read_line.c ares_gethostbyname.c	   \ | ||||
| ares_strerror.c ares_cancel.c ares_init.c ares_timeout.c ares_destroy.c	   \ | ||||
| ares_mkquery.c ares_version.c ares_expand_name.c ares_parse_a_reply.c	   \ | ||||
| windows_port.c ares_expand_string.c ares_parse_ptr_reply.c | ||||
| windows_port.c ares_expand_string.c ares_parse_ptr_reply.c                 \ | ||||
| ares_parse_aaaa_reply.c inet_net_pton.c bitncmp.c | ||||
|  | ||||
| HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h nameser.h | ||||
| HHEADERS = ares.h ares_private.h setup.h ares_dns.h ares_version.h nameser.h \ | ||||
|            inet_net_pton.h | ||||
|  | ||||
| MANPAGES= ares_destroy.3 ares_expand_name.3 ares_expand_string.3 ares_fds.3 \ | ||||
|  ares_free_hostent.3 ares_free_string.3 ares_gethostbyaddr.3		    \ | ||||
|  ares_gethostbyname.3 ares_init.3 ares_init_options.3 ares_mkquery.3	    \ | ||||
|  ares_parse_a_reply.3 ares_parse_ptr_reply.3 ares_process.3		    \ | ||||
|  ares_query.3 ares_search.3 ares_send.3 ares_strerror.3 ares_timeout.3	    \ | ||||
|  ares_version.3 ares_cancel.3 | ||||
|  ares_version.3 ares_cancel.3 ares_parse_aaaa_reply.3 | ||||
|   | ||||
| @@ -20,7 +20,7 @@ endif | ||||
| TARGETS = adig.nlm ahost.nlm | ||||
| LTARGET = libcares.lib | ||||
| VERSION	= $(LIBCARES_VERSION) | ||||
| COPYR	= Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se> | ||||
| COPYR	= Copyright (C) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se> | ||||
| DESCR	= cURL $(subst .def,,$(notdir $@)) $(LIBCARES_VERSION_STR) - http://curl.haxx.se | ||||
| MTSAFE	= YES | ||||
| STACK	= 64000 | ||||
| @@ -297,6 +297,8 @@ config.h: Makefile.netware | ||||
| 	@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ | ||||
| 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_STRUCT_IN6_ADDR 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define HAVE_AF_INET6 1$(DL) >> $@ | ||||
| ifdef NW_WINSOCK | ||||
| 	@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ | ||||
| else | ||||
|   | ||||
| @@ -99,3 +99,50 @@ AC_DEFUN([CURL_CC_DEBUG_OPTS], | ||||
|  | ||||
| ]) dnl end of AC_DEFUN() | ||||
|  | ||||
|  | ||||
| dnl This macro determines if the specified struct exists in the specified file | ||||
| dnl Syntax: | ||||
| dnl CARES_CHECK_STRUCT(headers, struct name, if found, [if not found]) | ||||
|  | ||||
| AC_DEFUN([CARES_CHECK_STRUCT], [ | ||||
|   AC_MSG_CHECKING([for struct $2]) | ||||
|   AC_TRY_COMPILE([$1],  | ||||
|     [ | ||||
|       struct $2 struct_instance; | ||||
|     ], ac_struct="yes", ac_found="no") | ||||
|   if test "$ac_struct" = "yes" ; then | ||||
|     AC_MSG_RESULT(yes) | ||||
|     $3 | ||||
|   else | ||||
|     AC_MSG_RESULT(no) | ||||
|     $4 | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
| dnl This macro determines if the specified constant exists in the specified file | ||||
| dnl Syntax: | ||||
| dnl CARES_CHECK_CONSTANT(headers, constant name, if found, [if not found]) | ||||
|  | ||||
| AC_DEFUN([CARES_CHECK_CONSTANT], [ | ||||
|   AC_MSG_CHECKING([for $2]) | ||||
|   AC_EGREP_CPP(VARIABLEWASDEFINED, | ||||
|    [ | ||||
|       $1 | ||||
|  | ||||
|       #ifdef $2 | ||||
|         VARIABLEWASDEFINED | ||||
|       #else | ||||
|         NJET | ||||
|       #endif | ||||
|     ], ac_constant="yes", ac_constant="no" | ||||
|   ) | ||||
|   if test "$ac_constant" = "yes" ; then | ||||
|     AC_MSG_RESULT(yes) | ||||
|     $3 | ||||
|   else | ||||
|     AC_MSG_RESULT(no) | ||||
|     $4 | ||||
|   fi | ||||
| ]) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -137,12 +137,13 @@ int ares_expand_string(const unsigned char *encoded, const unsigned char *abuf, | ||||
|                      int alen, unsigned char **s, long *enclen); | ||||
| int ares_parse_a_reply(const unsigned char *abuf, int alen, | ||||
|                        struct hostent **host); | ||||
| int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, | ||||
|                        struct hostent **host); | ||||
| int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, | ||||
|                          int addrlen, int family, struct hostent **host); | ||||
| void ares_free_string(void *str); | ||||
| void ares_free_hostent(struct hostent *host); | ||||
| const char *ares_strerror(int code); | ||||
| void ares_free_errmem(char *mem); | ||||
|  | ||||
| #ifdef  __cplusplus | ||||
| } | ||||
|   | ||||
| @@ -30,12 +30,15 @@ | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
| #include "inet_net_pton.h" | ||||
|  | ||||
| int ares__get_hostent(FILE *fp, struct hostent **host) | ||||
| int ares__get_hostent(FILE *fp, int family, struct hostent **host) | ||||
| { | ||||
|   char *line = NULL, *p, *q, *canonical, **alias; | ||||
|   int status, linesize, end_at_hostname, naliases; | ||||
|   struct in_addr addr; | ||||
|   struct in6_addr addr6; | ||||
|   int addrlen = sizeof(struct in_addr); | ||||
|   struct hostent *hostent = NULL; | ||||
|  | ||||
|   while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS) | ||||
| @@ -56,6 +59,17 @@ int ares__get_hostent(FILE *fp, struct hostent **host) | ||||
|       *p = 0; | ||||
|       addr.s_addr = inet_addr(line); | ||||
|       if (addr.s_addr == INADDR_NONE) | ||||
|        { | ||||
|           if (ares_inet_pton(AF_INET6, line, &addr6) > 0) | ||||
|             { | ||||
|               if (family != AF_INET6) | ||||
|                 continue; | ||||
|               addrlen = sizeof(struct in6_addr); | ||||
|             } | ||||
|           else | ||||
|             continue; | ||||
|        } | ||||
|       else if (family != AF_INET) | ||||
|         continue; | ||||
|  | ||||
|       /* Get the canonical hostname. */ | ||||
| @@ -100,7 +114,7 @@ int ares__get_hostent(FILE *fp, struct hostent **host) | ||||
|       hostent->h_addr_list = malloc(2 * sizeof(char *)); | ||||
|       if (!hostent->h_addr_list) | ||||
|         break; | ||||
|       hostent->h_addr_list[0] = malloc(sizeof(struct in_addr)); | ||||
|       hostent->h_addr_list[0] = malloc(addrlen); | ||||
|       if (!hostent->h_addr_list[0]) | ||||
|         break; | ||||
|       hostent->h_aliases = malloc((naliases + 1) * sizeof(char *)); | ||||
| @@ -134,9 +148,12 @@ int ares__get_hostent(FILE *fp, struct hostent **host) | ||||
|         } | ||||
|       hostent->h_aliases[naliases] = NULL; | ||||
|  | ||||
|       hostent->h_addrtype = AF_INET; | ||||
|       hostent->h_length = sizeof(struct in_addr); | ||||
|       memcpy(hostent->h_addr_list[0], &addr, sizeof(struct in_addr)); | ||||
|       hostent->h_addrtype = family; | ||||
|       hostent->h_length = addrlen; | ||||
|       if (family == AF_INET) | ||||
|         memcpy(hostent->h_addr_list[0], &addr, addrlen); | ||||
|       else if (family == AF_INET6) | ||||
|         memcpy(hostent->h_addr_list[0], &addr6, addrlen); | ||||
|       hostent->h_addr_list[1] = NULL; | ||||
|       *host = hostent; | ||||
|       free(line); | ||||
|   | ||||
| @@ -21,6 +21,9 @@ | ||||
| #else | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
|   | ||||
| @@ -12,7 +12,6 @@ | ||||
|  * this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| @@ -23,6 +22,9 @@ | ||||
| #include <netinet/in.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| @@ -31,6 +33,7 @@ | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
| #include "inet_net_pton.h" | ||||
|  | ||||
| #ifdef WATT32 | ||||
| #undef WIN32 | ||||
| @@ -39,7 +42,8 @@ | ||||
| struct addr_query { | ||||
|   /* Arguments passed to ares_gethostbyaddr() */ | ||||
|   ares_channel channel; | ||||
|   struct in_addr addr; | ||||
|   union ares_addr addr; | ||||
|   int family; | ||||
|   ares_host_callback callback; | ||||
|   void *arg; | ||||
|  | ||||
| @@ -51,14 +55,21 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, | ||||
|                           int alen); | ||||
| static void end_aquery(struct addr_query *aquery, int status, | ||||
|                        struct hostent *host); | ||||
| static int file_lookup(struct in_addr *addr, struct hostent **host); | ||||
| static int file_lookup(union ares_addr *addr, int family, struct hostent **host); | ||||
|  | ||||
| void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | ||||
|                         int family, ares_host_callback callback, void *arg) | ||||
| { | ||||
|   struct addr_query *aquery; | ||||
|  | ||||
|   if (family != AF_INET || addrlen != sizeof(struct in_addr)) | ||||
|   if (family != AF_INET && family != AF_INET6) | ||||
|     { | ||||
|       callback(arg, ARES_ENOTIMP, NULL); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   if ((family == AF_INET && addrlen != sizeof(struct in_addr)) ||  | ||||
|       (family == AF_INET6 && addrlen != sizeof(struct in6_addr))) | ||||
|     { | ||||
|       callback(arg, ARES_ENOTIMP, NULL); | ||||
|       return; | ||||
| @@ -71,7 +82,11 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | ||||
|       return; | ||||
|     } | ||||
|   aquery->channel = channel; | ||||
|   memcpy(&aquery->addr, addr, sizeof(aquery->addr)); | ||||
|   if (family == AF_INET) | ||||
|     memcpy(&aquery->addr.addr4, addr, sizeof(struct in_addr)); | ||||
|   else | ||||
|     memcpy(&aquery->addr.addr6, addr, sizeof(struct in6_addr)); | ||||
|   aquery->family = family; | ||||
|   aquery->callback = callback; | ||||
|   aquery->arg = arg; | ||||
|   aquery->remaining_lookups = channel->lookups; | ||||
| @@ -82,7 +97,7 @@ void ares_gethostbyaddr(ares_channel channel, const void *addr, int addrlen, | ||||
| static void next_lookup(struct addr_query *aquery) | ||||
| { | ||||
|   const char *p; | ||||
|   char name[64]; | ||||
|   char name[128]; | ||||
|   int a1, a2, a3, a4, status; | ||||
|   struct hostent *host; | ||||
|   unsigned long addr; | ||||
| @@ -92,18 +107,38 @@ static void next_lookup(struct addr_query *aquery) | ||||
|       switch (*p) | ||||
|         { | ||||
|         case 'b': | ||||
|           addr = ntohl(aquery->addr.s_addr); | ||||
|           a1 = (int)((addr >> 24) & 0xff); | ||||
|           a2 = (int)((addr >> 16) & 0xff); | ||||
|           a3 = (int)((addr >> 8) & 0xff); | ||||
|           a4 = (int)(addr & 0xff); | ||||
|           sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1); | ||||
|           aquery->remaining_lookups = p + 1; | ||||
|           ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, | ||||
|                      aquery); | ||||
| 	  if (aquery->family == AF_INET) | ||||
|             { | ||||
|               addr = ntohl(aquery->addr.addr4.s_addr); | ||||
|               a1 = (int)((addr >> 24) & 0xff); | ||||
|               a2 = (int)((addr >> 16) & 0xff); | ||||
|               a3 = (int)((addr >> 8) & 0xff); | ||||
|               a4 = (int)(addr & 0xff); | ||||
|               sprintf(name, "%d.%d.%d.%d.in-addr.arpa", a4, a3, a2, a1); | ||||
|               aquery->remaining_lookups = p + 1; | ||||
|               ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, | ||||
|                          aquery); | ||||
|             } | ||||
|           else | ||||
|             { | ||||
|               unsigned char *bytes; | ||||
|               bytes = (unsigned char *)&aquery->addr.addr6.s6_addr; | ||||
|               sprintf(name, "%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.%x.ip6.arpa", | ||||
|                       bytes[15]&0xf, bytes[15] >> 4, bytes[14]&0xf, bytes[14] >> 4, | ||||
|                       bytes[13]&0xf, bytes[13] >> 4, bytes[12]&0xf, bytes[12] >> 4, | ||||
|                       bytes[11]&0xf, bytes[11] >> 4, bytes[10]&0xf, bytes[10] >> 4, | ||||
|                       bytes[9]&0xf, bytes[9] >> 4, bytes[8]&0xf, bytes[8] >> 4, | ||||
|                       bytes[7]&0xf, bytes[7] >> 4, bytes[6]&0xf, bytes[6] >> 4, | ||||
|                       bytes[5]&0xf, bytes[5] >> 4, bytes[4]&0xf, bytes[4] >> 4, | ||||
|                       bytes[3]&0xf, bytes[3] >> 4, bytes[2]&0xf, bytes[2] >> 4, | ||||
|                       bytes[1]&0xf, bytes[1] >> 4, bytes[0]&0xf, bytes[0] >> 4); | ||||
|               aquery->remaining_lookups = p + 1; | ||||
|               ares_query(aquery->channel, name, C_IN, T_PTR, addr_callback, | ||||
|                          aquery); | ||||
|             } | ||||
|           return; | ||||
|         case 'f': | ||||
|           status = file_lookup(&aquery->addr, &host); | ||||
|           status = file_lookup(&aquery->addr, aquery->family, &host); | ||||
|           if (status != ARES_ENOTFOUND) | ||||
|             { | ||||
|               end_aquery(aquery, status, host); | ||||
| @@ -122,8 +157,12 @@ static void addr_callback(void *arg, int status, unsigned char *abuf, int alen) | ||||
|  | ||||
|   if (status == ARES_SUCCESS) | ||||
|     { | ||||
|       status = ares_parse_ptr_reply(abuf, alen, &aquery->addr, | ||||
|                                     sizeof(struct in_addr), AF_INET, &host); | ||||
|       if (aquery->family == AF_INET) | ||||
|         status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr4, | ||||
|                                       sizeof(struct in_addr), AF_INET, &host); | ||||
|       else | ||||
|         status = ares_parse_ptr_reply(abuf, alen, &aquery->addr.addr6, | ||||
|                                       sizeof(struct in6_addr), AF_INET6, &host); | ||||
|       end_aquery(aquery, status, host); | ||||
|     } | ||||
|   else if (status == ARES_EDESTRUCTION) | ||||
| @@ -141,27 +180,26 @@ static void end_aquery(struct addr_query *aquery, int status, | ||||
|   free(aquery); | ||||
| } | ||||
|  | ||||
| static int file_lookup(struct in_addr *addr, struct hostent **host) | ||||
| static int file_lookup(union ares_addr *addr, int family, struct hostent **host) | ||||
| { | ||||
|   FILE *fp; | ||||
|   int status; | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
|   char PATH_HOSTS[MAX_PATH]; | ||||
|   if (IS_NT()) { | ||||
|         char tmp[MAX_PATH]; | ||||
|         HKEY hkeyHosts; | ||||
|     char tmp[MAX_PATH]; | ||||
|     HKEY hkeyHosts; | ||||
|  | ||||
|         if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts) | ||||
|                 == ERROR_SUCCESS) | ||||
|         { | ||||
|                 DWORD dwLength = MAX_PATH; | ||||
|                 RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, tmp, | ||||
|                         &dwLength); | ||||
|                 ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH); | ||||
|                 RegCloseKey(hkeyHosts); | ||||
|         } | ||||
|     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts) | ||||
|         == ERROR_SUCCESS) | ||||
|     { | ||||
|       DWORD dwLength = MAX_PATH; | ||||
|       RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, | ||||
|                       &dwLength); | ||||
|       ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH); | ||||
|       RegCloseKey(hkeyHosts); | ||||
|     } | ||||
|   } | ||||
|   else | ||||
|     GetWindowsDirectory(PATH_HOSTS, MAX_PATH); | ||||
| @@ -179,11 +217,23 @@ static int file_lookup(struct in_addr *addr, struct hostent **host) | ||||
|   fp = fopen(PATH_HOSTS, "r"); | ||||
|   if (!fp) | ||||
|     return ARES_ENOTFOUND; | ||||
|  | ||||
|   while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS) | ||||
|   while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) | ||||
|     { | ||||
|       if (memcmp((*host)->h_addr, addr, sizeof(struct in_addr)) == 0) | ||||
|         break; | ||||
|       if (family != (*host)->h_addrtype) | ||||
|         { | ||||
|           ares_free_hostent(*host); | ||||
|           continue; | ||||
|         } | ||||
|       if (family == AF_INET) | ||||
|         { | ||||
|           if (memcmp((*host)->h_addr, &addr->addr4, sizeof(struct in_addr)) == 0) | ||||
|             break; | ||||
|         } | ||||
|       else if (family == AF_INET6) | ||||
|         { | ||||
|           if (memcmp((*host)->h_addr, &addr->addr6, sizeof(struct in6_addr)) == 0) | ||||
|             break; | ||||
|         } | ||||
|       ares_free_hostent(*host); | ||||
|     } | ||||
|   fclose(fp); | ||||
|   | ||||
| @@ -33,6 +33,8 @@ | ||||
|  | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
| #include "inet_net_pton.h" | ||||
| #include "bitncmp.h" | ||||
|  | ||||
| #ifdef WATT32 | ||||
| #undef WIN32 | ||||
| @@ -44,7 +46,7 @@ struct host_query { | ||||
|   char *name; | ||||
|   ares_host_callback callback; | ||||
|   void *arg; | ||||
|  | ||||
|   int family; | ||||
|   const char *remaining_lookups; | ||||
| }; | ||||
|  | ||||
| @@ -53,13 +55,17 @@ static void host_callback(void *arg, int status, unsigned char *abuf, | ||||
|                           int alen); | ||||
| static void end_hquery(struct host_query *hquery, int status, | ||||
|                        struct hostent *host); | ||||
| static int fake_hostent(const char *name, ares_host_callback callback, | ||||
| static int fake_hostent(const char *name, int family, ares_host_callback callback, | ||||
|                         void *arg); | ||||
| static int file_lookup(const char *name, struct hostent **host); | ||||
| static int file_lookup(const char *name, int family, struct hostent **host); | ||||
| static void sort_addresses(struct hostent *host, struct apattern *sortlist, | ||||
|                            int nsort); | ||||
| static void sort6_addresses(struct hostent *host, struct apattern *sortlist, | ||||
|                            int nsort); | ||||
| static int get_address_index(struct in_addr *addr, struct apattern *sortlist, | ||||
|                              int nsort); | ||||
| static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist, | ||||
|                              int nsort); | ||||
|  | ||||
| void ares_gethostbyname(ares_channel channel, const char *name, int family, | ||||
|                         ares_host_callback callback, void *arg) | ||||
| @@ -67,13 +73,13 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family, | ||||
|   struct host_query *hquery; | ||||
|  | ||||
|   /* Right now we only know how to look up Internet addresses. */ | ||||
|   if (family != AF_INET) | ||||
|   if (family != AF_INET && family != AF_INET6) | ||||
|     { | ||||
|       callback(arg, ARES_ENOTIMP, NULL); | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   if (fake_hostent(name, callback, arg)) | ||||
|   if (fake_hostent(name, family, callback, arg)) | ||||
|     return; | ||||
|  | ||||
|   /* Allocate and fill in the host query structure. */ | ||||
| @@ -85,6 +91,7 @@ void ares_gethostbyname(ares_channel channel, const char *name, int family, | ||||
|     } | ||||
|   hquery->channel = channel; | ||||
|   hquery->name = strdup(name); | ||||
|   hquery->family = family; | ||||
|   if (!hquery->name) | ||||
|     { | ||||
|       free(hquery); | ||||
| @@ -112,13 +119,17 @@ static void next_lookup(struct host_query *hquery) | ||||
|         case 'b': | ||||
|           /* DNS lookup */ | ||||
|           hquery->remaining_lookups = p + 1; | ||||
|           ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, | ||||
|                       hquery); | ||||
| 	  if (hquery->family == AF_INET6) | ||||
| 	    ares_search(hquery->channel, hquery->name, C_IN, T_AAAA, host_callback, | ||||
| 	                hquery); | ||||
| 	  else | ||||
|             ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, | ||||
|                         hquery); | ||||
|           return; | ||||
|  | ||||
|         case 'f': | ||||
|           /* Host file lookup */ | ||||
|           status = file_lookup(hquery->name, &host); | ||||
|           status = file_lookup(hquery->name, hquery->family, &host); | ||||
|           if (status != ARES_ENOTFOUND) | ||||
|             { | ||||
|               end_hquery(hquery, status, host); | ||||
| @@ -138,11 +149,27 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen) | ||||
|  | ||||
|   if (status == ARES_SUCCESS) | ||||
|     { | ||||
|       status = ares_parse_a_reply(abuf, alen, &host); | ||||
|       if (host && channel->nsort) | ||||
|         sort_addresses(host, channel->sortlist, channel->nsort); | ||||
|       if (hquery->family == AF_INET) | ||||
|         { | ||||
|           status = ares_parse_a_reply(abuf, alen, &host); | ||||
|           if (host && channel->nsort) | ||||
|             sort_addresses(host, channel->sortlist, channel->nsort); | ||||
|         } | ||||
|       else if (hquery->family == AF_INET6) | ||||
|         { | ||||
|           status = ares_parse_aaaa_reply(abuf, alen, &host); | ||||
|           if (host && channel->nsort) | ||||
|             sort6_addresses(host, channel->sortlist, channel->nsort); | ||||
|         } | ||||
|       end_hquery(hquery, status, host); | ||||
|     } | ||||
|   else if (status == ARES_ENODATA && hquery->family == AF_INET6) | ||||
|     { | ||||
|       /* There was no AAAA now lookup an A */ | ||||
|       hquery->family = AF_INET; | ||||
|       ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback, | ||||
|                   hquery); | ||||
|     }       | ||||
|   else if (status == ARES_EDESTRUCTION) | ||||
|     end_hquery(hquery, status, NULL); | ||||
|   else | ||||
| @@ -162,36 +189,34 @@ static void end_hquery(struct host_query *hquery, int status, | ||||
| /* If the name looks like an IP address, fake up a host entry, end the | ||||
|  * query immediately, and return true.  Otherwise return false. | ||||
|  */ | ||||
| static int fake_hostent(const char *name, ares_host_callback callback, | ||||
| static int fake_hostent(const char *name, int family, ares_host_callback callback, | ||||
|                         void *arg) | ||||
| { | ||||
|   struct in_addr addr; | ||||
|   struct hostent hostent; | ||||
|   const char *p; | ||||
|   char *aliases[1] = { NULL }; | ||||
|   char *addrs[2]; | ||||
|   int result = 0; | ||||
|   struct in_addr in; | ||||
|   struct in6_addr in6; | ||||
|  | ||||
|   /* It only looks like an IP address if it's all numbers and dots. */ | ||||
|   for (p = name; *p; p++) | ||||
|     { | ||||
|       if (!isdigit((unsigned char)*p) && *p != '.') | ||||
|         return 0; | ||||
|     } | ||||
|   if (family == AF_INET) | ||||
|     result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1); | ||||
|   else if (family == AF_INET6) | ||||
|     result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1); | ||||
|  | ||||
|   /* It also only looks like an IP address if it's non-zero-length and | ||||
|    * doesn't end with a dot. | ||||
|    */ | ||||
|   if (p == name || *(p - 1) == '.') | ||||
|   if (!result) | ||||
|     return 0; | ||||
|  | ||||
|   /* It looks like an IP address.  Figure out what IP address it is. */ | ||||
|   addr.s_addr = inet_addr(name); | ||||
|   if (addr.s_addr == INADDR_NONE) | ||||
|   if (family == AF_INET) | ||||
|     { | ||||
|       callback(arg, ARES_EBADNAME, NULL); | ||||
|       return 1; | ||||
|       hostent.h_length = sizeof(struct in_addr); | ||||
|       addrs[0] = (char *)∈ | ||||
|     } | ||||
|   else if (family == AF_INET6) | ||||
|     { | ||||
|       hostent.h_length = sizeof(struct in6_addr); | ||||
|       addrs[0] = (char *)&in6; | ||||
|     } | ||||
|  | ||||
|   /* Duplicate the name, to avoid a constness violation. */ | ||||
|   hostent.h_name = strdup(name); | ||||
|   if (!hostent.h_name) | ||||
| @@ -201,11 +226,9 @@ static int fake_hostent(const char *name, ares_host_callback callback, | ||||
|     } | ||||
|  | ||||
|   /* Fill in the rest of the host structure and terminate the query. */ | ||||
|   addrs[0] = (char *) &addr; | ||||
|   addrs[1] = NULL; | ||||
|   hostent.h_aliases = aliases; | ||||
|   hostent.h_addrtype = AF_INET; | ||||
|   hostent.h_length = sizeof(struct in_addr); | ||||
|   hostent.h_addrtype = family; | ||||
|   hostent.h_addr_list = addrs; | ||||
|   callback(arg, ARES_SUCCESS, &hostent); | ||||
|  | ||||
| @@ -213,7 +236,7 @@ static int fake_hostent(const char *name, ares_host_callback callback, | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| static int file_lookup(const char *name, struct hostent **host) | ||||
| static int file_lookup(const char *name, int family, struct hostent **host) | ||||
| { | ||||
|   FILE *fp; | ||||
|   char **alias; | ||||
| @@ -222,18 +245,18 @@ static int file_lookup(const char *name, struct hostent **host) | ||||
| #ifdef WIN32 | ||||
|   char PATH_HOSTS[MAX_PATH]; | ||||
|   if (IS_NT()) { | ||||
|         char tmp[MAX_PATH]; | ||||
|         HKEY hkeyHosts; | ||||
|     char tmp[MAX_PATH]; | ||||
|     HKEY hkeyHosts; | ||||
|  | ||||
|         if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts) | ||||
|                 == ERROR_SUCCESS) | ||||
|         { | ||||
|                 DWORD dwLength = MAX_PATH; | ||||
|                 RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, tmp, | ||||
|                         &dwLength); | ||||
|                 ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH); | ||||
|                 RegCloseKey(hkeyHosts); | ||||
|         } | ||||
|     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0, KEY_READ, &hkeyHosts) | ||||
|         == ERROR_SUCCESS) | ||||
|     { | ||||
|       DWORD dwLength = MAX_PATH; | ||||
|       RegQueryValueEx(hkeyHosts, DATABASEPATH, NULL, NULL, (LPBYTE)tmp, | ||||
|                       &dwLength); | ||||
|       ExpandEnvironmentStrings(tmp, PATH_HOSTS, MAX_PATH); | ||||
|       RegCloseKey(hkeyHosts); | ||||
|     } | ||||
|   } | ||||
|   else | ||||
|     GetWindowsDirectory(PATH_HOSTS, MAX_PATH); | ||||
| @@ -252,7 +275,7 @@ static int file_lookup(const char *name, struct hostent **host) | ||||
|   if (!fp) | ||||
|     return ARES_ENOTFOUND; | ||||
|  | ||||
|   while ((status = ares__get_hostent(fp, host)) == ARES_SUCCESS) | ||||
|   while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS) | ||||
|     { | ||||
|       if (strcasecmp((*host)->h_name, name) == 0) | ||||
|         break; | ||||
| @@ -310,8 +333,66 @@ static int get_address_index(struct in_addr *addr, struct apattern *sortlist, | ||||
|  | ||||
|   for (i = 0; i < nsort; i++) | ||||
|     { | ||||
|       if ((addr->s_addr & sortlist[i].mask.s_addr) == sortlist[i].addr.s_addr) | ||||
|         break; | ||||
|       if (sortlist[i].family != AF_INET) | ||||
|         continue; | ||||
|       if (sortlist[i].type == PATTERN_MASK) | ||||
|         { | ||||
|           if ((addr->s_addr & sortlist[i].mask.addr.addr4.s_addr)  | ||||
|               == sortlist[i].addr.addr4.s_addr) | ||||
|             break; | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           if (!ares_bitncmp(&addr->s_addr, &sortlist[i].addr.addr4.s_addr,  | ||||
|                             sortlist[i].mask.bits)) | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|   return i; | ||||
| } | ||||
|  | ||||
| static void sort6_addresses(struct hostent *host, struct apattern *sortlist, | ||||
|                            int nsort) | ||||
| { | ||||
|   struct in6_addr a1, a2; | ||||
|   int i1, i2, ind1, ind2; | ||||
|  | ||||
|   /* This is a simple insertion sort, not optimized at all.  i1 walks | ||||
|    * through the address list, with the loop invariant that everything | ||||
|    * to the left of i1 is sorted.  In the loop body, the value at i1 is moved | ||||
|    * back through the list (via i2) until it is in sorted order. | ||||
|    */ | ||||
|   for (i1 = 0; host->h_addr_list[i1]; i1++) | ||||
|     { | ||||
|       memcpy(&a1, host->h_addr_list[i1], sizeof(struct in6_addr)); | ||||
|       ind1 = get6_address_index(&a1, sortlist, nsort); | ||||
|       for (i2 = i1 - 1; i2 >= 0; i2--) | ||||
|         { | ||||
|           memcpy(&a2, host->h_addr_list[i2], sizeof(struct in6_addr)); | ||||
|           ind2 = get6_address_index(&a2, sortlist, nsort); | ||||
|           if (ind2 <= ind1) | ||||
|             break; | ||||
|           memcpy(host->h_addr_list[i2 + 1], &a2, sizeof(struct in6_addr)); | ||||
|         } | ||||
|       memcpy(host->h_addr_list[i2 + 1], &a1, sizeof(struct in6_addr)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /* Find the first entry in sortlist which matches addr.  Return nsort | ||||
|  * if none of them match. | ||||
|  */ | ||||
| static int get6_address_index(struct in6_addr *addr, struct apattern *sortlist, | ||||
|                              int nsort) | ||||
| { | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < nsort; i++) | ||||
|     { | ||||
|       if (sortlist[i].family != AF_INET6) | ||||
|         continue; | ||||
|         if (!ares_bitncmp(&addr->s6_addr, &sortlist[i].addr.addr6.s6_addr, sortlist[i].mask.bits)) | ||||
|           break; | ||||
|     } | ||||
|   return i; | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										127
									
								
								ares/ares_init.c
									
									
									
									
									
								
							
							
						
						
									
										127
									
								
								ares/ares_init.c
									
									
									
									
									
								
							| @@ -27,10 +27,17 @@ | ||||
| #include <sys/time.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
|  | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| @@ -44,6 +51,7 @@ | ||||
| #include <errno.h> | ||||
| #include "ares.h" | ||||
| #include "ares_private.h" | ||||
| #include "inet_net_pton.h" | ||||
|  | ||||
| #ifdef WATT32 | ||||
| #undef WIN32  /* Redefined in MingW/MSVC headers */ | ||||
| @@ -54,19 +62,23 @@ static int init_by_options(ares_channel channel, struct ares_options *options, | ||||
| static int init_by_environment(ares_channel channel); | ||||
| static int init_by_resolv_conf(ares_channel channel); | ||||
| static int init_by_defaults(ares_channel channel); | ||||
|  | ||||
| static int config_nameserver(struct server_state **servers, int *nservers, | ||||
|                              char *str); | ||||
| static int set_search(ares_channel channel, const char *str); | ||||
| static int set_options(ares_channel channel, const char *str); | ||||
| static const char *try_option(const char *p, const char *q, const char *opt); | ||||
| #ifndef WIN32 | ||||
| static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat); | ||||
| static int ip_addr(const char *s, int len, struct in_addr *addr); | ||||
| static void natural_mask(struct apattern *pat); | ||||
| static int config_domain(ares_channel channel, char *str); | ||||
| static int config_lookup(ares_channel channel, const char *str, | ||||
|                          const char *bindch, const char *filech); | ||||
| static int config_nameserver(struct server_state **servers, int *nservers, | ||||
|                              char *str); | ||||
| static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|                            const char *str); | ||||
| static int set_search(ares_channel channel, const char *str); | ||||
| static int set_options(ares_channel channel, const char *str); | ||||
| static char *try_config(char *s, const char *opt); | ||||
| static const char *try_option(const char *p, const char *q, const char *opt); | ||||
| static int ip_addr(const char *s, int len, struct in_addr *addr); | ||||
| static void natural_mask(struct apattern *pat); | ||||
| #endif | ||||
|  | ||||
| int ares_init(ares_channel *channelptr) | ||||
| { | ||||
| @@ -264,7 +276,8 @@ static int get_res_nt(HKEY hKey, const char *subkey, char **obuf) | ||||
|   if (!*obuf) | ||||
|     return 0; | ||||
|  | ||||
|   if (RegQueryValueEx(hKey, subkey, 0, NULL, *obuf, &size) != ERROR_SUCCESS) | ||||
|   if (RegQueryValueEx(hKey, subkey, 0, NULL, | ||||
|                       (LPBYTE)*obuf, &size) != ERROR_SUCCESS) | ||||
|   { | ||||
|     free(*obuf); | ||||
|     return 0; | ||||
| @@ -709,6 +722,7 @@ static int init_by_defaults(ares_channel channel) | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| #ifndef WIN32 | ||||
| static int config_domain(ares_channel channel, char *str) | ||||
| { | ||||
|   char *q; | ||||
| @@ -749,6 +763,8 @@ static int config_lookup(ares_channel channel, const char *str, | ||||
|   return (channel->lookups) ? ARES_SUCCESS : ARES_ENOMEM; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| static int config_nameserver(struct server_state **servers, int *nservers, | ||||
|                              char *str) | ||||
| { | ||||
| @@ -810,39 +826,73 @@ static int config_nameserver(struct server_state **servers, int *nservers, | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| #ifndef WIN32 | ||||
| static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|                            const char *str) | ||||
| { | ||||
|   struct apattern pat, *newsort; | ||||
|   struct apattern pat; | ||||
|   const char *q; | ||||
|  | ||||
|   /* Add sortlist entries. */ | ||||
|   while (*str && *str != ';') | ||||
|     { | ||||
|       int bits; | ||||
|       char ipbuf[16], ipbufpfx[32]; | ||||
|       /* Find just the IP */ | ||||
|       q = str; | ||||
|       while (*q && *q != '/' && *q != ';' && !isspace((unsigned char)*q)) | ||||
|         q++; | ||||
|       if (ip_addr(str, (int)(q - str), &pat.addr) == 0) | ||||
|       memcpy(ipbuf, str, (int)(q-str)); | ||||
|       ipbuf[(int)(q-str)] = 0;       | ||||
|       /* Find the prefix */ | ||||
|       if (*q == '/') | ||||
|         { | ||||
|           /* We have a pattern address; now determine the mask. */ | ||||
|           if (*q == '/') | ||||
|           const char *str2 = q+1; | ||||
|           while (*q && *q != ';' && !isspace((unsigned char)*q)) | ||||
|             q++; | ||||
|           memcpy(ipbufpfx, str, (int)(q-str)); | ||||
|           ipbufpfx[(int)(q-str)] = 0; | ||||
|           str = str2; | ||||
|         } | ||||
|       else | ||||
|         ipbufpfx[0] = 0; | ||||
|       /* Lets see if it is CIDR */ | ||||
|       /* First we'll try IPv6 */ | ||||
|       if ((bits = ares_inet_net_pton(AF_INET6, ipbufpfx ? ipbufpfx : ipbuf, &pat.addr.addr6,  | ||||
|                                      sizeof(pat.addr.addr6))) > 0) | ||||
|         { | ||||
|           pat.type = PATTERN_CIDR; | ||||
|           pat.mask.bits = bits; | ||||
|           pat.family = AF_INET6; | ||||
|           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||
|             return ARES_ENOMEM; | ||||
|         } | ||||
|       if (ipbufpfx &&  | ||||
|           (bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addr.addr4,  | ||||
|                                      sizeof(pat.addr.addr4))) > 0) | ||||
|         { | ||||
|           pat.type = PATTERN_CIDR; | ||||
|           pat.mask.bits = bits; | ||||
|           pat.family = AF_INET; | ||||
|           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||
|             return ARES_ENOMEM; | ||||
|         } | ||||
|       /* See if it is just a regular IP */ | ||||
|       else if (ip_addr(ipbuf, (int)(q-str), &pat.addr.addr4) == 0) | ||||
|         { | ||||
|           if (ipbufpfx) | ||||
|             { | ||||
|               str = q + 1; | ||||
|               while (*q && *q != ';' && !isspace((unsigned char)*q)) | ||||
|                 q++; | ||||
|               if (ip_addr(str, (int)(q - str), &pat.mask) != 0) | ||||
|               memcpy(ipbuf, str, (int)(q-str)); | ||||
|               ipbuf[(int)(q-str)] = 0; | ||||
|               if (ip_addr(ipbuf, (int)(q - str), &pat.mask.addr.addr4) != 0) | ||||
|                 natural_mask(&pat); | ||||
|             } | ||||
|           else | ||||
|             natural_mask(&pat); | ||||
|  | ||||
|           /* Add this pattern to our list. */ | ||||
|           newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); | ||||
|           if (!newsort) | ||||
|           pat.family = AF_INET; | ||||
| 	  pat.type = PATTERN_MASK; | ||||
|           if (!sortlist_alloc(sortlist, nsort, &pat)) | ||||
|             return ARES_ENOMEM; | ||||
|           newsort[*nsort] = pat; | ||||
|           *sortlist = newsort; | ||||
|           (*nsort)++; | ||||
|         } | ||||
|       else | ||||
|         { | ||||
| @@ -856,6 +906,7 @@ static int config_sortlist(struct apattern **sortlist, int *nsort, | ||||
|  | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static int set_search(ares_channel channel, const char *str) | ||||
| { | ||||
| @@ -937,6 +988,7 @@ static int set_options(ares_channel channel, const char *str) | ||||
|   return ARES_SUCCESS; | ||||
| } | ||||
|  | ||||
| #ifndef WIN32 | ||||
| static char *try_config(char *s, const char *opt) | ||||
| { | ||||
|   size_t len; | ||||
| @@ -950,21 +1002,33 @@ static char *try_config(char *s, const char *opt) | ||||
|   return s; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| static const char *try_option(const char *p, const char *q, const char *opt) | ||||
| { | ||||
|   size_t len = strlen(opt); | ||||
|   return ((size_t)(q - p) > len && !strncmp(p, opt, len)) ? &p[len] : NULL; | ||||
| } | ||||
|  | ||||
| static int ip_addr(const char *s, int len, struct in_addr *addr) | ||||
| static int sortlist_alloc(struct apattern **sortlist, int *nsort, struct apattern *pat) | ||||
| { | ||||
|   struct apattern *newsort; | ||||
|   newsort = realloc(*sortlist, (*nsort + 1) * sizeof(struct apattern)); | ||||
|   if (!newsort) | ||||
|     return 0; | ||||
|   newsort[*nsort] = *pat; | ||||
|   *sortlist = newsort; | ||||
|   (*nsort)++; | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| #ifndef WIN32 | ||||
| static int ip_addr(const char *ipbuf, int len, struct in_addr *addr) | ||||
| { | ||||
|   char ipbuf[16]; | ||||
|  | ||||
|   /* Four octets and three periods yields at most 15 characters. */ | ||||
|   if (len > 15) | ||||
|     return -1; | ||||
|   memcpy(ipbuf, s, len); | ||||
|   ipbuf[len] = 0; | ||||
|  | ||||
|   addr->s_addr = inet_addr(ipbuf); | ||||
|   if (addr->s_addr == INADDR_NONE && strcmp(ipbuf, "255.255.255.255") != 0) | ||||
| @@ -979,15 +1043,16 @@ static void natural_mask(struct apattern *pat) | ||||
|   /* Store a host-byte-order copy of pat in a struct in_addr.  Icky, | ||||
|    * but portable. | ||||
|    */ | ||||
|   addr.s_addr = ntohl(pat->addr.s_addr); | ||||
|   addr.s_addr = ntohl(pat->addr.addr4.s_addr); | ||||
|  | ||||
|   /* This is out of date in the CIDR world, but some people might | ||||
|    * still rely on it. | ||||
|    */ | ||||
|   if (IN_CLASSA(addr.s_addr)) | ||||
|     pat->mask.s_addr = htonl(IN_CLASSA_NET); | ||||
|     pat->mask.addr.addr4.s_addr = htonl(IN_CLASSA_NET); | ||||
|   else if (IN_CLASSB(addr.s_addr)) | ||||
|     pat->mask.s_addr = htonl(IN_CLASSB_NET); | ||||
|     pat->mask.addr.addr4.s_addr = htonl(IN_CLASSB_NET); | ||||
|   else | ||||
|     pat->mask.s_addr = htonl(IN_CLASSC_NET); | ||||
|     pat->mask.addr.addr4.s_addr = htonl(IN_CLASSC_NET); | ||||
| } | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										43
									
								
								ares/ares_ipv6.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								ares/ares_ipv6.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
|  * fee is hereby granted, provided that the above copyright | ||||
|  * notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting | ||||
|  * documentation, and that the name of M.I.T. not be used in | ||||
|  * advertising or publicity pertaining to distribution of the | ||||
|  * software without specific, written prior permission. | ||||
|  * M.I.T. makes no representations about the suitability of | ||||
|  * this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #ifndef ARES_IPV6_H | ||||
| #define ARES_IPV6_H | ||||
|  | ||||
| #ifndef HAVE_PF_INET6 | ||||
| #define PF_INET6 AF_INET6 | ||||
| #endif | ||||
|  | ||||
| #ifndef HAVE_STRUCT_IN6_ADDR | ||||
| struct in6_addr | ||||
| { | ||||
|   unsigned char s6_addr[16]; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| #ifndef NS_IN6ADDRSZ | ||||
| #define NS_IN6ADDRSZ SIZEOF_STRUCT_IN6_ADDR | ||||
| #endif | ||||
|  | ||||
| #ifndef NS_INADDRSZ | ||||
| #define NS_INADDRSZ SIZEOF_STRUCT_IN_ADDR | ||||
| #endif | ||||
|  | ||||
| #ifndef NS_INT16SZ | ||||
| #define NS_INT16SZ 2 | ||||
| #endif | ||||
|  | ||||
| #endif /* ARES_IPV6_H */ | ||||
| @@ -21,6 +21,9 @@ | ||||
| #else | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
|   | ||||
| @@ -24,6 +24,9 @@ | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
|   | ||||
							
								
								
									
										64
									
								
								ares/ares_parse_aaaa_reply.3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								ares/ares_parse_aaaa_reply.3
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .\" Copyright 2005 by Dominick Meglio. | ||||
| .\" | ||||
| .\" Permission to use, copy, modify, and distribute this | ||||
| .\" software and its documentation for any purpose and without | ||||
| .\" fee is hereby granted, provided that the above copyright | ||||
| .\" notice appear in all copies and that both that copyright | ||||
| .\" notice and this permission notice appear in supporting | ||||
| .\" documentation, and that the name of M.I.T. not be used in | ||||
| .\" advertising or publicity pertaining to distribution of the | ||||
| .\" software without specific, written prior permission. | ||||
| .\" M.I.T. makes no representations about the suitability of | ||||
| .\" this software for any purpose.  It is provided "as is" | ||||
| .\" without express or implied warranty. | ||||
| .\" | ||||
| .TH ARES_PARSE_AAAA_REPLY 3 "10 March 2005" | ||||
| .SH NAME | ||||
| ares_parse_aaaa_reply \- Parse a reply to a DNS query of type AAAA into a hostent | ||||
| .SH SYNOPSIS | ||||
| .nf | ||||
| .B #include <ares.h> | ||||
| .PP | ||||
| .B int ares_parse_aaaa_reply(const unsigned char *\fIabuf\fP, int \fIalen\fP, | ||||
| .B 	struct hostent **\fIhost\fP); | ||||
| .fi | ||||
| .SH DESCRIPTION | ||||
| The | ||||
| .B ares_parse_aaaa_reply | ||||
| function parses the response to a query of type AAAA into a | ||||
| .BR "struct hostent" . | ||||
| The parameters | ||||
| .I abuf | ||||
| and | ||||
| .I alen | ||||
| give the contents of the response.  The result is stored in allocated | ||||
| memory and a pointer to it stored into the variable pointed to by | ||||
| .IR host . | ||||
| It is the caller's responsibility to free the resulting host structure | ||||
| using | ||||
| .BR ares_free_hostent (3) | ||||
| when it is no longer needed. | ||||
| .SH RETURN VALUES | ||||
| .B ares_parse_aaaa_reply | ||||
| can return any of the following values: | ||||
| .TP 15 | ||||
| .B ARES_SUCCESS | ||||
| The response was successfully parsed. | ||||
| .TP 15 | ||||
| .B ARES_EBADRESP | ||||
| The response was malformatted. | ||||
| .TP 15 | ||||
| .B ARES_ENODATA | ||||
| The response did not contain an answer to the query. | ||||
| .TP 15 | ||||
| .B ARES_ENOMEM | ||||
| Memory was exhausted. | ||||
| .SH SEE ALSO | ||||
| .BR ares_gethostbyname (3), | ||||
| .BR ares_free_hostent (3) | ||||
| .SH AUTHOR | ||||
| Dominick Meglio | ||||
| .br | ||||
| Copyright 2005 by Dominick Meglio. | ||||
							
								
								
									
										174
									
								
								ares/ares_parse_aaaa_reply.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										174
									
								
								ares/ares_parse_aaaa_reply.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,174 @@ | ||||
| /* Copyright 2005 Dominick Meglio | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
|  * fee is hereby granted, provided that the above copyright | ||||
|  * notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting | ||||
|  * documentation, and that the name of M.I.T. not be used in | ||||
|  * advertising or publicity pertaining to distribution of the | ||||
|  * software without specific, written prior permission. | ||||
|  * M.I.T. makes no representations about the suitability of | ||||
|  * this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| #else | ||||
| #include <sys/socket.h> | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "ares.h" | ||||
| #include "ares_dns.h" | ||||
| #include "inet_net_pton.h" | ||||
| #include "ares_private.h" | ||||
|  | ||||
| int ares_parse_aaaa_reply(const unsigned char *abuf, int alen, | ||||
|                        struct hostent **host) | ||||
| { | ||||
|   unsigned int qdcount, ancount; | ||||
|   int status, i, rr_type, rr_class, rr_len, naddrs; | ||||
|   int naliases; | ||||
|   long len; | ||||
|   const unsigned char *aptr; | ||||
|   char *hostname, *rr_name, *rr_data, **aliases; | ||||
|   struct in6_addr *addrs; | ||||
|   struct hostent *hostent; | ||||
|  | ||||
|   /* Set *host to NULL for all failure cases. */ | ||||
|   *host = NULL; | ||||
|  | ||||
|   /* Give up if abuf doesn't have room for a header. */ | ||||
|   if (alen < HFIXEDSZ) | ||||
|     return ARES_EBADRESP; | ||||
|  | ||||
|   /* Fetch the question and answer count from the header. */ | ||||
|   qdcount = DNS_HEADER_QDCOUNT(abuf); | ||||
|   ancount = DNS_HEADER_ANCOUNT(abuf); | ||||
|   if (qdcount != 1) | ||||
|     return ARES_EBADRESP; | ||||
|  | ||||
|   /* Expand the name from the question, and skip past the question. */ | ||||
|   aptr = abuf + HFIXEDSZ; | ||||
|   status = ares_expand_name(aptr, abuf, alen, &hostname, &len); | ||||
|   if (status != ARES_SUCCESS) | ||||
|     return status; | ||||
|   if (aptr + len + QFIXEDSZ > abuf + alen) | ||||
|     { | ||||
|       free(hostname); | ||||
|       return ARES_EBADRESP; | ||||
|     } | ||||
|   aptr += len + QFIXEDSZ; | ||||
|  | ||||
|   /* Allocate addresses and aliases; ancount gives an upper bound for both. */ | ||||
|   addrs = malloc(ancount * sizeof(struct in6_addr)); | ||||
|   if (!addrs) | ||||
|     { | ||||
|       free(hostname); | ||||
|       return ARES_ENOMEM; | ||||
|     } | ||||
|   aliases = malloc((ancount + 1) * sizeof(char *)); | ||||
|   if (!aliases) | ||||
|     { | ||||
|       free(hostname); | ||||
|       free(addrs); | ||||
|       return ARES_ENOMEM; | ||||
|     } | ||||
|   naddrs = 0; | ||||
|   naliases = 0; | ||||
|  | ||||
|   /* Examine each answer resource record (RR) in turn. */ | ||||
|   for (i = 0; i < (int)ancount; i++) | ||||
|     { | ||||
|       /* Decode the RR up to the data field. */ | ||||
|       status = ares_expand_name(aptr, abuf, alen, &rr_name, &len); | ||||
|       if (status != ARES_SUCCESS) | ||||
|         break; | ||||
|       aptr += len; | ||||
|       if (aptr + RRFIXEDSZ > abuf + alen) | ||||
|         { | ||||
|           status = ARES_EBADRESP; | ||||
|           break; | ||||
|         } | ||||
|       rr_type = DNS_RR_TYPE(aptr); | ||||
|       rr_class = DNS_RR_CLASS(aptr); | ||||
|       rr_len = DNS_RR_LEN(aptr); | ||||
|       aptr += RRFIXEDSZ; | ||||
|  | ||||
|       if (rr_class == C_IN && rr_type == T_AAAA | ||||
|           && rr_len == sizeof(struct in6_addr) | ||||
|           && strcasecmp(rr_name, hostname) == 0) | ||||
|         { | ||||
|           memcpy(&addrs[naddrs], aptr, sizeof(struct in6_addr)); | ||||
|           naddrs++; | ||||
|           status = ARES_SUCCESS; | ||||
|         } | ||||
|  | ||||
|       if (rr_class == C_IN && rr_type == T_CNAME) | ||||
|         { | ||||
|           /* Record the RR name as an alias. */ | ||||
|           aliases[naliases] = rr_name; | ||||
|           naliases++; | ||||
|  | ||||
|           /* Decode the RR data and replace the hostname with it. */ | ||||
|           status = ares_expand_name(aptr, abuf, alen, &rr_data, &len); | ||||
|           if (status != ARES_SUCCESS) | ||||
|             break; | ||||
|           free(hostname); | ||||
|           hostname = rr_data; | ||||
|         } | ||||
|       else | ||||
|         free(rr_name); | ||||
|  | ||||
|       aptr += rr_len; | ||||
|       if (aptr > abuf + alen) | ||||
|         { | ||||
|           status = ARES_EBADRESP; | ||||
|           break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   if (status == ARES_SUCCESS && naddrs == 0) | ||||
|     status = ARES_ENODATA; | ||||
|   if (status == ARES_SUCCESS) | ||||
|     { | ||||
|       /* We got our answer.  Allocate memory to build the host entry. */ | ||||
|       aliases[naliases] = NULL; | ||||
|       hostent = malloc(sizeof(struct hostent)); | ||||
|       if (hostent) | ||||
|         { | ||||
|           hostent->h_addr_list = malloc((naddrs + 1) * sizeof(char *)); | ||||
|           if (hostent->h_addr_list) | ||||
|             { | ||||
|               /* Fill in the hostent and return successfully. */ | ||||
|               hostent->h_name = hostname; | ||||
|               hostent->h_aliases = aliases; | ||||
|               hostent->h_addrtype = AF_INET6; | ||||
|               hostent->h_length = sizeof(struct in6_addr); | ||||
|               for (i = 0; i < naddrs; i++) | ||||
|                 hostent->h_addr_list[i] = (char *) &addrs[i]; | ||||
|               hostent->h_addr_list[naddrs] = NULL; | ||||
|               *host = hostent; | ||||
|               return ARES_SUCCESS; | ||||
|             } | ||||
|           free(hostent); | ||||
|         } | ||||
|       status = ARES_ENOMEM; | ||||
|     } | ||||
|   for (i = 0; i < naliases; i++) | ||||
|     free(aliases[i]); | ||||
|   free(aliases); | ||||
|   free(addrs); | ||||
|   free(hostname); | ||||
|   return status; | ||||
| } | ||||
| @@ -23,6 +23,9 @@ | ||||
| #include <netinet/in.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
|   | ||||
| @@ -69,6 +69,8 @@ | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #include "ares_ipv6.h" | ||||
|  | ||||
| struct send_request { | ||||
|   /* Remaining data to send */ | ||||
|   const unsigned char *data; | ||||
| @@ -124,9 +126,23 @@ struct query { | ||||
| }; | ||||
|  | ||||
| /* An IP address pattern; matches an IP address X if X & mask == addr */ | ||||
| #define PATTERN_MASK 0x1 | ||||
| #define PATTERN_CIDR 0x2 | ||||
|  | ||||
| union ares_addr { | ||||
|   struct in_addr addr4; | ||||
|   struct in6_addr addr6; | ||||
| }; | ||||
|  | ||||
| struct apattern { | ||||
|   struct in_addr addr; | ||||
|   struct in_addr mask; | ||||
|   union ares_addr addr; | ||||
|   union | ||||
|   { | ||||
|     union ares_addr addr; | ||||
|     unsigned short bits; | ||||
|   } mask; | ||||
|   int family; | ||||
|   unsigned short type; | ||||
| }; | ||||
|  | ||||
| struct ares_channeldata { | ||||
| @@ -156,7 +172,7 @@ struct ares_channeldata { | ||||
|  | ||||
| void ares__send_query(ares_channel channel, struct query *query, time_t now); | ||||
| void ares__close_sockets(struct server_state *server); | ||||
| int ares__get_hostent(FILE *fp, struct hostent **host); | ||||
| int ares__get_hostent(FILE *fp, int family, struct hostent **host); | ||||
| int ares__read_line(FILE *fp, char **buf, int *bufsize); | ||||
|  | ||||
| #ifdef CURLDEBUG | ||||
| @@ -164,9 +180,5 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize); | ||||
|    libcurl lowlevel code from within library is ugly and only works when | ||||
|    c-ares is built and linked with a similarly debug-build libcurl, but we do | ||||
|    this anyway for convenience. */ | ||||
| #ifndef CURL_EXTERN | ||||
| /* ugly hack to make this compile */ | ||||
| #define CURL_EXTERN | ||||
| #endif | ||||
| #include "../lib/memdebug.h" | ||||
| #endif | ||||
|   | ||||
| @@ -27,6 +27,9 @@ | ||||
| #include <netinet/in.h> | ||||
| #include <netdb.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #ifdef HAVE_UNISTD_H | ||||
| #include <unistd.h> | ||||
| #endif | ||||
| @@ -465,8 +468,12 @@ void ares__send_query(ares_channel channel, struct query *query, time_t now) | ||||
|  | ||||
| static int open_tcp_socket(ares_channel channel, struct server_state *server) | ||||
| { | ||||
|   ares_socket_t s; | ||||
| #if defined(WIN32) | ||||
|   u_long flags; | ||||
| #else | ||||
|   int flags; | ||||
| #endif | ||||
|   ares_socket_t s; | ||||
|   struct sockaddr_in sockin; | ||||
|  | ||||
|   /* Acquire a socket. */ | ||||
|   | ||||
| @@ -21,6 +21,9 @@ | ||||
| #else | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
|   | ||||
| @@ -21,6 +21,9 @@ | ||||
| #else | ||||
| #include <netinet/in.h> | ||||
| #include <arpa/nameser.h> | ||||
| #ifdef HAVE_ARPA_NAMESER_COMPAT_H | ||||
| #include <arpa/nameser_compat.h> | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #include <stdlib.h> | ||||
|   | ||||
							
								
								
									
										60
									
								
								ares/bitncmp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								ares/bitncmp.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /* | ||||
|  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") | ||||
|  * Copyright (c) 1996,1999 by Internet Software Consortium. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
|  * copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| #ifndef HAVE_BITNCMP | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include "bitncmp.h" | ||||
|  | ||||
| /* | ||||
|  * int | ||||
|  * bitncmp(l, r, n) | ||||
|  *	compare bit masks l and r, for n bits. | ||||
|  * return: | ||||
|  *	-1, 1, or 0 in the libc tradition. | ||||
|  * note: | ||||
|  *	network byte order assumed.  this means 192.5.5.240/28 has | ||||
|  *	0x11110000 in its fourth octet. | ||||
|  * author: | ||||
|  *	Paul Vixie (ISC), June 1996 | ||||
|  */ | ||||
| int | ||||
| ares_bitncmp(const void *l, const void *r, int n) { | ||||
| 	unsigned int lb, rb; | ||||
| 	int x, b; | ||||
|  | ||||
| 	b = n / 8; | ||||
| 	x = memcmp(l, r, b); | ||||
| 	if (x) | ||||
| 		return (x); | ||||
|  | ||||
| 	lb = ((const unsigned char *)l)[b]; | ||||
| 	rb = ((const unsigned char *)r)[b]; | ||||
| 	for (b = n % 8; b > 0; b--) { | ||||
| 		if ((lb & 0x80) != (rb & 0x80)) { | ||||
| 			if (lb & 0x80) | ||||
| 				return (1); | ||||
| 			return (-1); | ||||
| 		} | ||||
| 		lb <<= 1; | ||||
| 		rb <<= 1; | ||||
| 	} | ||||
| 	return (0); | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										26
									
								
								ares/bitncmp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ares/bitncmp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
|  * fee is hereby granted, provided that the above copyright | ||||
|  * notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting | ||||
|  * documentation, and that the name of M.I.T. not be used in | ||||
|  * advertising or publicity pertaining to distribution of the | ||||
|  * software without specific, written prior permission. | ||||
|  * M.I.T. makes no representations about the suitability of | ||||
|  * this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #ifndef BITNCMP_H | ||||
| #define BITNCMP_H | ||||
|  | ||||
| #ifndef HAVE_BITNCMP | ||||
| int ares_bitncmp(const void *l, const void *r, int n); | ||||
| #else | ||||
| #define ares_bitncmp(x,y,z) bitncmp(x,y,z) | ||||
| #endif | ||||
|  | ||||
| #endif /* BITNCMP_H */ | ||||
| @@ -1,7 +1,7 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| libtoolize --copy --automake --force | ||||
| aclocal | ||||
| autoheader | ||||
| autoconf | ||||
| automake --add-missing | ||||
| ${LIBTOOLIZE:-libtoolize} --copy --automake --force | ||||
| ${ACLOCAL:-aclocal} | ||||
| ${AUTOHEADER:-autoheader} | ||||
| ${AUTOCONF:-autoconf} | ||||
| ${AUTOMAKE:-automake} --add-missing | ||||
|   | ||||
| @@ -41,6 +41,10 @@ AC_HELP_STRING([--disable-debug],[Disable debug options]), | ||||
|     dnl Checks for standard header files, to make memdebug.h inclusions bettter | ||||
|     AC_HEADER_STDC | ||||
|  | ||||
|     dnl the entire --enable-debug is a hack that lives and runs on top of | ||||
|     dnl libcurl stuff so this BUILDING_LIBCURL is not THAT much uglier | ||||
|     AC_DEFINE(BUILDING_LIBCURL, 1, [when building as static part of libcurl]) | ||||
|  | ||||
|     CPPFLAGS="$CPPFLAGS -DCURLDEBUG -I$srcdir/../include" | ||||
|     CFLAGS="$CFLAGS -g"  | ||||
|  | ||||
| @@ -61,6 +65,174 @@ AC_CHECK_HEADERS( | ||||
|        sys/time.h \ | ||||
|        sys/select.h \ | ||||
|        sys/socket.h \ | ||||
|        ) | ||||
|        winsock.h \ | ||||
|        netinet/in.h \ | ||||
|        arpa/nameser.h \ | ||||
|        arpa/nameser_compat.h \ | ||||
|        arpa/inet.h, , , | ||||
| [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| dnl We do this default-include simply to make sure that the nameser_compat.h | ||||
| dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1 | ||||
| dnl (and others?) is not designed to allow this. | ||||
| #ifdef HAVE_ARPA_NAMESER_H | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
| ] | ||||
|   ) | ||||
|  | ||||
| dnl check for AF_INET6 | ||||
| CARES_CHECK_CONSTANT( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
|  | ||||
|   ], [PF_INET6],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.]) | ||||
| ) | ||||
|  | ||||
| dnl check for PF_INET6 | ||||
| CARES_CHECK_CONSTANT( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
|  | ||||
|   ], [AF_INET6],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.]) | ||||
| ) | ||||
|  | ||||
|  | ||||
| dnl check for the in6_addr structure | ||||
| CARES_CHECK_STRUCT( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
|   ], [in6_addr],  | ||||
|      AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.]) | ||||
| ) | ||||
|  | ||||
| dnl check for inet_pton | ||||
| AC_CHECK_FUNCS(inet_pton) | ||||
| dnl Some systems have it, but not IPv6 | ||||
| if test "$ac_cv_func_inet_pton" = "yes" ; then | ||||
| AC_MSG_CHECKING(if inet_pton supports IPv6) | ||||
| AC_TRY_RUN( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| int main() | ||||
|   { | ||||
|     struct in6_addr addr6; | ||||
|     if (inet_pton(AF_INET6, "::1", &addr6) < 1) | ||||
|       exit(1); | ||||
|     else | ||||
|       exit(0); | ||||
|   } | ||||
|   ], [ | ||||
|        AC_MSG_RESULT(yes) | ||||
|        AC_DEFINE_UNQUOTED(HAVE_INET_PTON_IPV6,1,[Define to 1 if inet_pton supports IPv6.]) | ||||
|      ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) | ||||
| fi | ||||
| dnl Check for inet_net_pton | ||||
| AC_CHECK_FUNCS(inet_net_pton) | ||||
| dnl Again, some systems have it, but not IPv6 | ||||
| if test "$ac_cv_func_inet_net_pton" = "yes" ; then | ||||
| AC_MSG_CHECKING(if inet_net_pton supports IPv6) | ||||
| AC_TRY_RUN( | ||||
|   [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| int main() | ||||
|   { | ||||
|     struct in6_addr addr6; | ||||
|     if (inet_net_pton(AF_INET6, "::1", &addr6, sizeof(addr6)) < 1) | ||||
|       exit(1); | ||||
|     else | ||||
|       exit(0); | ||||
|   } | ||||
|   ], [ | ||||
|        AC_MSG_RESULT(yes) | ||||
|        AC_DEFINE_UNQUOTED(HAVE_INET_NET_PTON_IPV6,1,[Define to 1 if inet_net_pton supports IPv6.]) | ||||
|      ], AC_MSG_RESULT(no),AC_MSG_RESULT(no)) | ||||
| fi | ||||
|  | ||||
| AC_CHECK_SIZEOF(struct in6_addr, , | ||||
| [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| ] | ||||
| ) | ||||
| AC_CHECK_SIZEOF(struct in_addr, , | ||||
| [ | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_WINSOCK_H | ||||
| #include <winsock.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| ] | ||||
| ) | ||||
|  | ||||
| AC_CHECK_FUNCS(bitncmp) | ||||
|  | ||||
|  | ||||
| AC_OUTPUT(Makefile) | ||||
|   | ||||
							
								
								
									
										433
									
								
								ares/inet_net_pton.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										433
									
								
								ares/inet_net_pton.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,433 @@ | ||||
| /* | ||||
|  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") | ||||
|  * Copyright (c) 1996,1999 by Internet Software Consortium. | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software for any | ||||
|  * purpose with or without fee is hereby granted, provided that the above | ||||
|  * copyright notice and this permission notice appear in all copies. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES | ||||
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR | ||||
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||||
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||||
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | ||||
|  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
|  | ||||
|  | ||||
| #include <sys/types.h> | ||||
|  | ||||
| #if defined(WIN32) && !defined(WATT32) | ||||
| #include "nameser.h" | ||||
| #else | ||||
|  | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
| #ifdef HAVE_NETINET_IN_H | ||||
| #include <netinet/in.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_NAMESER_H | ||||
| #include <arpa/nameser.h> | ||||
| #endif | ||||
| #ifdef HAVE_ARPA_INET_H | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #include <ctype.h> | ||||
| #include <errno.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include "ares_ipv6.h" | ||||
| #include "inet_net_pton.h" | ||||
|  | ||||
| #if !defined(HAVE_INET_NET_PTON) || !defined(HAVE_INET_NET_PTON_IPV6) || \ | ||||
|     !defined(HAVE_INET_PTON) || !defined(HAVE_INET_PTON_IPV6) | ||||
|  | ||||
| /* | ||||
|  * static int | ||||
|  * inet_net_pton_ipv4(src, dst, size) | ||||
|  *	convert IPv4 network number from presentation to network format. | ||||
|  *	accepts hex octets, hex strings, decimal octets, and /CIDR. | ||||
|  *	"size" is in bytes and describes "dst". | ||||
|  * return: | ||||
|  *	number of bits, either imputed classfully or specified with /CIDR, | ||||
|  *	or -1 if some failure occurred (check errno).  ENOENT means it was | ||||
|  *	not an IPv4 network specification. | ||||
|  * note: | ||||
|  *	network byte order assumed.  this means 192.5.5.240/28 has | ||||
|  *	0b11110000 in its fourth octet. | ||||
|  * author: | ||||
|  *	Paul Vixie (ISC), June 1996 | ||||
|  */ | ||||
| static int | ||||
| inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) { | ||||
| 	static const char xdigits[] = "0123456789abcdef"; | ||||
| 	static const char digits[] = "0123456789"; | ||||
| 	int n, ch, tmp = 0, dirty, bits; | ||||
| 	const unsigned char *odst = dst; | ||||
|  | ||||
| 	ch = *src++; | ||||
| 	if (ch == '0' && (src[0] == 'x' || src[0] == 'X') | ||||
| 	    && isascii((unsigned char)(src[1])) | ||||
| 	    && isxdigit((unsigned char)(src[1]))) { | ||||
| 		/* Hexadecimal: Eat nybble string. */ | ||||
| 		if (size <= 0U) | ||||
| 			goto emsgsize; | ||||
| 		dirty = 0; | ||||
| 		src++;	/* skip x or X. */ | ||||
| 		while ((ch = *src++) != '\0' && isascii(ch) && isxdigit(ch)) { | ||||
| 			if (isupper(ch)) | ||||
| 				ch = tolower(ch); | ||||
| 			n = strchr(xdigits, ch) - xdigits; | ||||
| 			if (dirty == 0) | ||||
| 				tmp = n; | ||||
| 			else | ||||
| 				tmp = (tmp << 4) | n; | ||||
| 			if (++dirty == 2) { | ||||
| 				if (size-- <= 0U) | ||||
| 					goto emsgsize; | ||||
| 				*dst++ = (unsigned char) tmp; | ||||
| 				dirty = 0; | ||||
| 			} | ||||
| 		} | ||||
| 		if (dirty) {  /* Odd trailing nybble? */ | ||||
| 			if (size-- <= 0U) | ||||
| 				goto emsgsize; | ||||
| 			*dst++ = (unsigned char) (tmp << 4); | ||||
| 		} | ||||
| 	} else if (isascii(ch) && isdigit(ch)) { | ||||
| 		/* Decimal: eat dotted digit string. */ | ||||
| 		for (;;) { | ||||
| 			tmp = 0; | ||||
| 			do { | ||||
| 				n = strchr(digits, ch) - digits; | ||||
| 				tmp *= 10; | ||||
| 				tmp += n; | ||||
| 				if (tmp > 255) | ||||
| 					goto enoent; | ||||
| 			} while ((ch = *src++) != '\0' && | ||||
| 				 isascii(ch) && isdigit(ch)); | ||||
| 			if (size-- <= 0U) | ||||
| 				goto emsgsize; | ||||
| 			*dst++ = (unsigned char) tmp; | ||||
| 			if (ch == '\0' || ch == '/') | ||||
| 				break; | ||||
| 			if (ch != '.') | ||||
| 				goto enoent; | ||||
| 			ch = *src++; | ||||
| 			if (!isascii(ch) || !isdigit(ch)) | ||||
| 				goto enoent; | ||||
| 		} | ||||
| 	} else | ||||
| 		goto enoent; | ||||
|  | ||||
| 	bits = -1; | ||||
| 	if (ch == '/' && isascii((unsigned char)(src[0])) && | ||||
| 	    isdigit((unsigned char)(src[0])) && dst > odst) { | ||||
| 		/* CIDR width specifier.  Nothing can follow it. */ | ||||
| 		ch = *src++;	/* Skip over the /. */ | ||||
| 		bits = 0; | ||||
| 		do { | ||||
| 			n = strchr(digits, ch) - digits; | ||||
| 			bits *= 10; | ||||
| 			bits += n; | ||||
| 		} while ((ch = *src++) != '\0' && isascii(ch) && isdigit(ch)); | ||||
| 		if (ch != '\0') | ||||
| 			goto enoent; | ||||
| 		if (bits > 32) | ||||
| 			goto emsgsize; | ||||
| 	} | ||||
|  | ||||
| 	/* Firey death and destruction unless we prefetched EOS. */ | ||||
| 	if (ch != '\0') | ||||
| 		goto enoent; | ||||
|  | ||||
| 	/* If nothing was written to the destination, we found no address. */ | ||||
| 	if (dst == odst) | ||||
| 		goto enoent; | ||||
| 	/* If no CIDR spec was given, infer width from net class. */ | ||||
| 	if (bits == -1) { | ||||
| 		if (*odst >= 240)	/* Class E */ | ||||
| 			bits = 32; | ||||
| 		else if (*odst >= 224)	/* Class D */ | ||||
| 			bits = 8; | ||||
| 		else if (*odst >= 192)	/* Class C */ | ||||
| 			bits = 24; | ||||
| 		else if (*odst >= 128)	/* Class B */ | ||||
| 			bits = 16; | ||||
| 		else			/* Class A */ | ||||
| 			bits = 8; | ||||
| 		/* If imputed mask is narrower than specified octets, widen. */ | ||||
| 		if (bits < ((dst - odst) * 8)) | ||||
| 			bits = (dst - odst) * 8; | ||||
| 		/* | ||||
| 		 * If there are no additional bits specified for a class D | ||||
| 		 * address adjust bits to 4. | ||||
| 		 */ | ||||
| 		if (bits == 8 && *odst == 224) | ||||
| 			bits = 4; | ||||
| 	} | ||||
| 	/* Extend network to cover the actual mask. */ | ||||
| 	while (bits > ((dst - odst) * 8)) { | ||||
| 		if (size-- <= 0U) | ||||
| 			goto emsgsize; | ||||
| 		*dst++ = '\0'; | ||||
| 	} | ||||
| 	return (bits); | ||||
|  | ||||
|  enoent: | ||||
| 	errno = ENOENT; | ||||
| 	return (-1); | ||||
|  | ||||
|  emsgsize: | ||||
| 	errno = EMSGSIZE; | ||||
| 	return (-1); | ||||
| } | ||||
|  | ||||
| static int | ||||
| getbits(const char *src, int *bitsp) { | ||||
| 	static const char digits[] = "0123456789"; | ||||
| 	int n; | ||||
| 	int val; | ||||
| 	char ch; | ||||
|  | ||||
| 	val = 0; | ||||
| 	n = 0; | ||||
| 	while ((ch = *src++) != '\0') { | ||||
| 		const char *pch; | ||||
|  | ||||
| 		pch = strchr(digits, ch); | ||||
| 		if (pch != NULL) { | ||||
| 			if (n++ != 0 && val == 0)	/* no leading zeros */ | ||||
| 				return (0); | ||||
| 			val *= 10; | ||||
| 			val += (pch - digits); | ||||
| 			if (val > 128)			/* range */ | ||||
| 				return (0); | ||||
| 			continue; | ||||
| 		} | ||||
| 		return (0); | ||||
| 	} | ||||
| 	if (n == 0) | ||||
| 		return (0); | ||||
| 	*bitsp = val; | ||||
| 	return (1); | ||||
| } | ||||
|  | ||||
| static int | ||||
| getv4(const char *src, unsigned char *dst, int *bitsp) { | ||||
| 	static const char digits[] = "0123456789"; | ||||
| 	unsigned char *odst = dst; | ||||
| 	int n; | ||||
| 	unsigned int val; | ||||
| 	char ch; | ||||
|  | ||||
| 	val = 0; | ||||
| 	n = 0; | ||||
| 	while ((ch = *src++) != '\0') { | ||||
| 		const char *pch; | ||||
|  | ||||
| 		pch = strchr(digits, ch); | ||||
| 		if (pch != NULL) { | ||||
| 			if (n++ != 0 && val == 0)	/* no leading zeros */ | ||||
| 				return (0); | ||||
| 			val *= 10; | ||||
| 			val += (pch - digits); | ||||
| 			if (val > 255)			/* range */ | ||||
| 				return (0); | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (ch == '.' || ch == '/') { | ||||
| 			if (dst - odst > 3)		/* too many octets? */ | ||||
| 				return (0); | ||||
| 			*dst++ = val; | ||||
| 			if (ch == '/') | ||||
| 				return (getbits(src, bitsp)); | ||||
| 			val = 0; | ||||
| 			n = 0; | ||||
| 			continue; | ||||
| 		} | ||||
| 		return (0); | ||||
| 	} | ||||
| 	if (n == 0) | ||||
| 		return (0); | ||||
| 	if (dst - odst > 3)		/* too many octets? */ | ||||
| 		return (0); | ||||
| 	*dst++ = val; | ||||
| 	return (1); | ||||
| } | ||||
|  | ||||
| static int | ||||
| inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) { | ||||
| 	static const char xdigits_l[] = "0123456789abcdef", | ||||
| 			  xdigits_u[] = "0123456789ABCDEF"; | ||||
| 	unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; | ||||
| 	const char *xdigits, *curtok; | ||||
| 	int ch, saw_xdigit; | ||||
| 	unsigned int val; | ||||
| 	int digits; | ||||
| 	int bits; | ||||
| 	size_t bytes; | ||||
| 	int words; | ||||
| 	int ipv4; | ||||
|  | ||||
| 	memset((tp = tmp), '\0', NS_IN6ADDRSZ); | ||||
| 	endp = tp + NS_IN6ADDRSZ; | ||||
| 	colonp = NULL; | ||||
| 	/* Leading :: requires some special handling. */ | ||||
| 	if (*src == ':') | ||||
| 		if (*++src != ':') | ||||
| 			goto enoent; | ||||
| 	curtok = src; | ||||
| 	saw_xdigit = 0; | ||||
| 	val = 0; | ||||
| 	digits = 0; | ||||
| 	bits = -1; | ||||
| 	ipv4 = 0; | ||||
| 	while ((ch = *src++) != '\0') { | ||||
| 		const char *pch; | ||||
|  | ||||
| 		if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) | ||||
| 			pch = strchr((xdigits = xdigits_u), ch); | ||||
| 		if (pch != NULL) { | ||||
| 			val <<= 4; | ||||
| 			val |= (pch - xdigits); | ||||
| 			if (++digits > 4) | ||||
| 				goto enoent; | ||||
| 			saw_xdigit = 1; | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (ch == ':') { | ||||
| 			curtok = src; | ||||
| 			if (!saw_xdigit) { | ||||
| 				if (colonp) | ||||
| 					goto enoent; | ||||
| 				colonp = tp; | ||||
| 				continue; | ||||
| 			} else if (*src == '\0') | ||||
| 				goto enoent; | ||||
| 			if (tp + NS_INT16SZ > endp) | ||||
| 				return (0); | ||||
| 			*tp++ = (unsigned char) (val >> 8) & 0xff; | ||||
| 			*tp++ = (unsigned char) val & 0xff; | ||||
| 			saw_xdigit = 0; | ||||
| 			digits = 0; | ||||
| 			val = 0; | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && | ||||
| 		     getv4(curtok, tp, &bits) > 0) { | ||||
| 			tp += NS_INADDRSZ; | ||||
| 			saw_xdigit = 0; | ||||
| 			ipv4 = 1; | ||||
| 			break;	/* '\0' was seen by inet_pton4(). */ | ||||
| 		} | ||||
| 		if (ch == '/' && getbits(src, &bits) > 0) | ||||
| 			break; | ||||
| 		goto enoent; | ||||
| 	} | ||||
| 	if (saw_xdigit) { | ||||
| 		if (tp + NS_INT16SZ > endp) | ||||
| 			goto enoent; | ||||
| 		*tp++ = (unsigned char) (val >> 8) & 0xff; | ||||
| 		*tp++ = (unsigned char) val & 0xff; | ||||
| 	} | ||||
| 	if (bits == -1) | ||||
| 		bits = 128; | ||||
|  | ||||
| 	words = (bits + 15) / 16; | ||||
| 	if (words < 2) | ||||
| 		words = 2; | ||||
| 	if (ipv4) | ||||
| 		words = 8; | ||||
| 	endp =  tmp + 2 * words; | ||||
|  | ||||
| 	if (colonp != NULL) { | ||||
| 		/* | ||||
| 		 * Since some memmove()'s erroneously fail to handle | ||||
| 		 * overlapping regions, we'll do the shift by hand. | ||||
| 		 */ | ||||
| 		const int n = tp - colonp; | ||||
| 		int i; | ||||
|  | ||||
| 		if (tp == endp) | ||||
| 			goto enoent; | ||||
| 		for (i = 1; i <= n; i++) { | ||||
| 			endp[- i] = colonp[n - i]; | ||||
| 			colonp[n - i] = 0; | ||||
| 		} | ||||
| 		tp = endp; | ||||
| 	} | ||||
| 	if (tp != endp) | ||||
| 		goto enoent; | ||||
|  | ||||
| 	bytes = (bits + 7) / 8; | ||||
| 	if (bytes > size) | ||||
| 		goto emsgsize; | ||||
| 	memcpy(dst, tmp, bytes); | ||||
| 	return (bits); | ||||
|  | ||||
|  enoent: | ||||
| 	errno = ENOENT; | ||||
| 	return (-1); | ||||
|  | ||||
|  emsgsize: | ||||
| 	errno = EMSGSIZE; | ||||
| 	return (-1); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * int | ||||
|  * inet_net_pton(af, src, dst, size) | ||||
|  *	convert network number from presentation to network format. | ||||
|  *	accepts hex octets, hex strings, decimal octets, and /CIDR. | ||||
|  *	"size" is in bytes and describes "dst". | ||||
|  * return: | ||||
|  *	number of bits, either imputed classfully or specified with /CIDR, | ||||
|  *	or -1 if some failure occurred (check errno).  ENOENT means it was | ||||
|  *	not a valid network specification. | ||||
|  * author: | ||||
|  *	Paul Vixie (ISC), June 1996 | ||||
|  */ | ||||
| int | ||||
| ares_inet_net_pton(int af, const char *src, void *dst, size_t size) { | ||||
| 	switch (af) { | ||||
| 	case AF_INET: | ||||
| 		return (inet_net_pton_ipv4(src, dst, size)); | ||||
| 	case AF_INET6: | ||||
| 		return (inet_net_pton_ipv6(src, dst, size)); | ||||
| 	default: | ||||
| 		errno = EAFNOSUPPORT; | ||||
| 		return (-1); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAVE_INET_PTON) || !defined(HAVE_INET_PTON_IPV6) | ||||
| int ares_inet_pton(int af, const char *src, void *dst) { | ||||
| 	int size, result; | ||||
| 	 | ||||
| 	if (af == AF_INET) | ||||
| 		size = sizeof(struct in_addr); | ||||
| 	else if (af == AF_INET6) | ||||
| 		size = sizeof(struct in6_addr); | ||||
| 	else | ||||
| 	{ | ||||
| 		errno = EAFNOSUPPORT; | ||||
| 		return -1; | ||||
| 	} | ||||
| 	result = ares_inet_net_pton(af, src, dst, size); | ||||
| 	if (result == -1 && errno == ENOENT) | ||||
| 		return 0; | ||||
| 	return (result > -1 ? 1 : -1); | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										31
									
								
								ares/inet_net_pton.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								ares/inet_net_pton.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| /* $Id$ */ | ||||
|  | ||||
| /* | ||||
|  * Permission to use, copy, modify, and distribute this | ||||
|  * software and its documentation for any purpose and without | ||||
|  * fee is hereby granted, provided that the above copyright | ||||
|  * notice appear in all copies and that both that copyright | ||||
|  * notice and this permission notice appear in supporting | ||||
|  * documentation, and that the name of M.I.T. not be used in | ||||
|  * advertising or publicity pertaining to distribution of the | ||||
|  * software without specific, written prior permission. | ||||
|  * M.I.T. makes no representations about the suitability of | ||||
|  * this software for any purpose.  It is provided "as is" | ||||
|  * without express or implied warranty. | ||||
|  */ | ||||
|  | ||||
| #ifndef INET_NET_PTON_H | ||||
| #define INET_NET_PTON_H | ||||
|  | ||||
| #if defined(HAVE_INET_PTON) && defined(HAVE_INET_PTON_IPV6) | ||||
| #define ares_inet_pton(x,y,z) inet_pton(x,y,z) | ||||
| #else | ||||
| int ares_inet_pton(int af, const char *src, void *dst); | ||||
| #endif | ||||
| #if defined(HAVE_INET_NET_PTON) && defined(HAVE_INET_NET_PTON_IPV6) | ||||
| #define ares_inet_net_pton(w,x,y,z) inet_net_pton(w,x,y,z) | ||||
| #else | ||||
| int ares_inet_net_pton(int af, const char *src, void *dst, size_t size); | ||||
| #endif | ||||
|  | ||||
| #endif /* INET_NET_PTON_H */ | ||||
| @@ -16,6 +16,8 @@ | ||||
|  | ||||
| #define EINPROGRESS WSAEINPROGRESS | ||||
| #define EWOULDBLOCK WSAEWOULDBLOCK | ||||
| #define EMSGSIZE WSAEMSGSIZE | ||||
| #define EAFNOSUPPORT WSAEAFNOSUPPORT | ||||
|  | ||||
| /* Structure for scatter/gather I/O.  */ | ||||
| struct iovec | ||||
| @@ -37,7 +39,9 @@ int ares_gettimeofday(struct timeval *tv, struct timezone *tz); | ||||
| #endif  /* !NETWARE */ | ||||
|  | ||||
| #define NS_CMPRSFLGS  0xc0 | ||||
|  | ||||
| #define NS_IN6ADDRSZ  16 | ||||
| #define NS_INT16SZ    2 | ||||
| #define NS_INADDRSZ   4 | ||||
|  | ||||
|   /* Flag bits indicating name compression. */ | ||||
| #define INDIR_MASK    NS_CMPRSFLGS | ||||
|   | ||||
							
								
								
									
										13
									
								
								ares/setup.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								ares/setup.h
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| #ifndef ARES_SETUP_H | ||||
| #define ARES_SETUP_H | ||||
|  | ||||
| /* Copyright (C) 2004 by Daniel Stenberg et al | ||||
| /* Copyright (C) 2004 - 2005 by Daniel Stenberg et al | ||||
|  * | ||||
|  * Permission to use, copy, modify, and distribute this software and its | ||||
|  * documentation for any purpose and without fee is hereby granted, provided | ||||
| @@ -49,7 +49,7 @@ typedef int ares_socket_t; | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAVE_UNISTD_H) && !defined(_MSC_VER) | ||||
| #define HAVE_UNISTD_H  | ||||
| #define HAVE_UNISTD_H 1 | ||||
| #endif | ||||
|  | ||||
| #if !defined(HAVE_SYS_UIO_H) && !defined(WIN32) && !defined(MSDOS) | ||||
| @@ -69,4 +69,13 @@ int ares_strcasecmp(const char *s1, const char *s2); | ||||
| #define strcasecmp(a,b) ares_strcasecmp(a,b) | ||||
| #endif | ||||
|  | ||||
| /* IPv6 compatibility */ | ||||
| #if !defined(HAVE_AF_INET6) | ||||
| #if defined(HAVE_PF_INET6) | ||||
| #define AF_INET6 PF_INET6 | ||||
| #else | ||||
| #define AF_INET6 AF_MAX+1 | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #endif /* ARES_SETUP_H */ | ||||
|   | ||||
| @@ -185,24 +185,24 @@ SOURCE=..\..\getopt.c | ||||
| !IF  "$(CFG)" == "adig - Win32 Release" | ||||
|  | ||||
| "areslib - Win32 Release" :  | ||||
|    cd ".\areslib" | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  | ||||
|    cd "..\adig" | ||||
|  | ||||
| "areslib - Win32 ReleaseCLEAN" :  | ||||
|    cd ".\areslib" | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  | ||||
|    cd "..\adig" | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "adig - Win32 Debug" | ||||
|  | ||||
| "areslib - Win32 Debug" :  | ||||
|    cd ".\areslib" | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  | ||||
|    cd "..\adig" | ||||
|  | ||||
| "areslib - Win32 DebugCLEAN" :  | ||||
|    cd ".\areslib" | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN  | ||||
|    cd "..\adig" | ||||
|  | ||||
|   | ||||
| @@ -195,24 +195,24 @@ SOURCE=..\..\ahost.c | ||||
| !IF  "$(CFG)" == "ahost - Win32 Release" | ||||
|  | ||||
| "areslib - Win32 Release" :  | ||||
|    cd ".\areslib" | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release"  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| "areslib - Win32 ReleaseCLEAN" :  | ||||
|    cd ".\areslib" | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Release" RECURSE=1 CLEAN  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| !ELSEIF  "$(CFG)" == "ahost - Win32 Debug" | ||||
|  | ||||
| "areslib - Win32 Debug" :  | ||||
|    cd ".\areslib" | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug"  | ||||
|    cd "..\ahost" | ||||
|  | ||||
| "areslib - Win32 DebugCLEAN" :  | ||||
|    cd ".\areslib" | ||||
|    cd "..\areslib" | ||||
|    $(MAKE) /$(MAKEFLAGS) /F ".\areslib.mak" CFG="areslib - Win32 Debug" RECURSE=1 CLEAN  | ||||
|    cd "..\ahost" | ||||
|  | ||||
|   | ||||
							
								
								
									
										28
									
								
								buildconf
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								buildconf
									
									
									
									
									
								
							| @@ -85,6 +85,14 @@ fi | ||||
|  | ||||
| echo "buildconf: automake version $am_version (ok)" | ||||
|  | ||||
| ac=`findtool aclocal` | ||||
|  | ||||
| if test -z "$ac"; then | ||||
|   echo "buildconf: aclocal not found. Weird automake installation!" | ||||
|   exit 1 | ||||
| else | ||||
|   echo "buildconf: aclocal found" | ||||
| fi | ||||
|  | ||||
| #-------------------------------------------------------------------------- | ||||
| # libtool check | ||||
| @@ -142,6 +150,13 @@ fi | ||||
|  | ||||
| echo "buildconf: libtool version $lt_version (ok)" | ||||
|  | ||||
| if test -f "$LIBTOOLIZE"; then | ||||
|   echo "buildconf: libtoolize found" | ||||
| else | ||||
|   echo "buildconf: libtoolize not found. Weird libtool installation!" | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| #-------------------------------------------------------------------------- | ||||
| # m4 check | ||||
| # | ||||
| @@ -155,6 +170,10 @@ else | ||||
|   exit 1 | ||||
| fi | ||||
|  | ||||
| #-------------------------------------------------------------------------- | ||||
| # perl check | ||||
| # | ||||
| PERL=`findtool perl` | ||||
|  | ||||
| # ------------------------------------------------------------ | ||||
|  | ||||
| @@ -164,8 +183,13 @@ echo "buildconf: running libtoolize" | ||||
| ${LIBTOOLIZE:-libtoolize} --copy --automake --force || die "The libtool command failed" | ||||
| echo "buildconf: running aclocal" | ||||
| ${ACLOCAL:-aclocal} $ACLOCAL_FLAGS || die "The aclocal command line failed" | ||||
| echo "buildconf: running aclocal hack to convert all mv to mv -f" | ||||
| perl -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4 | ||||
| if test -n "$PERL"; then | ||||
|   echo "buildconf: running aclocal hack to convert all mv to mv -f" | ||||
|   $PERL -i.bak -pe 's/\bmv +([^-\s])/mv -f $1/g' aclocal.m4 | ||||
| else | ||||
|   echo "buildconf: perl not found" | ||||
|   exit 1 | ||||
| fi | ||||
| echo "buildconf: running autoheader" | ||||
| ${AUTOHEADER:-autoheader} || die "The autoheader command failed" | ||||
| echo "buildconf: cp lib/config.h.in src/config.h.in" | ||||
|   | ||||
							
								
								
									
										317
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										317
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ dnl We don't know the version number "staticly" so we use a dash here | ||||
| AC_INIT(curl, [-], [a suitable curl mailing list => http://curl.haxx.se/mail/]) | ||||
|  | ||||
| dnl configure script copyright | ||||
| AC_COPYRIGHT([Copyright (c) 1998 - 2004 Daniel Stenberg, <daniel@haxx.se> | ||||
| AC_COPYRIGHT([Copyright (c) 1998 - 2005 Daniel Stenberg, <daniel@haxx.se> | ||||
| This configure script may be copied, distributed and modified under the  | ||||
| terms of the curl license; see COPYING for more details]) | ||||
|  | ||||
| @@ -56,7 +56,7 @@ AC_SUBST(PKGADD_VENDOR) | ||||
|  | ||||
| dnl | ||||
| dnl initialize all the info variables | ||||
|     curl_ssl_msg="no      (--with-ssl)" | ||||
|     curl_ssl_msg="no      (--with-ssl / --with-gnutls)" | ||||
|    curl_zlib_msg="no      (--with-zlib)" | ||||
|    curl_krb4_msg="no      (--with-krb4*)" | ||||
|     curl_gss_msg="no      (--with-gssapi)" | ||||
| @@ -66,6 +66,7 @@ dnl initialize all the info variables | ||||
|     curl_idn_msg="no      (--with-libidn)" | ||||
|  curl_manual_msg="no      (--enable-manual)" | ||||
| curl_verbose_msg="enabled (--disable-verbose)" | ||||
|    curl_sspi_msg="no      (--enable-sspi)" | ||||
|  | ||||
| dnl | ||||
| dnl Detect the canonical host and target build environment | ||||
| @@ -317,6 +318,7 @@ then | ||||
|   AC_TRY_LINK([#include <winsock2.h>], | ||||
|                [gethostbyname("www.dummysite.com");], | ||||
|                [ dnl worked! | ||||
|                ws2="yes" | ||||
|                AC_MSG_RESULT([yes]) | ||||
|                HAVE_GETHOSTBYNAME="1"], | ||||
|                [ dnl failed, restore LIBS | ||||
| @@ -371,6 +373,55 @@ AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]), | ||||
|        AC_MSG_RESULT(no) | ||||
| ) | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the name of dynamic OpenLDAP libraries | ||||
| dnl ********************************************************************** | ||||
|  | ||||
| LDAPLIBNAME="" | ||||
| AC_ARG_WITH(ldap-lib, | ||||
| AC_HELP_STRING([--with-ldap-lib=libname],[Specify name of dynamic ldap lib file]), | ||||
|  [LDAPLIBNAME="$withval"]) | ||||
|  | ||||
| LBERLIBNAME="" | ||||
| AC_ARG_WITH(lber-lib, | ||||
| AC_HELP_STRING([--with-lber-lib=libname],[Specify name of dynamic lber lib file]), | ||||
|  [LBERLIBNAME="$withval"]) | ||||
|  | ||||
| if test x$CURL_DISABLE_LDAP != x1 ; then | ||||
|  | ||||
|   if test -z "$LDAPLIBNAME" ; then | ||||
|     case $host in | ||||
|       *-*-cygwin | *-*-mingw* | *-*-pw32*) | ||||
|         dnl Windows uses a single and unique OpenLDAP DLL name | ||||
|         LDAPLIBNAME="wldap32.dll" | ||||
|         LBERLIBNAME="no" | ||||
|         ;; | ||||
|     esac | ||||
|   fi | ||||
|  | ||||
|   if test "$LDAPLIBNAME" ; then | ||||
|     AC_DEFINE_UNQUOTED(DL_LDAP_FILE, "$LDAPLIBNAME") | ||||
|     AC_MSG_CHECKING([name of dynamic library ldap]) | ||||
|     AC_MSG_RESULT($LDAPLIBNAME) | ||||
|   else | ||||
|     dnl Try to find the right ldap library name for this system | ||||
|     CURL_DLLIB_NAME(DL_LDAP_FILE, ldap) | ||||
|   fi | ||||
|  | ||||
|   if test "$LBERLIBNAME" ; then | ||||
|     dnl If name is "no" then don't define this variable at all | ||||
|     dnl (it's only needed if libldap.so's dependencies are broken). | ||||
|     if test "$LBERLIBNAME" != "no" ; then  | ||||
|       AC_DEFINE_UNQUOTED(DL_LBER_FILE, "$LBERLIBNAME") | ||||
|     fi | ||||
|     AC_MSG_CHECKING([name of dynamic library lber]) | ||||
|     AC_MSG_RESULT($LBERLIBNAME) | ||||
|   else | ||||
|     dnl Try to find the right lber library name for this system | ||||
|     CURL_DLLIB_NAME(DL_LBER_FILE, lber) | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the presence of the winmm library. | ||||
| dnl ********************************************************************** | ||||
| @@ -696,11 +747,7 @@ AC_HELP_STRING([--with-ssl=PATH],[where to look for SSL, PATH points to the SSL | ||||
| AC_HELP_STRING([--without-ssl], [disable SSL]), | ||||
|   OPT_SSL=$withval) | ||||
|  | ||||
| if test X"$OPT_SSL" = Xno | ||||
| then | ||||
|   AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more])   | ||||
| else | ||||
|  | ||||
| if test X"$OPT_SSL" != Xno; then | ||||
|   dnl backup the pre-ssl variables | ||||
|   CLEANLDFLAGS="$LDFLAGS" | ||||
|   CLEANCPPFLAGS="$CPPFLAGS" | ||||
| @@ -759,13 +806,29 @@ else | ||||
|     fi | ||||
|   fi | ||||
|  | ||||
|   dnl This is for Msys/Mingw | ||||
|   AC_MSG_CHECKING([for gdi32]) | ||||
|   my_ac_save_LIBS=$LIBS | ||||
|   LIBS="-lgdi32 $LIBS" | ||||
|   AC_TRY_LINK([#include <windef.h> | ||||
|                #include <wingdi.h>], | ||||
|                [GdiFlush();], | ||||
|                [ dnl worked! | ||||
|                AC_MSG_RESULT([yes])], | ||||
|                [ dnl failed, restore LIBS | ||||
|                LIBS=$my_ac_save_LIBS | ||||
|                AC_MSG_RESULT(no)] | ||||
|               ) | ||||
|  | ||||
|   AC_CHECK_LIB(crypto, CRYPTO_lock,[ | ||||
|      HAVECRYPTO="yes" | ||||
|      LIBS="-lcrypto $LIBS" | ||||
|      ],[ | ||||
|      LDFLAGS="$CLEANLDFLAGS -L$EXTRA_SSL/lib$libsuff" | ||||
|      CPPFLAGS="$CLEANCPPFLAGS -I$EXTRA_SSL/include/openssl -I$EXTRA_SSL/include" | ||||
|      AC_CHECK_LIB(crypto, CRYPTO_add_lock,[ | ||||
|        HAVECRYPTO="yes" ], [ | ||||
|        HAVECRYPTO="yes" | ||||
|        LIBS="-lcrypto $LIBS"], [ | ||||
|        LDFLAGS="$CLEANLDFLAGS" | ||||
|        CPPFLAGS="$CLEANCPPFLAGS" | ||||
|        LIBS="$CLEANLIBS" | ||||
| @@ -780,21 +843,6 @@ else | ||||
|     dnl This is only reasonable to do if crypto actually is there: check for | ||||
|     dnl SSL libs NOTE: it is important to do this AFTER the crypto lib | ||||
|  | ||||
|     dnl This is for Msys/Mingw | ||||
|     AC_MSG_CHECKING([for gdi32]) | ||||
|     my_ac_save_LIBS=$LIBS | ||||
|     LIBS="-lgdi32 $LIBS" | ||||
|     AC_TRY_LINK([#include <windef.h> | ||||
|                  #include <wingdi.h>], | ||||
|                [GdiFlush();], | ||||
|                [ dnl worked! | ||||
|                AC_MSG_RESULT([yes])], | ||||
|                [ dnl failed, restore LIBS | ||||
|                LIBS=$my_ac_save_LIBS | ||||
|                AC_MSG_RESULT(no)] | ||||
|               ) | ||||
|  | ||||
|     AC_CHECK_LIB(crypto, CRYPTO_add_lock) | ||||
|     AC_CHECK_LIB(ssl, SSL_connect) | ||||
|  | ||||
|     if test "$ac_cv_lib_ssl_SSL_connect" != yes; then | ||||
| @@ -816,13 +864,13 @@ else | ||||
|       dnl Have the libraries--check for SSLeay/OpenSSL headers | ||||
|       AC_CHECK_HEADERS(openssl/x509.h openssl/rsa.h openssl/crypto.h \ | ||||
|                        openssl/pem.h openssl/ssl.h openssl/err.h, | ||||
|         curl_ssl_msg="enabled" | ||||
|         curl_ssl_msg="enabled (OpenSSL)" | ||||
|         OPENSSL_ENABLED=1 | ||||
|         AC_DEFINE(USE_OPENSSL, 1, [if OpenSSL is in use])) | ||||
|  | ||||
|       if test $ac_cv_header_openssl_x509_h = no; then | ||||
|         AC_CHECK_HEADERS(x509.h rsa.h crypto.h pem.h ssl.h err.h, | ||||
|           curl_ssl_msg="enabled" | ||||
|           curl_ssl_msg="enabled (OpenSSL)" | ||||
|           OPENSSL_ENABLED=1) | ||||
|       fi | ||||
|     fi | ||||
| @@ -832,7 +880,11 @@ else | ||||
|  | ||||
|        dnl is there a pkcs12.h header present? | ||||
|        AC_CHECK_HEADERS(openssl/pkcs12.h) | ||||
|     else | ||||
|        LIBS="$CLEANLIBS" | ||||
|     fi | ||||
|     dnl USE_SSLEAY is the historical name for what configure calls | ||||
|     dnl OPENSSL_ENABLED; the names should really be unified | ||||
|     USE_SSLEAY="$OPENSSL_ENABLED" | ||||
|     AC_SUBST(USE_SSLEAY) | ||||
|  | ||||
| @@ -933,6 +985,79 @@ if test X"$OPENSSL_ENABLED" = X"1"; then | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| dnl ---------------------------------------------------- | ||||
| dnl FIX: only check for GnuTLS if OpenSSL is not enabled | ||||
| dnl ---------------------------------------------------- | ||||
|  | ||||
| dnl Default to compiler & linker defaults for GnuTLS files & libraries. | ||||
| OPT_GNUTLS=off | ||||
|  | ||||
| AC_ARG_WITH(gnutls,dnl | ||||
| AC_HELP_STRING([--with-gnutls=PATH],[where to look for GnuTLS, PATH points to the installation root (default: /usr/local/)]) | ||||
| AC_HELP_STRING([--without-gnutls], [disable GnuTLS detection]), | ||||
|   OPT_GNUTLS=$withval) | ||||
|  | ||||
| if test "$OPENSSL_ENABLED" != "1"; then | ||||
|  | ||||
|   if test X"$OPT_GNUTLS" != Xoff; then | ||||
|     if test "x$OPT_GNUTLS" = "xyes"; then | ||||
|      check=`libgnutls-config --version 2>/dev/null` | ||||
|      if test -n "$check"; then | ||||
|        addlib=`libgnutls-config --libs` | ||||
|        addcflags=`libgnutls-config --cflags` | ||||
|        version=`libgnutls-config --version` | ||||
|        gtlsprefix=`libgnutls-config --prefix` | ||||
|      fi | ||||
|     else | ||||
|       addlib="-L$OPT_GNUTLS/lib -lgnutls" | ||||
|       addcflags="-I$OPT_GNUTLS/include" | ||||
|       version=`$OPT_GNUTLS/bin/libgnutls-config --version 2>/dev/null` | ||||
|       gtlsprefix=$OPT_GNUTLS | ||||
|       if test -z "$version"; then | ||||
|         version="unknown" | ||||
|       fi | ||||
|     fi | ||||
|  | ||||
|     CLEANLDFLAGS="$LDFLAGS" | ||||
|     CLEANCPPFLAGS="$CPPFLAGS" | ||||
|    | ||||
|     LDFLAGS="$LDFLAGS $addlib" | ||||
|     if test "$addcflags" != "-I/usr/include"; then | ||||
|        CPPFLAGS="$CPPFLAGS $addcflags" | ||||
|     fi | ||||
|    | ||||
|     AC_CHECK_LIB(gnutls, gnutls_check_version, | ||||
|        [ | ||||
|        AC_DEFINE(USE_GNUTLS, 1, [if GnuTLS is enabled]) | ||||
|        AC_SUBST(USE_GNUTLS, [1]) | ||||
|        USE_GNUTLS="yes" | ||||
|      curl_ssl_msg="enabled (GnuTLS)" | ||||
|        ], | ||||
|        [ | ||||
|          LDFLAGS="$CLEANLDFLAGS" | ||||
|          CPPFLAGS="$CLEANCPPFLAGS" | ||||
|        ]) | ||||
|    | ||||
|     if test "x$USE_GNUTLS" = "xyes"; then | ||||
|       AC_MSG_NOTICE([detected GnuTLS version $version]) | ||||
|  | ||||
|       dnl when shared libs were found in a path that the run-time | ||||
|       dnl linker doesn't search through, we need to add it to | ||||
|       dnl LD_LIBRARY_PATH to prevent further configure tests to fail | ||||
|       dnl due to this | ||||
|  | ||||
|       LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$gtlsprefix/lib$libsuff" | ||||
|       export LD_LIBRARY_PATH | ||||
|     fi | ||||
|   fi dnl GNUTLS not disabled | ||||
|  | ||||
|   if test X"$USE_GNUTLS" != "Xyes"; then | ||||
|     AC_MSG_WARN([SSL disabled, you will not be able to use HTTPS, FTPS, NTLM and more.]) | ||||
|     AC_MSG_WARN([Use --with-ssl or --with-gnutls to address this.]) | ||||
|   fi | ||||
|  | ||||
| fi dnl OPENSSL != 1 | ||||
|    | ||||
| dnl ********************************************************************** | ||||
| dnl Check for the presence of ZLIB libraries and headers | ||||
| dnl ********************************************************************** | ||||
| @@ -941,71 +1066,78 @@ dnl Check for & handle argument to --with-zlib. | ||||
|  | ||||
| _cppflags=$CPPFLAGS | ||||
| _ldflags=$LDFLAGS | ||||
| OPT_ZLIB="/usr/local" | ||||
| AC_ARG_WITH(zlib, | ||||
| AC_HELP_STRING([--with-zlib=PATH],[search for zlib in PATH]) | ||||
| AC_HELP_STRING([--without-zlib],[disable use of zlib]), | ||||
|                [OPT_ZLIB="$withval"]) | ||||
|  | ||||
| case "$OPT_ZLIB" in | ||||
|   no) | ||||
|     AC_MSG_WARN([zlib disabled]) ;; | ||||
|   *) | ||||
| if test "$OPT_ZLIB" = "no" ; then | ||||
|     AC_MSG_WARN([zlib disabled]) | ||||
| else | ||||
|   if test "$OPT_ZLIB" = "yes" ; then | ||||
|      OPT_ZLIB="" | ||||
|   fi | ||||
|  | ||||
|   if test -z "$OPT_ZLIB" ; then | ||||
|     dnl check for the lib first without setting any new path, since many | ||||
|     dnl people have it in the default path | ||||
|  | ||||
|     AC_CHECK_LIB(z, inflateEnd, | ||||
|                    dnl libz found, set the variable | ||||
|                    [HAVE_LIBZ="1"], | ||||
|                    dnl if no lib found, try to add the given library | ||||
|                    [if test -d "$OPT_ZLIB"; then | ||||
|                       CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include" | ||||
|                       LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff" | ||||
|                    fi]) | ||||
|                    dnl if no lib found, try /usr/local | ||||
|                    [OPT_ZLIB="/usr/local"]) | ||||
|  | ||||
|     AC_CHECK_HEADER(zlib.h, | ||||
|       [ | ||||
|       dnl zlib.h was found | ||||
|       HAVE_ZLIB_H="1" | ||||
|       dnl if the lib wasn't found already, try again with the new paths | ||||
|       if test "$HAVE_LIBZ" != "1"; then | ||||
|         AC_CHECK_LIB(z, gzread, | ||||
|                      [ | ||||
|                      dnl the lib was found! | ||||
|                      HAVE_LIBZ="1" | ||||
|                      ], | ||||
|                      [ CPPFLAGS=$_cppflags | ||||
|                      LDFLAGS=$_ldflags]) | ||||
|       fi | ||||
|       ], | ||||
|       [ | ||||
|         dnl zlib.h was not found, restore the flags | ||||
|         CPPFLAGS=$_cppflags | ||||
|         LDFLAGS=$_ldflags] | ||||
|       ) | ||||
|   fi | ||||
|  | ||||
|     if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1" | ||||
|     then | ||||
|       AC_MSG_WARN([configure found only the libz lib, not the header file!]) | ||||
|     elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1" | ||||
|     then | ||||
|       AC_MSG_WARN([configure found only the libz header file, not the lib!]) | ||||
|     elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1" | ||||
|     then | ||||
|       dnl both header and lib were found! | ||||
|       AC_SUBST(HAVE_LIBZ) | ||||
|       AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file]) | ||||
|       AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available]) | ||||
|   dnl Add a nonempty path to the compiler flags | ||||
|   if test -n "$OPT_ZLIB"; then | ||||
|      CPPFLAGS="$CPPFLAGS -I$OPT_ZLIB/include" | ||||
|      LDFLAGS="$LDFLAGS -L$OPT_ZLIB/lib$libsuff" | ||||
|   fi | ||||
|  | ||||
|       LIBS="$LIBS -lz" | ||||
|  | ||||
|       dnl replace 'HAVE_LIBZ' in the automake makefile.ams | ||||
|       AMFIXLIB="1" | ||||
|       AC_MSG_NOTICE([found both libz and libz.h header]) | ||||
|       curl_zlib_msg="enabled" | ||||
|   AC_CHECK_HEADER(zlib.h, | ||||
|     [ | ||||
|     dnl zlib.h was found | ||||
|     HAVE_ZLIB_H="1" | ||||
|     dnl if the lib wasn't found already, try again with the new paths | ||||
|     if test "$HAVE_LIBZ" != "1"; then | ||||
|       AC_CHECK_LIB(z, gzread, | ||||
|                    [ | ||||
|                    dnl the lib was found! | ||||
|                    HAVE_LIBZ="1" | ||||
|                    ], | ||||
|                    [ CPPFLAGS=$_cppflags | ||||
|                    LDFLAGS=$_ldflags]) | ||||
|     fi | ||||
|     ;; | ||||
| esac | ||||
|     ], | ||||
|     [ | ||||
|       dnl zlib.h was not found, restore the flags | ||||
|       CPPFLAGS=$_cppflags | ||||
|       LDFLAGS=$_ldflags] | ||||
|     ) | ||||
|  | ||||
|   if test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" != "1" | ||||
|   then | ||||
|     AC_MSG_WARN([configure found only the libz lib, not the header file!]) | ||||
|   elif test "$HAVE_LIBZ" != "1" && test "$HAVE_ZLIB_H" = "1" | ||||
|   then | ||||
|     AC_MSG_WARN([configure found only the libz header file, not the lib!]) | ||||
|   elif test "$HAVE_LIBZ" = "1" && test "$HAVE_ZLIB_H" = "1" | ||||
|   then | ||||
|     dnl both header and lib were found! | ||||
|     AC_SUBST(HAVE_LIBZ) | ||||
|     AC_DEFINE(HAVE_ZLIB_H, 1, [if you have the zlib.h header file]) | ||||
|     AC_DEFINE(HAVE_LIBZ, 1, [if zlib is available]) | ||||
|  | ||||
|     LIBS="$LIBS -lz" | ||||
|  | ||||
|     dnl replace 'HAVE_LIBZ' in the automake makefile.ams | ||||
|     AMFIXLIB="1" | ||||
|     AC_MSG_NOTICE([found both libz and libz.h header]) | ||||
|     curl_zlib_msg="enabled" | ||||
|   fi | ||||
| fi | ||||
|  | ||||
| dnl set variable for use in automakefile(s) | ||||
| AM_CONDITIONAL(HAVE_LIBZ, test x"$AMFIXLIB" = x1) | ||||
| @@ -1048,6 +1180,7 @@ case "$LIBIDN" in | ||||
|  | ||||
|        if test "x$idn" = "xyes"; then | ||||
|          curl_idn_msg="enabled" | ||||
|          AC_SUBST(IDN_ENABLED, [1]) | ||||
|          dnl different versions of libidn have different setups of these: | ||||
|          AC_CHECK_FUNCS( idn_free idna_strerror tld_strerror) | ||||
|          AC_CHECK_HEADERS( idn-free.h tld.h ) | ||||
| @@ -1518,6 +1651,28 @@ AC_HELP_STRING([--disable-verbose],[Disable verbose strings]), | ||||
|        AC_MSG_RESULT(yes) | ||||
| ) | ||||
|  | ||||
| dnl ************************************************************ | ||||
| dnl enable SSPI support | ||||
| dnl | ||||
| AC_MSG_CHECKING([whether to enable SSPI support (win32 builds only)]) | ||||
| AC_ARG_ENABLE(sspi, | ||||
| AC_HELP_STRING([--enable-sspi],[Enable SSPI]) | ||||
| AC_HELP_STRING([--disable-sspi],[Disable SSPI]), | ||||
| [ case "$enableval" in | ||||
|   yes) | ||||
|        AC_MSG_RESULT(yes) | ||||
|        AC_DEFINE(USE_WINDOWS_SSPI, 1, [to enable SSPI support]) | ||||
|        AC_SUBST(USE_WINDOWS_SSPI) | ||||
|        LIBS="$LIBS -lsecur32" | ||||
|        curl_sspi_msg="yes" | ||||
|        ;; | ||||
|   *) | ||||
|        AC_MSG_RESULT(no) | ||||
|        ;; | ||||
|   esac ], | ||||
|        AC_MSG_RESULT(no) | ||||
| ) | ||||
|  | ||||
| dnl ************************************************************ | ||||
| dnl lame option to switch on debug options | ||||
| dnl | ||||
| @@ -1581,6 +1736,17 @@ AC_HELP_STRING([--disable-cookies],[Disable cookies support]), | ||||
|        AC_MSG_RESULT(yes) | ||||
| ) | ||||
|  | ||||
| if test "x$ws2" = "xyes"; then | ||||
|  | ||||
|   dnl If ws2_32 is wanted, make sure it is the _last_ lib in LIBS (makes | ||||
|   dnl things work when built with c-ares). But we can't just move it last | ||||
|   dnl since then other stuff (SSL) won't build. So we simply append it to the | ||||
|   dnl end. | ||||
|  | ||||
|   LIBS="$LIBS -lws2_32" | ||||
|  | ||||
| fi | ||||
|  | ||||
| AM_CONDITIONAL(CROSSCOMPILING, test x$cross_compiling = xyes) | ||||
|  | ||||
| AC_CONFIG_FILES([Makefile \ | ||||
| @@ -1629,4 +1795,5 @@ AC_MSG_NOTICE([Configured to build curl/libcurl: | ||||
|   Build libcurl:   Shared=${enable_shared}, Static=${enable_static}  | ||||
|   Built-in manual: ${curl_manual_msg} | ||||
|   Verbose errors:  ${curl_verbose_msg} | ||||
|   SSPI support:    ${curl_sspi_msg} | ||||
| ]) | ||||
|   | ||||
| @@ -60,6 +60,7 @@ while test $# -gt 0; do | ||||
|     --feature|--features) | ||||
| 	if test "@USE_SSLEAY@" = "1"; then | ||||
|           echo "SSL" | ||||
|           NTLM=1 | ||||
|         fi | ||||
| 	if test "@KRB4_ENABLED@" = "1"; then | ||||
|           echo "KRB4" | ||||
| @@ -73,6 +74,16 @@ while test $# -gt 0; do | ||||
| 	if test "@HAVE_ARES@" = "1"; then | ||||
|           echo "AsynchDNS" | ||||
|         fi | ||||
| 	if test "@IDN_ENABLED@" = "1"; then | ||||
|           echo "IDN" | ||||
|         fi | ||||
| 	if test "@USE_WINDOWS_SSPI@" = "1"; then | ||||
|           echo "SSPI" | ||||
|           NTLM=1 | ||||
|         fi | ||||
| 	if test "$NTLM" = "1"; then | ||||
|           echo "NTLM" | ||||
|         fi | ||||
| 	;; | ||||
|  | ||||
|     --protocols) | ||||
|   | ||||
| @@ -75,6 +75,11 @@ Java | ||||
|   Maintained by Vic Hanson | ||||
|   http://curl.haxx.se/libcurl/java/ | ||||
|  | ||||
| Lisp | ||||
|  | ||||
|   Written by Liam Healy | ||||
|   http://common-lisp.net/project/cl-curl/ | ||||
|  | ||||
| Lua | ||||
|  | ||||
|   Written by Steve Dekorte | ||||
|   | ||||
							
								
								
									
										63
									
								
								docs/FAQ
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								docs/FAQ
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| Updated: December 21, 2004 (http://curl.haxx.se/docs/faq.html) | ||||
| Updated: April 13, 2005 (http://curl.haxx.se/docs/faq.html) | ||||
|                                   _   _ ____  _ | ||||
|                               ___| | | |  _ \| | | ||||
|                              / __| | | | |_) | | | ||||
| @@ -43,6 +43,7 @@ FAQ | ||||
|   3.15 Can I do recursive fetches with curl? | ||||
|   3.16 What certificates do I need when I use SSL? | ||||
|   3.17 How do I list the root dir of an FTP server? | ||||
|   3.18 Can I use curl to send a POST/PUT and not wait for a response? | ||||
|  | ||||
|  4. Running Problems | ||||
|   4.1 Problems connecting to SSL servers. | ||||
| @@ -74,6 +75,9 @@ FAQ | ||||
|   5.7 Link errors when building libcurl on Windows! | ||||
|   5.8 libcurl.so.3: open failed: No such file or directory | ||||
|   5.9 How does libcurl resolve host names? | ||||
|   5.10 How do I prevent libcurl from writing the response to stdout? | ||||
|   5.11 How do I make libcurl not receive the whole HTTP response? | ||||
|   5.12 Can I make libcurl fake or hide my real IP address? | ||||
|  | ||||
|  6. License Issues | ||||
|   6.1 I have a GPL program, can I use the libcurl library? | ||||
| @@ -97,7 +101,7 @@ FAQ | ||||
|   cURL is the name of the project. The name is a play on 'Client for URLs', | ||||
|   originally with URL spelled in uppercase to make it obvious it deals with | ||||
|   URLs. The fact it can also be pronounced 'see URL' also helped, it works as | ||||
|   an abbrivation for "Client URL Request Library" or why not the recursive | ||||
|   an abbreviation for "Client URL Request Library" or why not the recursive | ||||
|   version: "Curl URL Request Library". | ||||
|  | ||||
|   The cURL project produces two products: | ||||
| @@ -296,8 +300,8 @@ FAQ | ||||
|  | ||||
|   2.2 Does curl work/build with other SSL libraries? | ||||
|  | ||||
|   Curl has been written to use OpenSSL, although there should not be much | ||||
|   problems using a different library. If anyone does "port" curl to use a | ||||
|   Curl has been written to use OpenSSL or GnuTLS, although there should not be | ||||
|   many problems using a different library. If anyone does "port" curl to use a | ||||
|   different SSL library, we are of course very interested in getting the | ||||
|   patch! | ||||
|  | ||||
| @@ -503,9 +507,9 @@ FAQ | ||||
|     If the server doesn't require this, you don't need a client certificate. | ||||
|  | ||||
|   - Server certificate. The server you communicate with has a server | ||||
|     certificate. You can and should verify this certficate to make sure that | ||||
|     certificate. You can and should verify this certificate to make sure that | ||||
|     you are truly talking to the real server and not a server impersonating | ||||
|     it. The server certificate verifaction process is made by using a | ||||
|     it. The server certificate verification process is made by using a | ||||
|     Certificate Authority certificate ("CA cert") that was used to sign the | ||||
|     server certificate. Server certificate verification is enabled by default | ||||
|     in curl and libcurl and is often the reason for problems as explained in | ||||
| @@ -533,6 +537,10 @@ FAQ | ||||
|  | ||||
|      curl ftp://ftp.sunet.se//tmp/ | ||||
|  | ||||
|   3.18 Can I use curl to send a POST/PUT and not wait for a response? | ||||
|   | ||||
|   No. | ||||
|  | ||||
|  | ||||
| 4. Running Problems | ||||
|  | ||||
| @@ -733,12 +741,20 @@ FAQ | ||||
|  | ||||
|   Yes. | ||||
|  | ||||
|   We have written the libcurl code specificly adjusted for multi-threaded | ||||
|   We have written the libcurl code specifically adjusted for multi-threaded | ||||
|   programs. libcurl will use thread-safe functions instead of non-safe ones if | ||||
|   your system has such. | ||||
|  | ||||
|   We would appreciate some kind of report or README file from those who have | ||||
|   used libcurl in a threaded environment. | ||||
|   If you use a OpenSSL-powered libcurl in a multi-threaded environment, you | ||||
|   need to provide one or two locking functions: | ||||
|  | ||||
|     http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION | ||||
|  | ||||
|   If you use a GnuTLS-powered libcurl in a multi-threaded environment, you | ||||
|   need to provide locking function(s) for libgcrypt (which is used by GnuTLS | ||||
|   for the crypto functions). | ||||
|  | ||||
|     [informative link missing] | ||||
|  | ||||
|   5.2 How can I receive all data into a large memory chunk? | ||||
|  | ||||
| @@ -877,6 +893,35 @@ FAQ | ||||
|     A - gethostbyname() on plain ipv4 windows hosts | ||||
|     B - getaddrinfo() on ipv6-enabled windows hosts | ||||
|  | ||||
|   Also note that libcurl never resolves or reverse-lookups addresses given as | ||||
|   pure numbers, such as 127.0.0.1 or ::1. | ||||
|  | ||||
|   5.10 How do I prevent libcurl from writing the response to stdout? | ||||
|  | ||||
|   libcurl provides a default built-in write function that writes received data | ||||
|   to stdout. Set a WRITEFUNCTION to receive the data, or possibly set | ||||
|   WRITEDATA to a different FILE * handle. | ||||
|  | ||||
|   5.11 How do I make libcurl not receive the whole HTTP response? | ||||
|  | ||||
|   You make the write callback (or progress callback) return an error and | ||||
|   libcurl will then abort the transfer. | ||||
|  | ||||
|   5.12 Can I make libcurl fake or hide my real IP address? | ||||
|  | ||||
|   No. libcurl operates on a higher level than so. Besides, faking IP address | ||||
|   would imply sending IP packages with a made-up source address, and then you | ||||
|   normally get a problem with intercepting the packages sent back as they | ||||
|   would then not be routed to you! | ||||
|  | ||||
|   If you use a proxy to access remote sites, the sites will not see your local | ||||
|   IP address but instead the address of the proxy. | ||||
|  | ||||
|   Also note that on many networks NATs or other IP-munging techniques are used | ||||
|   that makes you see and use a different IP address locally than what the | ||||
|   remote server will see you coming from. | ||||
|  | ||||
|  | ||||
| 6. License Issues | ||||
|  | ||||
|   Curl and libcurl are released under a MIT/X derivate license. The license is | ||||
|   | ||||
| @@ -139,3 +139,7 @@ August 2004: | ||||
|  Number of public functions in libcurl:    36 | ||||
|  Amount of public web site mirrors:        12 | ||||
|  Number of known libcurl bindings:         26 | ||||
|  | ||||
| April 2005: | ||||
|  | ||||
| GnuTLS can now optionally be used for the secure layer when curl is built. | ||||
|   | ||||
| @@ -3,6 +3,21 @@ join in and help us correct one or more of these! Also be sure to check the | ||||
| changelog of the current development status, as one or more of these problems | ||||
| may have been fixed since this was written! | ||||
|  | ||||
| 22. Sending files to a FTP server using curl on VMS, might lead to curl | ||||
|   complaining on "unaligned file size" on completion. The problem is related | ||||
|   to VMS file structures and the perceived file sizes stat() returns. A | ||||
|   possible fix would involve sending a "STRU VMS" command. | ||||
|   http://sourceforge.net/support/tracker.php?aid=1156287 | ||||
|    | ||||
| 21. FTP ASCII transfers do not follow RFC959. They don't convert the data | ||||
|    accordingly (not for sending nor for receiving). RFC 959 section 3.1.1.1 | ||||
|    clearly describes how this should be done: | ||||
|  | ||||
|      The sender converts the data from an internal character representation to | ||||
|      the standard 8-bit NVT-ASCII representation (see the Telnet | ||||
|      specification).  The receiver will convert the data from the standard | ||||
|      form to his own internal form. | ||||
|  | ||||
| 20. valgrind errors occur too often when 'make test' is used. It is because | ||||
|   too many third-party libs and tools have problems. When curl is built | ||||
|   without --disable-shared, the testing is done with a front-end script which | ||||
| @@ -91,7 +106,3 @@ may have been fixed since this was written! | ||||
|   and havoc is what happens. | ||||
|   More details on this is found in this libcurl mailing list thread: | ||||
|   http://curl.haxx.se/mail/lib-2002-08/0000.html | ||||
|  | ||||
| 1. LDAP support requires that not only the OpenLDAP shared libraries be | ||||
|    present at run time, but the development libraries (liblber.so and | ||||
|    libldap.so) as well (not applicable to Windows). | ||||
|   | ||||
| @@ -32,7 +32,15 @@ OpenSSL http://www.openssl.org/source/license.html | ||||
|         makes it "incompatible" with GPL. You are not allowed to ship binaries | ||||
|         that link with OpenSSL that includes GPL code (unless that specific | ||||
|         GPL code includes an exception for OpenSSL - a habit that is growing | ||||
|         more and more common). | ||||
|         more and more common). If OpenSSL's licensing is a problem for you, | ||||
|         consider using GnuTLS instead. | ||||
|  | ||||
| GnuTLS  http://www.gnutls.org/ | ||||
|  | ||||
|         Uses the LGPL[3] license. If this is a problem for you, consider using | ||||
|         OpenSSL instead. Also note that GnuTLS itself depends on and uses | ||||
|         other libs (libgcrypt and libgpg-error) and they too are LGPL- or | ||||
|         GPL-licensed. | ||||
|  | ||||
| c-ares  http://daniel.haxx.se/projects/c-ares/license.html | ||||
|  | ||||
| @@ -84,3 +92,5 @@ OpenLDAP http://www.openldap.org/software/release/license.html | ||||
| [1] = GPL - GNU General Public License: http://www.gnu.org/licenses/gpl.html | ||||
| [2] = http://www.fsf.org/licenses/gpl-faq.html#GPLIncompatibleLibs details on | ||||
|       how to write such an exception to the GPL | ||||
| [3] = LGPL - GNU Lesser General Public License: | ||||
|       http://www.gnu.org/licenses/lgpl.html | ||||
|   | ||||
| @@ -299,6 +299,13 @@ POST (HTTP) | ||||
|  | ||||
|         curl -F "docpicture=@dog.gif" -F "catpicture=@cat.gif"  | ||||
|  | ||||
|   To send a field value literally without interpreting a leading '@' | ||||
|   or '<', or an embedded ';type=', use --form-string instead of | ||||
|   -F. This is recommended when the value is obtained from a user or | ||||
|   some other unpredictable source. Under these circumstances, using | ||||
|   -F instead of --form-string would allow a user to trick curl into | ||||
|   uploading a file. | ||||
|  | ||||
| REFERRER | ||||
|  | ||||
|   A HTTP request has the option to include information about which address | ||||
|   | ||||
							
								
								
									
										23
									
								
								docs/TODO
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								docs/TODO
									
									
									
									
									
								
							| @@ -26,7 +26,7 @@ TODO | ||||
|  | ||||
|  * More data sharing. curl_share_* functions already exist and work, and they | ||||
|    can be extended to share more. For example, enable sharing of the ares | ||||
|    channel. | ||||
|    channel and the connection cache. | ||||
|  | ||||
|  * Introduce a new error code indicating authentication problems (for proxy | ||||
|    CONNECT error 407 for example). This cannot be an error code, we must not | ||||
| @@ -35,16 +35,15 @@ TODO | ||||
|  | ||||
|  * Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and | ||||
|    SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. | ||||
|    To support ipv6 interface addresses properly. | ||||
|  | ||||
|  * Add the following to curl_easy_getinfo(): GET_HTTP_IP, GET_FTP_IP and | ||||
|    GET_FTP_DATA_IP. Return a string with the used IP. Suggested by Alan. | ||||
|  | ||||
|  LIBCURL - multi interface | ||||
|  | ||||
|  * Add a curl_multi_fdset() alternative that returns only two arrays with file | ||||
|    desrciptors for reading and writing to allow the app to use whatever | ||||
|    function it prefers. Plus, this allows apps to avoid the FD_SETSIZE problem | ||||
|    with select(). | ||||
|  * Add a curl_multi_fdset() alternative. this allows apps to avoid the | ||||
|    FD_SETSIZE problem with select(). | ||||
|  | ||||
|  * Add curl_multi_timeout() to make libcurl's ares-functionality better. | ||||
|  | ||||
| @@ -68,9 +67,6 @@ TODO | ||||
|  * Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in | ||||
|    the process to avoid doing a resolve and connect in vain. | ||||
|  | ||||
|  * Code overhaul to make it more state-machine like and to _never_ block on | ||||
|    waiting for server responses when used with the multi interface. | ||||
|  | ||||
|  * Support GSS/Kerberos 5 for ftp file transfer. This will allow user | ||||
|    authentication and file encryption.  Possible libraries and example clients | ||||
|    are available from MIT or Heimdal. Requsted by Markus Moeller. | ||||
| @@ -146,14 +142,9 @@ TODO | ||||
|    it be? There's so much that could be done if it were! (brought by Chris | ||||
|    Clark) | ||||
|  | ||||
|  * Make curl's SSL layer option capable of using other free SSL libraries. | ||||
|    Such as the Mozilla Security Services | ||||
|    (http://www.mozilla.org/projects/security/pki/nss/) and GnuTLS | ||||
|    (http://www.gnu.org/software/gnutls/) This subject has been brought up | ||||
|    again recently since GPL-licensed applications that link with libcurl MAY | ||||
|    NOT distribute binaries that use OpenSSL without adding an exception clause | ||||
|    to the GPL license. See the LICENSE-MIXING document and this: | ||||
|    http://www.gnome.org/~markmc/openssl-and-the-gpl.html | ||||
|  * Make curl's SSL layer capable of using other free SSL libraries.  Such as | ||||
|    the Mozilla Security Services: | ||||
|    http://www.mozilla.org/projects/security/pki/nss/ | ||||
|  | ||||
|  LDAP | ||||
|  | ||||
|   | ||||
							
								
								
									
										32
									
								
								docs/curl.1
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								docs/curl.1
									
									
									
									
									
								
							| @@ -21,7 +21,7 @@ | ||||
| .\" * $Id$ | ||||
| .\" ************************************************************************** | ||||
| .\" | ||||
| .TH curl 1 "25 Jan 2005" "Curl 7.13.0" "Curl Manual" | ||||
| .TH curl 1 "05 Apr 2005" "Curl 7.13.3" "Curl Manual" | ||||
| .SH NAME | ||||
| curl \- transfer a URL | ||||
| .SH SYNOPSIS | ||||
| @@ -267,7 +267,7 @@ If this option is used several times, the last one will be used. | ||||
| be set with the \fI-H/--header\fP flag of course.  When used with | ||||
| \fI-L/--location\fP you can append ";auto" to the referer URL to make curl | ||||
| automatically set the previous URL when it follows a Location: header. The | ||||
| ";auto" string can be used alone, even if you don't set an initial referer. | ||||
| \&";auto" string can be used alone, even if you don't set an initial referer. | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--engine <name>" | ||||
| @@ -343,7 +343,7 @@ will instead attempt to create missing directories. (Added in 7.10.7) | ||||
|  | ||||
| If this option is used twice, the second will again disable silent failure. | ||||
| .IP "--ftp-pasv" | ||||
| (FTP) Use PASV when transfering. PASV is the internal default behavior, but | ||||
| (FTP) Use PASV when transferring. PASV is the internal default behavior, but | ||||
| using this option can be used to override a previous --ftp-port option. (Added | ||||
| in 7.11.0) | ||||
|  | ||||
| @@ -388,6 +388,12 @@ setting filename=, like this: | ||||
| See further examples and details in the MANUAL. | ||||
|  | ||||
| This option can be used multiple times. | ||||
| .IP "--form-string <name=string>" | ||||
| (HTTP) Similar to \fI--form\fP except that the value string for the named | ||||
| parameter is used literally. Leading \&'@' and \&'<' characters, and the | ||||
| \&';type=' string in the value have no special meaning. Use this in preference | ||||
| to \fI--form\fP if there's any possibility that the string value may | ||||
| accidentally trigger the \&'@' or \&'<' features of \fI--form\fP. | ||||
| .IP "-g/--globoff" | ||||
| This option switches off the "URL globbing parser". When you set this option, | ||||
| you can specify URLs that contain the letters {}[] without having them being | ||||
| @@ -641,6 +647,13 @@ You may use this option as many times as you have number of URLs. | ||||
| (SSL) Pass phrase for the private key | ||||
|  | ||||
| If this option is used several times, the last one will be used. | ||||
| .IP "--proxy-anyauth" | ||||
| Tells curl to pick a suitable authentication method when communicating with | ||||
| the given proxy. This will cause an extra request/response round-trip. Added | ||||
| in curl 7.13.2. | ||||
|  | ||||
| If this option is used twice, the second will again disable the proxy use-any | ||||
| authentication. | ||||
| .IP "--proxy-basic" | ||||
| Tells curl to use HTTP Basic authentication when communicating with the given | ||||
| proxy. Use \fI--basic\fP for enabling HTTP Basic with a remote host. Basic is | ||||
| @@ -689,7 +702,7 @@ instead of PORT by using \fI--disable-eprt\fP. EPRT is really PORT++. | ||||
| .IP "-q" | ||||
| If used as the first parameter on the command line, the \fI$HOME/.curlrc\fP | ||||
| file will not be read and used as a config file. | ||||
| .IP "-Q/--quote <comand>" | ||||
| .IP "-Q/--quote <command>" | ||||
| (FTP) Send an arbitrary command to the remote FTP server. Quote commands are | ||||
| sent BEFORE the transfer is taking place (just after the initial PWD command | ||||
| to be exact). To make commands take place after a successful transfer, prefix | ||||
| @@ -874,9 +887,9 @@ This option may be used any number of times. To control where this URL is | ||||
| written, use the \fI-o/--output\fP or the \fI-O/--remote-name\fP options. | ||||
| .IP "-v/--verbose" | ||||
| Makes the fetching more verbose/talkative. Mostly usable for debugging. Lines | ||||
| starting with '>' means data sent by curl, '<' means data received by curl | ||||
| that is hidden in normal cases and lines starting with '*' means additional | ||||
| info provided by curl. | ||||
| starting with '>' means data sent by curl (this data may in itself contain | ||||
| newlines), '<' means data received by curl that is hidden in normal cases and | ||||
| lines starting with '*' means additional info provided by curl. | ||||
|  | ||||
| Note that if you only want HTTP headers in the output, \fI-i/--include\fP | ||||
| might be option you're looking for. | ||||
| @@ -920,6 +933,9 @@ SPNEGO Negotiate authentication is supported. | ||||
| This curl supports transfers of large files, files larger than 2GB. | ||||
| .IP "IDN" | ||||
| This curl supports IDN - international domain names. | ||||
| .IP "SSPI" | ||||
| SSPI is supported. If you use NTLM and set a blank user name, curl will | ||||
| authenticate with your current user and password. | ||||
| .RE | ||||
| .IP "-w/--write-out <format>" | ||||
| Defines what to display after a completed and successful operation. The format | ||||
| @@ -1271,5 +1287,5 @@ http://curl.haxx.se | ||||
| ftp://ftp.sunet.se/pub/www/utilities/curl/ | ||||
| .SH "SEE ALSO" | ||||
| .BR ftp (1), | ||||
| .BR wget (1), | ||||
| .BR wget (1) | ||||
|  | ||||
|   | ||||
| @@ -41,9 +41,9 @@ general you should instead use the specific relative time compared to | ||||
| UTC. Supported formats include: -1200, MST, +0100. | ||||
| .TP | ||||
| .B day of the week items | ||||
| Specifies a day of the week. Days of the week may be spelled out in full: | ||||
| `Sunday', `Monday', etc or they may be abbreviated to their first three | ||||
| letters. This is usually not info that adds anything. | ||||
| Specifies a day of the week. Days of the week may be spelled out in full | ||||
| (using english): `Sunday', `Monday', etc or they may be abbreviated to their | ||||
| first three letters. This is usually not info that adds anything. | ||||
| .TP | ||||
| .B pure numbers | ||||
| If a decimal number of the form YYYYMMDD appears, then YYYY is read as the | ||||
| @@ -85,7 +85,12 @@ This function returns -1 when it fails to parse the date string. Otherwise it | ||||
| returns the number of seconds as described. | ||||
|  | ||||
| If the year is larger than 2037 on systems with 32 bit time_t, this function | ||||
| will return 0x7fffffff (since that is the largest possible 31 bit number). | ||||
| will return 0x7fffffff (since that is the largest possible signed 32 bit | ||||
| number). | ||||
|  | ||||
| Having a 64 bit time_t is not a guarantee that dates beyond 03:14:07 UTC, | ||||
| January 19, 2038 will work fine. On systems with a 64 bit time_t but with a | ||||
| crippled mktime(), \fIcurl_getdate\fP will return -1 in this case. | ||||
| .SH REWRITE | ||||
| The former version of this function was built with yacc and was not only very | ||||
| large, it was also never quite understood and it wasn't possible to build with | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_multi_fdset 3 "15 Apr 2004" "libcurl 7.9.5" "libcurl Manual" | ||||
| .TH curl_multi_fdset 3 "18 Apr 2005" "libcurl 7.9.5" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_multi_fdset - extracts file descriptor information from a multi handle | ||||
| .SH SYNOPSIS | ||||
| @@ -15,15 +15,17 @@ CURLMcode curl_multi_fdset(CURLM *multi_handle, | ||||
| .ad | ||||
| .SH DESCRIPTION | ||||
| This function extracts file descriptor information from a given multi_handle. | ||||
| libcurl returns its fd_set sets. The application can use these to select() | ||||
| on. The \fIcurl_multi_perform(3)\fP function should be called as soon as one | ||||
| of them are ready to be read from or written to. | ||||
| libcurl returns its fd_set sets. The application can use these to select() on, | ||||
| but be sure to FD_ZERO them before calling this function as | ||||
| \fIcurl_multi_fdset(3)\fP only adds its own descriptors it doesn't zero or | ||||
| otherwise remove any other. The \fIcurl_multi_perform(3)\fP function should be | ||||
| called as soon as one of them are ready to be read from or written to. | ||||
|  | ||||
| You should also be aware that when doing select(), you should consider using a | ||||
| rather small (single-digit number of seconds) timeout and call | ||||
| \fIcurl_multi_perform\fP regularly - even if no activity has been seen on the | ||||
| fd_sets - as otherwise libcurl-internal retries and timeouts may not work as | ||||
| you'd think. | ||||
| you'd think and want. | ||||
| .SH RETURN VALUE | ||||
| CURLMcode type, general libcurl multi interface error code. See | ||||
| \fIlibcurl-errors(3)\fP | ||||
|   | ||||
| @@ -1,8 +1,6 @@ | ||||
| .\" You can view this file with: | ||||
| .\" nroff -man [file] | ||||
| .\" $Id$ | ||||
| .\" | ||||
| .TH curl_version_info 3 "11 May 2004" "libcurl 7.12" "libcurl Manual" | ||||
| .TH curl_version_info 3 "11 Mar 2005" "libcurl 7.13.2" "libcurl Manual" | ||||
| .SH NAME | ||||
| curl_version_info - returns run-time libcurl version info | ||||
| .SH SYNOPSIS | ||||
| @@ -36,7 +34,7 @@ typedef struct { | ||||
|   const char *host;         /* human readable string */ | ||||
|   int features;             /* bitmask, see below */ | ||||
|   char *ssl_version;        /* human readable string */ | ||||
|   long ssl_version_num;     /* number */ | ||||
|   long ssl_version_num;     /* not used, always zero */ | ||||
|   const char *libz_version; /* human readable string */ | ||||
|   const char **protocols;   /* list of protocols */ | ||||
|  | ||||
| @@ -73,9 +71,9 @@ supports IPv6 | ||||
| .IP CURL_VERSION_KERBEROS4 | ||||
| supports kerberos4 (when using FTP) | ||||
| .IP CURL_VERSION_SSL | ||||
| supports SSL (HTTPS/FTPS) | ||||
| supports SSL (HTTPS/FTPS) (Added in 7.10) | ||||
| .IP CURL_VERSION_LIBZ | ||||
| supports HTTP deflate using libz | ||||
| supports HTTP deflate using libz (Added in 7.10) | ||||
| .IP CURL_VERSION_NTLM | ||||
| supports HTTP NTLM (added in 7.10.6) | ||||
| .IP CURL_VERSION_GSSNEGOTIATE | ||||
| @@ -91,10 +89,15 @@ interface. (added in 7.10.7) | ||||
| libcurl was built with support for SPNEGO authentication (Simple and Protected | ||||
| GSS-API Negotiation Mechanism, defined in RFC 2478.) (added in 7.10.8) | ||||
| .IP CURL_VERSION_LARGEFILE | ||||
| libcurl was built with support for large files. | ||||
| libcurl was built with support for large files. (Added in 7.11.1) | ||||
| .IP CURL_VERSION_IDN | ||||
| libcurl was built with support for IDNA, domain names with international | ||||
| letters. | ||||
| letters. (Added in 7.12.0) | ||||
| .IP CURL_VERSION_SSPI | ||||
| libcurl was built with support for SSPI. This is only available on Windows and | ||||
| makes libcurl use Windows-provided functions for NTLM authentication. It also | ||||
| allows libcurl to use the current user and the current user's password without | ||||
| the app having to pass them on. (Added in 7.13.2) | ||||
| .RE | ||||
| \fIssl_version\fP is an ascii string for the OpenSSL version used. If libcurl | ||||
| has no SSL support, this is NULL. | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -1358,8 +1358,8 @@ typedef struct { | ||||
|   const char *host;         /* OS/host/cpu/machine when configured */ | ||||
|   int features;             /* bitmask, see defines below */ | ||||
|   const char *ssl_version;  /* human readable string */ | ||||
|   long ssl_version_num;     /* number */ | ||||
|   const char *libz_version;       /* human readable string */ | ||||
|   long ssl_version_num;     /* not used anymore, always 0 */ | ||||
|   const char *libz_version; /* human readable string */ | ||||
|   /* protocols is terminated by an entry with a NULL protoname */ | ||||
|   const char * const *protocols; | ||||
|  | ||||
| @@ -1382,6 +1382,7 @@ typedef struct { | ||||
| #define CURL_VERSION_SPNEGO    (1<<8)  /* SPNEGO auth */ | ||||
| #define CURL_VERSION_LARGEFILE (1<<9)  /* supports files bigger than 2GB */ | ||||
| #define CURL_VERSION_IDN       (1<<10) /* International Domain Names support */ | ||||
| #define CURL_VERSION_SSPI      (1<<11) /* SSPI is supported */ | ||||
|  | ||||
| /* | ||||
|  * NAME curl_version_info() | ||||
|   | ||||
| @@ -28,7 +28,7 @@ | ||||
|  | ||||
| /* This is the version number of the libcurl package from which this header | ||||
|    file origins: */ | ||||
| #define LIBCURL_VERSION "7.13.1-CVS" | ||||
| #define LIBCURL_VERSION "7.14.0-CVS" | ||||
|  | ||||
| /* This is the numeric version of the libcurl version number, meant for easier | ||||
|    parsing and comparions by programs. The LIBCURL_VERSION_NUM define will | ||||
| @@ -44,12 +44,12 @@ | ||||
|    always a greater number in a more recent release. It makes comparisons with | ||||
|    greater than and less than work. | ||||
| */ | ||||
| #define LIBCURL_VERSION_NUM 0x070d01 | ||||
| #define LIBCURL_VERSION_NUM 0x070e00 | ||||
|  | ||||
| /* The numeric version number is also available "in parts" by using these | ||||
|    defines: */ | ||||
| #define LIBCURL_VERSION_MAJOR 7 | ||||
| #define LIBCURL_VERSION_MINOR 13 | ||||
| #define LIBCURL_VERSION_PATCH 1 | ||||
| #define LIBCURL_VERSION_MINOR 14 | ||||
| #define LIBCURL_VERSION_PATCH 0 | ||||
|  | ||||
| #endif /* __CURL_CURLVER_H */ | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -43,7 +43,8 @@ OBJS = $(OBJ_DIR)\transfer.obj         $(OBJ_DIR)\file.obj       & | ||||
|        $(OBJ_DIR)\hostip4.obj          $(OBJ_DIR)\hostthre.obj   & | ||||
|        $(OBJ_DIR)\hostip6.obj          $(OBJ_DIR)\inet_ntop.obj  & | ||||
|        $(OBJ_DIR)\hostsyn.obj          $(OBJ_DIR)\parsedate.obj  & | ||||
|        $(OBJ_DIR)\select.obj | ||||
|        $(OBJ_DIR)\select.obj           $(OBJ_DIR)\sslgen.obj     & | ||||
|        $(OBJ_DIR)\gtls.obj | ||||
|  | ||||
| RESOURCE = $(OBJ_DIR)\libcurl.res | ||||
|  | ||||
| @@ -355,3 +356,9 @@ $(OBJ_DIR)\parsedate.obj: parsedate.c setup.h config-win32.h ..\include\curl\cur | ||||
|   ..\include\curl\multi.h ..\include\curl\curl.h | ||||
|  | ||||
| $(OBJ_DIR)\select.obj: select.c setup.h config-win32.h select.h | ||||
|  | ||||
| $(OBJ_DIR)\gtls.obj: gtls.c setup.h config-win32.h | ||||
|  | ||||
| $(OBJ_DIR)\sslgen.obj: sslgen.c setup.h config-win32.h urldata.h cookie.h & | ||||
|   formdata.h timeval.h http_chunks.h hostip.h hash.h llist.h sslgen.h & | ||||
|   ssluse.h gtls.h sendf.h strequal.h url.h memory.h memdebug.h | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
| #                            | (__| |_| |  _ <| |___ | ||||
| #                             \___|\___/|_| \_\_____| | ||||
| # | ||||
| # Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
| # | ||||
| # This software is licensed as described in the file COPYING, which | ||||
| # you should have received as part of this distribution. The terms | ||||
| @@ -25,7 +25,7 @@ AUTOMAKE_OPTIONS = foreign nostdinc | ||||
| DSP = curllib.dsp | ||||
|  | ||||
| EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 Makefile.riscos $(DSP)    \ | ||||
|  curllib.dsw config-vms.h config-win32.h config-win32ce.h config-riscos.h     \ | ||||
|  curllib.dsw config-win32.h config-win32ce.h config-riscos.h     \ | ||||
|  config-mac.h config.h.in ca-bundle.crt README.encoding README.memoryleak     \ | ||||
|  README.ares README.curlx makefile.dj config.dj libcurl.framework.make	      \ | ||||
|  libcurl.plist libcurl.rc config-amigaos.h amigaos.c amigaos.h makefile.amiga \ | ||||
|   | ||||
| @@ -8,13 +8,15 @@ CSOURCES = file.c timeval.c base64.c hostip.c progress.c formdata.c	\ | ||||
|   content_encoding.c share.c http_digest.c md5.c http_negotiate.c	\ | ||||
|   http_ntlm.c inet_pton.c strtoofft.c strerror.c hostares.c hostasyn.c	\ | ||||
|   hostip4.c hostip6.c hostsyn.c hostthre.c inet_ntop.c parsedate.c	\ | ||||
|   select.c | ||||
|   select.c gtls.c sslgen.c | ||||
|  | ||||
| HHEADERS = arpa_telnet.h netrc.h file.h timeval.h base64.h hostip.h	\ | ||||
|   progress.h formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h	\ | ||||
|   if2ip.h speedcheck.h urldata.h ldap.h ssluse.h escape.h telnet.h	\ | ||||
|   getinfo.h strequal.h security.h krb4.h memdebug.h inet_ntoa_r.h	\ | ||||
|   getinfo.h strequal.h krb4.h memdebug.h inet_ntoa_r.h \ | ||||
|   http_chunks.h strtok.h connect.h llist.h hash.h content_encoding.h	\ | ||||
|   share.h md5.h http_digest.h http_negotiate.h http_ntlm.h ca-bundle.h	\ | ||||
|   inet_pton.h strtoofft.h strerror.h inet_ntop.h curlx.h memory.h	\ | ||||
|   setup.h transfer.h select.h easyif.h multiif.h parsedate.h | ||||
|   setup.h transfer.h select.h easyif.h multiif.h parsedate.h sslgen.h   \ | ||||
|   gtls.h | ||||
|  | ||||
|   | ||||
| @@ -27,7 +27,7 @@ endif | ||||
| # Edit the vars below to change NLM target settings. | ||||
| TARGET  = libcurl | ||||
| VERSION	= $(LIBCURL_VERSION) | ||||
| COPYR	= Copyright (c) 1996 - 2004, Daniel Stenberg, <daniel@haxx.se> | ||||
| COPYR	= Copyright (C) 1996 - 2005, Daniel Stenberg, <daniel@haxx.se> | ||||
| DESCR	= cURL libcurl $(LIBCURL_VERSION_STR) - http://curl.haxx.se | ||||
| MTSAFE	= YES | ||||
| STACK	= 64000 | ||||
| @@ -336,6 +336,7 @@ config.h: Makefile.netware | ||||
| 	@echo $(DL)#define SIZEOF_CURL_OFF_T 4$(DL) >> $@ | ||||
| 	@echo $(DL)#define STDC_HEADERS 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define TIME_WITH_SYS_TIME 1$(DL) >> $@ | ||||
| 	@echo $(DL)#define CURL_DISABLE_LDAP 1$(DL) >> $@ | ||||
| ifdef NW_WINSOCK | ||||
| 	@echo $(DL)#define HAVE_CLOSESOCKET 1$(DL) >> $@ | ||||
| else | ||||
|   | ||||
| @@ -12,7 +12,7 @@ objs =	o.base64 o.connect o.cookie o.dict \ | ||||
| 	o.memdebug o.mprintf o.netrc o.parsedate o.progress \ | ||||
| 	o.security o.select o.sendf o.speedcheck o.ssluse \ | ||||
| 	o.strequal o.strtok o.telnet o.timeval \ | ||||
| 	o.transfer o.url o.version o.strtoofft | ||||
| 	o.transfer o.url o.version o.strtoofft o.sslgen o.gtls | ||||
|  | ||||
| # Compile options: | ||||
| linkopts	= -o libcurl | ||||
| @@ -119,6 +119,12 @@ o.sendf:	c.sendf | ||||
| o.speedcheck:	c.speedcheck | ||||
| 		gcc $(compileropts) -c -o speedcheck.o c.speedcheck | ||||
|  | ||||
| o.gtls:	c.gtls | ||||
| 		gcc $(compileropts) -c -o gtls.o c.gtls | ||||
|  | ||||
| o.sslgen:	c.sslgen | ||||
| 		gcc $(compileropts) -c -o sslgen.o c.sslgen | ||||
|  | ||||
| o.ssluse:	c.ssluse | ||||
| 		gcc $(compileropts) -c -o ssluse.o c.ssluse | ||||
|  | ||||
|   | ||||
| @@ -42,6 +42,24 @@ OPENSSL_PATH   = ../../openssl-0.9.7e | ||||
| ZLIB_PATH  = ../../zlib-1.2.1 | ||||
| !ENDIF | ||||
|  | ||||
| # USE_WINDOWS_SSPI uses windows libraries to allow NTLM authentication | ||||
| # without an openssl installation and offers the ability to authenticate | ||||
| # using the "current logged in user".  It does however require that the | ||||
| # Windows SDK be installed. | ||||
| # | ||||
| # If, for some reason the Windows SDK is installed but not installed | ||||
| # in the default location, you can specify WINDOWS_SDK_PATH. | ||||
| # It can be downloaded from: | ||||
| # http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ | ||||
|  | ||||
| # USE_WINDOWS_SSPI = 1 | ||||
|  | ||||
| !IFDEF WINDOWS_SSPI | ||||
| !IFNDEF WINDOWS_SDK_PATH | ||||
| WINDOWS_SDK_PATH = "C:\Program Files\Microsoft SDK" | ||||
| !ENDIF | ||||
| !ENDIF | ||||
|  | ||||
| # Use the high resolution time by default.  Comment this out to use low | ||||
| # resolution time and not require winmm.lib | ||||
| USEMM_LIBS = YES | ||||
| @@ -69,6 +87,11 @@ CFLAGS     = $(CFLAGS) /DWITHOUT_MM_LIB | ||||
| #  RSAglue.lib was formerly needed in the SSLLIBS | ||||
| CFGSET     = FALSE | ||||
|  | ||||
| !IFDEF WINDOWS_SSPI | ||||
| CFLAGS = $(CFLAGS) /DUSE_WINDOWS_SSPI /I$(WINDOWS_SDK_PATH)\include | ||||
| LFLAGS = $(LFLAGS) $(WINDOWS_SDK_PATH)\lib\secur32.lib | ||||
| !ENDIF | ||||
|  | ||||
| ###################### | ||||
| # release | ||||
|  | ||||
| @@ -120,10 +143,10 @@ CFGSET   = TRUE | ||||
| # release-ssl-dll | ||||
|  | ||||
| !IF "$(CFG)" == "release-ssl-dll" | ||||
| TARGET   = $(LIB_NAME).lib | ||||
| TARGET   = $(LIB_NAME).dll | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /out:$(DIROBJ)\$(TARGET) | ||||
| LNK      = $(LNKDLL) $(WINLIBS) /out:$(DIROBJ)\$(TARGET) $(SSLLIBS) $(LFLAGSSSL) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME).lib | ||||
| CC       = $(CCNODBG) $(CFLAGSSSL) | ||||
| CFGSET   = TRUE | ||||
| !ENDIF | ||||
| @@ -297,7 +320,7 @@ CFGSET   = TRUE | ||||
| !IF "$(CFG)" == "debug-dll" | ||||
| TARGET = $(LIB_NAME_DEBUG).dll | ||||
| DIROBJ = $(CFG) | ||||
| LNK    = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| LNK    = $(LNKDLL) $(WINLIBS) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| CC     = $(CCDEBUG) | ||||
| CFGSET = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| @@ -310,7 +333,7 @@ RESOURCE = $(DIROBJ)\libcurl.res | ||||
| TARGET   = $(LIB_NAME_DEBUG).dll | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(LFLAGSSSL) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| @@ -323,7 +346,7 @@ RESOURCE = $(DIROBJ)\libcurl.res | ||||
| TARGET   = $(LIB_NAME_DEBUG).dll | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(ZLIBLIBSDLL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| CC       = $(CCDEBUG) $(CFLAGSZLIB) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| @@ -337,7 +360,7 @@ TARGET   = $(LIB_NAME_DEBUG).dll | ||||
| DIROBJ   = $(CFG) | ||||
| LFLAGSZLIB = "/LIBPATH:$(ZLIB_PATH)" | ||||
| LFLAGSSSL = "/LIBPATH:$(OPENSSL_PATH)\out32dll" | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(LIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| LNK      = $(LNKDLL) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBSDLL) $(LFLAGSSSL) $(LFLAGSZLIB) /DEBUG /out:$(DIROBJ)\$(TARGET) /IMPLIB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib /PDB:$(DIROBJ)\$(IMPLIB_NAME_DEBUG).pdb | ||||
| CC       = $(CCDEBUG) $(CFLAGSSSL) $(CFLAGSZLIB) | ||||
| CFGSET   = TRUE | ||||
| RESOURCE = $(DIROBJ)\libcurl.res | ||||
| @@ -405,6 +428,7 @@ X_OBJS= \ | ||||
| 	$(DIROBJ)\telnet.obj \ | ||||
| 	$(DIROBJ)\parsedate.obj \ | ||||
| 	$(DIROBJ)\getenv.obj \ | ||||
| 	$(DIROBJ)\gtls.obj \ | ||||
| 	$(DIROBJ)\inet_pton.obj \ | ||||
| 	$(DIROBJ)\hostip.obj \ | ||||
| 	$(DIROBJ)\hostasyn.obj \ | ||||
| @@ -420,6 +444,7 @@ X_OBJS= \ | ||||
| 	$(DIROBJ)\progress.obj \ | ||||
| 	$(DIROBJ)\sendf.obj \ | ||||
| 	$(DIROBJ)\speedcheck.obj \ | ||||
| 	$(DIROBJ)\sslgen.obj \ | ||||
| 	$(DIROBJ)\ssluse.obj \ | ||||
| 	$(DIROBJ)\timeval.obj \ | ||||
| 	$(DIROBJ)\url.obj \ | ||||
| @@ -454,7 +479,7 @@ $(TARGET): $(X_OBJS) | ||||
| 	-xcopy $(DIROBJ)\$(LIB_NAME_DEBUG).dll . /y | ||||
| 	-xcopy $(DIROBJ)\$(LIB_NAME_DEBUG).lib . /y | ||||
| 	-xcopy $(DIROBJ)\$(IMPLIB_NAME).lib    . /y | ||||
| 	-xcopy $(DIROBJ)\$(IMPLIB_NAME).lib    . /y | ||||
| 	-xcopy $(DIROBJ)\$(IMPLIB_NAME_DEBUG).lib . /y | ||||
| 	-xcopy $(DIROBJ)\*.exp                 . /y | ||||
| 	-xcopy $(DIROBJ)\*.pdb                 . /y | ||||
|  | ||||
|   | ||||
							
								
								
									
										17
									
								
								lib/TODO.gnutls
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								lib/TODO.gnutls
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| Things to fix for the GnuTLS support | ||||
| ==================================== | ||||
|  | ||||
| * make the configure --with-ssl option first check for OpenSSL and then for | ||||
|   GnuTLS if OpenSSL wasn't detected. | ||||
|  | ||||
| * Get NTLM working using the functions provided by libgcrypt, since GnuTLS | ||||
|   already depends on that to function. Not strictly SSL/TLS related, but | ||||
|   hey... Another option is to get available DES and MD4 source code from the | ||||
|   cryptopp library. They are fine license-wise, but are C++. | ||||
|  | ||||
| * SSL engine stuff? | ||||
|  | ||||
|   SRP for TLS | ||||
|  | ||||
| * Work out a common method with Peter Sylvester's OpenSSL-patch for SRP | ||||
|   on the TLS to provide name and password | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -57,6 +57,8 @@ | ||||
|  | ||||
| #define USE_OPENSSL 1 | ||||
| #define USE_SSLEAY 1 | ||||
| #define CURL_DISABLE_LDAP 1 | ||||
|  | ||||
|  | ||||
| #define OS "AmigaOS" | ||||
|  | ||||
|   | ||||
| @@ -36,6 +36,8 @@ | ||||
| #       define USE_OPENSSL      1 | ||||
| #endif | ||||
|  | ||||
| #define CURL_DISABLE_LDAP       1 | ||||
|  | ||||
| #define HAVE_RAND_STATUS        1 | ||||
| #define HAVE_RAND_EGD           1 | ||||
|  | ||||
|   | ||||
| @@ -388,3 +388,6 @@ | ||||
|  | ||||
| #define HAVE_FIONBIO | ||||
|  | ||||
| /* to disable LDAP */ | ||||
| #define CURL_DISABLE_LDAP | ||||
|  | ||||
|   | ||||
							
								
								
									
										385
									
								
								lib/config-vms.h
									
									
									
									
									
								
							
							
						
						
									
										385
									
								
								lib/config-vms.h
									
									
									
									
									
								
							| @@ -1,385 +0,0 @@ | ||||
| /* 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 HAVE_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.  */ | ||||
| #define HAVE_OPENSSL_CRYPTO_H 1 | ||||
|  | ||||
| /* Define if you have the <openssl/err.h> header file.  */ | ||||
| #define HAVE_OPENSSL_ERR_H      1 | ||||
|  | ||||
| /* Define if you have the <openssl/pem.h> header file.  */ | ||||
| #define HAVE_OPENSSL_PEM_H      1 | ||||
|  | ||||
| /* Define if you have the <openssl/rsa.h> header file.  */ | ||||
| #define HAVE_OPENSSL_RSA_H 1 | ||||
|  | ||||
| /* Define if you have the <openssl/ssl.h> header file.  */ | ||||
| #define HAVE_OPENSSL_SSL_H      1 | ||||
|  | ||||
| /* Define if you have the <openssl/x509.h> header file.  */ | ||||
| #define HAVE_OPENSSL_X509_H     1 | ||||
|  | ||||
| /* 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).  */ | ||||
| #define HAVE_LIBCRYPTO 1 | ||||
|  | ||||
| /* 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).  */ | ||||
| #define HAVE_LIBSSL     1 | ||||
|  | ||||
| /* 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 | ||||
|  | ||||
| /* if OpenSSL is in use */ | ||||
| #define USE_OPENSSL 1 | ||||
|  | ||||
| /* if SSL is enabled */ | ||||
| #define USE_SSLEAY 1 | ||||
|  | ||||
| /* 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 if you have the `strtoll' function. */ | ||||
| #undef HAVE_STRTOLL | ||||
|  | ||||
| #define HAVE_MEMORY_H   1 | ||||
|  | ||||
| #define HAVE_FIONBIO    1 | ||||
|  | ||||
| /* Define if you have the `sigsetjmp' function. */ | ||||
| #define HAVE_SIGSETJMP 1 | ||||
|  | ||||
| /* Define to 1 if you have the <setjmp.h> header file. */ | ||||
| #define HAVE_SETJMP_H 1 | ||||
|  | ||||
| /* | ||||
|  * This needs to be defined for OpenSSL 0.9.7 and other versions that have the | ||||
|  * ENGINE stuff supported. If an include of "openssl/engine.h" fails, then | ||||
|  * undefine the define below. | ||||
| */ | ||||
| #define HAVE_OPENSSL_ENGINE_H 1 | ||||
| @@ -232,6 +232,12 @@ | ||||
| /* use ioctlsocket() for non-blocking sockets */ | ||||
| #define HAVE_IOCTLSOCKET | ||||
|  | ||||
| /* lber dynamic library file */ | ||||
| /* #undef DL_LBER_FILE */ | ||||
|  | ||||
| /* ldap dynamic library file */ | ||||
| #define DL_LDAP_FILE "wldap32.dll" | ||||
|  | ||||
| /************************************************* | ||||
|  * This section is for compiler specific defines.* | ||||
|  *************************************************/ | ||||
|   | ||||
| @@ -93,6 +93,9 @@ | ||||
|   #define USE_OPENSSL            1 | ||||
| #endif | ||||
|  | ||||
| /* to disable LDAP */ | ||||
| #define CURL_DISABLE_LDAP        1 | ||||
|  | ||||
| /* Because djgpp <= 2.03 doesn't have snprintf() etc. | ||||
|  */ | ||||
| #if (DJGPP_MINOR < 4) | ||||
|   | ||||
| @@ -364,6 +364,9 @@ static CURLcode bindlocal(struct connectdata *conn, | ||||
|     return CURLE_OK; | ||||
|  | ||||
|   } /* end of device selection support */ | ||||
| #else | ||||
|   (void)conn; | ||||
|   (void)sockfd; | ||||
| #endif /* end of HAVE_INET_NTOA */ | ||||
|  | ||||
|   return CURLE_HTTP_PORT_FAILED; | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -75,7 +75,7 @@ | ||||
| #include "urldata.h" | ||||
| #include <curl/curl.h> | ||||
| #include "transfer.h" | ||||
| #include "ssluse.h" | ||||
| #include "sslgen.h" | ||||
| #include "url.h" | ||||
| #include "getinfo.h" | ||||
| #include "hostip.h" | ||||
| @@ -201,7 +201,7 @@ CURLcode curl_global_init(long flags) | ||||
|   Curl_ccalloc = (curl_calloc_callback)calloc; | ||||
|  | ||||
|   if (flags & CURL_GLOBAL_SSL) | ||||
|     if (!Curl_SSL_init()) | ||||
|     if (!Curl_ssl_init()) | ||||
|       return CURLE_FAILED_INIT; | ||||
|  | ||||
|   if (flags & CURL_GLOBAL_WIN32) | ||||
| @@ -266,7 +266,7 @@ void curl_global_cleanup(void) | ||||
|   Curl_global_host_cache_dtor(); | ||||
|  | ||||
|   if (init_flags & CURL_GLOBAL_SSL) | ||||
|     Curl_SSL_cleanup(); | ||||
|     Curl_ssl_cleanup(); | ||||
|  | ||||
|   if (init_flags & CURL_GLOBAL_WIN32) | ||||
|     win32_cleanup(); | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
							
								
								
									
										101
									
								
								lib/ftp.c
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								lib/ftp.c
									
									
									
									
									
								
							| @@ -82,13 +82,12 @@ | ||||
| #include "ftp.h" | ||||
|  | ||||
| #ifdef HAVE_KRB4 | ||||
| #include "security.h" | ||||
| #include "krb4.h" | ||||
| #endif | ||||
|  | ||||
| #include "strtoofft.h" | ||||
| #include "strequal.h" | ||||
| #include "ssluse.h" | ||||
| #include "sslgen.h" | ||||
| #include "connect.h" | ||||
| #include "strerror.h" | ||||
| #include "memory.h" | ||||
| @@ -235,6 +234,17 @@ static CURLcode AllowServerConnect(struct connectdata *conn) | ||||
|   return CURLE_OK; | ||||
| } | ||||
|  | ||||
| /* initialize stuff to prepare for reading a fresh new response */ | ||||
| static void ftp_respinit(struct connectdata *conn) | ||||
| { | ||||
|   struct FTP *ftp = conn->proto.ftp; | ||||
|   ftp->nread_resp = 0; | ||||
|   ftp->linestart_resp = conn->data->state.buffer; | ||||
| } | ||||
|  | ||||
| /* macro to check for the last line in an FTP server response */ | ||||
| #define lastline(line) (isdigit((int)line[0]) && isdigit((int)line[1]) && \ | ||||
|                         isdigit((int)line[2]) && (' ' == line[3])) | ||||
|  | ||||
| static CURLcode ftp_readresp(curl_socket_t sockfd, | ||||
|                              struct connectdata *conn, | ||||
| @@ -246,7 +256,6 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, | ||||
|   ssize_t gotbytes; | ||||
|   char *ptr; | ||||
|   struct SessionHandle *data = conn->data; | ||||
|   char *line_start; | ||||
|   char *buf = data->state.buffer; | ||||
|   CURLcode result = CURLE_OK; | ||||
|   struct FTP *ftp = conn->proto.ftp; | ||||
| @@ -255,10 +264,10 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, | ||||
|   if (ftpcode) | ||||
|     *ftpcode = 0; /* 0 for errors or not done */ | ||||
|  | ||||
|   ptr=buf; | ||||
|   line_start = buf; | ||||
|   ptr=buf + ftp->nread_resp; | ||||
|  | ||||
|   perline=0; | ||||
|   perline= ptr-ftp->linestart_resp; /* number of bytes in the current line, | ||||
|                                        so far */ | ||||
|   keepon=TRUE; | ||||
|  | ||||
|   while((ftp->nread_resp<BUFSIZE) && (keepon && !result)) { | ||||
| @@ -313,7 +322,8 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, | ||||
|  | ||||
|           /* output debug output if that is requested */ | ||||
|           if(data->set.verbose) | ||||
|             Curl_debug(data, CURLINFO_HEADER_IN, line_start, perline, conn); | ||||
|             Curl_debug(data, CURLINFO_HEADER_IN, | ||||
|                        ftp->linestart_resp, perline, conn); | ||||
|  | ||||
|           /* | ||||
|            * We pass all response-lines to the callback function registered | ||||
| @@ -321,24 +331,21 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, | ||||
|            * headers. | ||||
|            */ | ||||
|           result = Curl_client_write(data, CLIENTWRITE_HEADER, | ||||
|                                      line_start, perline); | ||||
|                                      ftp->linestart_resp, perline); | ||||
|           if(result) | ||||
|             return result; | ||||
|  | ||||
| #define lastline(line) (isdigit((int)line[0]) && isdigit((int)line[1]) && \ | ||||
|                         isdigit((int)line[2]) && (' ' == line[3])) | ||||
|  | ||||
|           if(perline>3 && lastline(line_start)) { | ||||
|           if(perline>3 && lastline(ftp->linestart_resp)) { | ||||
|             /* This is the end of the last line, copy the last line to the | ||||
|                start of the buffer and zero terminate, for old times sake (and | ||||
|                krb4)! */ | ||||
|             char *meow; | ||||
|             int n; | ||||
|             for(meow=line_start, n=0; meow<ptr; meow++, n++) | ||||
|             for(meow=ftp->linestart_resp, n=0; meow<ptr; meow++, n++) | ||||
|               buf[n] = *meow; | ||||
|             *meow=0; /* zero terminate */ | ||||
|             keepon=FALSE; | ||||
|             line_start = ptr+1; /* advance pointer */ | ||||
|             ftp->linestart_resp = ptr+1; /* advance pointer */ | ||||
|             i++; /* skip this before getting out */ | ||||
|  | ||||
|             *size = ftp->nread_resp; /* size of the response */ | ||||
| @@ -346,7 +353,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, | ||||
|             break; | ||||
|           } | ||||
|           perline=0; /* line starts over here */ | ||||
|           line_start = ptr+1; | ||||
|           ftp->linestart_resp = ptr+1; | ||||
|         } | ||||
|       } | ||||
|       if(!keepon && (i != gotbytes)) { | ||||
| @@ -357,7 +364,7 @@ static CURLcode ftp_readresp(curl_socket_t sockfd, | ||||
|         ftp->cache_size = gotbytes - i; | ||||
|         ftp->cache = (char *)malloc((int)ftp->cache_size); | ||||
|         if(ftp->cache) | ||||
|           memcpy(ftp->cache, line_start, (int)ftp->cache_size); | ||||
|           memcpy(ftp->cache, ftp->linestart_resp, (int)ftp->cache_size); | ||||
|         else | ||||
|           return CURLE_OUT_OF_MEMORY; /**BANG**/ | ||||
|       } | ||||
| @@ -550,9 +557,6 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */ | ||||
|             if(result) | ||||
|               return result; | ||||
|  | ||||
| #define lastline(line) (isdigit((int)line[0]) && isdigit((int)line[1]) && \ | ||||
|                         isdigit((int)line[2]) && (' ' == line[3])) | ||||
|  | ||||
|             if(perline>3 && lastline(line_start)) { | ||||
|               /* This is the end of the last line, copy the last | ||||
|                * line to the start of the buffer and zero terminate, | ||||
| @@ -1063,7 +1067,7 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, | ||||
|       /* we set the secondary socket variable to this for now, it | ||||
|          is only so that the cleanup function will close it in case | ||||
|          we fail before the true secondary stuff is made */ | ||||
|       if(-1 != conn->sock[SECONDARYSOCKET]) | ||||
|       if(CURL_SOCKET_BAD != conn->sock[SECONDARYSOCKET]) | ||||
|         sclose(conn->sock[SECONDARYSOCKET]); | ||||
|       conn->sock[SECONDARYSOCKET] = portsock; | ||||
|  | ||||
| @@ -1339,14 +1343,16 @@ static CURLcode ftp_state_post_cwd(struct connectdata *conn) | ||||
|  | ||||
|  | ||||
| /* This is called after the TYPE and possible quote commands have been sent */ | ||||
| static CURLcode ftp_state_ul_setup(struct connectdata *conn) | ||||
| static CURLcode ftp_state_ul_setup(struct connectdata *conn, | ||||
|                                    bool sizechecked) | ||||
| { | ||||
|   CURLcode result = CURLE_OK; | ||||
|   struct FTP *ftp = conn->proto.ftp; | ||||
|   struct SessionHandle *data = conn->data; | ||||
|   curl_off_t passed=0; | ||||
|  | ||||
|   if(conn->resume_from) { | ||||
|   if((conn->resume_from && !sizechecked) || | ||||
|      ((conn->resume_from > 0) && sizechecked)) { | ||||
|     /* we're about to continue the uploading of a file */ | ||||
|     /* 1. get already existing file's size. We use the SIZE command for this | ||||
|        which may not exist in the server!  The SIZE command is not in | ||||
| @@ -1480,7 +1486,7 @@ static CURLcode ftp_state_quote(struct connectdata *conn, | ||||
|       state(conn, FTP_RETR_SIZE); | ||||
|       break; | ||||
|     case FTP_STOR_PREQUOTE: | ||||
|       result = ftp_state_ul_setup(conn); | ||||
|       result = ftp_state_ul_setup(conn, FALSE); | ||||
|       break; | ||||
|     case FTP_POSTQUOTE: | ||||
|       break; | ||||
| @@ -1523,7 +1529,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, | ||||
|                       &separator[2], | ||||
|                       &num, | ||||
|                       &separator[3])) { | ||||
|         char sep1 = separator[0]; | ||||
|         const char sep1 = separator[0]; | ||||
|         int i; | ||||
|  | ||||
|         /* The four separators should be identical, or else this is an oddly | ||||
| @@ -1538,7 +1544,7 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, | ||||
|           newport = num; | ||||
|  | ||||
|           /* use the same IP we are already connected to */ | ||||
|           snprintf(newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str, newhost); | ||||
|           snprintf(newhost, NEWHOST_BUFSIZE, "%s", conn->ip_addr_str); | ||||
|         } | ||||
|       } | ||||
|       else | ||||
| @@ -1739,7 +1745,11 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn, | ||||
|       /* If we asked for a time of the file and we actually got one as well, | ||||
|          we "emulate" a HTTP-style header in our output. */ | ||||
|  | ||||
|       if(data->set.get_filetime && (data->info.filetime>=0) ) { | ||||
|       if(conn->bits.no_body && | ||||
|          data->set.include_header && | ||||
|          ftp->file && | ||||
|          data->set.get_filetime && | ||||
|          (data->info.filetime>=0) ) { | ||||
|         struct tm *tm; | ||||
|         time_t clock = (time_t)data->info.filetime; | ||||
| #ifdef HAVE_GMTIME_R | ||||
| @@ -1761,7 +1771,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn, | ||||
|         result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0); | ||||
|         if(result) | ||||
|           return result; | ||||
|       } | ||||
|       } /* end of a ridiculous amount of conditionals */ | ||||
|     } | ||||
|     break; | ||||
|   default: | ||||
| @@ -1936,7 +1946,7 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn, | ||||
|     result = ftp_state_post_retr_size(conn, filesize); | ||||
|   else if(instate == FTP_STOR_SIZE) { | ||||
|     conn->resume_from = filesize; | ||||
|     result = ftp_state_ul_setup(conn); | ||||
|     result = ftp_state_ul_setup(conn, TRUE); | ||||
|   } | ||||
|  | ||||
|   return result; | ||||
| @@ -2003,7 +2013,7 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn, | ||||
|        do the TLS stuff */ | ||||
|     infof(data, "Doing the SSL/TLS handshake on the data stream\n"); | ||||
|     /* BLOCKING */ | ||||
|     result = Curl_SSLConnect(conn, SECONDARYSOCKET); | ||||
|     result = Curl_ssl_connect(conn, SECONDARYSOCKET); | ||||
|     if(result) | ||||
|       return result; | ||||
|   } | ||||
| @@ -2111,7 +2121,7 @@ static CURLcode ftp_state_get_resp(struct connectdata *conn, | ||||
|       /* since we only have a plaintext TCP connection here, we must now | ||||
|          do the TLS stuff */ | ||||
|       infof(data, "Doing the SSL/TLS handshake on the data stream\n"); | ||||
|       result = Curl_SSLConnect(conn, SECONDARYSOCKET); | ||||
|       result = Curl_ssl_connect(conn, SECONDARYSOCKET); | ||||
|       if(result) | ||||
|         return result; | ||||
|     } | ||||
| @@ -2363,24 +2373,25 @@ static CURLcode ftp_statemach_act(struct connectdata *conn) | ||||
|        */ | ||||
|  | ||||
|       if((ftpcode == 234) || (ftpcode == 334)) { | ||||
|         /* Curl_SSLConnect is BLOCKING */ | ||||
|         result = Curl_SSLConnect(conn, FIRSTSOCKET); | ||||
|         if(result) | ||||
|           return result; | ||||
|         conn->protocol |= PROT_FTPS; | ||||
|         conn->ssl[SECONDARYSOCKET].use = FALSE; /* clear-text data */ | ||||
|         /* Curl_ssl_connect is BLOCKING */ | ||||
|         result = Curl_ssl_connect(conn, FIRSTSOCKET); | ||||
|         if(CURLE_OK == result) { | ||||
|           conn->protocol |= PROT_FTPS; | ||||
|           conn->ssl[SECONDARYSOCKET].use = FALSE; /* clear-text data */ | ||||
|           result = ftp_state_user(conn); | ||||
|         } | ||||
|       } | ||||
|       else if(ftp->count3 < 1) { | ||||
|         ftp->count3++; | ||||
|         ftp->count1 += ftp->count2; /* get next attempt */ | ||||
|         NBFTPSENDF(conn, "AUTH %s", ftpauth[ftp->count1]); | ||||
|         result = Curl_nbftpsendf(conn, "AUTH %s", ftpauth[ftp->count1]); | ||||
|         /* remain in this same state */ | ||||
|       } | ||||
|       else { | ||||
|       else | ||||
|         result = ftp_state_user(conn); | ||||
|         if(result) | ||||
|           return result; | ||||
|       } | ||||
|  | ||||
|       if(result) | ||||
|         return result; | ||||
|       break; | ||||
|  | ||||
|     case FTP_USER: | ||||
| @@ -2737,13 +2748,14 @@ CURLcode Curl_ftp_connect(struct connectdata *conn, | ||||
|     /* BLOCKING */ | ||||
|     /* FTPS is simply ftp with SSL for the control channel */ | ||||
|     /* now, perform the SSL initialization for this socket */ | ||||
|     result = Curl_SSLConnect(conn, FIRSTSOCKET); | ||||
|     result = Curl_ssl_connect(conn, FIRSTSOCKET); | ||||
|     if(result) | ||||
|       return result; | ||||
|   } | ||||
|  | ||||
|   /* When we connect, we start in the state where we await the 220 | ||||
|      response */ | ||||
|   ftp_respinit(conn); /* init the response reader stuff */ | ||||
|   state(conn, FTP_WAIT220); | ||||
|   ftp->response = Curl_tvnow(); /* start response time-out now! */ | ||||
|  | ||||
| @@ -2808,7 +2820,8 @@ CURLcode Curl_ftp_done(struct connectdata *conn, CURLcode status) | ||||
|   if(data->set.upload) { | ||||
|     if((-1 != data->set.infilesize) && | ||||
|        (data->set.infilesize != *ftp->bytecountp) && | ||||
|        !data->set.crlf) { | ||||
|        !data->set.crlf && | ||||
|        !ftp->no_transfer) { | ||||
|       failf(data, "Uploaded unaligned file size (%" FORMAT_OFF_T | ||||
|             " out of %" FORMAT_OFF_T " bytes)", | ||||
|             *ftp->bytecountp, data->set.infilesize); | ||||
| @@ -3216,6 +3229,8 @@ CURLcode Curl_nbftpsendf(struct connectdata *conn, | ||||
|   bytes_written=0; | ||||
|   write_len = strlen(s); | ||||
|  | ||||
|   ftp_respinit(conn); | ||||
|  | ||||
|   res = Curl_write(conn, conn->sock[FIRSTSOCKET], sptr, write_len, | ||||
|                    &bytes_written); | ||||
|  | ||||
|   | ||||
| @@ -33,7 +33,7 @@ | ||||
| #include <stdarg.h> | ||||
| #include <stdlib.h> | ||||
| #include "memory.h" | ||||
| #include "ssluse.h" | ||||
| #include "sslgen.h" | ||||
|  | ||||
| /* Make this the last #include */ | ||||
| #include "memdebug.h" | ||||
| @@ -182,7 +182,7 @@ CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...) | ||||
|     *param_longp = data->info.numconnects; | ||||
|     break; | ||||
|   case CURLINFO_SSL_ENGINES: | ||||
|     *param_slistp = Curl_SSL_engines_list(data); | ||||
|     *param_slistp = Curl_ssl_engines_list(data); | ||||
|     break; | ||||
|   default: | ||||
|     return CURLE_BAD_FUNCTION_ARGUMENT; | ||||
|   | ||||
							
								
								
									
										486
									
								
								lib/gtls.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										486
									
								
								lib/gtls.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,486 @@ | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|  * are also available at http://curl.haxx.se/docs/copyright.html. | ||||
|  * | ||||
|  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||
|  * copies of the Software, and permit persons to whom the Software is | ||||
|  * furnished to do so, under the terms of the COPYING file. | ||||
|  * | ||||
|  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||
|  * KIND, either express or implied. | ||||
|  * | ||||
|  * $Id$ | ||||
|  ***************************************************************************/ | ||||
|  | ||||
| /* | ||||
|  * Source file for all GnuTLS-specific code for the TLS/SSL layer. No code | ||||
|  * but sslgen.c should ever call or use these functions. | ||||
|  * | ||||
|  * Note: don't use the GnuTLS' *_t variable type names in this source code, | ||||
|  * since they were not present in 1.0.X. | ||||
|  */ | ||||
|  | ||||
| #include "setup.h" | ||||
| #ifdef USE_GNUTLS | ||||
| #include <gnutls/gnutls.h> | ||||
| #include <gnutls/x509.h> | ||||
|  | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <ctype.h> | ||||
| #ifdef HAVE_SYS_TYPES_H | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_SOCKET_H | ||||
| #include <sys/socket.h> | ||||
| #endif | ||||
|  | ||||
| #include "urldata.h" | ||||
| #include "sendf.h" | ||||
| #include "gtls.h" | ||||
| #include "sslgen.h" | ||||
| #include "parsedate.h" | ||||
| #include "connect.h" /* for the connect timeout */ | ||||
| #include "select.h" | ||||
| #define _MPRINTF_REPLACE /* use our functions only */ | ||||
| #include <curl/mprintf.h> | ||||
| #include "memory.h" | ||||
| /* The last #include file should be: */ | ||||
| #include "memdebug.h" | ||||
|  | ||||
| /* Enable GnuTLS debugging by defining GTLSDEBUG */ | ||||
| /*#define GTLSDEBUG */ | ||||
|  | ||||
| #ifdef GTLSDEBUG | ||||
| static void tls_log_func(int level, const char *str) | ||||
| { | ||||
|     fprintf(stderr, "|<%d>| %s", level, str); | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* Global GnuTLS init, called from Curl_ssl_init() */ | ||||
| int Curl_gtls_init(void) | ||||
| { | ||||
|   gnutls_global_init(); | ||||
| #ifdef GTLSDEBUG | ||||
|   gnutls_global_set_log_function(tls_log_func); | ||||
|   gnutls_global_set_log_level(2); | ||||
| #endif | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| int Curl_gtls_cleanup(void) | ||||
| { | ||||
|   gnutls_global_deinit(); | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| static void showtime(struct SessionHandle *data, | ||||
|                      const char *text, | ||||
|                      time_t stamp) | ||||
| { | ||||
|   struct tm *tm; | ||||
| #ifdef HAVE_GMTIME_R | ||||
|   struct tm buffer; | ||||
|   tm = (struct tm *)gmtime_r(&stamp, &buffer); | ||||
| #else | ||||
|   tm = gmtime(&stamp); | ||||
| #endif | ||||
|   snprintf(data->state.buffer, | ||||
|            BUFSIZE, | ||||
|            "\t %s: %s, %02d %s %4d %02d:%02d:%02d GMT\n", | ||||
|            text, | ||||
|            Curl_wkday[tm->tm_wday?tm->tm_wday-1:6], | ||||
|            tm->tm_mday, | ||||
|            Curl_month[tm->tm_mon], | ||||
|            tm->tm_year + 1900, | ||||
|            tm->tm_hour, | ||||
|            tm->tm_min, | ||||
|            tm->tm_sec); | ||||
|   infof(data, "%s", data->state.buffer); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * This function is called after the TCP connect has completed. Setup the TLS | ||||
|  * layer and do all necessary magic. | ||||
|  */ | ||||
| CURLcode | ||||
| Curl_gtls_connect(struct connectdata *conn, | ||||
|                   int sockindex) | ||||
|  | ||||
| { | ||||
|   const int cert_type_priority[] = { GNUTLS_CRT_X509, 0 }; | ||||
|   struct SessionHandle *data = conn->data; | ||||
|   gnutls_session session; | ||||
|   int rc; | ||||
|   unsigned int cert_list_size; | ||||
|   const gnutls_datum *chainp; | ||||
|   unsigned int verify_status; | ||||
|   gnutls_x509_crt x509_cert; | ||||
|   char certbuf[256]; /* big enough? */ | ||||
|   size_t size; | ||||
|   unsigned int algo; | ||||
|   unsigned int bits; | ||||
|   time_t clock; | ||||
|   const char *ptr; | ||||
|   void *ssl_sessionid; | ||||
|   size_t ssl_idsize; | ||||
|  | ||||
|   /* GnuTLS only supports TLSv1 (and SSLv3?) */ | ||||
|   if(data->set.ssl.version == CURL_SSLVERSION_SSLv2) { | ||||
|     failf(data, "GnuTLS does not support SSLv2"); | ||||
|     return CURLE_SSL_CONNECT_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* allocate a cred struct */ | ||||
|   rc = gnutls_certificate_allocate_credentials(&conn->ssl[sockindex].cred); | ||||
|   if(rc < 0) { | ||||
|     failf(data, "gnutls_cert_all_cred() failed: %s", gnutls_strerror(rc)); | ||||
|     return CURLE_SSL_CONNECT_ERROR; | ||||
|   } | ||||
|  | ||||
|   if(data->set.ssl.CAfile) { | ||||
|     /* set the trusted CA cert bundle file */ | ||||
|     rc = gnutls_certificate_set_x509_trust_file(conn->ssl[sockindex].cred, | ||||
|                                                 data->set.ssl.CAfile, | ||||
|                                                 GNUTLS_X509_FMT_PEM); | ||||
|     if(rc < 0) { | ||||
|       infof(data, "error reading ca cert file %s (%s)\n", | ||||
|             data->set.ssl.CAfile, gnutls_strerror(rc)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /* Initialize TLS session as a client */ | ||||
|   rc = gnutls_init(&conn->ssl[sockindex].session, GNUTLS_CLIENT); | ||||
|   if(rc) { | ||||
|     failf(data, "gnutls_init() failed: %d", rc); | ||||
|     return CURLE_SSL_CONNECT_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* convenient assign */ | ||||
|   session = conn->ssl[sockindex].session; | ||||
|  | ||||
|   /* Use default priorities */ | ||||
|   rc = gnutls_set_default_priority(session); | ||||
|   if(rc < 0) | ||||
|     return CURLE_SSL_CONNECT_ERROR; | ||||
|  | ||||
|   /* Sets the priority on the certificate types supported by gnutls. Priority | ||||
|      is higher for types specified before others. After specifying the types | ||||
|      you want, you must append a 0. */ | ||||
|   rc = gnutls_certificate_type_set_priority(session, cert_type_priority); | ||||
|   if(rc < 0) | ||||
|     return CURLE_SSL_CONNECT_ERROR; | ||||
|  | ||||
|   /* put the anonymous credentials to the current session */ | ||||
|   rc = gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, | ||||
|                               conn->ssl[sockindex].cred); | ||||
|  | ||||
|   /* set the connection handle (file descriptor for the socket) */ | ||||
|   gnutls_transport_set_ptr(session, | ||||
|                            (gnutls_transport_ptr)conn->sock[sockindex]); | ||||
|  | ||||
|   /* This might be a reconnect, so we check for a session ID in the cache | ||||
|      to speed up things */ | ||||
|  | ||||
|   if(!Curl_ssl_getsessionid(conn, &ssl_sessionid, &ssl_idsize)) { | ||||
|     /* we got a session id, use it! */ | ||||
|     gnutls_session_set_data(session, ssl_sessionid, ssl_idsize); | ||||
|  | ||||
|     /* Informational message */ | ||||
|     infof (data, "SSL re-using session ID\n"); | ||||
|   } | ||||
|  | ||||
|   do { | ||||
|     rc = gnutls_handshake(session); | ||||
|  | ||||
|     if((rc == GNUTLS_E_AGAIN) || (rc == GNUTLS_E_INTERRUPTED)) { | ||||
|       long timeout_ms; | ||||
|       long has_passed; | ||||
|  | ||||
|       if(data->set.timeout || data->set.connecttimeout) { | ||||
|         /* get the most strict timeout of the ones converted to milliseconds */ | ||||
|         if(data->set.timeout && | ||||
|            (data->set.timeout>data->set.connecttimeout)) | ||||
|           timeout_ms = data->set.timeout*1000; | ||||
|         else | ||||
|           timeout_ms = data->set.connecttimeout*1000; | ||||
|       } | ||||
|       else | ||||
|         timeout_ms = DEFAULT_CONNECT_TIMEOUT; | ||||
|  | ||||
|       /* Evaluate in milliseconds how much time that has passed */ | ||||
|       has_passed = Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle); | ||||
|  | ||||
|       /* subtract the passed time */ | ||||
|       timeout_ms -= has_passed; | ||||
|  | ||||
|       if(timeout_ms < 0) { | ||||
|         /* a precaution, no need to continue if time already is up */ | ||||
|         failf(data, "SSL connection timeout"); | ||||
|         return CURLE_OPERATION_TIMEOUTED; | ||||
|       } | ||||
|  | ||||
|       rc = Curl_select(conn->sock[sockindex], | ||||
|                          conn->sock[sockindex], (int)timeout_ms); | ||||
|       if(rc > 0) | ||||
|         /* reabable or writable, go loop*/ | ||||
|         continue; | ||||
|       else if(0 == rc) { | ||||
|         /* timeout */ | ||||
|         failf(data, "SSL connection timeout"); | ||||
|         return CURLE_OPERATION_TIMEDOUT; | ||||
|       } | ||||
|       else { | ||||
|         /* anything that gets here is fatally bad */ | ||||
|         failf(data, "select on SSL socket, errno: %d", Curl_ourerrno()); | ||||
|         return CURLE_SSL_CONNECT_ERROR; | ||||
|       } | ||||
|     } | ||||
|     else | ||||
|       break; | ||||
|   } while(1); | ||||
|  | ||||
|   if (rc < 0) { | ||||
|     failf(data, "gnutls_handshake() failed: %d", rc); | ||||
|     /* gnutls_perror(ret); */ | ||||
|     return CURLE_SSL_CONNECT_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* This function will return the peer's raw certificate (chain) as sent by | ||||
|      the peer. These certificates are in raw format (DER encoded for | ||||
|      X.509). In case of a X.509 then a certificate list may be present. The | ||||
|      first certificate in the list is the peer's certificate, following the | ||||
|      issuer's certificate, then the issuer's issuer etc. */ | ||||
|  | ||||
|   chainp = gnutls_certificate_get_peers(session, &cert_list_size); | ||||
|   if(!chainp) { | ||||
|     if(data->set.ssl.verifyhost) { | ||||
|       failf(data, "failed to get server cert"); | ||||
|       return CURLE_SSL_PEER_CERTIFICATE; | ||||
|     } | ||||
|     infof(data, "\t common name: WARNING couldn't obtain\n"); | ||||
|   } | ||||
|  | ||||
|   /* This function will try to verify the peer's certificate and return its | ||||
|      status (trusted, invalid etc.). The value of status should be one or more | ||||
|      of the gnutls_certificate_status_t enumerated elements bitwise or'd. To | ||||
|      avoid denial of service attacks some default upper limits regarding the | ||||
|      certificate key size and chain size are set. To override them use | ||||
|      gnutls_certificate_set_verify_limits(). */ | ||||
|  | ||||
|   rc = gnutls_certificate_verify_peers2(session, &verify_status); | ||||
|   if (rc < 0) { | ||||
|     failf(data, "server cert verify failed: %d", rc); | ||||
|     return CURLE_SSL_CONNECT_ERROR; | ||||
|   } | ||||
|  | ||||
|   /* verify_status is a bitmask of gnutls_certificate_status bits */ | ||||
|   if(verify_status & GNUTLS_CERT_INVALID) { | ||||
|     if (data->set.ssl.verifypeer) { | ||||
|       failf(data, "server certificate verification failed. CAfile: %s", | ||||
|             data->set.ssl.CAfile?data->set.ssl.CAfile:"none"); | ||||
|       return CURLE_SSL_CACERT; | ||||
|     } | ||||
|     else | ||||
|       infof(data, "\t server certificate verification FAILED\n"); | ||||
|   } | ||||
|   else | ||||
|       infof(data, "\t server certificate verification OK\n"); | ||||
|  | ||||
|   /* initialize an X.509 certificate structure. */ | ||||
|   gnutls_x509_crt_init(&x509_cert); | ||||
|  | ||||
|   /* convert the given DER or PEM encoded Certificate to the native | ||||
|      gnutls_x509_crt_t format */ | ||||
|   gnutls_x509_crt_import(x509_cert, chainp, GNUTLS_X509_FMT_DER); | ||||
|  | ||||
|   size=sizeof(certbuf); | ||||
|   rc = gnutls_x509_crt_get_dn_by_oid(x509_cert, GNUTLS_OID_X520_COMMON_NAME, | ||||
|                                      0, /* the first and only one */ | ||||
|                                      TRUE, /* give to me raw please */ | ||||
|                                      certbuf, | ||||
|                                      &size); | ||||
|  | ||||
|   /* This function will check if the given certificate's subject matches the | ||||
|      given hostname. This is a basic implementation of the matching described | ||||
|      in RFC2818 (HTTPS), which takes into account wildcards, and the subject | ||||
|      alternative name PKIX extension. Returns non zero on success, and zero on | ||||
|      failure. */ | ||||
|   rc = gnutls_x509_crt_check_hostname(x509_cert, conn->host.name); | ||||
|  | ||||
|   if(!rc) { | ||||
|     if (data->set.ssl.verifyhost > 1) { | ||||
|       failf(data, "SSL: certificate subject name (%s) does not match " | ||||
|             "target host name '%s'", certbuf, conn->host.dispname); | ||||
|       gnutls_x509_crt_deinit(x509_cert); | ||||
|       return CURLE_SSL_PEER_CERTIFICATE; | ||||
|     } | ||||
|     else | ||||
|       infof(data, "\t common name: %s (does not match '%s')\n", | ||||
|             certbuf, conn->host.dispname); | ||||
|   } | ||||
|   else | ||||
|     infof(data, "\t common name: %s (matched)\n", certbuf); | ||||
|  | ||||
|   /* Show: | ||||
|  | ||||
|   - ciphers used | ||||
|   - subject | ||||
|   - start date | ||||
|   - expire date | ||||
|   - common name | ||||
|   - issuer | ||||
|  | ||||
|   */ | ||||
|  | ||||
|   /* public key algorithm's parameters */ | ||||
|   algo = gnutls_x509_crt_get_pk_algorithm(x509_cert, &bits); | ||||
|   infof(data, "\t certificate public key: %s\n", | ||||
|         gnutls_pk_algorithm_get_name(algo)); | ||||
|  | ||||
|   /* version of the X.509 certificate. */ | ||||
|   infof(data, "\t certificate version: #%d\n", | ||||
|         gnutls_x509_crt_get_version(x509_cert)); | ||||
|  | ||||
|  | ||||
|   size = sizeof(certbuf); | ||||
|   gnutls_x509_crt_get_dn(x509_cert, certbuf, &size); | ||||
|   infof(data, "\t subject: %s\n", certbuf); | ||||
|  | ||||
|   clock = gnutls_x509_crt_get_activation_time(x509_cert); | ||||
|   showtime(data, "start date", clock); | ||||
|  | ||||
|   clock = gnutls_x509_crt_get_expiration_time(x509_cert); | ||||
|   showtime(data, "expire date", clock); | ||||
|  | ||||
|   size = sizeof(certbuf); | ||||
|   gnutls_x509_crt_get_issuer_dn(x509_cert, certbuf, &size); | ||||
|   infof(data, "\t issuer: %s\n", certbuf); | ||||
|  | ||||
|   gnutls_x509_crt_deinit(x509_cert); | ||||
|  | ||||
|   /* compression algorithm (if any) */ | ||||
|   ptr = gnutls_compression_get_name(gnutls_compression_get(session)); | ||||
|   /* the *_get_name() says "NULL" if GNUTLS_COMP_NULL is returned */ | ||||
|   infof(data, "\t compression: %s\n", ptr); | ||||
|  | ||||
|   /* the name of the cipher used. ie 3DES. */ | ||||
|   ptr = gnutls_cipher_get_name(gnutls_cipher_get(session)); | ||||
|   infof(data, "\t cipher: %s\n", ptr); | ||||
|  | ||||
|   /* the MAC algorithms name. ie SHA1 */ | ||||
|   ptr = gnutls_mac_get_name(gnutls_mac_get(session)); | ||||
|   infof(data, "\t MAC: %s\n", ptr); | ||||
|  | ||||
|   if(!ssl_sessionid) { | ||||
|     /* this session was not previously in the cache, add it now */ | ||||
|  | ||||
|     /* get the session ID data size */ | ||||
|     gnutls_session_get_data(session, NULL, &ssl_idsize); | ||||
|     ssl_sessionid = malloc(ssl_idsize); /* get a buffer for it */ | ||||
|  | ||||
|     if(ssl_sessionid) { | ||||
|       /* extract session ID to the allocated buffer */ | ||||
|       gnutls_session_get_data(session, ssl_sessionid, &ssl_idsize); | ||||
|  | ||||
|       /* store this session id */ | ||||
|       return Curl_ssl_addsessionid(conn, ssl_sessionid, ssl_idsize); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   return CURLE_OK; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* return number of sent (non-SSL) bytes */ | ||||
| int Curl_gtls_send(struct connectdata *conn, | ||||
|                    int sockindex, | ||||
|                    void *mem, | ||||
|                    size_t len) | ||||
| { | ||||
|   int rc; | ||||
|   rc = gnutls_record_send(conn->ssl[sockindex].session, mem, len); | ||||
|  | ||||
|   return rc; | ||||
| } | ||||
|  | ||||
| void Curl_gtls_close_all(struct SessionHandle *data) | ||||
| { | ||||
|   /* FIX: make the OpenSSL code more generic and use parts of it here */ | ||||
|   (void)data; | ||||
| } | ||||
|  | ||||
| static void close_one(struct connectdata *conn, | ||||
|                       int index) | ||||
| { | ||||
|   if(conn->ssl[index].session) { | ||||
|     gnutls_bye(conn->ssl[index].session, GNUTLS_SHUT_RDWR); | ||||
|     gnutls_deinit(conn->ssl[index].session); | ||||
|   } | ||||
|   gnutls_certificate_free_credentials(conn->ssl[index].cred); | ||||
| } | ||||
|  | ||||
| void Curl_gtls_close(struct connectdata *conn) | ||||
| { | ||||
|   if(conn->ssl[0].use) | ||||
|     close_one(conn, 0); | ||||
|   if(conn->ssl[1].use) | ||||
|     close_one(conn, 1); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * If the read would block we return -1 and set 'wouldblock' to TRUE. | ||||
|  * Otherwise we return the amount of data read. Other errors should return -1 | ||||
|  * and set 'wouldblock' to FALSE. | ||||
|  */ | ||||
| ssize_t Curl_gtls_recv(struct connectdata *conn, /* connection data */ | ||||
|                        int num,                  /* socketindex */ | ||||
|                        char *buf,                /* store read data here */ | ||||
|                        size_t buffersize,        /* max amount to read */ | ||||
|                        bool *wouldblock) | ||||
| { | ||||
|   ssize_t ret; | ||||
|  | ||||
|   ret = gnutls_record_recv(conn->ssl[num].session, buf, buffersize); | ||||
|   if((ret == GNUTLS_E_AGAIN) || (ret == GNUTLS_E_INTERRUPTED)) { | ||||
|     *wouldblock = TRUE; | ||||
|     return -1; | ||||
|   } | ||||
|  | ||||
|   *wouldblock = FALSE; | ||||
|   if (!ret) { | ||||
|     failf(conn->data, "Peer closed the TLS connection"); | ||||
|     return -1; | ||||
|   } | ||||
|  | ||||
|   if (ret < 0) { | ||||
|     failf(conn->data, "GnuTLS recv error (%d): %s", | ||||
|           (int)ret, gnutls_strerror(ret)); | ||||
|     return -1; | ||||
|   } | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| void Curl_gtls_session_free(void *ptr) | ||||
| { | ||||
|   free(ptr); | ||||
| } | ||||
|  | ||||
| size_t Curl_gtls_version(char *buffer, size_t size) | ||||
| { | ||||
|   return snprintf(buffer, size, " GnuTLS/%s", gnutls_check_version(NULL)); | ||||
| } | ||||
|  | ||||
| #endif /* USE_GNUTLS */ | ||||
							
								
								
									
										45
									
								
								lib/gtls.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								lib/gtls.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| #ifndef __GTLS_H | ||||
| #define __GTLS_H | ||||
| /*************************************************************************** | ||||
|  *                                  _   _ ____  _ | ||||
|  *  Project                     ___| | | |  _ \| | | ||||
|  *                             / __| | | | |_) | | | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|  * are also available at http://curl.haxx.se/docs/copyright.html. | ||||
|  * | ||||
|  * You may opt to use, copy, modify, merge, publish, distribute and/or sell | ||||
|  * copies of the Software, and permit persons to whom the Software is | ||||
|  * furnished to do so, under the terms of the COPYING file. | ||||
|  * | ||||
|  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||||
|  * KIND, either express or implied. | ||||
|  * | ||||
|  * $Id$ | ||||
|  ***************************************************************************/ | ||||
| int Curl_gtls_init(void); | ||||
| int Curl_gtls_cleanup(void); | ||||
| CURLcode Curl_gtls_connect(struct connectdata *conn, int sockindex); | ||||
|  | ||||
| /* tell GnuTLS to close down all open information regarding connections (and | ||||
|    thus session ID caching etc) */ | ||||
| void Curl_gtls_close_all(struct SessionHandle *data); | ||||
| void Curl_gtls_close(struct connectdata *conn); /* close a SSL connection */ | ||||
|  | ||||
| /* return number of sent (non-SSL) bytes */ | ||||
| int Curl_gtls_send(struct connectdata *conn, int sockindex, | ||||
|                    void *mem, size_t len); | ||||
| ssize_t Curl_gtls_recv(struct connectdata *conn, /* connection data */ | ||||
|                        int num,                  /* socketindex */ | ||||
|                        char *buf,                /* store read data here */ | ||||
|                        size_t buffersize,        /* max amount to read */ | ||||
|                        bool *wouldblock); | ||||
| void Curl_gtls_session_free(void *ptr); | ||||
| size_t Curl_gtls_version(char *buffer, size_t size); | ||||
|  | ||||
| #endif | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -240,6 +240,13 @@ struct Curl_dns_entry * | ||||
| Curl_cache_addr(struct SessionHandle *data, Curl_addrinfo *addr, | ||||
|                 char *hostname, int port); | ||||
|  | ||||
| /* | ||||
|  * Curl_destroy_thread_data() cleans up async resolver data. | ||||
|  * Complementary of ares_destroy. | ||||
|  */ | ||||
| struct Curl_async; /* forward-declaration */ | ||||
| void Curl_destroy_thread_data(struct Curl_async *async); | ||||
|  | ||||
| #ifndef INADDR_NONE | ||||
| #define CURL_INADDR_NONE (in_addr_t) ~0 | ||||
| #else | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -79,6 +79,7 @@ | ||||
| #include "share.h" | ||||
| #include "strerror.h" | ||||
| #include "url.h" | ||||
| #include "inet_pton.h" | ||||
|  | ||||
| #define _MPRINTF_REPLACE /* use our functions only */ | ||||
| #include <curl/mprintf.h> | ||||
| @@ -202,11 +203,9 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn, | ||||
|  | ||||
|   *waitp = 0; /* don't wait, we act synchronously */ | ||||
|  | ||||
|   in=inet_addr(hostname); | ||||
|   if (in != CURL_INADDR_NONE) { | ||||
|   if(1 == Curl_inet_pton(AF_INET, hostname, &in)) | ||||
|     /* This is a dotted IP address 123.123.123.123-style */ | ||||
|     return Curl_ip2addr(in, hostname, port); | ||||
|   } | ||||
|  | ||||
| #if defined(HAVE_GETHOSTBYNAME_R) | ||||
|   /* | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -74,6 +74,7 @@ | ||||
| #include "share.h" | ||||
| #include "strerror.h" | ||||
| #include "url.h" | ||||
| #include "inet_pton.h" | ||||
|  | ||||
| #define _MPRINTF_REPLACE /* use our functions only */ | ||||
| #include <curl/mprintf.h> | ||||
| @@ -242,8 +243,8 @@ Curl_addrinfo *Curl_getaddrinfo(struct connectdata *conn, | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if((1 == inet_pton(AF_INET, hostname, addrbuf)) || | ||||
|      (1 == inet_pton(AF_INET6, hostname, addrbuf))) { | ||||
|   if((1 == Curl_inet_pton(AF_INET, hostname, addrbuf)) || | ||||
|      (1 == Curl_inet_pton(AF_INET6, hostname, addrbuf))) { | ||||
|     /* the given address is numerical only, prevent a reverse lookup */ | ||||
|     ai_flags = AI_NUMERICHOST; | ||||
|   } | ||||
|   | ||||
| @@ -301,10 +301,10 @@ static unsigned __stdcall getaddrinfo_thread (void *arg) | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * destroy_thread_data() cleans up async resolver data. | ||||
|  * Curl_destroy_thread_data() cleans up async resolver data. | ||||
|  * Complementary of ares_destroy. | ||||
|  */ | ||||
| static void destroy_thread_data (struct Curl_async *async) | ||||
| void Curl_destroy_thread_data (struct Curl_async *async) | ||||
| { | ||||
|   if (async->hostname) | ||||
|     free(async->hostname); | ||||
| @@ -319,6 +319,7 @@ static void destroy_thread_data (struct Curl_async *async) | ||||
|     /* destroy the synchronization objects */ | ||||
|     if (td->mutex_waiting) | ||||
|       CloseHandle(td->mutex_waiting); | ||||
|     td->mutex_waiting = NULL; | ||||
|     if (td->event_resolved) | ||||
|       CloseHandle(td->event_resolved); | ||||
|  | ||||
| @@ -365,7 +366,7 @@ static bool init_resolve_thread (struct connectdata *conn, | ||||
|    */ | ||||
|   td->mutex_waiting = CreateMutex(NULL, TRUE, NULL); | ||||
|   if (td->mutex_waiting == NULL) { | ||||
|     destroy_thread_data(&conn->async); | ||||
|     Curl_destroy_thread_data(&conn->async); | ||||
|     SetLastError(EAGAIN); | ||||
|     return FALSE; | ||||
|   } | ||||
| @@ -375,7 +376,7 @@ static bool init_resolve_thread (struct connectdata *conn, | ||||
|    */ | ||||
|   td->event_resolved = CreateEvent(NULL, TRUE, FALSE, NULL); | ||||
|   if (td->event_resolved == NULL) { | ||||
|     destroy_thread_data(&conn->async); | ||||
|     Curl_destroy_thread_data(&conn->async); | ||||
|     SetLastError(EAGAIN); | ||||
|     return FALSE; | ||||
|   } | ||||
| @@ -401,7 +402,7 @@ static bool init_resolve_thread (struct connectdata *conn, | ||||
|   if (!td->thread_hnd) { | ||||
|      SetLastError(errno); | ||||
|      TRACE(("_beginthreadex() failed; %s\n", Curl_strerror(conn,errno))); | ||||
|      destroy_thread_data(&conn->async); | ||||
|      Curl_destroy_thread_data(&conn->async); | ||||
|      return FALSE; | ||||
|   } | ||||
|   /* This socket is only to keep Curl_resolv_fdset() and select() happy; | ||||
| @@ -508,7 +509,7 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn, | ||||
|       rc = CURLE_OPERATION_TIMEDOUT; | ||||
|   } | ||||
|  | ||||
|   destroy_thread_data(&conn->async); | ||||
|   Curl_destroy_thread_data(&conn->async); | ||||
|  | ||||
|   if(!conn->async.dns) | ||||
|     conn->bits.close = TRUE; | ||||
| @@ -528,7 +529,7 @@ CURLcode Curl_is_resolved(struct connectdata *conn, | ||||
|  | ||||
|   if (conn->async.done) { | ||||
|     /* we're done */ | ||||
|     destroy_thread_data(&conn->async); | ||||
|     Curl_destroy_thread_data(&conn->async); | ||||
|     if (!conn->async.dns) { | ||||
|       TRACE(("Curl_is_resolved(): CURLE_COULDNT_RESOLVE_HOST\n")); | ||||
|       return CURLE_COULDNT_RESOLVE_HOST; | ||||
| @@ -536,8 +537,6 @@ CURLcode Curl_is_resolved(struct connectdata *conn, | ||||
|     *entry = conn->async.dns; | ||||
|     TRACE(("resolved okay, dns %p\n", *entry)); | ||||
|   } | ||||
|   else | ||||
|     TRACE(("not yet\n")); | ||||
|   return CURLE_OK; | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										60
									
								
								lib/http.c
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								lib/http.c
									
									
									
									
									
								
							| @@ -85,7 +85,7 @@ | ||||
| #include "base64.h" | ||||
| #include "cookie.h" | ||||
| #include "strequal.h" | ||||
| #include "ssluse.h" | ||||
| #include "sslgen.h" | ||||
| #include "http_digest.h" | ||||
| #include "http_ntlm.h" | ||||
| #include "http_negotiate.h" | ||||
| @@ -230,21 +230,27 @@ static CURLcode perhapsrewind(struct connectdata *conn) | ||||
|  | ||||
|   bytessent = http->writebytecount; | ||||
|  | ||||
|   /* figure out how much data we are expected to send */ | ||||
|   switch(data->set.httpreq) { | ||||
|   case HTTPREQ_POST: | ||||
|     if(data->set.postfieldsize != -1) | ||||
|       expectsend = data->set.postfieldsize; | ||||
|     break; | ||||
|   case HTTPREQ_PUT: | ||||
|     if(data->set.infilesize != -1) | ||||
|       expectsend = data->set.infilesize; | ||||
|     break; | ||||
|   case HTTPREQ_POST_FORM: | ||||
|     expectsend = http->postsize; | ||||
|     break; | ||||
|   default: | ||||
|     break; | ||||
|   if(conn->bits.authneg) | ||||
|     /* This is a state where we are known to be negotiating and we don't send | ||||
|        any data then. */ | ||||
|     expectsend = 0; | ||||
|   else { | ||||
|     /* figure out how much data we are expected to send */ | ||||
|     switch(data->set.httpreq) { | ||||
|     case HTTPREQ_POST: | ||||
|       if(data->set.postfieldsize != -1) | ||||
|         expectsend = data->set.postfieldsize; | ||||
|       break; | ||||
|     case HTTPREQ_PUT: | ||||
|       if(data->set.infilesize != -1) | ||||
|         expectsend = data->set.infilesize; | ||||
|       break; | ||||
|     case HTTPREQ_POST_FORM: | ||||
|       expectsend = http->postsize; | ||||
|       break; | ||||
|     default: | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   conn->bits.rewindaftersend = FALSE; /* default */ | ||||
| @@ -298,6 +304,10 @@ CURLcode Curl_http_auth_act(struct connectdata *conn) | ||||
|   bool pickproxy = FALSE; | ||||
|   CURLcode code = CURLE_OK; | ||||
|  | ||||
|   if(100 == conn->keep.httpcode) | ||||
|     /* this is a transient response code, ignore */ | ||||
|     return CURLE_OK; | ||||
|  | ||||
|   if(data->state.authproblem) | ||||
|     return data->set.http_fail_on_error?CURLE_HTTP_RETURNED_ERROR:CURLE_OK; | ||||
|  | ||||
| @@ -406,8 +416,8 @@ Curl_http_output_auth(struct connectdata *conn, | ||||
|   /* Send proxy authentication header if needed */ | ||||
|   if (conn->bits.httpproxy && | ||||
|       (conn->bits.tunnel_proxy == proxytunnel)) { | ||||
| #ifdef USE_SSLEAY | ||||
|     if(authproxy->want == CURLAUTH_NTLM) { | ||||
| #ifdef USE_NTLM | ||||
|     if(authproxy->picked == CURLAUTH_NTLM) { | ||||
|       auth=(char *)"NTLM"; | ||||
|       result = Curl_output_ntlm(conn, TRUE); | ||||
|       if(result) | ||||
| @@ -415,7 +425,7 @@ Curl_http_output_auth(struct connectdata *conn, | ||||
|     } | ||||
|     else | ||||
| #endif | ||||
|       if(authproxy->want == CURLAUTH_BASIC) { | ||||
|       if(authproxy->picked == CURLAUTH_BASIC) { | ||||
|         /* Basic */ | ||||
|         if(conn->bits.proxy_user_passwd && | ||||
|            !checkheaders(data, "Proxy-authorization:")) { | ||||
| @@ -429,7 +439,7 @@ Curl_http_output_auth(struct connectdata *conn, | ||||
|         authproxy->done = TRUE; | ||||
|       } | ||||
| #ifndef CURL_DISABLE_CRYPTO_AUTH | ||||
|       else if(authproxy->want == CURLAUTH_DIGEST) { | ||||
|       else if(authproxy->picked == CURLAUTH_DIGEST) { | ||||
|         auth=(char *)"Digest"; | ||||
|         result = Curl_output_digest(conn, | ||||
|                                     TRUE, /* proxy */ | ||||
| @@ -463,7 +473,7 @@ Curl_http_output_auth(struct connectdata *conn, | ||||
|     { | ||||
|       auth = NULL; | ||||
| #ifdef HAVE_GSSAPI | ||||
|       if((authhost->want == CURLAUTH_GSSNEGOTIATE) && | ||||
|       if((authhost->picked == CURLAUTH_GSSNEGOTIATE) && | ||||
|          data->state.negotiate.context && | ||||
|          !GSS_ERROR(data->state.negotiate.status)) { | ||||
|         auth=(char *)"GSS-Negotiate"; | ||||
| @@ -474,7 +484,7 @@ Curl_http_output_auth(struct connectdata *conn, | ||||
|       } | ||||
|       else | ||||
| #endif | ||||
| #ifdef USE_SSLEAY | ||||
| #ifdef USE_NTLM | ||||
|       if(authhost->picked == CURLAUTH_NTLM) { | ||||
|         auth=(char *)"NTLM"; | ||||
|         result = Curl_output_ntlm(conn, FALSE); | ||||
| @@ -587,7 +597,7 @@ CURLcode Curl_http_input_auth(struct connectdata *conn, | ||||
|   } | ||||
|   else | ||||
| #endif | ||||
| #ifdef USE_SSLEAY | ||||
| #ifdef USE_NTLM | ||||
|     /* NTLM support requires the SSL crypto libs */ | ||||
|     if(checkprefix("NTLM", start)) { | ||||
|       *availp |= CURLAUTH_NTLM; | ||||
| @@ -1258,8 +1268,8 @@ CURLcode Curl_http_connect(struct connectdata *conn, bool *done) | ||||
|   } | ||||
|  | ||||
|   if(conn->protocol & PROT_HTTPS) { | ||||
|     /* now, perform the SSL initialization for this socket */ | ||||
|     result = Curl_SSLConnect(conn, FIRSTSOCKET); | ||||
|     /* perform SSL initialization for this socket */ | ||||
|     result = Curl_ssl_connect(conn, FIRSTSOCKET); | ||||
|     if(result) | ||||
|       return result; | ||||
|   } | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
							
								
								
									
										189
									
								
								lib/http_ntlm.c
									
									
									
									
									
								
							
							
						
						
									
										189
									
								
								lib/http_ntlm.c
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -30,8 +30,7 @@ | ||||
| */ | ||||
|  | ||||
| #ifndef CURL_DISABLE_HTTP | ||||
| #ifdef USE_SSLEAY | ||||
| /* We need OpenSSL for the crypto lib to provide us with MD4 and DES */ | ||||
| #ifdef USE_NTLM | ||||
|  | ||||
| /* -- WIN32 approved -- */ | ||||
| #include <stdio.h> | ||||
| @@ -51,6 +50,8 @@ | ||||
| #define _MPRINTF_REPLACE /* use our functions only */ | ||||
| #include <curl/mprintf.h> | ||||
|  | ||||
| #ifndef USE_WINDOWS_SSPI | ||||
|  | ||||
| #include <openssl/des.h> | ||||
| #include <openssl/md4.h> | ||||
| #include <openssl/ssl.h> | ||||
| @@ -71,6 +72,12 @@ | ||||
| #define DESKEY(x) &x | ||||
| #endif | ||||
|  | ||||
| #else | ||||
|  | ||||
| #include <rpc.h> | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /* The last #include file should be: */ | ||||
| #include "memdebug.h" | ||||
|  | ||||
| @@ -130,6 +137,14 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn, | ||||
|  | ||||
|       ntlm->state = NTLMSTATE_TYPE2; /* we got a type-2 */ | ||||
|  | ||||
| #ifdef USE_WINDOWS_SSPI | ||||
|       if ((ntlm->type_2 = malloc(size+1)) == NULL) { | ||||
|         free(buffer); | ||||
|         return CURLE_OUT_OF_MEMORY; | ||||
|       } | ||||
|       ntlm->n_type_2 = size; | ||||
|       memcpy(ntlm->type_2, buffer, size); | ||||
| #else | ||||
|       if(size >= 48) | ||||
|         /* the nonce of interest is index [24 .. 31], 8 bytes */ | ||||
|         memcpy(ntlm->nonce, &buffer[24], 8); | ||||
| @@ -138,6 +153,7 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn, | ||||
|       /* at index decimal 20, there's a 32bit NTLM flag field */ | ||||
|  | ||||
|       free(buffer); | ||||
| #endif | ||||
|     } | ||||
|     else { | ||||
|       if(ntlm->state >= NTLMSTATE_TYPE1) | ||||
| @@ -149,6 +165,8 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn, | ||||
|   return CURLNTLM_FINE; | ||||
| } | ||||
|  | ||||
| #ifndef USE_WINDOWS_SSPI | ||||
|  | ||||
| /* | ||||
|  * Turns a 56 bit key into the 64 bit, odd parity key and sets the key.  The | ||||
|  * key schedule ks is also set. | ||||
| @@ -275,6 +293,32 @@ static void mkhash(char *password, | ||||
|   free(pw); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #ifdef USE_WINDOWS_SSPI | ||||
|  | ||||
| static void | ||||
| ntlm_sspi_cleanup(struct ntlmdata *ntlm) | ||||
| { | ||||
|   if (ntlm->type_2) { | ||||
|     free(ntlm->type_2); | ||||
|     ntlm->type_2 = NULL; | ||||
|   } | ||||
|   if (ntlm->has_handles) { | ||||
|     DeleteSecurityContext(&ntlm->c_handle); | ||||
|     FreeCredentialsHandle(&ntlm->handle); | ||||
|     ntlm->has_handles = 0; | ||||
|   } | ||||
|   if (ntlm->p_identity) { | ||||
|     if (ntlm->identity.User) free(ntlm->identity.User); | ||||
|     if (ntlm->identity.Password) free(ntlm->identity.Password); | ||||
|     if (ntlm->identity.Domain) free(ntlm->identity.Domain); | ||||
|     ntlm->p_identity = NULL; | ||||
|   } | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #define SHORTPAIR(x) ((x) & 0xff), ((x) >> 8) | ||||
| #define LONGQUARTET(x) ((x) & 0xff), (((x) >> 8)&0xff), \ | ||||
|   (((x) >>16)&0xff), ((x)>>24) | ||||
| @@ -285,10 +329,12 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, | ||||
| { | ||||
|   const char *domain=""; /* empty */ | ||||
|   const char *host=""; /* empty */ | ||||
| #ifndef USE_WINDOWS_SSPI | ||||
|   int domlen=(int)strlen(domain); | ||||
|   int hostlen = (int)strlen(host); | ||||
|   int hostoff; /* host name offset */ | ||||
|   int domoff;  /* domain name offset */ | ||||
| #endif | ||||
|   size_t size; | ||||
|   char *base64=NULL; | ||||
|   unsigned char ntlmbuf[256]; /* enough, unless the host/domain is very long */ | ||||
| @@ -333,6 +379,90 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, | ||||
|   switch(ntlm->state) { | ||||
|   case NTLMSTATE_TYPE1: | ||||
|   default: /* for the weird cases we (re)start here */ | ||||
| #ifdef USE_WINDOWS_SSPI | ||||
|   { | ||||
|     SecBuffer buf; | ||||
|     SecBufferDesc desc; | ||||
|     SECURITY_STATUS status; | ||||
|     ULONG attrs; | ||||
|     const char *user; | ||||
|     int domlen; | ||||
|  | ||||
|     ntlm_sspi_cleanup(ntlm); | ||||
|  | ||||
|     user = strchr(userp, '\\'); | ||||
|     if (!user) | ||||
|       user = strchr(userp, '/'); | ||||
|  | ||||
|     if (user) { | ||||
|       domain = userp; | ||||
|       domlen = user - userp; | ||||
|       user++; | ||||
|     } | ||||
|     else { | ||||
|       user = userp; | ||||
|       domain = ""; | ||||
|       domlen = 0; | ||||
|     } | ||||
|  | ||||
|     if (user && *user) { | ||||
|       /* note: initialize all of this before doing the mallocs so that | ||||
|        * it can be cleaned up later without leaking memory. | ||||
|        */ | ||||
|       ntlm->p_identity = &ntlm->identity; | ||||
|       memset(ntlm->p_identity, 0, sizeof(*ntlm->p_identity)); | ||||
|       if ((ntlm->identity.User = (unsigned char *)strdup(user)) == NULL) | ||||
|         return CURLE_OUT_OF_MEMORY; | ||||
|       ntlm->identity.UserLength = strlen(user); | ||||
|       if ((ntlm->identity.Password = (unsigned char *)strdup(passwdp)) == NULL) | ||||
|         return CURLE_OUT_OF_MEMORY; | ||||
|       ntlm->identity.PasswordLength = strlen(passwdp); | ||||
|       if ((ntlm->identity.Domain = malloc(domlen+1)) == NULL) | ||||
|         return CURLE_OUT_OF_MEMORY; | ||||
|       strncpy((char *)ntlm->identity.Domain, domain, domlen); | ||||
|       ntlm->identity.Domain[domlen] = '\0'; | ||||
|       ntlm->identity.DomainLength = domlen; | ||||
|       ntlm->identity.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI; | ||||
|     } | ||||
|     else { | ||||
|       ntlm->p_identity = NULL; | ||||
|     } | ||||
|  | ||||
|     if (AcquireCredentialsHandle( | ||||
|           NULL, (char *)"NTLM", SECPKG_CRED_OUTBOUND, NULL, ntlm->p_identity, | ||||
|           NULL, NULL, &ntlm->handle, NULL | ||||
|         ) != SEC_E_OK) { | ||||
|       return CURLE_OUT_OF_MEMORY; | ||||
|     } | ||||
|  | ||||
|     desc.ulVersion = SECBUFFER_VERSION; | ||||
|     desc.cBuffers  = 1; | ||||
|     desc.pBuffers  = &buf; | ||||
|     buf.cbBuffer   = sizeof(ntlmbuf); | ||||
|     buf.BufferType = SECBUFFER_TOKEN; | ||||
|     buf.pvBuffer   = ntlmbuf; | ||||
|  | ||||
|     status = InitializeSecurityContext(&ntlm->handle, NULL, (char *) host, | ||||
|                                        ISC_REQ_CONFIDENTIALITY | | ||||
|                                        ISC_REQ_REPLAY_DETECT | | ||||
|                                        ISC_REQ_CONNECTION, | ||||
|                                        0, SECURITY_NETWORK_DREP, NULL, 0, | ||||
|                                        &ntlm->c_handle, &desc, &attrs, NULL | ||||
|                                       ); | ||||
|  | ||||
|     if (status == SEC_I_COMPLETE_AND_CONTINUE || | ||||
|         status == SEC_I_CONTINUE_NEEDED) { | ||||
|       CompleteAuthToken(&ntlm->c_handle, &desc); | ||||
|     } | ||||
|     else if (status != SEC_E_OK) { | ||||
|       FreeCredentialsHandle(&ntlm->handle); | ||||
|       return CURLE_RECV_ERROR; | ||||
|     } | ||||
|  | ||||
|     ntlm->has_handles = 1; | ||||
|     size = buf.cbBuffer; | ||||
|   } | ||||
| #else | ||||
|     hostoff = 32; | ||||
|     domoff = hostoff + hostlen; | ||||
|  | ||||
| @@ -382,6 +512,7 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, | ||||
|  | ||||
|     /* initial packet length */ | ||||
|     size = 32 + hostlen + domlen; | ||||
| #endif | ||||
|  | ||||
|     /* now keeper of the base64 encoded package size */ | ||||
|     size = Curl_base64_encode((char *)ntlmbuf, size, &base64); | ||||
| @@ -417,6 +548,41 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, | ||||
|     */ | ||||
|  | ||||
|   { | ||||
| #ifdef USE_WINDOWS_SSPI | ||||
|     SecBuffer type_2, type_3; | ||||
|     SecBufferDesc type_2_desc, type_3_desc; | ||||
|     SECURITY_STATUS status; | ||||
|     ULONG attrs; | ||||
|  | ||||
|     type_2_desc.ulVersion  = type_3_desc.ulVersion  = SECBUFFER_VERSION; | ||||
|     type_2_desc.cBuffers   = type_3_desc.cBuffers   = 1; | ||||
|     type_2_desc.pBuffers   = &type_2; | ||||
|     type_3_desc.pBuffers   = &type_3; | ||||
|  | ||||
|     type_2.BufferType = SECBUFFER_TOKEN; | ||||
|     type_2.pvBuffer   = ntlm->type_2; | ||||
|     type_2.cbBuffer   = ntlm->n_type_2; | ||||
|     type_3.BufferType = SECBUFFER_TOKEN; | ||||
|     type_3.pvBuffer   = ntlmbuf; | ||||
|     type_3.cbBuffer   = sizeof(ntlmbuf); | ||||
|  | ||||
|     status = InitializeSecurityContext(&ntlm->handle, &ntlm->c_handle, | ||||
|                                        (char *) host, | ||||
|                                        ISC_REQ_CONFIDENTIALITY | | ||||
|                                        ISC_REQ_REPLAY_DETECT | | ||||
|                                        ISC_REQ_CONNECTION, | ||||
|                                        0, SECURITY_NETWORK_DREP, &type_2_desc, | ||||
|                                        0, &ntlm->c_handle, &type_3_desc, | ||||
|                                        &attrs, NULL); | ||||
|  | ||||
|     if (status != SEC_E_OK) | ||||
|       return CURLE_RECV_ERROR; | ||||
|  | ||||
|     size = type_3.cbBuffer; | ||||
|  | ||||
|     ntlm_sspi_cleanup(ntlm); | ||||
|  | ||||
| #else | ||||
|     int lmrespoff; | ||||
|     int ntrespoff; | ||||
|     int useroff; | ||||
| @@ -556,6 +722,8 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, | ||||
|     ntlmbuf[56] = (unsigned char)(size & 0xff); | ||||
|     ntlmbuf[57] = (unsigned char)(size >> 8); | ||||
|  | ||||
| #endif | ||||
|  | ||||
|     /* convert the binary blob into base64 */ | ||||
|     size = Curl_base64_encode((char *)ntlmbuf, size, &base64); | ||||
|  | ||||
| @@ -587,5 +755,18 @@ CURLcode Curl_output_ntlm(struct connectdata *conn, | ||||
|  | ||||
|   return CURLE_OK; | ||||
| } | ||||
| #endif /* USE_SSLEAY */ | ||||
|  | ||||
|  | ||||
| void | ||||
| Curl_ntlm_cleanup(struct connectdata *conn) | ||||
| { | ||||
| #ifdef USE_WINDOWS_SSPI | ||||
|   ntlm_sspi_cleanup(&conn->ntlm); | ||||
|   ntlm_sspi_cleanup(&conn->proxyntlm); | ||||
| #else | ||||
|   (void)conn; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| #endif /* USE_NTLM */ | ||||
| #endif /* !CURL_DISABLE_HTTP */ | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -38,7 +38,10 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn, bool proxy, char *header); | ||||
| /* this is for creating ntlm header output */ | ||||
| CURLcode Curl_output_ntlm(struct connectdata *conn, bool proxy); | ||||
|  | ||||
| void Curl_ntlm_cleanup(struct SessionHandle *data); | ||||
| void Curl_ntlm_cleanup(struct connectdata *conn); | ||||
| #if !defined(USE_SSLEAY) && !defined(USE_WINDOWS_SSPI) | ||||
| #define Curl_ntlm_cleanup(x) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* Flag bits definitions based on http://davenport.sourceforge.net/ntlm.html */ | ||||
|   | ||||
							
								
								
									
										18
									
								
								lib/if2ip.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								lib/if2ip.c
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -31,6 +31,8 @@ | ||||
| #include <unistd.h> | ||||
| #endif | ||||
|  | ||||
| #include "if2ip.h" | ||||
|  | ||||
| #if !defined(WIN32) && !defined(__BEOS__) && !defined(__CYGWIN32__) && \ | ||||
|     !defined(__riscos__) && !defined(__INTERIX) && !defined(NETWARE) | ||||
|  | ||||
| @@ -55,7 +57,6 @@ | ||||
| #include <sys/ioctl.h> | ||||
| #endif | ||||
|  | ||||
| /* -- if2ip() -- */ | ||||
| #ifdef HAVE_NETDB_H | ||||
| #include <netdb.h> | ||||
| #endif | ||||
| @@ -64,15 +65,11 @@ | ||||
| #include <sys/sockio.h> | ||||
| #endif | ||||
|  | ||||
| #if defined(HAVE_INET_NTOA_R) && !defined(HAVE_INET_NTOA_R_DECL) | ||||
| #include "inet_ntoa_r.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef VMS | ||||
| #include <inet.h> | ||||
| #endif | ||||
|  | ||||
| #include "if2ip.h" | ||||
| #include "inet_ntop.h" | ||||
| #include "memory.h" | ||||
|  | ||||
| /* The last #include file should be: */ | ||||
| @@ -113,12 +110,7 @@ char *Curl_if2ip(const char *interface, char *buf, int buf_size) | ||||
|  | ||||
|       struct sockaddr_in *s = (struct sockaddr_in *)&req.ifr_dstaddr; | ||||
|       memcpy(&in, &(s->sin_addr.s_addr), sizeof(in)); | ||||
| #if defined(HAVE_INET_NTOA_R) | ||||
|       ip = inet_ntoa_r(in,buf,buf_size); | ||||
| #else | ||||
|       ip = strncpy(buf,inet_ntoa(in),buf_size); | ||||
|       ip[buf_size - 1] = 0; | ||||
| #endif | ||||
|       ip = (char *) Curl_inet_ntop(s->sin_family, &in, buf, buf_size); | ||||
|     } | ||||
|     sclose(dummy); | ||||
|   } | ||||
|   | ||||
							
								
								
									
										10
									
								
								lib/if2ip.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								lib/if2ip.h
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -24,12 +24,8 @@ | ||||
|  ***************************************************************************/ | ||||
| #include "setup.h" | ||||
|  | ||||
| #if !defined(WIN32) && !defined(__BEOS__) && !defined(__CYGWIN32__) && \ | ||||
|     !defined(__riscos__) && !defined(__INTERIX) | ||||
| extern char *Curl_if2ip(const char *interface, char *buf, int buf_size); | ||||
| #else | ||||
| #define Curl_if2ip(a,b,c) NULL | ||||
| #endif | ||||
| extern char *Curl_if2ip(const char *interf, char *buf, int buf_size); | ||||
|  | ||||
| #ifdef __INTERIX | ||||
| /* Nedelcho Stanev's work-around for SFU 3.0 */ | ||||
| struct ifreq { | ||||
|   | ||||
| @@ -1,5 +1,16 @@ | ||||
| #ifndef __INET_NTOA_R_H | ||||
| #define __INET_NTOA_R_H | ||||
|  | ||||
| #include "setup.h" | ||||
|  | ||||
| #ifdef HAVE_INET_NTOA_R_2_ARGS | ||||
| /* | ||||
|  * uClibc 0.9.26 (at least) doesn't define this prototype. The buffer | ||||
|  * must be at least 16 characters long. | ||||
|  */ | ||||
| char *inet_ntoa_r(const struct in_addr in, char buffer[]); | ||||
|  | ||||
| #else | ||||
| /* | ||||
|  * My solaris 5.6 system running gcc 2.8.1 does *not* have this prototype | ||||
|  * in any system include file! Isn't that weird? | ||||
| @@ -7,3 +18,5 @@ | ||||
| char *inet_ntoa_r(const struct in_addr in, char *buffer, int buflen); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -54,10 +54,17 @@ | ||||
|  *  - uses no statics | ||||
|  *  - takes a u_char* not an in_addr as input | ||||
|  */ | ||||
| static const char *inet_ntop4 (const u_char *src, char *dst, size_t size) | ||||
| static char *inet_ntop4 (const u_char *src, char *dst, size_t size) | ||||
| { | ||||
| #ifdef HAVE_INET_NTOA_R | ||||
| #if defined(HAVE_INET_NTOA_R_2_ARGS) | ||||
|   const char *ptr; | ||||
|   curlassert(size >= 16); | ||||
|   ptr = inet_ntoa_r(*(struct in_addr*)src, dst); | ||||
|   return (char *)memmove(dst, ptr, strlen(ptr)+1); | ||||
|  | ||||
| #elif defined(HAVE_INET_NTOA_R) | ||||
|   return inet_ntoa_r(*(struct in_addr*)src, dst, size); | ||||
|  | ||||
| #else | ||||
|   const char *addr = inet_ntoa(*(struct in_addr*)src); | ||||
|  | ||||
| @@ -74,7 +81,7 @@ static const char *inet_ntop4 (const u_char *src, char *dst, size_t size) | ||||
| /* | ||||
|  * Convert IPv6 binary address into presentation (printable) format. | ||||
|  */ | ||||
| static const char *inet_ntop6 (const u_char *src, char *dst, size_t size) | ||||
| static char *inet_ntop6 (const u_char *src, char *dst, size_t size) | ||||
| { | ||||
|   /* | ||||
|    * Note that int32_t and int16_t need only be "at least" large enough | ||||
| @@ -178,10 +185,10 @@ static const char *inet_ntop6 (const u_char *src, char *dst, size_t size) | ||||
| /* | ||||
|  * Convert a network format address to presentation format. | ||||
|  * | ||||
|  * Returns pointer to presentation format address (`dst'), | ||||
|  * Returns pointer to presentation format address (`buf'), | ||||
|  * Returns NULL on error (see errno). | ||||
|  */ | ||||
| const char *Curl_inet_ntop(int af, const void *src, char *buf, size_t size) | ||||
| char *Curl_inet_ntop(int af, const void *src, char *buf, size_t size) | ||||
| { | ||||
|   switch (af) { | ||||
|   case AF_INET: | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -31,7 +31,7 @@ | ||||
| #include <arpa/inet.h> | ||||
| #endif | ||||
| #else | ||||
| const char *Curl_inet_ntop(int af, const void *addr, char *buf, size_t size); | ||||
| char *Curl_inet_ntop(int af, const void *addr, char *buf, size_t size); | ||||
| #endif | ||||
|  | ||||
| #endif /* __INET_NTOP_H */ | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
|   | ||||
| @@ -43,8 +43,6 @@ | ||||
| #ifndef CURL_DISABLE_FTP | ||||
| #ifdef HAVE_KRB4 | ||||
|  | ||||
| #include "security.h" | ||||
| #include "base64.h" | ||||
| #include <stdlib.h> | ||||
| #ifdef HAVE_NETDB_H | ||||
| #include <netdb.h> | ||||
| @@ -57,6 +55,8 @@ | ||||
| #include <unistd.h> /* for getpid() */ | ||||
| #endif | ||||
|  | ||||
| #include "urldata.h" | ||||
| #include "base64.h" | ||||
| #include "ftp.h" | ||||
| #include "sendf.h" | ||||
| #include "krb4.h" | ||||
|   | ||||
							
								
								
									
										44
									
								
								lib/krb4.h
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								lib/krb4.h
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ | ||||
|  *                            | (__| |_| |  _ <| |___ | ||||
|  *                             \___|\___/|_| \_\_____| | ||||
|  * | ||||
|  * Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * Copyright (C) 1998 - 2005, Daniel Stenberg, <daniel@haxx.se>, et al. | ||||
|  * | ||||
|  * This software is licensed as described in the file COPYING, which | ||||
|  * you should have received as part of this distribution. The terms | ||||
| @@ -22,6 +22,48 @@ | ||||
|  * | ||||
|  * $Id$ | ||||
|  ***************************************************************************/ | ||||
|  | ||||
| struct Curl_sec_client_mech { | ||||
|   const char *name; | ||||
|   size_t size; | ||||
|   int (*init)(void *); | ||||
|   int (*auth)(void *, struct connectdata *); | ||||
|   void (*end)(void *); | ||||
|   int (*check_prot)(void *, int); | ||||
|   int (*overhead)(void *, int, int); | ||||
|   int (*encode)(void *, void*, int, int, void**, struct connectdata *); | ||||
|   int (*decode)(void *, void*, int, int, struct connectdata *); | ||||
| }; | ||||
|  | ||||
|  | ||||
| #define AUTH_OK         0 | ||||
| #define AUTH_CONTINUE   1 | ||||
| #define AUTH_ERROR      2 | ||||
|  | ||||
| extern struct Curl_sec_client_mech Curl_krb4_client_mech; | ||||
|  | ||||
| CURLcode Curl_krb_kauth(struct connectdata *conn); | ||||
| 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); | ||||
|  | ||||
| int Curl_sec_vfprintf(struct connectdata *, FILE *, const char *, va_list); | ||||
| int Curl_sec_fprintf2(struct connectdata *conn, FILE *f, const char *fmt, ...); | ||||
| int Curl_sec_vfprintf2(struct connectdata *conn, FILE *, const char *, va_list); | ||||
| int Curl_sec_write (struct connectdata *conn, int, char *, int); | ||||
|  | ||||
| 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 *, | ||||
|                                             enum protection_level); | ||||
|  | ||||
|  | ||||
| #endif | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user