]> git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/bindlexer.l
rec: ensure correct service user on debian
[thirdparty/pdns.git] / pdns / bindlexer.l
1 %{
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <errno.h>
6
7 #define YY_NO_INPUT 1
8 #define YYSTYPE char *
9
10 #include "bindparser.h"
11
12 int linenumber;
13 #define MAX_INCLUDE_DEPTH 10
14 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
15 int include_stack_ln[MAX_INCLUDE_DEPTH];
16 char *include_stack_name[MAX_INCLUDE_DEPTH];
17 char *current_filename;
18 char *original_filename;
19 int include_stack_ptr = 0;
20 extern const char *bind_directory;
21
22 %}
23
24 %x comment
25 %x incl
26 %x quoted
27 %option stack
28 %option nounput
29 %option noyy_top_state
30 %option noinput
31
32 %%
33
34
35 "/*" BEGIN(comment);
36 <comment>[^*\n]* /* eat anything that's not a '*' */
37 <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */
38 <comment>\n ++linenumber;
39 <comment>"*"+"/" BEGIN(INITIAL);
40
41 include BEGIN(incl);
42 <incl>[ \t;]* /* eat the whitespace */
43 <incl>\"[^ \t\n";]+\"; { /* got the include file name */
44 char filename[1024];
45 if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
46 {
47 fprintf( stderr, "Includes nested too deeply\n" );
48 exit( 1 );
49 }
50
51 if (strlen(yytext) <= 2) {
52 fprintf( stderr, "Empty include directive\n" );
53 exit( 1 );
54 }
55
56 yytext[strlen(yytext)-2]=0;
57
58 include_stack[include_stack_ptr]=YY_CURRENT_BUFFER;
59 include_stack_name[include_stack_ptr]=current_filename=strdup(yytext+1);
60 include_stack_ln[include_stack_ptr++]=linenumber;
61 linenumber=1;
62
63 int ret;
64 if(*(yytext+1)=='/') {
65 ret = snprintf(filename, sizeof(filename), "%s", yytext+1);
66 }
67 else {
68 ret = snprintf(filename, sizeof(filename), "%s/%s", bind_directory, yytext+1);
69 }
70 if (ret == -1 || ret >= sizeof(filename)) {
71 fprintf( stderr, "Filename '%s' is too long\n",yytext+1);
72 exit( 1 );
73 }
74
75 if (!(yyin=fopen(filename,"r"))) {
76 fprintf( stderr, "Unable to open '%s': %s\n",filename,strerror(errno));
77 exit( 1 );
78 }
79
80 BEGIN(INITIAL);
81 yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
82
83 }
84
85
86 <<EOF>> {
87 if ( --include_stack_ptr < 0 )
88 {
89 yyterminate();
90 }
91
92 else
93 {
94 fclose(yyin);
95 yy_delete_buffer(YY_CURRENT_BUFFER);
96 yy_switch_to_buffer(include_stack[include_stack_ptr]);
97 linenumber=include_stack_ln[include_stack_ptr];
98 free(include_stack_name[include_stack_ptr]);
99 if(include_stack_ptr)
100 current_filename=include_stack_name[include_stack_ptr-1];
101 else
102 current_filename=original_filename;
103 }
104 }
105
106
107
108
109 zone return ZONETOK;
110
111 file return FILETOK;
112 options return OPTIONSTOK;
113 also-notify return ALSONOTIFYTOK;
114 acl return ACLTOK;
115 logging return LOGGINGTOK;
116 directory return DIRECTORYTOK;
117 masters return MASTERTOK;
118 type return TYPETOK;
119 \" yy_push_state(quoted);
120 <quoted>[^\"]* yylval=strdup(yytext); return QUOTEDWORD;
121 <quoted>\" yy_pop_state();
122 [^\" \t\n{};]* yylval=strdup(yytext);return AWORD;
123 \{ return OBRACE;
124 \} return EBRACE;
125 ; return SEMICOLON;
126 \n linenumber++;
127 [ \t]* ;
128 \/\/.*$ ;
129 \#.*$ ;
130 %%