gpg_error = gpgme_data_new_from_fd (&kdata, fd);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
+ ot_gpgme_throw (gpg_error, error, "Loading data from fd %i", fd);
goto out;
}
gpg_error = gpgme_op_import (result->context, kdata);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
+ ot_gpgme_throw (gpg_error, error, "Failed to import key");
goto out;
}
}
0 /* do not copy */);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to read signed data: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to read signed data");
goto out;
}
0 /* do not copy */);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to read signature: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to read signature");
goto out;
}
gpg_error = gpgme_op_verify (result->context, signature_buffer, data_buffer, NULL);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to complete signature verification: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to complete signature verification");
goto out;
}
gpg_error = gpgme_new (&result->context);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to create context: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to create context");
goto out;
}
gpg_error = gpgme_op_import (source_context, data_buffer);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to import keys: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to import keys");
goto out;
}
gpg_error = gpgme_get_key (source_context, key_ids[ii], &key, 0);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to find key \"%s\": ", key_ids[ii]);
+ ot_gpgme_throw (gpg_error, error, "Unable to find key \"%s\"", key_ids[ii]);
goto out;
}
if (gpgme_err_code (gpg_error) != GPG_ERR_EOF)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to list keys: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to list keys");
goto out;
}
}
gpg_error = gpgme_data_new (&data_buffer);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to create data buffer: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to create data buffer");
goto out;
}
data_buffer);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to export keys: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to export keys");
goto out;
}
gpg_error = gpgme_op_import (target_context, data_buffer);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to import keys: ");
+ ot_gpgme_throw (gpg_error, error, "Unable to import keys");
goto out;
}
{
if (import_status->result != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
- g_prefix_error (error, "Unable to import key \"%s\": ",
+ ot_gpgme_throw (gpg_error, error, "Unable to import key \"%s\"",
import_status->fpr);
goto out;
}
}
else if (err != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (err, error);
- g_prefix_error (error, "Unable to lookup key ID %s: ", key_id);
+ ot_gpgme_throw (err, error, "Unable to lookup key ID %s", key_id);
goto out;
}
/* Add the key to the context as a signer */
if ((err = gpgme_signers_add (context, key)) != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (err, error);
- g_prefix_error (error, "Error signing commit: ");
+ ot_gpgme_throw (err, error, "Error signing commit");
goto out;
}
-
+
{
gsize len;
const char *buf = g_bytes_get_data (input_data, &len);
if ((err = gpgme_data_new_from_mem (&commit_buffer, buf, len, FALSE)) != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (err, error);
- g_prefix_error (error, "Failed to create buffer from commit file: ");
+ ot_gpgme_throw (err, error, "Failed to create buffer from commit file");
goto out;
}
}
if ((err = gpgme_op_sign (context, commit_buffer, signature_buffer, GPGME_SIG_MODE_DETACH))
!= GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (err, error);
- g_prefix_error (error, "Failure signing commit file: ");
+ ot_gpgme_throw (err, error, "Failure signing commit file");
goto out;
}
#include "libglnx.h"
-void
-ot_gpgme_error_to_gio_error (gpgme_error_t gpg_error,
- GError **error)
+/* Like glnx_throw_errno_prefix, but takes @gpg_error */
+gboolean
+ot_gpgme_throw (gpgme_error_t gpg_error, GError **error,
+ const char *fmt, ...)
{
+ if (error == NULL)
+ return FALSE;
+
GIOErrorEnum errcode;
char errbuf[1024];
/* XXX This list is incomplete. Add cases as needed. */
-
switch (gpgme_err_code (gpg_error))
{
/* special case - shouldn't be here */
case GPG_ERR_NO_ERROR:
- g_return_if_reached ();
+ g_assert_not_reached ();
/* special case - abort on out-of-memory */
case GPG_ERR_ENOMEM:
g_set_error (error, G_IO_ERROR, errcode, "%s: %s",
gpgme_strsource (gpg_error),
errbuf);
+ va_list args;
+ va_start (args, fmt);
+ glnx_real_set_prefix_error_va (*error, fmt, args);
+ va_end (args);
+
+ return FALSE;
}
gboolean
NULL, tmp_home_dir);
if (gpg_error != GPG_ERR_NO_ERROR)
{
- ot_gpgme_error_to_gio_error (gpg_error, error);
+ ot_gpgme_throw (gpg_error, error, "gpgme_ctx_set_engine_info");
goto out;
}
if (gpg_error != GPG_ERR_NO_ERROR)
{
g_assert (gpgme_err_code (gpg_error) == GPG_ERR_ENOMEM);
- ot_gpgme_error_to_gio_error (gpg_error, NULL);
g_assert_not_reached ();
}
if (gpg_error != GPG_ERR_NO_ERROR)
{
g_assert (gpgme_err_code (gpg_error) == GPG_ERR_ENOMEM);
- ot_gpgme_error_to_gio_error (gpg_error, NULL);
g_assert_not_reached ();
}
g_auto(gpgme_ctx_t) context = NULL;
if ((err = gpgme_new (&context)) != GPG_ERR_NO_ERROR)
- {
- ot_gpgme_error_to_gio_error (err, error);
- g_prefix_error (error, "Unable to create gpg context: ");
- return NULL;
- }
+ return ot_gpgme_throw (err, error, "Unable to create gpg context"), NULL;
if (homedir != NULL)
{
if ((err = gpgme_ctx_set_engine_info (context, info->protocol, NULL, homedir))
!= GPG_ERR_NO_ERROR)
- {
- ot_gpgme_error_to_gio_error (err, error);
- g_prefix_error (error, "Unable to set gpg homedir to '%s': ",
- homedir);
- return NULL;
- }
+ return ot_gpgme_throw (err, error, "Unable to set gpg homedir to '%s'", homedir), NULL;
}
return g_steal_pointer (&context);
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_ctx_t, gpgme_release, NULL)
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_key_t, gpgme_key_unref, NULL)
-void ot_gpgme_error_to_gio_error (gpgme_error_t gpg_error, GError **error);
+gboolean ot_gpgme_throw (gpgme_error_t gpg_error, GError **error,
+ const char *fmt, ...) G_GNUC_PRINTF (3, 4);
gboolean ot_gpgme_ctx_tmp_home_dir (gpgme_ctx_t gpgme_ctx,
char **out_tmp_home_dir,