]> git.ipfire.org Git - people/ms/dma.git/blame - aliases_parse.y
Merge pull request #34 from mtremer/better-authentication
[people/ms/dma.git] / aliases_parse.y
CommitLineData
86e4d161 1%{
86e4d161
MS
2
3#include <err.h>
4#include <string.h>
b73b879e 5#include <syslog.h>
86e4d161
MS
6#include "dma.h"
7
8extern int yylineno;
65bec70e 9static void yyerror(const char *);
86e4d161 10
65bec70e 11static void
86e4d161
MS
12yyerror(const char *msg)
13{
b73b879e
SS
14 /**
15 * Because we do error '\n' below, we need to report the error
16 * one line above of what yylineno points to.
17 */
18 syslog(LOG_CRIT, "aliases line %d: %s", yylineno - 1, msg);
19 fprintf(stderr, "aliases line %d: %s\n", yylineno - 1, msg);
86e4d161
MS
20}
21
22int
23yywrap(void)
24{
25 return (1);
26}
27
28%}
29
30%union {
31 char *ident;
32 struct stritem *strit;
33 struct alias *alias;
34}
35
36%token <ident> T_IDENT
37%token T_ERROR
38%token T_EOF 0
39
40%type <strit> dests
41%type <alias> alias aliases
42
43%%
44
45start : aliases T_EOF
46 {
47 LIST_FIRST(&aliases) = $1;
48 }
49
50aliases : /* EMPTY */
51 {
52 $$ = NULL;
53 }
54 | alias aliases
55 {
56 if ($2 != NULL && $1 != NULL)
57 LIST_INSERT_AFTER($2, $1, next);
58 else if ($2 == NULL)
59 $2 = $1;
60 $$ = $2;
61 }
62 ;
63
64alias : T_IDENT ':' dests '\n'
65 {
66 struct alias *al;
67
68 if ($1 == NULL)
69 YYABORT;
70 al = calloc(1, sizeof(*al));
71 if (al == NULL)
72 YYABORT;
73 al->alias = $1;
74 SLIST_FIRST(&al->dests) = $3;
75 $$ = al;
76 }
77 | error '\n'
78 {
b73b879e 79 YYABORT;
86e4d161
MS
80 }
81 ;
82
83dests : T_IDENT
84 {
85 struct stritem *it;
86
87 if ($1 == NULL)
88 YYABORT;
89 it = calloc(1, sizeof(*it));
90 if (it == NULL)
91 YYABORT;
92 it->str = $1;
93 $$ = it;
94 }
95 | T_IDENT ',' dests
96 {
97 struct stritem *it;
98
99 if ($1 == NULL)
100 YYABORT;
101 it = calloc(1, sizeof(*it));
102 if (it == NULL)
103 YYABORT;
104 it->str = $1;
105 SLIST_NEXT(it, next) = $3;
106 $$ = it;
107 }
108 ;
109
110%%