common: Rename log and gcc attribute macros (jnlib merge).
[gnupg.git] / dirmngr / certcache.c
index 1fb585a..8c5feef 100644 (file)
@@ -25,7 +25,7 @@
 #include <assert.h>
 #include <sys/types.h>
 #include <dirent.h>
-#include <pth.h>
+#include <npth.h>
 
 #include "dirmngr.h"
 #include "misc.h"
@@ -78,12 +78,12 @@ typedef struct cert_item_s *cert_item_t;
    the first byte of the fingerprint.  */
 static cert_item_t cert_cache[256];
 
-/* This is the global cache_lock variable. In general looking is not
+/* This is the global cache_lock variable. In general locking is not
    needed but it would take extra efforts to make sure that no
-   indirect use of pth functions is done, so we simply lock it always.
-   Note: We can't use static initialization, as that is not available
-   through w32-pth.  */
-static pth_rwlock_t cert_cache_lock;
+   indirect use of npth functions is done, so we simply lock it
+   always.  Note: We can't use static initialization, as that is not
+   available through w32-pth.  */
+static npth_rwlock_t cert_cache_lock;
 
 /* Flag to track whether the cache has been initialized.  */
 static int initialization_done;
@@ -99,33 +99,45 @@ static unsigned int total_extra_certificates;
 static void
 init_cache_lock (void)
 {
-  if (!pth_rwlock_init (&cert_cache_lock))
+  int err;
+
+  err = npth_rwlock_init (&cert_cache_lock, NULL);
+  if (err)
     log_fatal (_("can't initialize certificate cache lock: %s\n"),
-              strerror (errno));
+              strerror (err));
 }
 
 static void
 acquire_cache_read_lock (void)
 {
-  if (!pth_rwlock_acquire (&cert_cache_lock, PTH_RWLOCK_RD, FALSE, NULL))
+  int err;
+
+  err = npth_rwlock_rdlock (&cert_cache_lock);
+  if (err)
     log_fatal (_("can't acquire read lock on the certificate cache: %s\n"),
-               strerror (errno));
+               strerror (err));
 }
 
 static void
 acquire_cache_write_lock (void)
 {
-  if (!pth_rwlock_acquire (&cert_cache_lock, PTH_RWLOCK_RW, FALSE, NULL))
+  int err;
+
+  err = npth_rwlock_wrlock (&cert_cache_lock);
+  if (err)
     log_fatal (_("can't acquire write lock on the certificate cache: %s\n"),
-               strerror (errno));
+               strerror (err));
 }
 
 static void
 release_cache_lock (void)
 {
-  if (!pth_rwlock_release (&cert_cache_lock))
+  int err;
+
+  err = npth_rwlock_unlock (&cert_cache_lock);
+  if (err)
     log_fatal (_("can't release lock on the certificate cache: %s\n"),
-               strerror (errno));
+               strerror (err));
 }
 
 
@@ -141,7 +153,7 @@ compare_serialno (ksba_sexp_t serial1, ksba_sexp_t serial2 )
 
 
 
-/* Return a malloced canonical S-Expression with the serialnumber
+/* Return a malloced canonical S-Expression with the serial number
    converted from the hex string HEXSN.  Return NULL on memory
    error. */
 ksba_sexp_t
@@ -337,7 +349,7 @@ load_certs_from_dir (const char *dirname, int are_trusted)
   if (!dir)
     {
       if (opt.system_daemon)
-        log_info (_("can't access directory `%s': %s\n"),
+        log_info (_("can't access directory '%s': %s\n"),
                   dirname, strerror (errno));
       return 0; /* We do not consider this a severe error.  */
     }
@@ -356,7 +368,7 @@ load_certs_from_dir (const char *dirname, int are_trusted)
       fp = es_fopen (fname, "rb");
       if (!fp)
         {
-          log_error (_("can't open `%s': %s\n"),
+          log_error (_("can't open '%s': %s\n"),
                      fname, strerror (errno));
           continue;
         }
@@ -375,7 +387,7 @@ load_certs_from_dir (const char *dirname, int are_trusted)
       es_fclose (fp);
       if (err)
         {
-          log_error (_("can't parse certificate `%s': %s\n"),
+          log_error (_("can't parse certificate '%s': %s\n"),
                      fname, gpg_strerror (err));
           ksba_cert_release (cert);
           continue;
@@ -383,13 +395,13 @@ load_certs_from_dir (const char *dirname, int are_trusted)
 
       err = put_cert (cert, 1, are_trusted, NULL);
       if (gpg_err_code (err) == GPG_ERR_DUP_VALUE)
-        log_info (_("certificate `%s' already cached\n"), fname);
+        log_info (_("certificate '%s' already cached\n"), fname);
       else if (!err)
         {
           if (are_trusted)
-            log_info (_("trusted certificate `%s' loaded\n"), fname);
+            log_info (_("trusted certificate '%s' loaded\n"), fname);
           else
-            log_info (_("certificate `%s' loaded\n"), fname);
+            log_info (_("certificate '%s' loaded\n"), fname);
           if (opt.verbose)
             {
               p = get_fingerprint_hexstring_colon (cert);
@@ -401,7 +413,7 @@ load_certs_from_dir (const char *dirname, int are_trusted)
             }
         }
       else
-        log_error (_("error loading certificate `%s': %s\n"),
+        log_error (_("error loading certificate '%s': %s\n"),
                      fname, gpg_strerror (err));
       ksba_cert_release (cert);
     }
@@ -423,11 +435,11 @@ cert_cache_init (void)
   init_cache_lock ();
   acquire_cache_write_lock ();
 
-  dname = make_filename (opt.homedir, "trusted-certs", NULL);
+  dname = make_filename (gnupg_sysconfdir (), "trusted-certs", NULL);
   load_certs_from_dir (dname, 1);
   xfree (dname);
 
-  dname = make_filename (opt.homedir_data, "extra-certs", NULL);
+  dname = make_filename (gnupg_sysconfdir (), "extra-certs", NULL);
   load_certs_from_dir (dname, 0);
   xfree (dname);
 
@@ -581,7 +593,7 @@ get_cert_byhexfpr (const char *string)
     }
   if (i!=20 || *s)
     {
-      log_error (_("invalid SHA1 fingerprint string `%s'\n"), string);
+      log_error (_("invalid SHA1 fingerprint string '%s'\n"), string);
       return NULL;
     }
 
@@ -652,6 +664,9 @@ get_cert_bysubject (const char *subject_dn, unsigned int seq)
   cert_item_t ci;
   int i;
 
+  if (!subject_dn)
+    return NULL;
+
   acquire_cache_read_lock ();
   for (i=0; i < 256; i++)
     {
@@ -678,11 +693,10 @@ get_cert_bysubject (const char *subject_dn, unsigned int seq)
 static enum pattern_class
 classify_pattern (const char *pattern, size_t *r_offset, size_t *r_sn_offset)
 {
-  enum pattern_class result = PATTERN_UNKNOWN;
+  enum pattern_class result;
   const char *s;
   int hexprefix = 0;
   int hexlength;
-  int mode = 0;
 
   *r_offset = *r_sn_offset = 0;
 
@@ -715,7 +729,7 @@ classify_pattern (const char *pattern, size_t *r_offset, size_t *r_sn_offset)
       break;
 
     case '*':  /* Case insensitive substring search.  */
-      mode = PATTERN_SUBSTR;
+      result = PATTERN_SUBSTR;
       s++;
       break;
 
@@ -1101,7 +1115,7 @@ find_cert_bysubject (ctrl_t ctrl, const char *subject_dn, ksba_sexp_t keyid)
      uniquely located by the following code we can use them.  This is
      for example required by Telesec certificates where a keyId is
      used but the issuer certificate comes without a subject keyId! */
-  if (ctrl->ocsp_certs)
+  if (ctrl->ocsp_certs && subject_dn)
     {
       cert_item_t ci;
       cert_ref_t cr;