aboutsummaryrefslogtreecommitdiffstats
path: root/g10/keylist.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/keylist.c')
-rw-r--r--g10/keylist.c89
1 files changed, 56 insertions, 33 deletions
diff --git a/g10/keylist.c b/g10/keylist.c
index 69e9b523b..a1150cdd5 100644
--- a/g10/keylist.c
+++ b/g10/keylist.c
@@ -37,6 +37,7 @@
static void list_all(int);
static void list_one(const char *name, int secret);
+static void list_keyblock( KBNODE keyblock, int secret );
static void fingerprint( PKT_public_key *pk, PKT_secret_key *sk );
@@ -70,63 +71,87 @@ secret_key_list( int nnames, char **names )
static void
list_all( int secret )
{
- int i, seq=0;
- const char *s;
- IOBUF a;
-
- /* FIXME: this assumes a keyring resource is a plain keyring file */
- while( (s = enum_keyblock_resources( &seq, secret )) ) {
- if( !(a = iobuf_open(s)) ) {
- log_error(_("can't open %s: %s\n"), s, strerror(errno));
- continue;
- }
- if( seq > 1 )
- putchar('\n');
- printf("%s\n", s );
- for(i=strlen(s); i; i-- )
- putchar('-');
- putchar('\n');
+ KBPOS kbpos;
+ KBNODE keyblock = NULL;
+ int rc=0;
+ int lastresno;
+
+ rc = enum_keyblocks( secret? 5:0, &kbpos, &keyblock );
+ if( rc ) {
+ if( rc != -1 )
+ log_error("enum_keyblocks(open) failed: %s\n", g10_errstr(rc) );
+ goto leave;
+ }
- proc_packets( a );
- iobuf_close(a);
+ lastresno = -1;
+ while( !(rc = enum_keyblocks( 1, &kbpos, &keyblock )) ) {
+ if( lastresno != kbpos.resno ) {
+ const char *s = keyblock_resource_name( &kbpos );
+ int i;
+
+ lastresno = kbpos.resno;
+ printf("%s\n", s );
+ for(i=strlen(s); i; i-- )
+ putchar('-');
+ putchar('\n');
+ }
+ merge_keys_and_selfsig( keyblock );
+ list_keyblock( keyblock, secret );
+ release_kbnode( keyblock ); keyblock = NULL;
}
+
+ if( rc && rc != -1 )
+ log_error("enum_keyblocks(read) failed: %s\n", g10_errstr(rc));
+
+ leave:
+ enum_keyblocks( 2, &kbpos, &keyblock ); /* close */
+ release_kbnode( keyblock );
}
+
+
static void
list_one( const char *name, int secret )
{
int rc = 0;
KBNODE keyblock = NULL;
- KBNODE kbctx;
- KBNODE node;
KBPOS kbpos;
- PKT_public_key *pk;
- PKT_secret_key *sk;
- u32 keyid[2];
- int any=0;
- int trustletter = 0;
- /* search the userid */
rc = secret? find_secret_keyblock_byname( &kbpos, name )
: find_keyblock_byname( &kbpos, name );
if( rc ) {
log_error("%s: user not found\n", name );
- goto leave;
+ return;
}
- /* read the keyblock */
rc = read_keyblock( &kbpos, &keyblock );
if( rc ) {
log_error("%s: keyblock read problem: %s\n", name, g10_errstr(rc) );
- goto leave;
+ return;
}
+ merge_keys_and_selfsig( keyblock );
+ list_keyblock( keyblock, secret );
+ release_kbnode( keyblock );
+}
+static void
+list_keyblock( KBNODE keyblock, int secret )
+{
+ int rc = 0;
+ KBNODE kbctx;
+ KBNODE node;
+ PKT_public_key *pk;
+ PKT_secret_key *sk;
+ u32 keyid[2];
+ int any=0;
+ int trustletter = 0;
+
/* get the keyid from the keyblock */
node = find_kbnode( keyblock, secret? PKT_SECRET_KEY : PKT_PUBLIC_KEY );
if( !node ) {
log_error("Oops; key lost!\n");
- goto leave;
+ return;
}
if( secret ) {
@@ -336,11 +361,9 @@ list_one( const char *name, int secret )
putchar(':');
putchar('\n');
}
+}
- leave:
- release_kbnode( keyblock );
-}
static void
fingerprint( PKT_public_key *pk, PKT_secret_key *sk )