From d901c8888560a1745ecee7c8d5ddad6229aafc66 Mon Sep 17 00:00:00 2001 From: mdw Date: Thu, 11 Nov 2004 00:57:15 +0000 Subject: [PATCH] Allow modified key files to be discarded. --- key-io.c | 52 +++++++++++++++++++++++++++++++++------------------- key.h | 13 ++++++++++++- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/key-io.c b/key-io.c index c78b967..5f793d7 100644 --- 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 --- 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 -- 2.11.0