/* -*-c-*-
*
- * $Id: parser.y,v 1.5 1998/01/12 16:46:22 mdw Exp $
+ * $Id: parser.y,v 1.8 2003/10/12 00:14:55 mdw Exp $
*
* Parser for `become.conf' files
*
/*----- Revision history --------------------------------------------------*
*
* $Log: parser.y,v $
+ * Revision 1.8 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.7 1999/03/26 15:25:22 mdw
+ * Insert some missing semicolons. Bison didn't seem to care, but other
+ * programs like `yyextract' do, so it's worth fixing.
+ *
+ * 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.
*
#include <pwd.h>
#include <unistd.h>
+/* --- mLib headers --- */
+
+#include <mLib/report.h>
+#include <mLib/sym.h>
+
/* --- Local headers --- */
#include "class.h"
#include "lexer.h"
#include "name.h"
#include "rule.h"
-#include "sym.h"
#include "userdb.h"
-#include "utils.h"
%}
/*----- Stack type --------------------------------------------------------*/
;
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_opt command_class_opt ';' {
rule_add($2, $3, $5, $6);
}
+ ;
host_class_opt : /* empty */ { $$ = class_all; }
| '[' host_class ']' { $$ = $2; }
n->c = 0;
$$ = n;
}
+ ;
/*----- Various class expression types ------------------------------------*
*
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 -------------------------------------------------*/