Allow modified key files to be discarded.
authormdw <mdw>
Thu, 11 Nov 2004 00:57:15 +0000 (00:57 +0000)
committermdw <mdw>
Thu, 11 Nov 2004 00:57:15 +0000 (00:57 +0000)
key-io.c
key.h

index c78b967..5f793d7 100644 (file)
--- a/key-io.c
+++ b/key-io.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: key-io.c,v 1.6 2004/04/08 01:36:15 mdw Exp $
+ * $Id$
  *
  * Adding new keys to a key file
  *
@@ -277,7 +277,7 @@ int key_merge(key_file *f, const char *file, FILE *fp,
        if (err == KERR_DUPTAG) {
          if (rep)
            rep(file, line, "duplicate key tag stripped", arg);
-         free(k->tag);
+         xfree(k->tag);
          k->tag = 0;
          goto again;
        }
@@ -310,8 +310,8 @@ int key_merge(key_file *f, const char *file, FILE *fp,
 
   skip_3:
     if (k->tag)
-      free(k->tag);
-    free(k->type);
+      xfree(k->tag);
+    xfree(k->type);
   skip_2:
     key_destroy(&k->k);
   skip_1:
@@ -448,25 +448,20 @@ int key_open(key_file *f, const char *file, unsigned how,
   return (0);
 }
 
-/* --- @key_close@ --- *
+/* --- @key_discard@ --- *
  *
  * Arguments:  @key_file *f@ = pointer to key file block
  *
- * Returns:    A @KWRITE_@ code indicating how it went.
+ * Returns:    ---
  *
- * Use:                Frees all the key data, writes any changes.  Make sure that
- *             all hell breaks loose if this returns @KWRITE_BROKEN@.
+ * Use:                Frees all the key data, without writing changes.
  */
 
-int key_close(key_file *f)
+int key_discard(key_file *f)
 {
-  int e;
   hash_base *b;
   hash_iter i;
 
-  if (f->fp && (e = key_save(f)) != KWRITE_OK)
-    return (e);
-
   /* --- Free all the individual keys --- */
 
   for (hash_mkiter(&i, &f->byid); (b = hash_next(&i)) != 0; ) {
@@ -475,12 +470,12 @@ int key_close(key_file *f)
     key *k = (key *)b;
 
     key_destroy(&k->k);
-    free(k->type);
-    free(k->tag);
+    xfree(k->type);
+    xfree(k->tag);
     if (k->c)
-      free(k->c);
+      xfree(k->c);
     for (sym_mkiter(&j, &k->a); (a = sym_next(&j)) != 0; )
-      free(a->p);
+      xfree(a->p);
     sym_destroy(&k->a);
     DESTROY(k);
   }
@@ -490,7 +485,26 @@ int key_close(key_file *f)
 
   if (f->fp)
     fclose(f->fp);
-  free(f->name);
+  xfree(f->name);
+}
+
+/* --- @key_close@ --- *
+ *
+ * Arguments:  @key_file *f@ = pointer to key file block
+ *
+ * Returns:    A @KWRITE_@ code indicating how it went.
+ *
+ * Use:                Frees all the key data, writes any changes.  Make sure that
+ *             all hell breaks loose if this returns @KWRITE_BROKEN@.
+ */
+
+int key_close(key_file *f)
+{
+  int e;
+
+  if (f->fp && (e = key_save(f)) != KWRITE_OK)
+    return (e);
+  key_discard(f);
   return (KWRITE_OK);
 }
 
@@ -548,7 +562,7 @@ key *key_new(key_file *f, uint32 id, const char *type, time_t exp, int *err)
     if ((e = insert(f, k)) == 0)
       f->f |= KF_MODIFIED;
     else {
-      free(k->type);
+      xfree(k->type);
       DESTROY(k);
       k = 0;
     }
diff --git a/key.h b/key.h
index ada6260..6f5bedb 100644 (file)
--- a/key.h
+++ b/key.h
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: key.h,v 1.11 2004/04/08 01:36:15 mdw Exp $
+ * $Id$
  *
  * Simple key management
  *
@@ -247,6 +247,17 @@ extern int key_extract(key_file */*f*/, key */*k*/, FILE */*fp*/,
 extern int key_open(key_file */*f*/, const char */*file*/, unsigned /*how*/,
                    key_reporter */*rep*/, void */*arg*/);
 
+/* --- @key_discard@ --- *
+ *
+ * Arguments:  @key_file *f@ = pointer to key file block
+ *
+ * Returns:    ---
+ *
+ * Use:                Frees all the key data, without writing changes.
+ */
+
+extern int key_discard(key_file */*f*/);
+
 /* --- @key_close@ --- *
  *
  * Arguments:  @key_file *f@ = pointer to key file block