/* -*-c-*-
*
- * $Id: parser.y,v 1.4 1997/09/17 10:26:52 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.4 1997/09/17 10:26:52 mdw
+ * 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.
*
;
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 : user_class ',' user_class {
if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| user_class '-' user_class {
if (($$ = class_diff($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| user_class '&' user_class {
if (($$ = class_isect($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| user_class '|' user_class {
if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| INT { $$ = class_fromUser(clType_user, $1); }
if ((pw = userdb_userByName($1)) == 0) {
moan("user `%s' not known at line %i",
$1, lex_line);
- YYERROR;
+ yynerrs++; YYERROR;
} else
$$ = class_fromUser(clType_user, pw->pw_uid);
}
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 : command_class ',' command_class {
if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| command_class '-' command_class {
if (($$ = class_diff($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| command_class '&' command_class {
if (($$ = class_isect($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| command_class '|' command_class {
if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| STRING { $$ = class_fromString(clType_command, $1); }
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 : host_class ',' host_class {
if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| host_class '-' host_class {
if (($$ = class_diff($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| host_class '&' host_class {
if (($$ = class_isect($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| host_class '|' host_class {
if (($$ = class_union($1, $3)) == 0) {
yyerror("type mismatch");
- YYERROR;
+ yynerrs++; YYERROR;
}
}
| STRING { $$ = class_fromString(clType_host, $1); }
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 -------------------------------------------------*/