Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/catacomb
[u/mdw/catacomb] / key-attr.c
index 75b2f1e..b6a3616 100644 (file)
@@ -1,13 +1,13 @@
 /* -*-c-*-
  *
- * $Id: key-attr.c,v 1.4 2004/04/08 01:02:49 mdw Exp $
+ * $Id$
  *
  * Key attribute manipulation
  *
  * (c) 1999 Straylight/Edgeware
  */
 
-/*----- Licensing notice --------------------------------------------------* 
+/*----- Licensing notice --------------------------------------------------*
  *
  * This file is part of Catacomb.
  *
  * it under the terms of the GNU Library General Public License as
  * published by the Free Software Foundation; either version 2 of the
  * License, or (at your option) any later version.
- * 
+ *
  * Catacomb is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Library General Public
  * License along with Catacomb; if not, write to the Free
  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  * MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------* 
- *
- * $Log: key-attr.c,v $
- * Revision 1.4  2004/04/08 01:02:49  mdw
- * key-binary.c
- *
- * Revision 1.3  2001/06/22 19:39:43  mdw
- * Allow tagging if the tag is owned by a deleted key.
- *
- * Revision 1.2  2000/02/12 18:21:02  mdw
- * Overhaul of key management (again).
- *
- * Revision 1.1  1999/12/22 15:47:48  mdw
- * Major key-management revision.
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 #include <ctype.h>
@@ -134,8 +117,8 @@ int key_nextattr(key_attriter *i, const char **n, const char **v)
   key_attr *a = sym_next(&i->i);
   if (!a)
     return (0);
-  *n = SYM_NAME(a);
-  *v = a->p;
+  if (n) *n = SYM_NAME(a);
+  if (v) *v = a->p;
   return (1);
 }
 
@@ -185,10 +168,10 @@ int key_putattr(key_file *f, key *k, const char *n, const char *v)
   if (v) {
     a = sym_find(&k->a, n, -1, sizeof(*a), &found);
     if (found)
-      free(a->p);
+      xfree(a->p);
     a->p = xstrdup(v);
   } else if ((a = sym_find(&k->a, n, -1, 0, 0)) != 0) {
-    free(a->p);
+    xfree(a->p);
     sym_remove(&k->a, a);
   }
 
@@ -196,6 +179,28 @@ int key_putattr(key_file *f, key *k, const char *n, const char *v)
   return (0);
 }
 
+/* --- @key_setkeydata@ --- *
+ *
+ * Arguments:  @key_file *kf@ = pointer to key file
+ *             @key *k@ = pointer to key
+ *             @key_data *kd@ = new key data
+ *
+ * Returns:    Zero on success, or a @KERR_@ error code on failure.
+ *
+ * Use:                Sets the key data for a key.
+ */
+
+int key_setkeydata(key_file *kf, key *k, key_data *kd)
+{
+  if (!(kf->f & KF_WRITE))
+    return (KERR_READONLY);
+  key_incref(kd);
+  key_drop(k->k);
+  k->k = kd;
+  kf->f |= KF_MODIFIED;
+  return (0);
+}
+
 /* --- @key_setcomment@ --- *
  *
  * Arguments:  @key_file *f@ = pointer to key file block
@@ -214,7 +219,7 @@ int key_setcomment(key_file *f, key *k, const char *c)
   if (key_chkcomment(c))
     return (KERR_BADCOMMENT);
   if (k->c)
-    free(k->c);
+    xfree(k->c);
   if (c)
     k->c = xstrdup(c);
   else
@@ -268,7 +273,7 @@ int key_settag(key_file *f, key *k, const char *tag)
     kr = sym_find(&f->bytag, k->tag, -1, 0, 0);
     assert(((void)"No bytag link", kr));
     sym_remove(&f->bytag, kr);
-    free(k->tag);
+    xfree(k->tag);
   }
 
   /* --- Done --- */