See ChangeLog: Wed Apr 28 13:03:03 CEST 1999 Werner Koch
[gnupg.git] / g10 / kbnode.c
index d50d057..70c85f7 100644 (file)
@@ -1,14 +1,14 @@
 /* kbnode.c -  keyblock node utility functions
  *     Copyright (C) 1998 Free Software Foundation, Inc.
  *
- * This file is part of GNUPG.
+ * This file is part of GnuPG.
  *
- * GNUPG is free software; you can redistribute it and/or modify
+ * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
  *
- * GNUPG is distributed in the hope that it will be useful,
+ * GnuPG is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
 #include "packet.h"
 #include "keydb.h"
 
+#define USE_UNUSED_NODES 1
 
+static KBNODE unused_nodes;
 
 KBNODE
 new_kbnode( PACKET *pkt )
 {
-    KBNODE n = m_alloc( sizeof *n );
+    KBNODE n;
+
+    n = unused_nodes;
+    if( n )
+       unused_nodes = n->next;
+    else
+       n = m_alloc( sizeof *n );
     n->next = NULL;
     n->pkt = pkt;
     n->flag = 0;
     n->private_flag=0;
+    n->recno = 0;
     return n;
 }
 
@@ -45,7 +54,13 @@ new_kbnode( PACKET *pkt )
 KBNODE
 clone_kbnode( KBNODE node )
 {
-    KBNODE n = m_alloc( sizeof *n );
+    KBNODE n;
+
+    n = unused_nodes;
+    if( n )
+       unused_nodes = n->next;
+    else
+       n = m_alloc( sizeof *n );
     n->next = NULL;
     n->pkt = node->pkt;
     n->flag = 0;
@@ -61,9 +76,16 @@ release_kbnode( KBNODE n )
 
     while( n ) {
        n2 = n->next;
-       if( !(n->private_flag & 2) )
+       if( !(n->private_flag & 2) ) {
            free_packet( n->pkt );
+           m_free( n->pkt );
+       }
+      #if USE_UNUSED_NODES
+       n->next = unused_nodes;
+       unused_nodes = n;
+      #else
        m_free( n );
+      #endif
        n = n2;
     }
 }
@@ -94,7 +116,8 @@ add_kbnode( KBNODE root, KBNODE node )
 }
 
 /****************
- * Insert NODE into the list after root but before a packet with type PKTTYPE
+ * Insert NODE into the list after root but before a packet which is not of
+ * type PKTTYPE
  * (only if PKTTYPE != 0)
  */
 void
@@ -108,7 +131,7 @@ insert_kbnode( KBNODE root, KBNODE node, int pkttype )
        KBNODE n1;
 
        for(n1=root; n1->next;  n1 = n1->next)
-           if( pkttype == n1->next->pkt->pkttype ) {
+           if( pkttype != n1->next->pkt->pkttype ) {
                node->next = n1->next;
                n1->next = node;
                return;
@@ -136,7 +159,7 @@ find_prev_kbnode( KBNODE root, KBNODE node, int pkttype )
 }
 
 /****************
- * Ditto, but find the next package.  The behaviour is trivial if
+ * Ditto, but find the next packet.  The behaviour is trivial if
  * PKTTYPE is 0 but if it is specified, the next node with a packet
  * of this type is returned.  The function has some knowledge about
  * the valid ordering of packets: e.g. if the next signature packet
@@ -150,13 +173,13 @@ find_next_kbnode( KBNODE node, int pkttype )
        if( !pkttype )
            return node;
        else if( pkttype == PKT_USER_ID
-                && (   node->pkt->pkttype == PKT_PUBLIC_CERT
-                    || node->pkt->pkttype == PKT_SECRET_CERT ) )
+                && (   node->pkt->pkttype == PKT_PUBLIC_KEY
+                    || node->pkt->pkttype == PKT_SECRET_KEY ) )
            return NULL;
        else if( pkttype == PKT_SIGNATURE
                 && (   node->pkt->pkttype == PKT_USER_ID
-                    || node->pkt->pkttype == PKT_PUBLIC_CERT
-                    || node->pkt->pkttype == PKT_SECRET_CERT ) )
+                    || node->pkt->pkttype == PKT_PUBLIC_KEY
+                    || node->pkt->pkttype == PKT_SECRET_KEY ) )
            return NULL;
        else if( node->pkt->pkttype == pkttype )
            return node;
@@ -229,9 +252,16 @@ commit_kbnode( KBNODE *root )
                *root = nl = n->next;
            else
                nl->next = n->next;
-           if( !(n->private_flag & 2) )
+           if( !(n->private_flag & 2) ) {
                free_packet( n->pkt );
+               m_free( n->pkt );
+           }
+         #if USE_UNUSED_NODES
+           n->next = unused_nodes;
+           unused_nodes = n;
+         #else
            m_free( n );
+         #endif
            changed = 1;
        }
        else
@@ -248,14 +278,14 @@ dump_kbnode( KBNODE node )
        const char *s;
        switch( node->pkt->pkttype ) {
          case 0:               s="empty"; break;
-         case PKT_PUBLIC_CERT: s="public-key"; break;
-         case PKT_SECRET_CERT: s="secret-key"; break;
-         case PKT_SECKEY_SUBCERT:  s= "secret-subkey"; break;
+         case PKT_PUBLIC_KEY:  s="public-key"; break;
+         case PKT_SECRET_KEY:  s="secret-key"; break;
+         case PKT_SECRET_SUBKEY: s= "secret-subkey"; break;
          case PKT_PUBKEY_ENC:  s="public-enc"; break;
          case PKT_SIGNATURE:   s="signature"; break;
          case PKT_ONEPASS_SIG: s="onepass-sig"; break;
          case PKT_USER_ID:     s="user-id"; break;
-         case PKT_PUBKEY_SUBCERT: s="public-subkey"; break;
+         case PKT_PUBLIC_SUBKEY: s="public-subkey"; break;
          case PKT_COMMENT:     s="comment"; break;
          case PKT_RING_TRUST:  s="trust"; break;
          case PKT_PLAINTEXT:   s="plaintext"; break;
@@ -275,10 +305,10 @@ dump_kbnode( KBNODE node )
            fprintf(stderr, "  keyid=%08lX\n",
                   (ulong)node->pkt->pkt.signature->keyid[1] );
        }
-       else if( node->pkt->pkttype == PKT_PUBLIC_CERT
-                || node->pkt->pkttype == PKT_PUBKEY_SUBCERT ) {
+       else if( node->pkt->pkttype == PKT_PUBLIC_KEY
+                || node->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
            fprintf(stderr, "  keyid=%08lX\n", (ulong)
-                 keyid_from_pkc( node->pkt->pkt.public_cert, NULL ));
+                 keyid_from_pk( node->pkt->pkt.public_key, NULL ));
        }
        else
            fputs("\n", stderr);