diff options
-rw-r--r-- | g10/ChangeLog | 13 | ||||
-rw-r--r-- | g10/Makefile.am | 3 | ||||
-rw-r--r-- | g10/keyserver.c | 65 | ||||
-rw-r--r-- | g10/main.h | 2 | ||||
-rw-r--r-- | g10/misc.c | 39 |
5 files changed, 84 insertions, 38 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog index f076e83d3..7b136b073 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,5 +1,18 @@ 2005-08-21 David Shaw <[email protected]> + * Makefile.am: No need to link with curl any longer. + + * main.h, misc.c (path_access): New. Same as access() but does a + PATH search like execlp. + + * keyserver.c (curl_can_handle): Removed. Replaced by... + (curl_cant_handle): We are now relying on curl as the handler of + last resort. This is necessary because PGP LDAP and curl LDAP are + apples and oranges. + (keyserver_typemap): Only test for ldap and ldaps. + (keyserver_spawn): If a given handler is unusable (as determined + by path_access()) then try gpgkeys_curl. + * exec.h, exec.c (make_tempdir, expand_args, exec_write, exec_read): Minor cleanup to use bitfield flags instead of a bunch of integers. diff --git a/g10/Makefile.am b/g10/Makefile.am index 3c1ba7a76..fd3789724 100644 --- a/g10/Makefile.am +++ b/g10/Makefile.am @@ -124,8 +124,7 @@ gpgv_SOURCES = gpgv.c \ verify.c LDADD = $(needed_libs) $(other_libs) @ZLIBS@ @W32LIBS@ @LIBREADLINE@ -gpg_LDADD = $(LDADD) @DLLIBS@ @NETLIBS@ @LIBUSB@ @LIBCURL@ -##gpg_CPPFLAGS = @LIBCURL_CPPFLAGS@ +gpg_LDADD = $(LDADD) @DLLIBS@ @NETLIBS@ @LIBUSB@ $(PROGRAMS): $(needed_libs) diff --git a/g10/keyserver.c b/g10/keyserver.c index 553bce1a4..c4938e061 100644 --- a/g10/keyserver.c +++ b/g10/keyserver.c @@ -49,6 +49,16 @@ #define GPGKEYS_PREFIX "gpgkeys_" +#if defined(HAVE_LIBCURL) || defined(FAKE_CURL) +#define GPGKEYS_CURL "gpgkeys_curl" +#endif + +#ifdef GPGKEYS_CURL +#define GPGKEYS_PREFIX_LEN (strlen(GPGKEYS_PREFIX)+strlen(GPGKEYS_CURL)) +#else +#define GPGKEYS_PREFIX_LEN (strlen(GPGKEYS_PREFIX)) +#endif + struct keyrec { KEYDB_SEARCH_DESC desc; @@ -830,47 +840,29 @@ keyserver_search_prompt(IOBUF buffer,const char *searchstr) xfree(line); } -static int -curl_can_handle(const char *scheme) -{ -#if defined(HAVE_LIBCURL) - - const char * const *proto; - curl_version_info_data *data=curl_version_info(CURLVERSION_NOW); - - assert(data); - - for(proto=data->protocols;*proto;proto++) - if(strcasecmp(*proto,scheme)==0) - return 1; - -#elif defined(FAKE_CURL) - - /* If we're faking curl, then we only support HTTP */ - if(strcasecmp(scheme,"http")==0) - return 1; - -#endif - - return 0; -} - /* We sometimes want to use a different gpgkeys_xxx for a given protocol (for example, ldaps is handled by gpgkeys_ldap). Map these here. */ static const char * keyserver_typemap(const char *type) { - if(strcmp(type,"ldap")==0) + if(strcmp(type,"ldaps")==0) return "ldap"; - else if(strcmp(type,"ldaps")==0) - return "ldap"; - else if(curl_can_handle(type)) - return "curl"; else return type; } +#ifdef GPGKEYS_CURL +static int +curl_cant_handle(const char *scheme) +{ + if(strcmp(scheme,"ldap")==0 || strcmp(scheme,"ldaps")==0) + return 1; + + return 0; +} +#endif + #define KEYSERVER_ARGS_KEEP " -o \"%O\" \"%I\"" #define KEYSERVER_ARGS_NOKEEP " -o \"%o\" \"%i\"" @@ -881,7 +873,7 @@ keyserver_spawn(int action,STRLIST list,KEYDB_SEARCH_DESC *desc, int ret=0,i,gotversion=0,outofband=0; STRLIST temp; unsigned int maxlen,buflen; - char *command,*searchstr=NULL; + char *command,*end,*searchstr=NULL; byte *line=NULL; struct parse_options *kopts; struct exec_info *spawn; @@ -923,7 +915,7 @@ keyserver_spawn(int action,STRLIST list,KEYDB_SEARCH_DESC *desc, /* If exec-path was set, and DISABLE_KEYSERVER_PATH is undefined, then don't specify a full path to gpgkeys_foo, so that the PATH can work. */ - command=xmalloc(strlen(GPGKEYS_PREFIX)+strlen(scheme)+1); + command=xmalloc(GPGKEYS_PREFIX_LEN+strlen(scheme)+1); command[0]='\0'; } else @@ -931,14 +923,21 @@ keyserver_spawn(int action,STRLIST list,KEYDB_SEARCH_DESC *desc, { /* Specify a full path to gpgkeys_foo. */ command=xmalloc(strlen(libexecdir)+strlen(DIRSEP_S)+ - strlen(GPGKEYS_PREFIX)+strlen(scheme)+1); + GPGKEYS_PREFIX_LEN+strlen(scheme)+1); strcpy(command,libexecdir); strcat(command,DIRSEP_S); } + end=command+strlen(command); + strcat(command,GPGKEYS_PREFIX); strcat(command,scheme); +#ifdef GPGKEYS_CURL + if(!curl_cant_handle(scheme) && path_access(command,X_OK)!=0) + strcpy(end,GPGKEYS_CURL); +#endif + if(opt.keyserver_options.options&KEYSERVER_USE_TEMP_FILES) { if(opt.keyserver_options.options&KEYSERVER_KEEP_TEMP_FILES) diff --git a/g10/main.h b/g10/main.h index d3c8083dc..e53f73cb5 100644 --- a/g10/main.h +++ b/g10/main.h @@ -129,7 +129,7 @@ int has_invalid_email_chars (const char *s); int is_valid_mailbox (const char *name); char *default_homedir (void); const char *get_libexecdir (void); - +int path_access(const char *file,int mode); /*-- helptext.c --*/ void display_online_help( const char *keyword ); diff --git a/g10/misc.c b/g10/misc.c index 14848eed2..31348b324 100644 --- a/g10/misc.c +++ b/g10/misc.c @@ -1,6 +1,6 @@ /* misc.c - miscellaneous functions - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, - * 2004, 2005 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, + * 2005 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -1223,3 +1223,38 @@ get_libexecdir (void) return GNUPG_LIBEXECDIR; } + +int +path_access(const char *file,int mode) +{ + char *envpath; + int ret=-1; + + envpath=getenv("PATH"); + + if(file[0]=='/' || !envpath) + return access(file,mode); + else + { + /* At least as large as, but most often larger than we need. */ + char *buffer=xmalloc(strlen(envpath)+1+strlen(file)+1); + char *split,*item,*path=xstrdup(envpath); + + split=path; + + while((item=strsep(&split,PATHSEP_S))) + { + strcpy(buffer,item); + strcat(buffer,"/"); + strcat(buffer,file); + ret=access(buffer,mode); + if(ret==0) + break; + } + + xfree(path); + xfree(buffer); + } + + return ret; +} |