summaryrefslogtreecommitdiff
path: root/src/engine-gpgsm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine-gpgsm.c')
-rw-r--r--src/engine-gpgsm.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
index 396f19c..ae5d8ef 100644
--- a/src/engine-gpgsm.c
+++ b/src/engine-gpgsm.c
@@ -549,8 +549,6 @@ gpgsm_new (void **engine, const char *file_name, const char *home_dir,
|| _gpgme_io_set_close_notify (gpgsm->output_cb.fd,
close_notify_handler, gpgsm)
|| _gpgme_io_set_close_notify (gpgsm->message_cb.fd,
- close_notify_handler, gpgsm)
- || _gpgme_io_set_close_notify (gpgsm->diag_cb.fd,
close_notify_handler, gpgsm)))
{
err = gpg_error (GPG_ERR_GENERAL);
@@ -1129,7 +1127,7 @@ add_io_cb (engine_gpgsm_t gpgsm, iocb_data_t *iocbd, gpgme_io_cb_t handler)
gpgme_error_t err;
TRACE_BEG (DEBUG_ENGINE, "engine-gpgsm:add_io_cb", gpgsm,
- "fd %d, dir %d", iocbd->fd, iocbd->dir);
+ "fd=%d, dir %d", iocbd->fd, iocbd->dir);
err = (*gpgsm->io_cbs.add) (gpgsm->io_cbs.add_priv,
iocbd->fd, iocbd->dir,
handler, iocbd->data, &iocbd->tag);
@@ -1409,11 +1407,12 @@ set_recipients_from_string (engine_gpgsm_t gpgsm, const char *string)
{
gpg_error_t err = 0;
char *line = NULL;
- int no_pubkey = 0;
+ int ignore = 0;
+ int any = 0;
const char *s;
int n;
- for (;;)
+ do
{
while (*string == ' ' || *string == '\t')
string++;
@@ -1428,25 +1427,32 @@ set_recipients_from_string (engine_gpgsm_t gpgsm, const char *string)
while (n && (string[n-1] == ' ' || string[n-1] == '\t'))
n--;
- gpgrt_free (line);
- if (gpgrt_asprintf (&line, "RECIPIENT %.*s", n, string) < 0)
+ if (!ignore && n == 2 && !memcmp (string, "--", 2))
+ ignore = 1;
+ else if (!ignore && n > 2 && !memcmp (string, "--", 2))
+ err = gpg_error (GPG_ERR_UNKNOWN_OPTION);
+ else if (n) /* Not empty - use it. */
{
- err = gpg_error_from_syserror ();
- break;
+ gpgrt_free (line);
+ if (gpgrt_asprintf (&line, "RECIPIENT %.*s", n, string) < 0)
+ err = gpg_error_from_syserror ();
+ else
+ {
+ err = gpgsm_assuan_simple_command (gpgsm, line, gpgsm->status.fnc,
+ gpgsm->status.fnc_value);
+ if (!err)
+ any = 1;
+ }
}
- string += n + !!s;
-
- err = gpgsm_assuan_simple_command (gpgsm, line, gpgsm->status.fnc,
- gpgsm->status.fnc_value);
- /* Fixme: Improve error reporting. */
- if (gpg_err_code (err) == GPG_ERR_NO_PUBKEY)
- no_pubkey++;
- else if (err)
- break;
+ string += n + !!s;
}
+ while (!err);
+
+ if (!err && !any)
+ err = gpg_error (GPG_ERR_MISSING_KEY);
gpgrt_free (line);
- return err? err : no_pubkey? gpg_error (GPG_ERR_NO_PUBKEY) : 0;
+ return err;
}
@@ -1460,7 +1466,7 @@ gpgsm_encrypt (void *engine, gpgme_key_t recp[], const char *recpstring,
if (!gpgsm)
return gpg_error (GPG_ERR_INV_VALUE);
- if (!recp)
+ if (!recp && !recpstring) /* Symmetric only */
return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
if ((flags & GPGME_ENCRYPT_NO_ENCRYPT_TO))