diff --git a/keyserver/ChangeLog b/keyserver/ChangeLog index 0c009e2b7..d34b20696 100644 --- a/keyserver/ChangeLog +++ b/keyserver/ChangeLog @@ -1,3 +1,12 @@ +2007-03-13 David Shaw + + * gpgkeys_curl.c (main): Use curl_version_info to verify that the + protocol we're about to use is actually available. + + * curl-shim.h, curl-shim.c (curl_free): Make into a macro. + (curl_version_info): New. Only advertises "http" for our shim, of + course. + 2007-02-10 David Shaw * gpgkeys_ldap.c (send_key): Missing a free(). diff --git a/keyserver/curl-shim.c b/keyserver/curl-shim.c index d8b3da806..bff0e4b59 100644 --- a/keyserver/curl-shim.c +++ b/keyserver/curl-shim.c @@ -322,8 +322,13 @@ curl_easy_escape(CURL *curl,char *str,int length) return enc; } -void -curl_free(char *ptr) +curl_version_info_data * +curl_version_info(int type) { - free(ptr); + static curl_version_info_data data; + static const char *protocols[]={"http",NULL}; + + data.protocols=protocols; + + return &data; } diff --git a/keyserver/curl-shim.h b/keyserver/curl-shim.h index 66e6ed8d6..7b19b02f3 100644 --- a/keyserver/curl-shim.h +++ b/keyserver/curl-shim.h @@ -76,8 +76,14 @@ typedef struct struct http_context hd; } CURL; +typedef struct +{ + const char **protocols; +} curl_version_info_data; + #define CURL_ERROR_SIZE 256 #define CURL_GLOBAL_DEFAULT 0 +#define CURLVERSION_NOW 0 CURLcode curl_global_init(long flags); void curl_global_cleanup(void); @@ -86,7 +92,8 @@ CURLcode curl_easy_setopt(CURL *curl,CURLoption option,...); CURLcode curl_easy_perform(CURL *curl); void curl_easy_cleanup(CURL *curl); char *curl_easy_escape(CURL *curl,char *str,int len); -void curl_free(char *ptr); +#define curl_free(x) free(x) #define curl_version() "GnuPG curl-shim "VERSION +curl_version_info_data *curl_version_info(int type); #endif /* !_CURL_SHIM_H_ */ diff --git a/keyserver/gpgkeys_curl.c b/keyserver/gpgkeys_curl.c index 192f9ba66..e326df63c 100644 --- a/keyserver/gpgkeys_curl.c +++ b/keyserver/gpgkeys_curl.c @@ -1,5 +1,5 @@ /* gpgkeys_curl.c - fetch a key via libcurl - * Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. + * Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -112,11 +112,12 @@ show_help (FILE *fp) int main(int argc,char *argv[]) { - int arg,ret=KEYSERVER_INTERNAL_ERROR; + int arg,ret=KEYSERVER_INTERNAL_ERROR,i; char line[MAX_LINE]; char *thekey=NULL; long follow_redirects=5; char *proxy=NULL; + curl_version_info_data *curldata; console=stderr; @@ -261,6 +262,7 @@ main(int argc,char *argv[]) } curl_global_init(CURL_GLOBAL_DEFAULT); + curl=curl_easy_init(); if(!curl) { @@ -269,6 +271,20 @@ main(int argc,char *argv[]) goto fail; } + /* Make sure we have the protocol the user is asking for so we can + print a nicer error message. */ + curldata=curl_version_info(CURLVERSION_NOW); + for(i=0;curldata->protocols[i];i++) + if(strcasecmp(curldata->protocols[i],opt->scheme)==0) + break; + + if(curldata->protocols[i]==NULL) + { + fprintf(console,"gpgkeys: protocol `%s' not supported\n",opt->scheme); + ret=KEYSERVER_SCHEME_NOT_FOUND; + goto fail; + } + if(follow_redirects) { curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1);