2004-09-30 Marcus Brinkmann <marcus@g10code.de>
[gpgme.git] / gpgme / key.c
index d8e7cee..444f067 100644 (file)
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
+#include <errno.h>
 
 #include "util.h"
 #include "ops.h"
 
 \f
 /* Protects all reference counters in keys.  All other accesses to a
-   key are either read only or happen before the key is entered into
-   the cache.  */
+   key are read only.  */
 DEFINE_STATIC_LOCK (key_ref_lock);
 
 
 /* Create a new key.  */
-GpgmeError
-_gpgme_key_new (GpgmeKey *r_key)
+gpgme_error_t
+_gpgme_key_new (gpgme_key_t *r_key)
 {
-  GpgmeKey key;
+  gpgme_key_t key;
 
   key = calloc (1, sizeof *key);
   if (!key)
-    return GPGME_Out_Of_Core;
+    return gpg_error_from_errno (errno);
   key->_refs = 1;
 
   *r_key = key;
@@ -52,14 +52,14 @@ _gpgme_key_new (GpgmeKey *r_key)
 }
 
 
-GpgmeError
-_gpgme_key_add_subkey (GpgmeKey key, GpgmeSubkey *r_subkey)
+gpgme_error_t
+_gpgme_key_add_subkey (gpgme_key_t key, gpgme_subkey_t *r_subkey)
 {
-  GpgmeSubkey subkey;
+  gpgme_subkey_t subkey;
 
   subkey = calloc (1, sizeof *subkey);
   if (!subkey)
-    return GPGME_Out_Of_Core;
+    return gpg_error_from_errno (errno);
   subkey->keyid = subkey->_keyid;
   subkey->_keyid[16] = '\0';
 
@@ -200,10 +200,10 @@ parse_x509_user_id (char *src, char **name, char **email,
 
 /* Take a name from the --with-colon listing, remove certain escape
    sequences sequences and put it into the list of UIDs.  */
-GpgmeError
-_gpgme_key_append_name (GpgmeKey key, char *src)
+gpgme_error_t
+_gpgme_key_append_name (gpgme_key_t key, char *src)
 {
-  GpgmeUserID uid;
+  gpgme_user_id_t uid;
   char *dst;
   int src_len = strlen (src);
 
@@ -213,19 +213,19 @@ _gpgme_key_append_name (GpgmeKey key, char *src)
      size, so that we are able to store the parsed stuff there too.  */
   uid = malloc (sizeof (*uid) + 2 * src_len + 3);
   if (!uid)
-    return GPGME_Out_Of_Core;
+    return gpg_error_from_errno (errno);
   memset (uid, 0, sizeof *uid);
 
   uid->uid = ((char *) uid) + sizeof (*uid);
   dst = uid->uid;
   _gpgme_decode_c_string (src, &dst, src_len + 1);
 
-  dst += src_len + 1;
+  dst += strlen (dst) + 1;
   if (key->protocol == GPGME_PROTOCOL_CMS)
-    parse_x509_user_id (src, &uid->name, &uid->email,
+    parse_x509_user_id (uid->uid, &uid->name, &uid->email,
                        &uid->comment, dst);
   else
-    parse_user_id (src, &uid->name, &uid->email,
+    parse_user_id (uid->uid, &uid->name, &uid->email,
                   &uid->comment, dst);
 
   if (!key->uids)
@@ -238,12 +238,12 @@ _gpgme_key_append_name (GpgmeKey key, char *src)
 }
 
 
-GpgmeKeySig
-_gpgme_key_add_sig (GpgmeKey key, char *src)
+gpgme_key_sig_t
+_gpgme_key_add_sig (gpgme_key_t key, char *src)
 {
   int src_len = src ? strlen (src) : 0;
-  GpgmeUserID uid;
-  GpgmeKeySig sig;
+  gpgme_user_id_t uid;
+  gpgme_key_sig_t sig;
 
   assert (key);        /* XXX */
 
@@ -253,9 +253,11 @@ _gpgme_key_add_sig (GpgmeKey key, char *src)
   /* We can malloc a buffer of the same length, because the converted
      string will never be larger. Actually we allocate it twice the
      size, so that we are able to store the parsed stuff there too.  */
-  sig = calloc (1, sizeof (*sig) + 2 * src_len + 3);
+  sig = malloc (sizeof (*sig) + 2 * src_len + 3);
   if (!sig)
     return NULL;
+  memset (sig, 0, sizeof *sig);
+
   sig->keyid = sig->_keyid;
   sig->_keyid[16] = '\0';
   sig->uid = ((char *) sig) + sizeof (*sig);
@@ -264,12 +266,12 @@ _gpgme_key_add_sig (GpgmeKey key, char *src)
     {
       char *dst = sig->uid;
       _gpgme_decode_c_string (src, &dst, src_len + 1);
-      dst += src_len + 1;
+      dst += strlen (dst) + 1;
       if (key->protocol == GPGME_PROTOCOL_CMS)
-       parse_x509_user_id (src, &sig->name, &sig->email,
+       parse_x509_user_id (sig->uid, &sig->name, &sig->email,
                            &sig->comment, dst);
       else
-       parse_user_id (src, &sig->name, &sig->email,
+       parse_user_id (sig->uid, &sig->name, &sig->email,
                       &sig->comment, dst);
     }
 
@@ -285,7 +287,7 @@ _gpgme_key_add_sig (GpgmeKey key, char *src)
 \f
 /* Acquire a reference to KEY.  */
 void
-gpgme_key_ref (GpgmeKey key)
+gpgme_key_ref (gpgme_key_t key)
 {
   LOCK (key_ref_lock);
   key->_refs++;
@@ -293,16 +295,19 @@ gpgme_key_ref (GpgmeKey key)
 }
 
 
-/* gpgme_key_unref releases the key object. Note, that this function
+/* gpgme_key_unref releases the key object.  Note, that this function
    may not do an actual release if there are other shallow copies of
    the objects.  You have to call this function for every newly
    created key object as well as for every gpgme_key_ref() done on the
    key object.  */
 void
-gpgme_key_unref (GpgmeKey key)
+gpgme_key_unref (gpgme_key_t key)
 {
-  GpgmeUserID uid;
-  GpgmeSubkey subkey;
+  gpgme_user_id_t uid;
+  gpgme_subkey_t subkey;
+
+  if (!key)
+    return;
 
   LOCK (key_ref_lock);
   assert (key->_refs > 0);
@@ -316,7 +321,7 @@ gpgme_key_unref (GpgmeKey key)
   subkey = key->subkeys;
   while (subkey)
     {
-      GpgmeSubkey next = subkey->next;
+      gpgme_subkey_t next = subkey->next;
       if (subkey->fpr)
        free (subkey->fpr);
       free (subkey);
@@ -326,12 +331,12 @@ gpgme_key_unref (GpgmeKey key)
   uid = key->uids;
   while (uid)
     {
-      GpgmeUserID next_uid = uid->next;
-      GpgmeKeySig keysig = uid->signatures;
+      gpgme_user_id_t next_uid = uid->next;
+      gpgme_key_sig_t keysig = uid->signatures;
 
       while (keysig)
        {
-         GpgmeKeySig next = keysig->next;
+         gpgme_key_sig_t next = keysig->next;
           free (keysig);
          keysig = next;
         }
@@ -354,7 +359,7 @@ gpgme_key_unref (GpgmeKey key)
 /* Compatibility interfaces.  */
 
 void
-gpgme_key_release (GpgmeKey key)
+gpgme_key_release (gpgme_key_t key)
 {
   gpgme_key_unref (key);
 }
@@ -411,7 +416,7 @@ validity_to_string (int validity)
 
 
 static const char *
-capabilities_to_string (GpgmeSubkey subkey)
+capabilities_to_string (gpgme_subkey_t subkey)
 {
   static const char *const strings[8] =
     {
@@ -433,11 +438,11 @@ capabilities_to_string (GpgmeSubkey subkey)
 /* Return the value of the attribute WHAT of ITEM, which has to be
    representable by a string.  */
 const char *
-gpgme_key_get_string_attr (GpgmeKey key, GpgmeAttr what,
+gpgme_key_get_string_attr (gpgme_key_t key, _gpgme_attr_t what,
                           const void *reserved, int idx)
 {
-  GpgmeSubkey subkey;
-  GpgmeUserID uid;
+  gpgme_subkey_t subkey;
+  gpgme_user_id_t uid;
   int i;
 
   if (!key || reserved || idx < 0)
@@ -512,11 +517,11 @@ gpgme_key_get_string_attr (GpgmeKey key, GpgmeAttr what,
 
 
 unsigned long
-gpgme_key_get_ulong_attr (GpgmeKey key, GpgmeAttr what,
+gpgme_key_get_ulong_attr (gpgme_key_t key, _gpgme_attr_t what,
                          const void *reserved, int idx)
 {
-  GpgmeSubkey subkey;
-  GpgmeUserID uid;
+  gpgme_subkey_t subkey;
+  gpgme_user_id_t uid;
   int i;
 
   if (!key || reserved || idx < 0)
@@ -601,11 +606,11 @@ gpgme_key_get_ulong_attr (GpgmeKey key, GpgmeAttr what,
 }
 
 
-static GpgmeKeySig
-get_keysig (GpgmeKey key, int uid_idx, int idx)
+static gpgme_key_sig_t
+get_keysig (gpgme_key_t key, int uid_idx, int idx)
 {
-  GpgmeUserID uid;
-  GpgmeKeySig sig;
+  gpgme_user_id_t uid;
+  gpgme_key_sig_t sig;
 
   if (!key || uid_idx < 0 || idx < 0)
     return NULL;
@@ -630,10 +635,11 @@ get_keysig (GpgmeKey key, int uid_idx, int idx)
 
 
 const char *
-gpgme_key_sig_get_string_attr (GpgmeKey key, int uid_idx, GpgmeAttr what,
+gpgme_key_sig_get_string_attr (gpgme_key_t key, int uid_idx,
+                              _gpgme_attr_t what,
                               const void *reserved, int idx)
 {
-  GpgmeKeySig certsig = get_keysig (key, uid_idx, idx);
+  gpgme_key_sig_t certsig = get_keysig (key, uid_idx, idx);
 
   if (!certsig || reserved)
     return NULL;
@@ -665,10 +671,10 @@ gpgme_key_sig_get_string_attr (GpgmeKey key, int uid_idx, GpgmeAttr what,
 
 
 unsigned long
-gpgme_key_sig_get_ulong_attr (GpgmeKey key, int uid_idx, GpgmeAttr what,
+gpgme_key_sig_get_ulong_attr (gpgme_key_t key, int uid_idx, _gpgme_attr_t what,
                              const void *reserved, int idx)
 {
-  GpgmeKeySig certsig = get_keysig (key, uid_idx, idx);
+  gpgme_key_sig_t certsig = get_keysig (key, uid_idx, idx);
 
   if (!certsig || reserved)
     return 0;
@@ -694,7 +700,7 @@ gpgme_key_sig_get_ulong_attr (GpgmeKey key, int uid_idx, GpgmeAttr what,
       return certsig->expired;
 
     case GPGME_ATTR_SIG_CLASS:
-      return certsig->class;
+      return certsig->sig_class;
 
     case GPGME_ATTR_SIG_STATUS:
       return certsig->status;