/* -*-c-*-
*
- * $Id: parser.y,v 1.3 1997/09/09 18:17:06 mdw Exp $
+ * $Id: parser.y,v 1.6 1998/04/23 13:26:49 mdw Exp $
*
* Parser for `become.conf' files
*
- * (c) 1997 EBI
+ * (c) 1998 EBI
*/
/*----- Licensing notice --------------------------------------------------*
/*----- Revision history --------------------------------------------------*
*
* $Log: parser.y,v $
+ * Revision 1.6 1998/04/23 13:26:49 mdw
+ * New `parse' interface to configuration file parser; informs caller
+ * whether parsing encountered any errors. Also support no-network
+ * configuration.
+ *
+ * Revision 1.5 1998/01/12 16:46:22 mdw
+ * Fix copyright date.
+ *
+ * Revision 1.4 1997/09/17 10:26:52 mdw
+ * Use rewritten class handler. Makes the expression parsers considerably
+ * simpler.
+ *
* Revision 1.3 1997/09/09 18:17:06 mdw
* Allow default port to be given as a service name or port number.
*
#include "lexer.h"
#include "name.h"
#include "rule.h"
-#include "set.h"
#include "sym.h"
#include "userdb.h"
#include "utils.h"
long i;
char *s;
name *n;
- classdef *c;
+ class_node *c;
}
/*----- Token and rule declarations ---------------------------------------*/
;
port_spec : PORT STRING ';' {
+#ifndef NONETWORK
struct servent *s = getservbyname($2, "udp");
if (!s) {
moan("unknown service `%s' at line %i",
$2, lex_line);
- YYERROR;
+ yynerrs++; YYERROR;
}
daemon_usePort(s->s_port);
+#else
+ yyerror("`port' command unsupported");
+ yynerrs++; YYERROR;
+#endif
+ }
+ | PORT INT ';' {
+#ifndef NONETWORK
+ daemon_usePort(htons($2));
+#else
+ yyerror("`port' command unsupported");
+ yynerrs++; YYERROR;
+#endif
}
- | PORT INT ';' { daemon_usePort(htons($2)); }
;
-key_spec : KEYFILE STRING ';' { daemon_readKey($2); }
+key_spec : KEYFILE STRING ';' {
+#ifndef NONETWORK
+ daemon_readKey($2);
+#else
+ yyerror("`keyfile' command unsupported");
+ yynerrs++; YYERROR;
+#endif
+ }
/* --- Parsing allow specifications --- */
/* --- User class expressions --- */
user_class : user_class ',' user_class {
- if ($1->type != $3->type) {
+ if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_union($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| user_class '-' user_class {
- if ($1->type != $3->type) {
+ if (($$ = class_diff($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- $$ = class_create($1->type,
- set_subtract($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| user_class '&' user_class {
- if ($1->type != $3->type) {
+ if (($$ = class_isect($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_intersect($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| user_class '|' user_class {
- if ($1->type != $3->type) {
+ if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_union($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
- | INT {
- sym_table *t = xmalloc(sizeof(*t));
- int u = $1;
- sym_createTable(t);
- sym_find(t, (char *)&u, sizeof(u),
- sizeof(sym_base), 0);
- $$ = class_create(clType_user, t);
- }
+ | INT { $$ = class_fromUser(clType_user, $1); }
| STRING {
struct passwd *pw;
- sym_table *t;
- int u;
if ((pw = userdb_userByName($1)) == 0) {
moan("user `%s' not known at line %i",
$1, lex_line);
- YYERROR;
- } else {
- t = xmalloc(sizeof(*t));
- u = pw->pw_uid;
- sym_createTable(t);
- sym_find(t, (char *)&u, sizeof(u),
- sizeof(sym_base), 0);
- $$ = class_create(clType_user, t);
- }
+ yynerrs++; YYERROR;
+ } else
+ $$ = class_fromUser(clType_user, pw->pw_uid);
}
| WORD {
name *n = name_find($1, 0, 0);
if (!n || !n->c) {
moan("class `%s' not found at line %i",
$1, lex_line);
- YYERROR;
+ yynerrs++; YYERROR;
} else if (~n->c->type & clType_user) {
- yyerror("type mismatch");
- YYERROR;
+ yynerrs++; yyerror("type mismatch");
+ yynerrs++; YYERROR;
} else {
$$ = n->c;
class_inc(n->c);
/* --- Command class expressions --- */
command_class : command_class ',' command_class {
- if ($1->type != $3->type) {
+ if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_union($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| command_class '-' command_class {
- if ($1->type != $3->type) {
+ if (($$ = class_diff($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- $$ = class_create($1->type,
- set_subtract($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| command_class '&' command_class {
- if ($1->type != $3->type) {
+ if (($$ = class_isect($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_intersect($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| command_class '|' command_class {
- if ($1->type != $3->type) {
+ if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_union($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
- | STRING {
- sym_table *t = xmalloc(sizeof(*t));
- sym_createTable(t);
- sym_find(t, $1, -1, sizeof(sym_base), 0);
- $$ = class_create(clType_command, t);
- }
+ | STRING { $$ = class_fromString(clType_command, $1); }
| WORD {
name *n = name_find($1, 0, 0);
if (!n || !n->c) {
moan("class `%s' not found at line %i",
$1, lex_line);
- YYERROR;
+ yynerrs++; YYERROR;
} else if (~n->c->type & clType_command) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
} else {
$$ = n->c;
class_inc(n->c);
/* --- Host class expressions --- */
-host_class : host_class ',' host_class {
- if ($1->type != $3->type) {
+host_class : host_class ',' host_class {
+ if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_union($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| host_class '-' host_class {
- if ($1->type != $3->type) {
+ if (($$ = class_diff($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- $$ = class_create($1->type,
- set_subtract($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| host_class '&' host_class {
- if ($1->type != $3->type) {
+ if (($$ = class_isect($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_intersect($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
| host_class '|' host_class {
- if ($1->type != $3->type) {
+ if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- class_dec($1);
- class_dec($3);
- YYERROR;
- } else {
- if ($1 == class_all)
- $$ = class_all;
- else
- $$ = class_create($1->type,
- set_union($1->t, $3->t));
- class_dec($1);
- class_dec($3);
+ yynerrs++; YYERROR;
}
}
- | STRING {
- sym_table *t = xmalloc(sizeof(*t));
- sym_createTable(t);
- sym_find(t, $1, -1, sizeof(sym_base), 0);
- $$ = class_create(clType_host, t);
- }
+ | STRING { $$ = class_fromString(clType_host, $1); }
| WORD {
name *n = name_find($1, 0, 0);
if (!n || !n->c) {
moan("class `%s' not found at line %i",
$1, lex_line);
- YYERROR;
+ yynerrs++; YYERROR;
} else if (~n->c->type & clType_host) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
} else {
$$ = n->c;
class_inc(n->c);
| '(' host_class ')' { $$ = $2; }
;
+/*----- Helper functions --------------------------------------------------*/
+%%
+/* --- @parse@ --- *
+ *
+ * Arguments: ---
+ *
+ * Returns: Zero if it worked, nonzero if it didn't.
+ *
+ * Use: Parses configuration files.
+ */
+
+int parse(void)
+{
+ yynerrs = 0;
+ return (yyparse() || yynerrs);
+}
+
/*----- That's all, folks -------------------------------------------------*/