/* -*-c-*-
*
- * $Id: parser.y,v 1.2 1997/08/04 10:24:24 mdw Exp $
+ * $Id: parser.y,v 1.5 1998/01/12 16:46:22 mdw Exp $
*
* Parser for `become.conf' files
*
- * (c) 1997 EBI
+ * (c) 1998 EBI
*/
/*----- Licensing notice --------------------------------------------------*
/*----- 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.
*
/* --- Unix headers --- */
#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <netdb.h>
#include <pwd.h>
#include <unistd.h>
#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 INT ';' { daemon_usePort($2); }
+port_spec : PORT STRING ';' {
+ struct servent *s = getservbyname($2, "udp");
+ if (!s) {
+ moan("unknown service `%s' at line %i",
+ $2, lex_line);
+ YYERROR;
+ }
+ daemon_usePort(s->s_port);
+ }
+ | PORT INT ';' { daemon_usePort(htons($2)); }
;
key_spec : KEYFILE STRING ';' { daemon_readKey($2); }
/* --- 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);
}
}
| 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);
}
}
| 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);
}
}
| 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);
}
}
- | 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);
- }
+ } else
+ $$ = class_fromUser(clType_user, pw->pw_uid);
}
| WORD {
name *n = name_find($1, 0, 0);
/* --- 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);
}
}
| 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);
}
}
| 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);
}
}
| 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);
}
}
- | 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) {
/* --- 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);
}
}
| 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);
}
}
| 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);
}
}
| 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);
}
}
- | 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) {