aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/ChangeLog13
-rw-r--r--g10/Makefile.am3
-rw-r--r--g10/keyserver.c65
-rw-r--r--g10/main.h2
-rw-r--r--g10/misc.c39
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;
+}