gpgme doesn't seem to return the signatures

Marcus Brinkmann marcus.brinkmann at
Fri Jun 3 00:10:38 CEST 2005


At Wed, 18 May 2005 11:58:26 +0200,
Folkert van Heusden <folkert at> wrote:
>         (void)gpgme_check_version(NULL);
>         err = gpgme_new(&ctx);
>         err = gpgme_op_keylist_start (ctx, NULL, 0);
> 	err = gpgme_op_keylist_next(ctx, &r_key);
> 	gpgme_user_id_t uids = r_key -> uids;
> 	...for each uid...
> 		gpgme_key_sig_t sigs = uids -> signatures;
> Now sigs in this case is *always* NULL!
> And I've verified (with gpg --list-sigs) that *all* keys have one or more signature.

You need to set the keylist mode.  By default, signatures are not
included to speed things up a bit.  If you need them, you need to use
the keylist mode GPGME_KEYLIST_MODE_SIGS.  From the manual (*Key
Listing Mode*):

The @code{GPGME_KEYLIST_MODE_SIGS} symbol specifies that the key
signatures should be included in the listed keys.

From tests/gpg/t-keylist-sig.c:

  int mode;
  mode = gpgme_get_keylist_mode (ctx);
  err = gpgme_set_keylist_mode (ctx, mode);
  fail_if_err (err);

> Oh, and do I need to free-up something after I do gpgme_op_keylist_next?

You need to eventually dereference the key to release its storage.
This is done with gpgme_key_unref ().  From the manual, (*Manipulating

@deftypefun void gpgme_key_unref (@w{gpgme_key_t @var{key}})
The function @code{gpgme_key_unref} releases a reference for the key
@var{key}.  If this was the last reference, the key will be destroyed
and all resources associated to it will be released.
@end deftypefun


More information about the Gnupg-devel mailing list