aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shaw <[email protected]>2006-02-23 17:00:02 +0000
committerDavid Shaw <[email protected]>2006-02-23 17:00:02 +0000
commitc37453211c11d19ac26dc6b70f6d789896aeee9d (patch)
treea1894712dbe14f78398aa2ba17744106856514a9
parent* options.h, keyserver-internal.h, keyserver.c (keyserver_import_name), (diff)
downloadgnupg-c37453211c11d19ac26dc6b70f6d789896aeee9d.tar.gz
gnupg-c37453211c11d19ac26dc6b70f6d789896aeee9d.zip
* options.h, keyserver.c (add_canonical_option): New.
(parse_keyserver_options): Moved from here. (parse_keyserver_uri): Use it here so each keyserver can have some private options in addition to the main keyserver-options (e.g. per-keyserver auth).
-rw-r--r--g10/ChangeLog8
-rw-r--r--g10/keyserver-internal.h3
-rw-r--r--g10/keyserver.c62
-rw-r--r--g10/options.h1
4 files changed, 54 insertions, 20 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index ffc38deaa..77b05a6a1 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,11 @@
+2006-02-23 David Shaw <[email protected]>
+
+ * options.h, keyserver.c (add_canonical_option): New.
+ (parse_keyserver_options): Moved from here.
+ (parse_keyserver_uri): Use it here so each keyserver can have some
+ private options in addition to the main keyserver-options
+ (e.g. per-keyserver auth).
+
2006-02-22 David Shaw <[email protected]>
* options.h, keyserver-internal.h, keyserver.c
diff --git a/g10/keyserver-internal.h b/g10/keyserver-internal.h
index ed5fdceb1..c35c57134 100644
--- a/g10/keyserver-internal.h
+++ b/g10/keyserver-internal.h
@@ -29,7 +29,8 @@
int parse_keyserver_options(char *options);
void free_keyserver_spec(struct keyserver_spec *keyserver);
-struct keyserver_spec *parse_keyserver_uri(const char *uri,int require_scheme,
+struct keyserver_spec *parse_keyserver_uri(const char *string,
+ int require_scheme,
const char *configname,
unsigned int configlineno);
struct keyserver_spec *parse_preferred_keyserver(PKT_signature *sig);
diff --git a/g10/keyserver.c b/g10/keyserver.c
index bf3ce2149..4d51f91bc 100644
--- a/g10/keyserver.c
+++ b/g10/keyserver.c
@@ -104,6 +104,27 @@ static int keyserver_work(enum ks_action action,STRLIST list,
static size_t max_cert_size=DEFAULT_MAX_CERT_SIZE;
+static void
+add_canonical_option(char *option,STRLIST *list)
+{
+ char *arg=argsplit(option);
+
+ if(arg)
+ {
+ char *joined;
+
+ joined=xmalloc(strlen(option)+1+strlen(arg)+1);
+ /* Make a canonical name=value form with no spaces */
+ strcpy(joined,option);
+ strcat(joined,"=");
+ strcat(joined,arg);
+ add_to_strlist(list,joined);
+ xfree(joined);
+ }
+ else
+ add_to_strlist(list,option);
+}
+
int
parse_keyserver_options(char *options)
{
@@ -152,23 +173,7 @@ parse_keyserver_options(char *options)
{
/* All of the standard options have failed, so the option is
destined for a keyserver plugin. */
- char *arg=argsplit(tok);
-
- if(arg)
- {
- char *joined;
-
- joined=xmalloc(strlen(tok)+1+strlen(arg)+1);
- /* Make a canonical name=value form with no
- spaces */
- strcpy(joined,tok);
- strcat(joined,"=");
- strcat(joined,arg);
- add_to_strlist(&opt.keyserver_options.other,joined);
- xfree(joined);
- }
- else
- add_to_strlist(&opt.keyserver_options.other,tok);
+ add_canonical_option(tok,&opt.keyserver_options.other);
}
}
@@ -193,6 +198,7 @@ free_keyserver_spec(struct keyserver_spec *keyserver)
xfree(keyserver->port);
xfree(keyserver->path);
xfree(keyserver->opaque);
+ free_strlist(keyserver->options);
xfree(keyserver);
}
@@ -201,18 +207,33 @@ free_keyserver_spec(struct keyserver_spec *keyserver)
keyserver/ksutil.c for limited use in gpgkeys_ldap or the like. */
struct keyserver_spec *
-parse_keyserver_uri(const char *uri,int require_scheme,
+parse_keyserver_uri(const char *string,int require_scheme,
const char *configname,unsigned int configlineno)
{
int assume_hkp=0;
struct keyserver_spec *keyserver;
const char *idx;
int count;
+ char *uri,*options;
- assert(uri!=NULL);
+ assert(string!=NULL);
keyserver=xmalloc_clear(sizeof(struct keyserver_spec));
+ uri=xstrdup(string);
+
+ options=strchr(uri,' ');
+ if(options)
+ {
+ char *tok;
+
+ *options='\0';
+ options++;
+
+ while((tok=optsep(&options)))
+ add_canonical_option(tok,&keyserver->options);
+ }
+
/* Get the scheme */
for(idx=uri,count=0;*idx && *idx!=':';idx++)
@@ -1038,6 +1059,9 @@ keyserver_spawn(enum ks_action action,STRLIST list,KEYDB_SEARCH_DESC *desc,
for(temp=opt.keyserver_options.other;temp;temp=temp->next)
fprintf(spawn->tochild,"OPTION %s\n",temp->d);
+ for(temp=opt.keyserver->options;temp;temp=temp->next)
+ fprintf(spawn->tochild,"OPTION %s\n",temp->d);
+
switch(action)
{
case KS_GET:
diff --git a/g10/options.h b/g10/options.h
index b1b0cfde9..f5ccbbdc0 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -136,6 +136,7 @@ struct
char *port;
char *path;
char *opaque;
+ STRLIST options;
struct
{
unsigned int direct_uri:1;