blob: b365088092e2e66a03e24057bdf22f505c09795d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
%{
/*
* For license terms, see the file COPYING in this directory.
*/
/***********************************************************************
module: rcfile_y.y
project: fetchmail
programmer: Eric S. Raymond <esr@thyrsus.com>
description: fetchmail configuration file parser
***********************************************************************/
#include <config.h>
#include <stdio.h>
#include "fetchmail.h"
extern char *rcfile;
extern int prc_lineno;
extern int prc_errflag;
extern char *yytext;
int yydebug; /* in case we didn't generate with -- debug */
%}
%union {
int proto;
int flag;
char *sval;
}
%token DEFAULTS SERVER PROTOCOL AUTHENTICATE KPOP KERBEROS
%token USERNAME PASSWORD FOLDER SMTPHOST MDA IS HERE THERE
%token <proto> PROTO
%token <sval> STRING
%token <flag> KEEP FLUSH FETCHALL REWRITE PORT SKIP
/* these are actually used by the lexer */
%token FLAG_TRUE 2
%token FLAG_FALSE 1
%%
rcfile : /* empty */
| statement_list
;
statement_list : statement
| statement_list statement
;
statement : define_server serverspecs userspecs
;
define_server : SERVER STRING {prc_setserver($2);}
| SKIP SERVER STRING {prc_setserver($3);
prc_setskip($1==FLAG_TRUE);}
| DEFAULTS {prc_setserver("defaults");}
;
serverspecs : /* EMPTY */
| serverspecs serv_option
;
serv_option : PROTOCOL PROTO {prc_setproto($2);}
| PROTOCOL KPOP {
prc_setproto(P_POP3);
prc_setauth(A_KERBEROS);
prc_setport(KPOP_PORT);
}
| PORT STRING {prc_setport(atoi($2));}
| SKIP {prc_setskip($1==FLAG_TRUE);}
| AUTHENTICATE PASSWORD {prc_setauth(A_PASSWORD);}
| AUTHENTICATE KERBEROS {prc_setauth(A_KERBEROS);}
;
/* the first and only the first user spec may omit the USERNAME part */
userspecs : user1opts {prc_register(); prc_reset();}
| user1opts explicits {prc_register(); prc_reset();}
| explicits
;
explicits : explicitdef {prc_register(); prc_reset();}
| explicits explicitdef {prc_register(); prc_reset();}
;
explicitdef : userdef user0opts
;
userdef : USERNAME STRING {prc_setremote($2);}
| USERNAME STRING HERE {prc_setlocal($2);}
| USERNAME STRING THERE {prc_setremote($2);}
;
user0opts : /* EMPTY */
| user0opts user_option
;
user1opts : user_option
| user1opts user_option
;
user_option : IS STRING {prc_setlocal($2);}
| IS STRING HERE {prc_setlocal($2);}
| IS STRING THERE {prc_setremote($2);}
| PASSWORD STRING {prc_setpassword($2);}
| FOLDER STRING {prc_setfolder($2);}
| SMTPHOST STRING {prc_setsmtphost($2);}
| MDA STRING {prc_setmda($2);}
| KEEP {prc_setkeep($1==FLAG_TRUE);}
| FLUSH {prc_setflush($1==FLAG_TRUE);}
| FETCHALL {prc_setfetchall($1==FLAG_TRUE);}
| REWRITE {prc_setrewrite($1==FLAG_TRUE);}
;
%%
yyerror (s)
char *s;
{
fprintf(stderr,"%s line %d: %s at %s\n", rcfile, prc_lineno, s, yytext);
prc_errflag++;
}
|