* engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Implement secret only mode.
authorWerner Koch <wk@gnupg.org>
Tue, 29 Jan 2002 10:04:41 +0000 (10:04 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 29 Jan 2002 10:04:41 +0000 (10:04 +0000)
* keylist.c (keylist_colon_handler): Add support for the new "crs"
record type.

gpgme/ChangeLog
gpgme/engine-gpgsm.c
gpgme/keylist.c

index 1dc060c..7f485c0 100644 (file)
@@ -1,3 +1,10 @@
+2002-01-29  Werner Koch  <wk@gnupg.org>
+
+       * engine-gpgsm.c (_gpgme_gpgsm_op_keylist): Implement secret only mode.
+
+       * keylist.c (keylist_colon_handler): Add support for the new "crs"
+       record type.
+
 2002-01-22  Marcus Brinkmann  <marcus@g10code.de>
 
        * engine-gpgsm.c (_gpgme_gpgsm_release): Call assuan_disconnect,
index b66ceaa..51e62fd 100644 (file)
@@ -433,11 +433,19 @@ _gpgme_gpgsm_op_keylist (GpgsmObject gpgsm, const char *pattern,
   if (!pattern)
     pattern = "";
 
-  line = xtrymalloc (9 + strlen (pattern) + 1);        /* "LISTKEYS " + p + '\0'.  */
+  line = xtrymalloc (15 + strlen (pattern) + 1); /* "LISTSECRETKEYS "+p+'\0'.*/
   if (!line)
     return mk_error (Out_Of_Core);
-  strcpy (line, "LISTKEYS ");
-  strcpy (&line[9], pattern);
+  if (secret_only)
+    {
+      strcpy (line, "LISTSECRETKEYS ");
+      strcpy (&line[15], pattern);
+    }
+  else
+    {
+      strcpy (line, "LISTKEYS ");
+      strcpy (&line[9], pattern);
+    }
 
   _gpgme_io_close (gpgsm->input_fd);
   _gpgme_io_close (gpgsm->output_fd);
index b9907a4..133da5d 100644 (file)
@@ -146,7 +146,8 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
     char *p, *pend;
     int field = 0;
     enum {
-      RT_NONE, RT_SIG, RT_UID, RT_SUB, RT_PUB, RT_FPR, RT_SSB, RT_SEC, RT_CRT
+      RT_NONE, RT_SIG, RT_UID, RT_SUB, RT_PUB, RT_FPR, RT_SSB, RT_SEC,
+      RT_CRT, RT_CRS
     } rectype = RT_NONE;
     GpgmeKey key = ctx->tmp_key;
     int i;
@@ -223,13 +224,26 @@ keylist_colon_handler ( GpgmeCtx ctx, char *line )
                 assert ( !ctx->tmp_key );
                 ctx->tmp_key = key;
             }
+            else if ( !strcmp (p, "crs") ) {
+                /* start a new certificate */
+                if ( _gpgme_key_new_secret ( &key ) ) {
+                    ctx->out_of_core=1; /* the only kind of error we can get*/
+                    return;
+                }
+                key->x509 = 1;
+                rectype = RT_CRS;
+                finish_key ( ctx );
+                assert ( !ctx->tmp_key );
+                ctx->tmp_key = key;
+            }
             else if ( !strcmp ( p, "fpr" ) && key ) 
                 rectype = RT_FPR;
             else 
                 rectype = RT_NONE;
             
         }
-        else if ( rectype == RT_PUB || rectype == RT_SEC || rectype == RT_CRT)
+        else if ( rectype == RT_PUB || rectype == RT_SEC
+                  || rectype == RT_CRT || rectype == RT_CRS)
           {
             switch (field) {
               case 2: /* trust info */