aboutsummaryrefslogtreecommitdiffstats
path: root/g10/keyserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/keyserver.c')
-rw-r--r--g10/keyserver.c62
1 files changed, 43 insertions, 19 deletions
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: