Converted all m_free to xfree etc.
[gnupg.git] / g10 / keylist.c
index e4c9e6e..b5ba537 100644 (file)
@@ -1,6 +1,6 @@
 /* keylist.c
  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
- *               2004 Free Software Foundation, Inc.
+ *               2004, 2005 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -16,7 +16,8 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  */
 
 #include <config.h>
@@ -95,6 +96,13 @@ public_key_list( STRLIST list )
       printf("\n");
     }
 
+  /* We need to do the stale check right here because it might need to
+     update the keyring while we already have the keyring open.  This
+     is very bad for W32 because of a sharing violation. For real OSes
+     it might lead to false results if we are later listing a keyring
+     which is associated with the inode of a deleted file.  */
+  check_trustdb_stale ();
+
   if( !list )
     list_all(0);
   else
@@ -104,6 +112,8 @@ public_key_list( STRLIST list )
 void
 secret_key_list( STRLIST list )
 {
+    check_trustdb_stale ();
+
     if( !list )
        list_all(1);
     else  /* List by user id */
@@ -124,7 +134,7 @@ print_seckey_info (PKT_secret_key *sk)
              pubkey_letter (sk->pubkey_algo),
              keystr(keyid), datestr_from_sk (sk), p);
     
-  m_free (p);
+  xfree (p);
 }
 
 /* Print information about the public key.  With FP passed as NULL,
@@ -155,9 +165,63 @@ print_pubkey_info (FILE *fp, PKT_public_key *pk)
                 nbits_from_pk (pk), pubkey_letter (pk->pubkey_algo),
                 keystr(keyid), datestr_from_pk (pk), p);
 
-  m_free (p);
+  xfree (p);
+}
+
+
+/* Print basic information of a secret key including the card serial
+   number information. */
+void
+print_card_key_info (FILE *fp, KBNODE keyblock)
+{
+  KBNODE node;
+  int i;
+
+  for (node = keyblock; node; node = node->next ) 
+    {
+      if (node->pkt->pkttype == PKT_SECRET_KEY
+          || (node->pkt->pkttype == PKT_SECRET_SUBKEY) )
+        {
+          PKT_secret_key *sk = node->pkt->pkt.secret_key;
+          
+          tty_fprintf (fp, "%s%c  %4u%c/%s  ",
+                      node->pkt->pkttype == PKT_SECRET_KEY? "sec":"ssb",
+                       (sk->protect.s2k.mode==1001)?'#':
+                       (sk->protect.s2k.mode==1002)?'>':' ',
+                      nbits_from_sk (sk),
+                      pubkey_letter (sk->pubkey_algo),
+                      keystr_from_sk(sk));
+          tty_fprintf (fp, _("created: %s"), datestr_from_sk (sk));
+          tty_fprintf (fp, "  ");
+          tty_fprintf (fp, _("expires: %s"), expirestr_from_sk (sk));
+          if (sk->is_protected && sk->protect.s2k.mode == 1002)
+            {
+              tty_fprintf (fp, "\n                      ");
+              tty_fprintf (fp, _("card-no: ")); 
+              if (sk->protect.ivlen == 16
+                  && !memcmp (sk->protect.iv, "\xD2\x76\x00\x01\x24\x01", 6))
+                { 
+                  /* This is an OpenPGP card. */
+                  for (i=8; i < 14; i++)
+                    {
+                      if (i == 10)
+                        tty_fprintf (fp, " ");
+                      tty_fprintf (fp, "%02X", sk->protect.iv[i]);
+                    }
+                }
+              else
+                { /* Something is wrong: Print all. */
+                  for (i=0; i < sk->protect.ivlen; i++)
+                    tty_fprintf (fp, "%02X", sk->protect.iv[i]);
+                }
+            }
+          tty_fprintf (fp, "\n");
+        }
+    }
 }
 
+
+
 /* Flags = 0x01 hashed 0x02 critical */
 static void
 status_one_subpacket(sigsubpkttype_t type,size_t len,int flags,const byte *buf)
@@ -168,7 +232,7 @@ status_one_subpacket(sigsubpkttype_t type,size_t len,int flags,const byte *buf)
   if(len>256)
     return;
 
-  sprintf(status,"%d %u %u ",type,flags,len);
+  sprintf(status,"%d %u %u ",type,flags,(unsigned int)len);
 
   write_status_text_and_buffer(STATUS_SIG_SUBPACKET,status,buf,len,0);
 }
@@ -580,7 +644,7 @@ print_one_subpacket(sigsubpkttype_t type,size_t len,int flags,const byte *buf)
 {
   size_t i;
 
-  printf("spk:%d:%u:%u:",type,flags,len);
+  printf("spk:%d:%u:%u:",type,flags,(unsigned int)len);
 
   for(i=0;i<len;i++)
     {
@@ -726,7 +790,7 @@ list_keyblock_print ( KBNODE keyblock, int secret, int fpr, void *opaque )
        else if(pk->has_expired)
          {
            printf(" [");
-           printf(_("expired: %s)"),expirestr_from_pk(pk));
+           printf(_("expired: %s"),expirestr_from_pk(pk));
            printf("]");
          }
        else if(pk->expiredate)
@@ -760,7 +824,7 @@ list_keyblock_print ( KBNODE keyblock, int secret, int fpr, void *opaque )
        if( node->pkt->pkttype == PKT_USER_ID && !opt.fast_list_mode ) {
            PKT_user_id *uid=node->pkt->pkt.user_id;
 
-           if((uid->is_expired || uid->is_revoked)
+           if(pk && (uid->is_expired || uid->is_revoked)
               && !(opt.list_options&LIST_SHOW_UNUSABLE_UIDS))
              {
                skip_sigs=1;
@@ -787,7 +851,7 @@ list_keyblock_print ( KBNODE keyblock, int secret, int fpr, void *opaque )
                printf("uid%*s%s ",indent,"",validity);
              }
            else
-             printf("uid%*s",keystrlen()+10,"");
+             printf("uid%*s", (int)keystrlen()+10,"");
 
             print_utf8_string( stdout, uid->name, uid->len );
            putchar('\n');
@@ -922,7 +986,7 @@ list_keyblock_print ( KBNODE keyblock, int secret, int fpr, void *opaque )
                size_t n;
                char *p = get_user_id( sig->keyid, &n );
                 print_utf8_string( stdout, p, n );
-               m_free(p);
+               xfree(p);
            }
            putchar('\n');
 
@@ -1229,7 +1293,7 @@ list_keyblock_colon( KBNODE keyblock, int secret, int fpr )
 
                fflush(stdout);
                if(opt.no_sig_cache)
-                 signer_pk=m_alloc_clear(sizeof(PKT_public_key));
+                 signer_pk=xmalloc_clear(sizeof(PKT_public_key));
 
                rc = check_key_signature2( keyblock, node, NULL, signer_pk,
                                           NULL, NULL, NULL );
@@ -1281,7 +1345,7 @@ list_keyblock_colon( KBNODE keyblock, int secret, int fpr )
                size_t n;
                char *p = get_user_id( sig->keyid, &n );
                 print_string( stdout, p, n, ':' );
-               m_free(p);
+               xfree(p);
            }
             printf(":%02x%c:", sig->sig_class,sig->flags.exportable?'x':'l');
 
@@ -1405,14 +1469,14 @@ print_fingerprint (PKT_public_key *pk, PKT_secret_key *sk, int mode )
       {
        if(sk)
          {
-           PKT_secret_key *primary_sk=m_alloc_clear(sizeof(*primary_sk));
+           PKT_secret_key *primary_sk=xmalloc_clear(sizeof(*primary_sk));
            get_seckey(primary_sk,sk->main_keyid);
            print_fingerprint(NULL,primary_sk,mode|0x80);
            free_secret_key(primary_sk);
          }
        else
          {
-           PKT_public_key *primary_pk=m_alloc_clear(sizeof(*primary_pk));
+           PKT_public_key *primary_pk=xmalloc_clear(sizeof(*primary_pk));
            get_pubkey(primary_pk,pk->main_keyid);
            print_fingerprint(primary_pk,NULL,mode|0x80);
            free_public_key(primary_pk);
@@ -1428,9 +1492,9 @@ print_fingerprint (PKT_public_key *pk, PKT_secret_key *sk, int mode )
     }
     else if (mode == 2) {
         fp = NULL; /* use tty */
-        /* Translators: this should fit into 24 bytes to that the fingerprint
-         * data is properly aligned with the user ID */
        if(primary)
+          /* TRANSLATORS: this should fit into 24 bytes to that the
+           * fingerprint data is properly aligned with the user ID */
          text = _(" Primary key fingerprint:");
        else
          text = _("      Subkey fingerprint:");