/* -*-c-*-
*
- * $Id: parser.y,v 1.5 1998/01/12 16:46:22 mdw Exp $
+ * $Id$
*
* Parser for `become.conf' files
*
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: parser.y,v $
- * 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.
- *
- * Revision 1.2 1997/08/04 10:24:24 mdw
- * Sources placed under CVS control.
- *
- * Revision 1.1 1997/07/21 13:47:45 mdw
- * Initial revision
- *
- */
-
/*----- Header files ------------------------------------------------------*/
%{
#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"
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE
%}
/*----- Stack type --------------------------------------------------------*/
/*----- Error reporting ---------------------------------------------------*/
%{
-#define YYDEBUG 1
-#define YYERROR_VERBOSE
-
/* --- @yyprint@ --- *
*
* Arguments: @FILE *fp@ = pointer to stream to write on
;
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 -------------------------------------------------*/