1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-04-17 15:44:34 +02:00

dirmngr: Factor a common command parsing code out.

* dirmngr/server.c (percentplus_line_to_strlist): New.  Code taken
from cmd_ks_get.
(cmd_ks_search, cmd_ks_get): Use it here.
This commit is contained in:
Werner Koch 2025-02-21 14:35:21 +01:00
parent 75667050dc
commit db7141d462
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B

View File

@ -324,6 +324,46 @@ strcpy_escaped_plus (char *d, const unsigned char *s)
} }
/* Break the LINE into space delimited tokens, put them into a new
* strlist and return it at R_LIST. On error an erro code is
* returned. If no tokens are found the list is set to NULL.
* Percent-plus encoding is removed from each token. Note that the
* function will modify LINE. */
static gpg_error_t
percentplus_line_to_strlist (char *line, strlist_t *r_list)
{
strlist_t list = NULL;
strlist_t sl;
char *p;
for (p=line; *p; line = p)
{
while (*p && *p != ' ')
p++;
if (*p)
*p++ = 0;
if (*line)
{
sl = xtrymalloc (sizeof *sl + strlen (line));
if (!sl)
{
gpg_error_t err = gpg_error_from_syserror ();
free_strlist (list);
*r_list = NULL;
return err;
}
sl->flags = 0;
strcpy_escaped_plus (sl->d, line);
sl->next = list;
list = sl;
}
}
*r_list = list;
return 0;
}
/* This function returns true if a Tor server is running. The status /* This function returns true if a Tor server is running. The status
* is cached for the current connection. */ * is cached for the current connection. */
static int static int
@ -2434,37 +2474,16 @@ cmd_ks_search (assuan_context_t ctx, char *line)
{ {
ctrl_t ctrl = assuan_get_pointer (ctx); ctrl_t ctrl = assuan_get_pointer (ctx);
gpg_error_t err; gpg_error_t err;
strlist_t list, sl; strlist_t list;
char *p;
estream_t outfp; estream_t outfp;
if (has_option (line, "--quick")) if (has_option (line, "--quick"))
ctrl->timeout = opt.connect_quick_timeout; ctrl->timeout = opt.connect_quick_timeout;
line = skip_options (line); line = skip_options (line);
/* Break the line down into an strlist. Each pattern is err = percentplus_line_to_strlist (line, &list);
percent-plus escaped. */ if (err)
list = NULL;
for (p=line; *p; line = p)
{
while (*p && *p != ' ')
p++;
if (*p)
*p++ = 0;
if (*line)
{
sl = xtrymalloc (sizeof *sl + strlen (line));
if (!sl)
{
err = gpg_error_from_syserror ();
goto leave; goto leave;
}
sl->flags = 0;
strcpy_escaped_plus (sl->d, line);
sl->next = list;
list = sl;
}
}
err = ensure_keyserver (ctrl); err = ensure_keyserver (ctrl);
if (err) if (err)
@ -2503,9 +2522,7 @@ cmd_ks_get (assuan_context_t ctx, char *line)
ctrl_t ctrl = assuan_get_pointer (ctx); ctrl_t ctrl = assuan_get_pointer (ctx);
gpg_error_t err; gpg_error_t err;
strlist_t list = NULL; strlist_t list = NULL;
strlist_t sl;
const char *s; const char *s;
char *p;
estream_t outfp; estream_t outfp;
unsigned int flags = 0; unsigned int flags = 0;
gnupg_isotime_t opt_newer; gnupg_isotime_t opt_newer;
@ -2528,30 +2545,13 @@ cmd_ks_get (assuan_context_t ctx, char *line)
} }
line = skip_options (line); line = skip_options (line);
/* Break the line into a strlist. Each pattern is by /* Break the line into a strlist. Each pattern is by definition
definition percent-plus escaped. However we only support keyids percent-plus escaped. However we only support keyids and
and fingerprints and thus the client has no need to apply the fingerprints and thus the caler of this function has no need to
escaping. */ apply the escaping. */
for (p=line; *p; line = p) err = percentplus_line_to_strlist (line, &list);
{ if (err)
while (*p && *p != ' ')
p++;
if (*p)
*p++ = 0;
if (*line)
{
sl = xtrymalloc (sizeof *sl + strlen (line));
if (!sl)
{
err = gpg_error_from_syserror ();
goto leave; goto leave;
}
sl->flags = 0;
strcpy_escaped_plus (sl->d, line);
sl->next = list;
list = sl;
}
}
if ((flags & KS_GET_FLAG_FIRST) && !(flags & KS_GET_FLAG_ONLY_LDAP)) if ((flags & KS_GET_FLAG_FIRST) && !(flags & KS_GET_FLAG_ONLY_LDAP))
{ {