/* -*-c-*-
*
- * $Id: key-attr.c,v 1.1 1999/12/22 15:47:48 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.1 1999/12/22 15:47:48 mdw
- * Major key-management revision.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include <ctype.h>
#include <string.h>
#include <time.h>
-#include <mLib/alloc.h>
+#include <mLib/dstr.h>
#include <mLib/sym.h>
#include "key.h"
int key_chkident(const char *p)
{
- if (!p || !*p)
+ if (!p || !*p || strlen(p) > 255)
return (-1);
while (*p) {
if (*p == ':' || *p == '.' || isspace((unsigned char)*p))
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);
}
if (!(f->f & KF_WRITE))
return (KERR_READONLY);
+ if (strlen(n) > 255)
+ return (KERR_BADATTR);
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);
}
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
if (key_chkcomment(c))
return (KERR_BADCOMMENT);
if (k->c)
- free(k->c);
+ xfree(k->c);
if (c)
k->c = xstrdup(c);
else
if (tag) {
kr = sym_find(&f->bytag, tag, -1, sizeof(*kr), &found);
- if (found)
+ if (found && !KEY_EXPIRED(time(0), kr->k->del))
return (KERR_DUPTAG);
kr->k = k;
}
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 --- */