aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine-gpg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine-gpg.c')
-rw-r--r--src/engine-gpg.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 123760be..cc249e7b 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -3615,25 +3615,32 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
{
engine_gpg_t gpg = engine;
gpgme_error_t err;
- const char *output = NULL;
+ const char *file_name = NULL;
+ unsigned int mode = flags & (GPGME_SIG_MODE_NORMAL
+ |GPGME_SIG_MODE_DETACH
+ |GPGME_SIG_MODE_CLEAR
+ |GPGME_SIG_MODE_ARCHIVE);
(void)include_certs;
- if ((flags != GPGME_SIG_MODE_NORMAL) && (flags != GPGME_SIG_MODE_DETACH)
- && (flags != GPGME_SIG_MODE_CLEAR) && (flags != GPGME_SIG_MODE_ARCHIVE))
+ if ((mode != GPGME_SIG_MODE_NORMAL) && (mode != GPGME_SIG_MODE_DETACH)
+ && (mode != GPGME_SIG_MODE_CLEAR) && (mode != GPGME_SIG_MODE_ARCHIVE))
return gpg_error (GPG_ERR_INV_VALUE);
- gpg->flags.use_gpgtar = !!(flags & GPGME_SIG_MODE_ARCHIVE);
+ gpg->flags.use_gpgtar = !!(mode == GPGME_SIG_MODE_ARCHIVE);
if (gpg->flags.use_gpgtar && !have_usable_gpgtar (gpg))
return gpg_error (GPG_ERR_NOT_SUPPORTED);
- if (flags & GPGME_SIG_MODE_CLEAR)
+ if (gpg->flags.use_gpgtar && (flags & GPGME_SIG_MODE_FILE))
+ return gpg_error (GPG_ERR_INV_VALUE);
+
+ if (mode == GPGME_SIG_MODE_CLEAR)
err = add_arg (gpg, "--clearsign");
else
{
err = add_arg (gpg, "--sign");
- if (!err && (flags & GPGME_SIG_MODE_DETACH))
+ if (!err && (mode == GPGME_SIG_MODE_DETACH))
err = add_arg (gpg, "--detach");
if (!err && use_armor)
err = add_gpg_arg (gpg, "--armor");
@@ -3657,20 +3664,24 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_SIG);
if (!err)
+ err = add_arg (gpg, "--output");
+ if (!err)
{
- output = gpgme_data_get_file_name (out);
+ const char *output = gpgme_data_get_file_name (out);
if (output)
+ err = add_arg (gpg, output);
+ else
{
- err = add_arg (gpg, "--output");
+ err = add_arg (gpg, "-");
if (!err)
- err = add_arg (gpg, output);
+ err = add_data (gpg, out, 1, 1);
}
}
-
+ if (!err)
+ file_name = gpgme_data_get_file_name (in);
/* Tell the gpg object about the data. */
if (gpg->flags.use_gpgtar)
{
- const char *file_name = gpgme_data_get_file_name (in);
if (!err && file_name)
{
err = add_arg (gpg, "--directory");
@@ -3689,9 +3700,17 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
if (!err)
err = add_data (gpg, in, 0, 0);
}
+ else if (flags & GPGME_SIG_MODE_FILE)
+ {
+ if (!err)
+ err = add_arg (gpg, "--");
+ if (!err && (!file_name || !*file_name))
+ err = gpg_error (GPG_ERR_INV_VALUE);
+ if (!err)
+ err = add_arg (gpg, file_name);
+ }
else
{
- const char *file_name = gpgme_data_get_file_name (in);
if (!err && file_name)
err = add_gpg_arg_with_value (gpg, "--set-filename=", file_name, 0);
if (!err)
@@ -3702,9 +3721,6 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
err = add_data (gpg, in, -1, 0);
}
- if (!err && !output)
- err = add_data (gpg, out, 1, 1);
-
if (!err)
err = start (gpg);