Factored common gpgconf constants out
[gnupg.git] / agent / trustlist.c
index 1f0427b..d3c409b 100644 (file)
@@ -5,7 +5,7 @@
  *
  * 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
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -14,9 +14,7 @@
  * GNU General Public License for more details.
  *
  * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -53,7 +51,7 @@ typedef struct trustitem_s trustitem_t;
 static trustitem_t *trusttable; 
 static size_t trusttablesize; 
 /* A mutex used to protect the table. */
-static pth_mutex_t trusttable_lock = PTH_MUTEX_INIT;
+static pth_mutex_t trusttable_lock;
 
 
 
@@ -71,6 +69,24 @@ static const char headerblurb[] =
 "\n";
 
 
+/* This function must be called once to initialize this module.  This
+   has to be done before a second thread is spawned.  We can't do the
+   static initialization because Pth emulation code might not be able
+   to do a static init; in particular, it is not possible for W32. */
+void
+initialize_module_trustlist (void)
+{
+  static int initialized;
+
+  if (!initialized)
+    {
+      if (!pth_mutex_init (&trusttable_lock))
+        log_fatal ("error initializing mutex: %s\n", strerror (errno));
+      initialized = 1;
+    }
+}
+
+
 
 \f
 static void
@@ -153,7 +169,7 @@ read_one_trustfile (const char *fname, int allow_include,
             }
           /* fixme: Should check for trailing garbage.  */
 
-          etcname = make_filename (GNUPG_SYSCONFDIR, "trustlist.txt", NULL);
+          etcname = make_filename (gnupg_sysconfdir (), "trustlist.txt", NULL);
           if ( !strcmp (etcname, fname) ) /* Same file. */
             log_info (_("statement \"%s\" ignored in `%s', line %d\n"),
                       "include-default", fname, lnr);
@@ -275,7 +291,7 @@ read_one_trustfile (const char *fname, int allow_include,
 }
 
 
-/* Read the trust files and update the global table on success. */
+/* Read the trust files and update the global table on success.  */
 static gpg_error_t
 read_trustfiles (void)
 {
@@ -303,7 +319,7 @@ read_trustfiles (void)
           log_error (_("error opening `%s': %s\n"), fname, gpg_strerror (err));
         }
       xfree (fname);
-      fname = make_filename (GNUPG_SYSCONFDIR, "trustlist.txt", NULL);
+      fname = make_filename (gnupg_sysconfdir (), "trustlist.txt", NULL);
       allow_include = 0;
     }
   err = read_one_trustfile (fname, allow_include,
@@ -313,12 +329,21 @@ read_trustfiles (void)
   if (err)
     {
       xfree (table);
+      if (gpg_err_code (err) == GPG_ERR_ENOENT)
+        {
+          /* Take a missing trustlist as an empty one.  */
+          lock_trusttable ();
+          xfree (trusttable);
+          trusttable = NULL;
+          trusttablesize = 0;
+          unlock_trusttable ();
+          err = 0;
+        }
       return err;
     }
 
   /* Fixme: we should drop duplicates and sort the table. */
-
-  ti = xtryrealloc (table, tableidx * sizeof *table);
+  ti = xtryrealloc (table, (tableidx?tableidx:1) * sizeof *table);
   if (!ti)
     {
       xfree (table);
@@ -479,8 +504,14 @@ agent_marktrusted (ctrl_t ctrl, const char *name, const char *fpr, int flag)
      button is "the default "Cancel" of the Pinentry. */
   err = agent_get_confirmation (ctrl, desc, _("Correct"), NULL);
   free (desc);
+  /* If the user did not confirmed this, we return cancel here so that
+     gpgsm may stop asking further questions.  We won't do this for
+     the second question of course. */
   if (err)
-    return err;
+    return (gpg_err_code (err) == GPG_ERR_NOT_CONFIRMED ? 
+            gpg_err_make (gpg_err_source (err), GPG_ERR_CANCELED) : err);
+
+
 
   if (asprintf (&desc,
                 /* TRANSLATORS: This prompt is shown by the Pinentry
@@ -569,4 +600,5 @@ agent_reload_trustlist (void)
   trusttable = NULL;
   trusttablesize = 0;
   unlock_trusttable ();
+  bump_key_eventcounter ();
 }