* Makefile.am: No need to link with curl any longer.
authorDavid Shaw <dshaw@jabberwocky.com>
Sun, 21 Aug 2005 20:58:46 +0000 (20:58 +0000)
committerDavid Shaw <dshaw@jabberwocky.com>
Sun, 21 Aug 2005 20:58:46 +0000 (20:58 +0000)
* 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.

g10/ChangeLog
g10/Makefile.am
g10/keyserver.c
g10/main.h
g10/misc.c

index f076e83..7b136b0 100644 (file)
@@ -1,5 +1,18 @@
 2005-08-21  David Shaw  <dshaw@jabberwocky.com>
 
+       * 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.
index 3c1ba7a..fd37897 100644 (file)
@@ -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)
 
index 553bce1..c4938e0 100644 (file)
 
 #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)
index d3c8083..e53f73c 100644 (file)
@@ -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 );
index 14848ee..31348b3 100644 (file)
@@ -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;
+}