diff options
author | David Shaw <[email protected]> | 2006-02-23 17:00:02 +0000 |
---|---|---|
committer | David Shaw <[email protected]> | 2006-02-23 17:00:02 +0000 |
commit | c37453211c11d19ac26dc6b70f6d789896aeee9d (patch) | |
tree | a1894712dbe14f78398aa2ba17744106856514a9 | |
parent | * options.h, keyserver-internal.h, keyserver.c (keyserver_import_name), (diff) | |
download | gnupg-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/ChangeLog | 8 | ||||
-rw-r--r-- | g10/keyserver-internal.h | 3 | ||||
-rw-r--r-- | g10/keyserver.c | 62 | ||||
-rw-r--r-- | g10/options.h | 1 |
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; |