{ gpgme_error_t err;
{
op_decrypt_file (const char *infile, const char *outfile){    gpgme_error_t err;    gpgme_data_t in = NULL;    gpgme_data_t out = NULL;        gpgme_ctx_t ctx = NULL;    struct decrypt_key_s *hd;    err = gpgme_data_new_from_file (&in, infile, 1);    if (err)	return err;    hd = xcalloc (1, sizeof *hd);    err = gpgme_new (&ctx);    if (err)	goto fail;    /* XXX: violates the information hiding principle */    {	struct decrypt_key_s *cb = (struct decrypt_key_s *)hd;	cb->ctx = (void *)ctx;    }    gpgme_set_passphrase_cb (ctx, passphrase_callback_box, hd);    err = gpgme_data_new (&out);    if (err)	goto fail;    err = gpgme_op_decrypt (ctx, in, out);    if (!err)	err = data_to_file (&out, outfile);fail:    if (in != NULL)	gpgme_data_release (in);    if (out != NULL)	gpgme_data_release (out);    if (ctx != NULL)	gpgme_release (ctx);    xfree (hd);    return err;}