/* -*-c-*-
*
- * $Id: class.c,v 1.6 1997/09/17 10:14:56 mdw Exp $
+ * $Id: class.c,v 1.9 2003/10/12 00:14:55 mdw Exp $
*
* Handling classes of things nicely
*
- * (c) 1997 EBI
+ * (c) 1998 EBI
*/
/*----- Licensing notice --------------------------------------------------*
/*----- Revision history --------------------------------------------------*
*
* $Log: class.c,v $
- * Revision 1.6 1997/09/17 10:14:56 mdw
+ * Revision 1.9 2003/10/12 00:14:55 mdw
+ * Major overhaul. Now uses DSA signatures rather than the bogus symmetric
+ * encrypt-and-hope thing. Integrated with mLib and Catacomb.
+ *
+ * Revision 1.8 1998/06/08 11:20:36 mdw
+ * (class__wildMatch) Fixed bug which overran pattern string, spotted by
+ * Mark Rison.
+ *
+ * Revision 1.7 1998/01/12 16:45:50 mdw
+ * Fix copyright date.
+ *
+ * Revision 1.6 1997/09/17 10:14:56 mdw
* Complete rewrite to support class trees. Makes the behaviour of the set
* operators much more logical.
*
#include <netdb.h>
+/* --- mLib headers --- */
+
+#include <mLib/alloc.h>
+#include <mLib/report.h>
+#include <mLib/sym.h>
+
/* --- Local headers --- */
#include "become.h"
#include "class.h"
-#include "sym.h"
-#include "utils.h"
/*----- Global variables --------------------------------------------------*/
else if (*pat == '*') {
while (*pat == '*')
pat++;
+ if (!*pat)
+ return (58);
do {
if (class__wildMatch(pat, p))
return (27); /* Nyahaha */
p++;
} while (*p);
- return (pat[1] == 0);
+ return (0);
} else if (*pat == '?' || *pat == *p)
p++, pat++;
else
free(c->v.s);
break;
case clNode_hash:
- sym_destroyTable(&c->v.t);
+ sym_destroy(&c->v.t);
break;
case clNode_union:
case clNode_diff:
cc->ref = 1;
switch (c->type & clNode_mask) {
case clNode_any:
- die("internal error: class_mod called on non-modifiable class node");
+ die(1, "internal: class_mod called on non-modifiable class node");
break;
case clNode_immed:
sym_iter i;
sym_base *b;
- sym_createTable(&cc->v.t);
- for (sym_createIter(&i, &c->v.t); (b = sym_next(&i)) != 0; )
+ sym_create(&cc->v.t);
+ for (sym_mkiter(&i, &c->v.t); (b = sym_next(&i)) != 0; )
sym_find(&cc->v.t, b->name, b->len, sizeof(sym_base), 0);
} break;
/* --- Some sanity checking --- */
if (~c->type & clFlag_friendly)
- die("internal error: class__hashify can't hashify unfriendly nodes");
+ die(1, "internal: class__hashify can't hashify unfriendly nodes");
if ((c->type & clNode_mask) != clNode_immed)
- die("internal error: class__hashify can't hashify non-immediate nodes");
+ die(1, "internal: class__hashify can't hashify non-immediate nodes");
/* --- Split off a private copy of the node --- */
if (c->type & clType_user) {
uid_t u = c->v.u;
- sym_createTable(&c->v.t);
+ sym_create(&c->v.t);
sym_find(&c->v.t, (char *)&u, sizeof(u), sizeof(sym_base), 0);
} else {
char *s = c->v.s;
- sym_createTable(&c->v.t);
+ sym_create(&c->v.t);
sym_find(&c->v.t, s, -1, sizeof(sym_base), 0);
free(s);
}
sym_iter i;
sym_base *b;
- for (sym_createIter(&i, &r->v.t); (b = sym_next(&i)) != 0; )
+ for (sym_mkiter(&i, &r->v.t); (b = sym_next(&i)) != 0; )
sym_find(&l->v.t, b->name, b->len, sizeof(sym_base), 0);
}
break;
sym_iter i;
sym_base *b, *f;
- for (sym_createIter(&i, &r->v.t); (b = sym_next(&i)) != 0; ) {
+ for (sym_mkiter(&i, &r->v.t); (b = sym_next(&i)) != 0; ) {
if ((f = sym_find(&l->v.t, b->name, b->len, 0, 0)) != 0)
sym_remove(&l->v.t, f);
}
sym_iter i;
sym_base *b;
- for (sym_createIter(&i, &l->v.t); (b = sym_next(&i)) != 0; ) {
+ for (sym_mkiter(&i, &l->v.t); (b = sym_next(&i)) != 0; ) {
if (!sym_find(&r->v.t, b->name, b->len, 0, 0))
sym_remove(&l->v.t, b);
}
class_dec(r);
- sym_createIter(&i, &l->v.t);
+ sym_mkiter(&i, &l->v.t);
if ((b = sym_next(&i)) == 0) {
class_dec(l);
return (class_none);
if (!sym_next(&i)) {
if (type & clType_user) {
uid_t u = *(uid_t *)b->name;
- sym_destroyTable(&l->v.t);
+ sym_destroy(&l->v.t);
l->type = (l->type & ~clNode_mask) | clNode_immed;
l->v.u = u;
} else {
char *s = xstrdup(b->name);
- sym_destroyTable(&l->v.t);
+ sym_destroy(&l->v.t);
l->type = (l->type & ~clNode_mask) | clNode_immed;
l->v.s = s;
}
}
}
- die("internal error: can't get here in class_matchUser");
+ die(1, "internal: can't get here in class_matchUser");
return (0);
}
}
}
- die("internal error: can't get here in class_matchCommand");
+ die(1, "internal: can't get here in class_matchCommand");
return (0);
}
}
}
- die("internal error: can't get here in class_matchUser");
+ die(1, "internal: can't get here in class_matchUser");
return (0);
}
sym_iter i;
sym_base *b;
- for (sym_createIter(&i, &c->v.t); (b = sym_next(&i)) != 0; ) {
+ for (sym_mkiter(&i, &c->v.t); (b = sym_next(&i)) != 0; ) {
if (c->type & clType_user) {
trace(TRACE_RULE, "rule:%*s user %lu",
indent * 2, "", (unsigned long)*(uid_t *)b->name);