void import ( gpgme_ctx_t * context, telem_gpg_opts * options, int num_keys, char ** key_path ) { gpgme_error_t err; int url_mode = 0; int nul_mode = 0; gpgme_import_result_t impres; gpgme_data_t data; for (; num_keys; --num_keys, key_path++) { printf ("reading file `%s'\n", *key_path); err = gpgme_data_new_from_file(&data, *key_path, 1); fail_if_err(err); if (url_mode) gpgme_data_set_encoding( data, (nul_mode? GPGME_DATA_ENCODING_URL0 : GPGME_DATA_ENCODING_URL) ); err = gpgme_op_import(*context, data); fail_if_err(err); impres = gpgme_op_import_result(*context); if (!impres) { fprintf(stderr, "No import result returned\n"); exit(1); } print_import_result(impres); gpgme_data_release(data); } }
int main(void) { gpgme_ctx_t ctx; gpgme_error_t err; int setup_res = setup(&ctx); if(setup_res) return setup_res; /* Change mode to extern */ gpgme_keylist_mode_t mode = gpgme_get_keylist_mode(ctx); mode &= ~GPGME_KEYLIST_MODE_LOCAL; mode |= GPGME_KEYLIST_MODE_EXTERN; mode |= GPGME_KEYLIST_MODE_SIGS | GPGME_KEYLIST_MODE_SIG_NOTATIONS; err = gpgme_set_keylist_mode(ctx, mode); if (err != GPG_ERR_NO_ERROR) return 6; /* List all keys */ /* (context, pattern, secret_only) */ err = gpgme_op_keylist_start(ctx, "07E7871B", 0); if (err != GPG_ERR_NO_ERROR) return 7; gpgme_key_t key; size_t MAX_KEYS = 100; gpgme_key_t keyarray[MAX_KEYS+1]; // need a space for the NULL term size_t i = 0; while ((err = gpgme_op_keylist_next(ctx, &key)) == GPG_ERR_NO_ERROR) { printf("Got a key\n"); printf ("%s:", key->subkeys->keyid); if (key->uids && key->uids->name) printf (" %s", key->uids->name); if (key->uids && key->uids->email) printf (" <%s>", key->uids->email); if (key->uids && key->uids->signatures) { printf("First signature: %s\n", key->uids->signatures->keyid); } putchar ('\n'); if (i < MAX_KEYS) { keyarray[i++] = key; } else { printf("Too many keys, skipping a key\n"); } //gpgme_key_release (key); } if (gpg_err_code(err) == GPG_ERR_EOF) { printf("%xu\n", err); printf("End of keylist.\n"); } else { print_gpg_error(err); return 8; } // https://bugs.gnupg.org/gnupg/issue1670 printf("Attempting to import %lu keys\n", i); err = gpgme_op_import_keys(ctx, keyarray); if (err != GPG_ERR_NO_ERROR) return 9; gpgme_import_result_t impres = gpgme_op_import_result(ctx); if (!impres) return 10; print_import_result(impres); /* free keys */ for (i = 0; keyarray[i]; i++) gpgme_key_release(key); /* free context */ gpgme_release(ctx); return 0; }