Add UDP client timeout support.

This commit is contained in:
Sam Hocevar 2017-09-08 12:32:05 +02:00
parent 17d17e233b
commit f04eada6a9
5 changed files with 286 additions and 177 deletions

388
parse.c
View File

@ -3,7 +3,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define YYRULECOUNT 29 #define YYRULECOUNT 30
#line 9 "parse.peg" #line 9 "parse.peg"
#if HAVE_CONFIG_H #if HAVE_CONFIG_H
@ -23,6 +23,7 @@
char *tmpPort; \ char *tmpPort; \
int tmpPortNum, tmpProto; \ int tmpPortNum, tmpProto; \
int bindPortNum, bindProto, connectPortNum, connectProto; \ int bindPortNum, bindProto, connectPortNum, connectProto; \
int serverTimeout; \
char *bindAddress, *connectAddress; char *bindAddress, *connectAddress;
#define YY_INPUT(yyctx, buf, result, max_size) \ #define YY_INPUT(yyctx, buf, result, max_size) \
{ \ { \
@ -308,18 +309,19 @@ YY_LOCAL(void) yySet(yycontext *yy, char *text, int count) { yy->__val[count]=
#define YYACCEPT yyAccept(yy, yythunkpos0) #define YYACCEPT yyAccept(yy, yythunkpos0)
YY_RULE(int) yy_eof(yycontext *yy); /* 29 */ YY_RULE(int) yy_eof(yycontext *yy); /* 30 */
YY_RULE(int) yy_digit(yycontext *yy); /* 28 */ YY_RULE(int) yy_digit(yycontext *yy); /* 29 */
YY_RULE(int) yy_name(yycontext *yy); /* 27 */ YY_RULE(int) yy_name(yycontext *yy); /* 28 */
YY_RULE(int) yy_filename(yycontext *yy); /* 26 */ YY_RULE(int) yy_filename(yycontext *yy); /* 27 */
YY_RULE(int) yy_pattern(yycontext *yy); /* 25 */ YY_RULE(int) yy_pattern(yycontext *yy); /* 26 */
YY_RULE(int) yy_auth_key(yycontext *yy); /* 24 */ YY_RULE(int) yy_auth_key(yycontext *yy); /* 25 */
YY_RULE(int) yy_service(yycontext *yy); /* 23 */ YY_RULE(int) yy_service(yycontext *yy); /* 24 */
YY_RULE(int) yy_number(yycontext *yy); /* 22 */ YY_RULE(int) yy_proto(yycontext *yy); /* 23 */
YY_RULE(int) yy_proto(yycontext *yy); /* 21 */ YY_RULE(int) yy_port(yycontext *yy); /* 22 */
YY_RULE(int) yy_port(yycontext *yy); /* 20 */ YY_RULE(int) yy_number(yycontext *yy); /* 21 */
YY_RULE(int) yy_full_port(yycontext *yy); /* 19 */ YY_RULE(int) yy_full_port(yycontext *yy); /* 20 */
YY_RULE(int) yy_ipv4(yycontext *yy); /* 18 */ YY_RULE(int) yy_ipv4(yycontext *yy); /* 19 */
YY_RULE(int) yy_server_options(yycontext *yy); /* 18 */
YY_RULE(int) yy_connect_port(yycontext *yy); /* 17 */ YY_RULE(int) yy_connect_port(yycontext *yy); /* 17 */
YY_RULE(int) yy_connect_address(yycontext *yy); /* 16 */ YY_RULE(int) yy_connect_address(yycontext *yy); /* 16 */
YY_RULE(int) yy_bind_port(yycontext *yy); /* 15 */ YY_RULE(int) yy_bind_port(yycontext *yy); /* 15 */
@ -327,8 +329,8 @@ YY_RULE(int) yy_bind_address(yycontext *yy); /* 14 */
YY_RULE(int) yy_logcommon(yycontext *yy); /* 13 */ YY_RULE(int) yy_logcommon(yycontext *yy); /* 13 */
YY_RULE(int) yy_pidlogfile(yycontext *yy); /* 12 */ YY_RULE(int) yy_pidlogfile(yycontext *yy); /* 12 */
YY_RULE(int) yy_logfile(yycontext *yy); /* 11 */ YY_RULE(int) yy_logfile(yycontext *yy); /* 11 */
YY_RULE(int) yy_rule(yycontext *yy); /* 10 */ YY_RULE(int) yy_auth_rule(yycontext *yy); /* 10 */
YY_RULE(int) yy_server(yycontext *yy); /* 9 */ YY_RULE(int) yy_server_rule(yycontext *yy); /* 9 */
YY_RULE(int) yy_comment(yycontext *yy); /* 8 */ YY_RULE(int) yy_comment(yycontext *yy); /* 8 */
YY_RULE(int) yy_command(yycontext *yy); /* 7 */ YY_RULE(int) yy_command(yycontext *yy); /* 7 */
YY_RULE(int) yy__(yycontext *yy); /* 6 */ YY_RULE(int) yy__(yycontext *yy); /* 6 */
@ -345,7 +347,7 @@ YY_ACTION(void) yy_1_sol(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_sol\n")); yyprintf((stderr, "do yy_1_sol\n"));
{ {
#line 135 #line 146
++yy->currentLine; ; ++yy->currentLine; ;
} }
#undef yythunkpos #undef yythunkpos
@ -359,7 +361,7 @@ YY_ACTION(void) yy_1_invalid_syntax(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_invalid_syntax\n")); yyprintf((stderr, "do yy_1_invalid_syntax\n"));
{ {
#line 118 #line 129
fprintf(stderr, "rinetd: invalid syntax at line %d: %s\n", fprintf(stderr, "rinetd: invalid syntax at line %d: %s\n",
yy->currentLine, yytext); yy->currentLine, yytext);
@ -377,7 +379,7 @@ YY_ACTION(void) yy_1_logcommon(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_logcommon\n")); yyprintf((stderr, "do yy_1_logcommon\n"));
{ {
#line 114 #line 124
logFormatCommon = 1; logFormatCommon = 1;
; ;
@ -393,7 +395,7 @@ YY_ACTION(void) yy_1_pidlogfile(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_pidlogfile\n")); yyprintf((stderr, "do yy_1_pidlogfile\n"));
{ {
#line 107 #line 116
pidLogFileName = strdup(yytext); pidLogFileName = strdup(yytext);
if (!pidLogFileName) { if (!pidLogFileName) {
@ -412,7 +414,7 @@ YY_ACTION(void) yy_1_logfile(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_logfile\n")); yyprintf((stderr, "do yy_1_logfile\n"));
{ {
#line 100 #line 108
logFileName = strdup(yytext); logFileName = strdup(yytext);
if (!logFileName) { if (!logFileName) {
@ -431,21 +433,21 @@ YY_ACTION(void) yy_1_auth_key(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_auth_key\n")); yyprintf((stderr, "do yy_1_auth_key\n"));
{ {
#line 98 #line 105
yy->isAuthAllow = (yytext[0] == 'a'); ; yy->isAuthAllow = (yytext[0] == 'a'); ;
} }
#undef yythunkpos #undef yythunkpos
#undef yypos #undef yypos
#undef yy #undef yy
} }
YY_ACTION(void) yy_1_rule(yycontext *yy, char *yytext, int yyleng) YY_ACTION(void) yy_1_auth_rule(yycontext *yy, char *yytext, int yyleng)
{ {
#define __ yy->__ #define __ yy->__
#define yypos yy->__pos #define yypos yy->__pos
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_rule\n")); yyprintf((stderr, "do yy_1_auth_rule\n"));
{ {
#line 76 #line 83
allRules = (Rule *) allRules = (Rule *)
realloc(allRules, sizeof(Rule) * (allRulesCount + 1)); realloc(allRules, sizeof(Rule) * (allRulesCount + 1));
@ -479,7 +481,7 @@ YY_ACTION(void) yy_3_proto(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_3_proto\n")); yyprintf((stderr, "do yy_3_proto\n"));
{ {
#line 74 #line 80
yy->tmpProto = protoTcp; ; yy->tmpProto = protoTcp; ;
} }
#undef yythunkpos #undef yythunkpos
@ -493,7 +495,7 @@ YY_ACTION(void) yy_2_proto(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_2_proto\n")); yyprintf((stderr, "do yy_2_proto\n"));
{ {
#line 73 #line 79
yy->tmpProto = protoUdp; ; yy->tmpProto = protoUdp; ;
} }
#undef yythunkpos #undef yythunkpos
@ -507,7 +509,7 @@ YY_ACTION(void) yy_1_proto(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_proto\n")); yyprintf((stderr, "do yy_1_proto\n"));
{ {
#line 72 #line 78
yy->tmpProto = protoTcp; ; yy->tmpProto = protoTcp; ;
} }
#undef yythunkpos #undef yythunkpos
@ -521,7 +523,7 @@ YY_ACTION(void) yy_1_port(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_port\n")); yyprintf((stderr, "do yy_1_port\n"));
{ {
#line 71 #line 77
yy->tmpPort = strdup(yytext); ; yy->tmpPort = strdup(yytext); ;
} }
#undef yythunkpos #undef yythunkpos
@ -535,7 +537,7 @@ YY_ACTION(void) yy_1_full_port(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_full_port\n")); yyprintf((stderr, "do yy_1_full_port\n"));
{ {
#line 61 #line 67
char const *proto = yy->tmpProto == protoTcp ? "tcp" : "udp"; char const *proto = yy->tmpProto == protoTcp ? "tcp" : "udp";
struct servent *service = getservbyname(yy->tmpPort, proto); struct servent *service = getservbyname(yy->tmpPort, proto);
@ -550,6 +552,20 @@ YY_ACTION(void) yy_1_full_port(yycontext *yy, char *yytext, int yyleng)
#undef yypos #undef yypos
#undef yy #undef yy
} }
YY_ACTION(void) yy_1_server_options(yycontext *yy, char *yytext, int yyleng)
{
#define __ yy->__
#define yypos yy->__pos
#define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_server_options\n"));
{
#line 64
yy->serverTimeout = atoi(yytext); ;
}
#undef yythunkpos
#undef yypos
#undef yy
}
YY_ACTION(void) yy_1_connect_port(yycontext *yy, char *yytext, int yyleng) YY_ACTION(void) yy_1_connect_port(yycontext *yy, char *yytext, int yyleng)
{ {
#define __ yy->__ #define __ yy->__
@ -557,7 +573,7 @@ YY_ACTION(void) yy_1_connect_port(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_connect_port\n")); yyprintf((stderr, "do yy_1_connect_port\n"));
{ {
#line 59 #line 63
yy->connectPortNum = yy->tmpPortNum; yy->connectProto = yy->tmpProto; ; yy->connectPortNum = yy->tmpPortNum; yy->connectProto = yy->tmpProto; ;
} }
#undef yythunkpos #undef yythunkpos
@ -571,7 +587,7 @@ YY_ACTION(void) yy_1_bind_port(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_bind_port\n")); yyprintf((stderr, "do yy_1_bind_port\n"));
{ {
#line 58 #line 62
yy->bindPortNum = yy->tmpPortNum; yy->bindProto = yy->tmpProto; ; yy->bindPortNum = yy->tmpPortNum; yy->bindProto = yy->tmpProto; ;
} }
#undef yythunkpos #undef yythunkpos
@ -585,7 +601,7 @@ YY_ACTION(void) yy_1_connect_address(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_connect_address\n")); yyprintf((stderr, "do yy_1_connect_address\n"));
{ {
#line 57 #line 61
yy->connectAddress = strdup(yytext); ; yy->connectAddress = strdup(yytext); ;
} }
#undef yythunkpos #undef yythunkpos
@ -599,25 +615,27 @@ YY_ACTION(void) yy_1_bind_address(yycontext *yy, char *yytext, int yyleng)
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_bind_address\n")); yyprintf((stderr, "do yy_1_bind_address\n"));
{ {
#line 56 #line 60
yy->bindAddress = strdup(yytext); ; yy->bindAddress = strdup(yytext); ;
} }
#undef yythunkpos #undef yythunkpos
#undef yypos #undef yypos
#undef yy #undef yy
} }
YY_ACTION(void) yy_1_server(yycontext *yy, char *yytext, int yyleng) YY_ACTION(void) yy_1_server_rule(yycontext *yy, char *yytext, int yyleng)
{ {
#define __ yy->__ #define __ yy->__
#define yypos yy->__pos #define yypos yy->__pos
#define yythunkpos yy->__thunkpos #define yythunkpos yy->__thunkpos
yyprintf((stderr, "do yy_1_server\n")); yyprintf((stderr, "do yy_1_server_rule\n"));
{ {
#line 50 #line 52
addServer(yy->bindAddress, yy->bindPortNum, yy->bindProto, addServer(yy->bindAddress, yy->bindPortNum, yy->bindProto,
yy->connectAddress, yy->connectPortNum, yy->connectProto); yy->connectAddress, yy->connectPortNum, yy->connectProto,
yy->serverTimeout > 0 ? yy->serverTimeout : RINETD_DEFAULT_UDP_TIMEOUT);
yy->bindAddress = yy->connectAddress = NULL; yy->bindAddress = yy->connectAddress = NULL;
yy->serverTimeout = 0;
; ;
} }
#undef yythunkpos #undef yythunkpos
@ -748,30 +766,17 @@ YY_RULE(int) yy_service(yycontext *yy)
yyprintf((stderr, " fail %s @ %s\n", "service", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "service", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_number(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "number")); if (!yy_digit(yy)) goto l32;
l33:;
{ int yypos34= yy->__pos, yythunkpos34= yy->__thunkpos; if (!yy_digit(yy)) goto l34; goto l33;
l34:; yy->__pos= yypos34; yy->__thunkpos= yythunkpos34;
}
yyprintf((stderr, " ok %s @ %s\n", "number", yy->__buf+yy->__pos));
return 1;
l32:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "number", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_proto(yycontext *yy) YY_RULE(int) yy_proto(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "proto")); yyprintf((stderr, "%s\n", "proto"));
{ int yypos36= yy->__pos, yythunkpos36= yy->__thunkpos; if (!yymatchString(yy, "/tcp")) goto l37; yyDo(yy, yy_1_proto, yy->__begin, yy->__end); goto l36; { int yypos33= yy->__pos, yythunkpos33= yy->__thunkpos; if (!yymatchString(yy, "/tcp")) goto l34; yyDo(yy, yy_1_proto, yy->__begin, yy->__end); goto l33;
l37:; yy->__pos= yypos36; yy->__thunkpos= yythunkpos36; if (!yymatchString(yy, "/udp")) goto l38; yyDo(yy, yy_2_proto, yy->__begin, yy->__end); goto l36; l34:; yy->__pos= yypos33; yy->__thunkpos= yythunkpos33; if (!yymatchString(yy, "/udp")) goto l35; yyDo(yy, yy_2_proto, yy->__begin, yy->__end); goto l33;
l38:; yy->__pos= yypos36; yy->__thunkpos= yythunkpos36; if (!yymatchString(yy, "")) goto l35; yyDo(yy, yy_3_proto, yy->__begin, yy->__end); l35:; yy->__pos= yypos33; yy->__thunkpos= yythunkpos33; if (!yymatchString(yy, "")) goto l32; yyDo(yy, yy_3_proto, yy->__begin, yy->__end);
} }
l36:; l33:;
yyprintf((stderr, " ok %s @ %s\n", "proto", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "proto", yy->__buf+yy->__pos));
return 1; return 1;
l35:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l32:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "proto", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "proto", yy->__buf+yy->__pos));
return 0; return 0;
} }
@ -780,26 +785,39 @@ YY_RULE(int) yy_port(yycontext *yy)
yyprintf((stderr, "%s\n", "port")); yyText(yy, yy->__begin, yy->__end); { yyprintf((stderr, "%s\n", "port")); yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l39; if (!(YY_BEGIN)) goto l36;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} }
{ int yypos40= yy->__pos, yythunkpos40= yy->__thunkpos; if (!yy_number(yy)) goto l41; goto l40; { int yypos37= yy->__pos, yythunkpos37= yy->__thunkpos; if (!yy_number(yy)) goto l38; goto l37;
l41:; yy->__pos= yypos40; yy->__thunkpos= yythunkpos40; if (!yy_service(yy)) goto l39; l38:; yy->__pos= yypos37; yy->__thunkpos= yythunkpos37; if (!yy_service(yy)) goto l36;
} }
l40:; yyText(yy, yy->__begin, yy->__end); { l37:; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_END)) goto l39; if (!(YY_END)) goto l36;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} yyDo(yy, yy_1_port, yy->__begin, yy->__end); } yyDo(yy, yy_1_port, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "port", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "port", yy->__buf+yy->__pos));
return 1; return 1;
l39:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l36:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "port", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "port", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_number(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "number")); if (!yy_digit(yy)) goto l39;
l40:;
{ int yypos41= yy->__pos, yythunkpos41= yy->__thunkpos; if (!yy_digit(yy)) goto l41; goto l40;
l41:; yy->__pos= yypos41; yy->__thunkpos= yythunkpos41;
}
yyprintf((stderr, " ok %s @ %s\n", "number", yy->__buf+yy->__pos));
return 1;
l39:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "number", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_full_port(yycontext *yy) YY_RULE(int) yy_full_port(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "full_port")); if (!yy_port(yy)) goto l42; if (!yy_proto(yy)) goto l42; yyDo(yy, yy_1_full_port, yy->__begin, yy->__end); yyprintf((stderr, "%s\n", "full_port")); if (!yy_port(yy)) goto l42; if (!yy_proto(yy)) goto l42; yyDo(yy, yy_1_full_port, yy->__begin, yy->__end);
@ -822,12 +840,41 @@ YY_RULE(int) yy_ipv4(yycontext *yy)
yyprintf((stderr, " fail %s @ %s\n", "ipv4", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "ipv4", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_connect_port(yycontext *yy) YY_RULE(int) yy_server_options(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "connect_port")); if (!yy_full_port(yy)) goto l46; yyDo(yy, yy_1_connect_port, yy->__begin, yy->__end); yyprintf((stderr, "%s\n", "server_options")); if (!yymatchString(yy, "timeout")) goto l46;
yyprintf((stderr, " ok %s @ %s\n", "connect_port", yy->__buf+yy->__pos)); { int yypos47= yy->__pos, yythunkpos47= yy->__thunkpos; if (!yy__(yy)) goto l47; goto l48;
l47:; yy->__pos= yypos47; yy->__thunkpos= yythunkpos47;
}
l48:; if (!yymatchChar(yy, '=')) goto l46;
{ int yypos49= yy->__pos, yythunkpos49= yy->__thunkpos; if (!yy__(yy)) goto l49; goto l50;
l49:; yy->__pos= yypos49; yy->__thunkpos= yythunkpos49;
}
l50:; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text
#define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l46;
#undef yytext
#undef yyleng
} if (!yy_number(yy)) goto l46; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text
#define yyleng yy->__textlen
if (!(YY_END)) goto l46;
#undef yytext
#undef yyleng
} yyDo(yy, yy_1_server_options, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "server_options", yy->__buf+yy->__pos));
return 1; return 1;
l46:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l46:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "server_options", yy->__buf+yy->__pos));
return 0;
}
YY_RULE(int) yy_connect_port(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "connect_port")); if (!yy_full_port(yy)) goto l51; yyDo(yy, yy_1_connect_port, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "connect_port", yy->__buf+yy->__pos));
return 1;
l51:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "connect_port", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "connect_port", yy->__buf+yy->__pos));
return 0; return 0;
} }
@ -836,28 +883,28 @@ YY_RULE(int) yy_connect_address(yycontext *yy)
yyprintf((stderr, "%s\n", "connect_address")); yyText(yy, yy->__begin, yy->__end); { yyprintf((stderr, "%s\n", "connect_address")); yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l47; if (!(YY_BEGIN)) goto l52;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} if (!yy_ipv4(yy)) goto l47; yyText(yy, yy->__begin, yy->__end); { } if (!yy_ipv4(yy)) goto l52; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_END)) goto l47; if (!(YY_END)) goto l52;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} yyDo(yy, yy_1_connect_address, yy->__begin, yy->__end); } yyDo(yy, yy_1_connect_address, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "connect_address", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "connect_address", yy->__buf+yy->__pos));
return 1; return 1;
l47:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l52:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "connect_address", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "connect_address", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_bind_port(yycontext *yy) YY_RULE(int) yy_bind_port(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "bind_port")); if (!yy_full_port(yy)) goto l48; yyDo(yy, yy_1_bind_port, yy->__begin, yy->__end); yyprintf((stderr, "%s\n", "bind_port")); if (!yy_full_port(yy)) goto l53; yyDo(yy, yy_1_bind_port, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "bind_port", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "bind_port", yy->__buf+yy->__pos));
return 1; return 1;
l48:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l53:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "bind_port", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "bind_port", yy->__buf+yy->__pos));
return 0; return 0;
} }
@ -866,145 +913,161 @@ YY_RULE(int) yy_bind_address(yycontext *yy)
yyprintf((stderr, "%s\n", "bind_address")); yyText(yy, yy->__begin, yy->__end); { yyprintf((stderr, "%s\n", "bind_address")); yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l49; if (!(YY_BEGIN)) goto l54;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} if (!yy_ipv4(yy)) goto l49; yyText(yy, yy->__begin, yy->__end); { } if (!yy_ipv4(yy)) goto l54; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_END)) goto l49; if (!(YY_END)) goto l54;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} yyDo(yy, yy_1_bind_address, yy->__begin, yy->__end); } yyDo(yy, yy_1_bind_address, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "bind_address", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "bind_address", yy->__buf+yy->__pos));
return 1; return 1;
l49:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l54:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "bind_address", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "bind_address", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_logcommon(yycontext *yy) YY_RULE(int) yy_logcommon(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "logcommon")); if (!yymatchString(yy, "logcommon")) goto l50; yyDo(yy, yy_1_logcommon, yy->__begin, yy->__end); yyprintf((stderr, "%s\n", "logcommon")); if (!yymatchString(yy, "logcommon")) goto l55; yyDo(yy, yy_1_logcommon, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "logcommon", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "logcommon", yy->__buf+yy->__pos));
return 1; return 1;
l50:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l55:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "logcommon", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "logcommon", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_pidlogfile(yycontext *yy) YY_RULE(int) yy_pidlogfile(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "pidlogfile")); if (!yymatchString(yy, "pidlogfile")) goto l51; if (!yy__(yy)) goto l51; yyText(yy, yy->__begin, yy->__end); { yyprintf((stderr, "%s\n", "pidlogfile")); if (!yymatchString(yy, "pidlogfile")) goto l56; if (!yy__(yy)) goto l56; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l51; if (!(YY_BEGIN)) goto l56;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} if (!yy_filename(yy)) goto l51; yyText(yy, yy->__begin, yy->__end); { } if (!yy_filename(yy)) goto l56; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_END)) goto l51; if (!(YY_END)) goto l56;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} yyDo(yy, yy_1_pidlogfile, yy->__begin, yy->__end); } yyDo(yy, yy_1_pidlogfile, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "pidlogfile", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "pidlogfile", yy->__buf+yy->__pos));
return 1; return 1;
l51:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l56:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "pidlogfile", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "pidlogfile", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_logfile(yycontext *yy) YY_RULE(int) yy_logfile(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "logfile")); if (!yymatchString(yy, "logfile")) goto l52; if (!yy__(yy)) goto l52; yyText(yy, yy->__begin, yy->__end); { yyprintf((stderr, "%s\n", "logfile")); if (!yymatchString(yy, "logfile")) goto l57; if (!yy__(yy)) goto l57; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l52; if (!(YY_BEGIN)) goto l57;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} if (!yy_filename(yy)) goto l52; yyText(yy, yy->__begin, yy->__end); { } if (!yy_filename(yy)) goto l57; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_END)) goto l52; if (!(YY_END)) goto l57;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} yyDo(yy, yy_1_logfile, yy->__begin, yy->__end); } yyDo(yy, yy_1_logfile, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "logfile", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "logfile", yy->__buf+yy->__pos));
return 1; return 1;
l52:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l57:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "logfile", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "logfile", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_rule(yycontext *yy) YY_RULE(int) yy_auth_rule(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "rule")); if (!yy_auth_key(yy)) goto l53; if (!yy__(yy)) goto l53; yyText(yy, yy->__begin, yy->__end); { yyprintf((stderr, "%s\n", "auth_rule")); if (!yy_auth_key(yy)) goto l58; if (!yy__(yy)) goto l58; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l53; if (!(YY_BEGIN)) goto l58;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} if (!yy_pattern(yy)) goto l53; yyText(yy, yy->__begin, yy->__end); { } if (!yy_pattern(yy)) goto l58; yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_END)) goto l53; if (!(YY_END)) goto l58;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} yyDo(yy, yy_1_rule, yy->__begin, yy->__end); } yyDo(yy, yy_1_auth_rule, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "rule", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "auth_rule", yy->__buf+yy->__pos));
return 1; return 1;
l53:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l58:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "rule", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "auth_rule", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_server(yycontext *yy) YY_RULE(int) yy_server_rule(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "server")); if (!yy_bind_address(yy)) goto l54; if (!yy__(yy)) goto l54; if (!yy_bind_port(yy)) goto l54; if (!yy__(yy)) goto l54; if (!yy_connect_address(yy)) goto l54; if (!yy__(yy)) goto l54; if (!yy_connect_port(yy)) goto l54; yyDo(yy, yy_1_server, yy->__begin, yy->__end); yyprintf((stderr, "%s\n", "server_rule")); if (!yy_bind_address(yy)) goto l59; if (!yy__(yy)) goto l59; if (!yy_bind_port(yy)) goto l59; if (!yy__(yy)) goto l59; if (!yy_connect_address(yy)) goto l59; if (!yy__(yy)) goto l59; if (!yy_connect_port(yy)) goto l59;
yyprintf((stderr, " ok %s @ %s\n", "server", yy->__buf+yy->__pos)); { int yypos60= yy->__pos, yythunkpos60= yy->__thunkpos;
{ int yypos62= yy->__pos, yythunkpos62= yy->__thunkpos; if (!yy__(yy)) goto l62; goto l63;
l62:; yy->__pos= yypos62; yy->__thunkpos= yythunkpos62;
}
l63:; if (!yymatchChar(yy, '[')) goto l60;
{ int yypos64= yy->__pos, yythunkpos64= yy->__thunkpos; if (!yy__(yy)) goto l64; goto l65;
l64:; yy->__pos= yypos64; yy->__thunkpos= yythunkpos64;
}
l65:; if (!yy_server_options(yy)) goto l60;
{ int yypos66= yy->__pos, yythunkpos66= yy->__thunkpos; if (!yy__(yy)) goto l66; goto l67;
l66:; yy->__pos= yypos66; yy->__thunkpos= yythunkpos66;
}
l67:; if (!yymatchChar(yy, ']')) goto l60; goto l61;
l60:; yy->__pos= yypos60; yy->__thunkpos= yythunkpos60;
}
l61:; yyDo(yy, yy_1_server_rule, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "server_rule", yy->__buf+yy->__pos));
return 1; return 1;
l54:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l59:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "server", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "server_rule", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_comment(yycontext *yy) YY_RULE(int) yy_comment(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "comment")); if (!yymatchChar(yy, '#')) goto l55; yyprintf((stderr, "%s\n", "comment")); if (!yymatchChar(yy, '#')) goto l68;
l56:; l69:;
{ int yypos57= yy->__pos, yythunkpos57= yy->__thunkpos; { int yypos70= yy->__pos, yythunkpos70= yy->__thunkpos;
{ int yypos58= yy->__pos, yythunkpos58= yy->__thunkpos; if (!yy_eol(yy)) goto l58; goto l57; { int yypos71= yy->__pos, yythunkpos71= yy->__thunkpos; if (!yy_eol(yy)) goto l71; goto l70;
l58:; yy->__pos= yypos58; yy->__thunkpos= yythunkpos58; l71:; yy->__pos= yypos71; yy->__thunkpos= yythunkpos71;
} if (!yymatchDot(yy)) goto l57; goto l56; } if (!yymatchDot(yy)) goto l70; goto l69;
l57:; yy->__pos= yypos57; yy->__thunkpos= yythunkpos57; l70:; yy->__pos= yypos70; yy->__thunkpos= yythunkpos70;
} }
yyprintf((stderr, " ok %s @ %s\n", "comment", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "comment", yy->__buf+yy->__pos));
return 1; return 1;
l55:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l68:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "comment", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "comment", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_command(yycontext *yy) YY_RULE(int) yy_command(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "command")); yyprintf((stderr, "%s\n", "command"));
{ int yypos60= yy->__pos, yythunkpos60= yy->__thunkpos; if (!yy_server(yy)) goto l61; goto l60; { int yypos73= yy->__pos, yythunkpos73= yy->__thunkpos; if (!yy_server_rule(yy)) goto l74; goto l73;
l61:; yy->__pos= yypos60; yy->__thunkpos= yythunkpos60; if (!yy_rule(yy)) goto l62; goto l60; l74:; yy->__pos= yypos73; yy->__thunkpos= yythunkpos73; if (!yy_auth_rule(yy)) goto l75; goto l73;
l62:; yy->__pos= yypos60; yy->__thunkpos= yythunkpos60; if (!yy_logfile(yy)) goto l63; goto l60; l75:; yy->__pos= yypos73; yy->__thunkpos= yythunkpos73; if (!yy_logfile(yy)) goto l76; goto l73;
l63:; yy->__pos= yypos60; yy->__thunkpos= yythunkpos60; if (!yy_pidlogfile(yy)) goto l64; goto l60; l76:; yy->__pos= yypos73; yy->__thunkpos= yythunkpos73; if (!yy_pidlogfile(yy)) goto l77; goto l73;
l64:; yy->__pos= yypos60; yy->__thunkpos= yythunkpos60; if (!yy_logcommon(yy)) goto l59; l77:; yy->__pos= yypos73; yy->__thunkpos= yythunkpos73; if (!yy_logcommon(yy)) goto l72;
} }
l60:; l73:;
yyprintf((stderr, " ok %s @ %s\n", "command", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "command", yy->__buf+yy->__pos));
return 1; return 1;
l59:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l72:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "command", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "command", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy__(yycontext *yy) YY_RULE(int) yy__(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "_")); if (!yymatchClass(yy, (unsigned char *)"\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l65; yyprintf((stderr, "%s\n", "_")); if (!yymatchClass(yy, (unsigned char *)"\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l78;
l66:; l79:;
{ int yypos67= yy->__pos, yythunkpos67= yy->__thunkpos; if (!yymatchClass(yy, (unsigned char *)"\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l67; goto l66; { int yypos80= yy->__pos, yythunkpos80= yy->__thunkpos; if (!yymatchClass(yy, (unsigned char *)"\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l80; goto l79;
l67:; yy->__pos= yypos67; yy->__thunkpos= yythunkpos67; l80:; yy->__pos= yypos80; yy->__thunkpos= yythunkpos80;
} }
yyprintf((stderr, " ok %s @ %s\n", "_", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "_", yy->__buf+yy->__pos));
return 1; return 1;
l65:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l78:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "_", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "_", yy->__buf+yy->__pos));
return 0; return 0;
} }
@ -1013,71 +1076,71 @@ YY_RULE(int) yy_invalid_syntax(yycontext *yy)
yyprintf((stderr, "%s\n", "invalid_syntax")); yyText(yy, yy->__begin, yy->__end); { yyprintf((stderr, "%s\n", "invalid_syntax")); yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_BEGIN)) goto l68; if (!(YY_BEGIN)) goto l81;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} }
{ int yypos71= yy->__pos, yythunkpos71= yy->__thunkpos; if (!yy_eol(yy)) goto l71; goto l68; { int yypos84= yy->__pos, yythunkpos84= yy->__thunkpos; if (!yy_eol(yy)) goto l84; goto l81;
l71:; yy->__pos= yypos71; yy->__thunkpos= yythunkpos71; l84:; yy->__pos= yypos84; yy->__thunkpos= yythunkpos84;
} if (!yymatchDot(yy)) goto l68; } if (!yymatchDot(yy)) goto l81;
l69:; l82:;
{ int yypos70= yy->__pos, yythunkpos70= yy->__thunkpos; { int yypos83= yy->__pos, yythunkpos83= yy->__thunkpos;
{ int yypos72= yy->__pos, yythunkpos72= yy->__thunkpos; if (!yy_eol(yy)) goto l72; goto l70; { int yypos85= yy->__pos, yythunkpos85= yy->__thunkpos; if (!yy_eol(yy)) goto l85; goto l83;
l72:; yy->__pos= yypos72; yy->__thunkpos= yythunkpos72; l85:; yy->__pos= yypos85; yy->__thunkpos= yythunkpos85;
} if (!yymatchDot(yy)) goto l70; goto l69; } if (!yymatchDot(yy)) goto l83; goto l82;
l70:; yy->__pos= yypos70; yy->__thunkpos= yythunkpos70; l83:; yy->__pos= yypos83; yy->__thunkpos= yythunkpos83;
} yyText(yy, yy->__begin, yy->__end); { } yyText(yy, yy->__begin, yy->__end); {
#define yytext yy->__text #define yytext yy->__text
#define yyleng yy->__textlen #define yyleng yy->__textlen
if (!(YY_END)) goto l68; if (!(YY_END)) goto l81;
#undef yytext #undef yytext
#undef yyleng #undef yyleng
} if (!yy_eol(yy)) goto l68; yyDo(yy, yy_1_invalid_syntax, yy->__begin, yy->__end); } if (!yy_eol(yy)) goto l81; yyDo(yy, yy_1_invalid_syntax, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "invalid_syntax", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "invalid_syntax", yy->__buf+yy->__pos));
return 1; return 1;
l68:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l81:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "invalid_syntax", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "invalid_syntax", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_eol(yycontext *yy) YY_RULE(int) yy_eol(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "eol")); yyprintf((stderr, "%s\n", "eol"));
{ int yypos74= yy->__pos, yythunkpos74= yy->__thunkpos; { int yypos87= yy->__pos, yythunkpos87= yy->__thunkpos;
{ int yypos76= yy->__pos, yythunkpos76= yy->__thunkpos; if (!yymatchChar(yy, '\r')) goto l76; goto l77; { int yypos89= yy->__pos, yythunkpos89= yy->__thunkpos; if (!yymatchChar(yy, '\r')) goto l89; goto l90;
l76:; yy->__pos= yypos76; yy->__thunkpos= yythunkpos76; l89:; yy->__pos= yypos89; yy->__thunkpos= yythunkpos89;
} }
l77:; if (!yymatchChar(yy, '\n')) goto l75; goto l74; l90:; if (!yymatchChar(yy, '\n')) goto l88; goto l87;
l75:; yy->__pos= yypos74; yy->__thunkpos= yythunkpos74; if (!yy_eof(yy)) goto l73; l88:; yy->__pos= yypos87; yy->__thunkpos= yythunkpos87; if (!yy_eof(yy)) goto l86;
} }
l74:; l87:;
yyprintf((stderr, " ok %s @ %s\n", "eol", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "eol", yy->__buf+yy->__pos));
return 1; return 1;
l73:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l86:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "eol", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "eol", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_line(yycontext *yy) YY_RULE(int) yy_line(yycontext *yy)
{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos;
yyprintf((stderr, "%s\n", "line")); yyprintf((stderr, "%s\n", "line"));
{ int yypos79= yy->__pos, yythunkpos79= yy->__thunkpos; if (!yy__(yy)) goto l79; goto l80; { int yypos92= yy->__pos, yythunkpos92= yy->__thunkpos; if (!yy__(yy)) goto l92; goto l93;
l79:; yy->__pos= yypos79; yy->__thunkpos= yythunkpos79; l92:; yy->__pos= yypos92; yy->__thunkpos= yythunkpos92;
} }
l80:; l93:;
{ int yypos81= yy->__pos, yythunkpos81= yy->__thunkpos; if (!yy_command(yy)) goto l81; { int yypos94= yy->__pos, yythunkpos94= yy->__thunkpos; if (!yy_command(yy)) goto l94;
{ int yypos83= yy->__pos, yythunkpos83= yy->__thunkpos; if (!yy__(yy)) goto l83; goto l84; { int yypos96= yy->__pos, yythunkpos96= yy->__thunkpos; if (!yy__(yy)) goto l96; goto l97;
l83:; yy->__pos= yypos83; yy->__thunkpos= yythunkpos83; l96:; yy->__pos= yypos96; yy->__thunkpos= yythunkpos96;
} }
l84:; goto l82; l97:; goto l95;
l81:; yy->__pos= yypos81; yy->__thunkpos= yythunkpos81; l94:; yy->__pos= yypos94; yy->__thunkpos= yythunkpos94;
} }
l82:; l95:;
{ int yypos85= yy->__pos, yythunkpos85= yy->__thunkpos; if (!yy_comment(yy)) goto l85; goto l86; { int yypos98= yy->__pos, yythunkpos98= yy->__thunkpos; if (!yy_comment(yy)) goto l98; goto l99;
l85:; yy->__pos= yypos85; yy->__thunkpos= yythunkpos85; l98:; yy->__pos= yypos98; yy->__thunkpos= yythunkpos98;
} }
l86:; l99:;
yyprintf((stderr, " ok %s @ %s\n", "line", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "line", yy->__buf+yy->__pos));
return 1; return 1;
l78:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l91:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "line", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "line", yy->__buf+yy->__pos));
return 0; return 0;
} }
@ -1086,20 +1149,20 @@ YY_RULE(int) yy_sol(yycontext *yy)
yyprintf((stderr, "%s\n", "sol")); yyDo(yy, yy_1_sol, yy->__begin, yy->__end); yyprintf((stderr, "%s\n", "sol")); yyDo(yy, yy_1_sol, yy->__begin, yy->__end);
yyprintf((stderr, " ok %s @ %s\n", "sol", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "sol", yy->__buf+yy->__pos));
return 1; return 1;
l87:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; l100:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0;
yyprintf((stderr, " fail %s @ %s\n", "sol", yy->__buf+yy->__pos)); yyprintf((stderr, " fail %s @ %s\n", "sol", yy->__buf+yy->__pos));
return 0; return 0;
} }
YY_RULE(int) yy_file(yycontext *yy) YY_RULE(int) yy_file(yycontext *yy)
{ {
yyprintf((stderr, "%s\n", "file")); yyprintf((stderr, "%s\n", "file"));
l89:; l102:;
{ int yypos90= yy->__pos, yythunkpos90= yy->__thunkpos; if (!yy_sol(yy)) goto l90; { int yypos103= yy->__pos, yythunkpos103= yy->__thunkpos; if (!yy_sol(yy)) goto l103;
{ int yypos91= yy->__pos, yythunkpos91= yy->__thunkpos; if (!yy_line(yy)) goto l92; if (!yy_eol(yy)) goto l92; goto l91; { int yypos104= yy->__pos, yythunkpos104= yy->__thunkpos; if (!yy_line(yy)) goto l105; if (!yy_eol(yy)) goto l105; goto l104;
l92:; yy->__pos= yypos91; yy->__thunkpos= yythunkpos91; if (!yy_invalid_syntax(yy)) goto l90; l105:; yy->__pos= yypos104; yy->__thunkpos= yythunkpos104; if (!yy_invalid_syntax(yy)) goto l103;
} }
l91:; goto l89; l104:; goto l102;
l90:; yy->__pos= yypos90; yy->__thunkpos= yythunkpos90; l103:; yy->__pos= yypos103; yy->__thunkpos= yythunkpos103;
} }
yyprintf((stderr, " ok %s @ %s\n", "file", yy->__buf+yy->__pos)); yyprintf((stderr, " ok %s @ %s\n", "file", yy->__buf+yy->__pos));
return 1; return 1;
@ -1152,10 +1215,11 @@ YY_PARSE(yycontext *) YYRELEASE(yycontext *yyctx)
} }
#endif #endif
#line 139 "parse.peg" #line 150 "parse.peg"
void parseConfiguration(char const *file) { void parseConfiguration(char const *file)
{
FILE *in = fopen(file, "r"); FILE *in = fopen(file, "r");
if (!in) { if (!in) {
PARSE_ERROR; PARSE_ERROR;

View File

@ -24,6 +24,7 @@
char *tmpPort; \ char *tmpPort; \
int tmpPortNum, tmpProto; \ int tmpPortNum, tmpProto; \
int bindPortNum, bindProto, connectPortNum, connectProto; \ int bindPortNum, bindProto, connectPortNum, connectProto; \
int serverTimeout; \
char *bindAddress, *connectAddress; char *bindAddress, *connectAddress;
#define YY_INPUT(yyctx, buf, result, max_size) \ #define YY_INPUT(yyctx, buf, result, max_size) \
{ \ { \
@ -44,21 +45,26 @@
file = (sol (line eol | invalid-syntax))* file = (sol (line eol | invalid-syntax))*
line = -? (command -?)? comment? line = -? (command -?)? comment?
command = (server | rule | logfile | pidlogfile | logcommon) command = (server-rule | auth-rule | logfile | pidlogfile | logcommon)
comment = "#" (!eol .)* comment = "#" (!eol .)*
server = bind-address - bind-port - connect-address - connect-port { server-rule = bind-address - bind-port - connect-address - connect-port (-? "[" -? server-options -? "]")?
{
addServer(yy->bindAddress, yy->bindPortNum, yy->bindProto, addServer(yy->bindAddress, yy->bindPortNum, yy->bindProto,
yy->connectAddress, yy->connectPortNum, yy->connectProto); yy->connectAddress, yy->connectPortNum, yy->connectProto,
yy->serverTimeout > 0 ? yy->serverTimeout : RINETD_DEFAULT_UDP_TIMEOUT);
yy->bindAddress = yy->connectAddress = NULL; yy->bindAddress = yy->connectAddress = NULL;
yy->serverTimeout = 0;
} }
bind-address = < ipv4 > { yy->bindAddress = strdup(yytext); } bind-address = < ipv4 > { yy->bindAddress = strdup(yytext); }
connect-address = < ipv4 > { yy->connectAddress = strdup(yytext); } connect-address = < ipv4 > { yy->connectAddress = strdup(yytext); }
bind-port = full-port { yy->bindPortNum = yy->tmpPortNum; yy->bindProto = yy->tmpProto; } bind-port = full-port { yy->bindPortNum = yy->tmpPortNum; yy->bindProto = yy->tmpProto; }
connect-port = full-port { yy->connectPortNum = yy->tmpPortNum; yy->connectProto = yy->tmpProto; } connect-port = full-port { yy->connectPortNum = yy->tmpPortNum; yy->connectProto = yy->tmpProto; }
server-options = ("timeout" -? "=" -? < number >) { yy->serverTimeout = atoi(yytext); }
full-port = port proto { full-port = port proto
{
char const *proto = yy->tmpProto == protoTcp ? "tcp" : "udp"; char const *proto = yy->tmpProto == protoTcp ? "tcp" : "udp";
struct servent *service = getservbyname(yy->tmpPort, proto); struct servent *service = getservbyname(yy->tmpPort, proto);
yy->tmpPortNum = service ? ntohs(service->s_port) : atoi(yy->tmpPort); yy->tmpPortNum = service ? ntohs(service->s_port) : atoi(yy->tmpPort);
@ -73,7 +79,8 @@ proto = '/tcp' { yy->tmpProto = protoTcp; }
| '/udp' { yy->tmpProto = protoUdp; } | '/udp' { yy->tmpProto = protoUdp; }
| '' { yy->tmpProto = protoTcp; } | '' { yy->tmpProto = protoTcp; }
rule = auth-key - < pattern > { auth-rule = auth-key - < pattern >
{
allRules = (Rule *) allRules = (Rule *)
realloc(allRules, sizeof(Rule) * (allRulesCount + 1)); realloc(allRules, sizeof(Rule) * (allRulesCount + 1));
if (!allRules) { if (!allRules) {
@ -97,25 +104,29 @@ rule = auth-key - < pattern > {
auth-key = < ("allow" | "deny") > { yy->isAuthAllow = (yytext[0] == 'a'); } auth-key = < ("allow" | "deny") > { yy->isAuthAllow = (yytext[0] == 'a'); }
logfile = "logfile" - < filename > { logfile = "logfile" - < filename >
{
logFileName = strdup(yytext); logFileName = strdup(yytext);
if (!logFileName) { if (!logFileName) {
PARSE_ERROR; PARSE_ERROR;
} }
} }
pidlogfile = "pidlogfile" - < filename > { pidlogfile = "pidlogfile" - < filename >
{
pidLogFileName = strdup(yytext); pidLogFileName = strdup(yytext);
if (!pidLogFileName) { if (!pidLogFileName) {
PARSE_ERROR; PARSE_ERROR;
} }
} }
logcommon = "logcommon" { logcommon = "logcommon"
{
logFormatCommon = 1; logFormatCommon = 1;
} }
invalid_syntax = < (!eol .)+ > eol { invalid_syntax = < (!eol .)+ > eol
{
fprintf(stderr, "rinetd: invalid syntax at line %d: %s\n", fprintf(stderr, "rinetd: invalid syntax at line %d: %s\n",
yy->currentLine, yytext); yy->currentLine, yytext);
PARSE_ERROR; /* FIXME */ PARSE_ERROR; /* FIXME */
@ -138,7 +149,8 @@ eof = '\0'
%% %%
void parseConfiguration(char const *file) { void parseConfiguration(char const *file)
{
FILE *in = fopen(file, "r"); FILE *in = fopen(file, "r");
if (!in) { if (!in) {
PARSE_ERROR; PARSE_ERROR;

View File

@ -243,7 +243,8 @@ static void readConfiguration(char const *file) {
} }
void addServer(char *bindAddress, int bindPort, int bindProto, void addServer(char *bindAddress, int bindPort, int bindProto,
char *connectAddress, int connectPort, int connectProto) { char *connectAddress, int connectPort, int connectProto,
int serverTimeout) {
/* Turn all of this stuff into reasonable addresses */ /* Turn all of this stuff into reasonable addresses */
struct in_addr iaddr; struct in_addr iaddr;
if (getAddress(bindAddress, &iaddr) < 0) { if (getAddress(bindAddress, &iaddr) < 0) {
@ -320,6 +321,7 @@ void addServer(char *bindAddress, int bindPort, int bindProto,
} }
srv->toPort = connectPort; srv->toPort = connectPort;
srv->toProto = connectProto; srv->toProto = connectProto;
srv->serverTimeout = serverTimeout;
#ifndef _WIN32 #ifndef _WIN32
if (fd > maxfd) { if (fd > maxfd) {
maxfd = fd; maxfd = fd;
@ -416,6 +418,11 @@ static void selectPass(void)
# define FD_ISSET_EXT(fd, ar) FD_ISSET((fd) % FD_SETSIZE, &(ar)[(fd) / FD_SETSIZE]) # define FD_ISSET_EXT(fd, ar) FD_ISSET((fd) % FD_SETSIZE, &(ar)[(fd) / FD_SETSIZE])
#endif #endif
/* Timeout value -- infinite by default */
struct timeval timeout;
timeout.tv_sec = timeout.tv_usec = 0;
time_t now = time(NULL);
fd_set readfds[fdSetCount], writefds[fdSetCount]; fd_set readfds[fdSetCount], writefds[fdSetCount];
FD_ZERO_EXT(readfds); FD_ZERO_EXT(readfds);
FD_ZERO_EXT(writefds); FD_ZERO_EXT(writefds);
@ -444,6 +451,13 @@ static void selectPass(void)
/* Get more input if we have room for it */ /* Get more input if we have room for it */
if (cnx->remote.recvPos < RINETD_BUFFER_SIZE) { if (cnx->remote.recvPos < RINETD_BUFFER_SIZE) {
FD_SET_EXT(cnx->remote.fd, readfds); FD_SET_EXT(cnx->remote.fd, readfds);
/* For UDP connections, we need to handle timeouts */
if (cnx->remote.proto == protoUdp) {
long delay = (long)(cnx->remoteTimeout - now);
timeout.tv_sec = delay <= 1 ? 1
: (delay < timeout.tv_sec || timeout.tv_sec == 0) ? delay
: timeout.tv_sec;
}
} }
/* Send more output if we have any, or if were closing */ /* Send more output if we have any, or if were closing */
if (cnx->remote.sentPos < cnx->local.recvPos || cnx->coClosing) { if (cnx->remote.sentPos < cnx->local.recvPos || cnx->coClosing) {
@ -451,15 +465,21 @@ static void selectPass(void)
} }
} }
} }
select(maxfd + 1, readfds, writefds, 0, 0);
select(maxfd + 1, readfds, writefds, 0, timeout.tv_sec ? &timeout : NULL);
for (int i = 0; i < coTotal; ++i) { for (int i = 0; i < coTotal; ++i) {
ConnectionInfo *cnx = &coInfo[i]; ConnectionInfo *cnx = &coInfo[i];
if (cnx->remote.fd != INVALID_SOCKET) { if (cnx->remote.fd != INVALID_SOCKET) {
/* Do not read on remote UDP sockets, the server does it. */ /* Do not read on remote UDP sockets, the server does it,
if (cnx->remote.proto != protoUdp) { but handle timeouts instead. */
if (cnx->remote.proto == protoTcp) {
if (FD_ISSET_EXT(cnx->remote.fd, readfds)) { if (FD_ISSET_EXT(cnx->remote.fd, readfds)) {
handleRead(cnx, &cnx->remote, &cnx->local); handleRead(cnx, &cnx->remote, &cnx->local);
} }
} else {
if (now > cnx->remoteTimeout) {
handleClose(cnx, &cnx->remote, &cnx->local);
}
} }
} }
if (cnx->remote.fd != INVALID_SOCKET) { if (cnx->remote.fd != INVALID_SOCKET) {
@ -609,6 +629,7 @@ static void handleAccept(ServerInfo const *srv)
&& cnx->remoteAddress.sin_family == addr_in->sin_family && cnx->remoteAddress.sin_family == addr_in->sin_family
&& cnx->remoteAddress.sin_port == addr_in->sin_port && cnx->remoteAddress.sin_port == addr_in->sin_port
&& cnx->remoteAddress.sin_addr.s_addr == addr_in->sin_addr.s_addr) { && cnx->remoteAddress.sin_addr.s_addr == addr_in->sin_addr.s_addr) {
cnx->remoteTimeout = time(NULL) + srv->serverTimeout;
handleRead(cnx, &cnx->remote, &cnx->local); handleRead(cnx, &cnx->remote, &cnx->local);
return; return;
} }
@ -624,11 +645,15 @@ static void handleAccept(ServerInfo const *srv)
cnx->local.proto = srv->toProto; cnx->local.proto = srv->toProto;
cnx->local.recvPos = cnx->local.sentPos = 0; cnx->local.recvPos = cnx->local.sentPos = 0;
cnx->local.recvBytes = cnx->local.sentBytes = 0; cnx->local.recvBytes = cnx->local.sentBytes = 0;
cnx->remote.fd = nfd; cnx->remote.fd = nfd;
cnx->remote.proto = srv->fromProto; cnx->remote.proto = srv->fromProto;
cnx->remote.recvPos = cnx->remote.sentPos = 0; cnx->remote.recvPos = cnx->remote.sentPos = 0;
cnx->remote.recvBytes = cnx->remote.sentBytes = 0; cnx->remote.recvBytes = cnx->remote.sentBytes = 0;
cnx->remoteAddress = *(struct sockaddr_in *)&addr; cnx->remoteAddress = *(struct sockaddr_in *)&addr;
if (srv->fromProto == protoUdp)
cnx->remoteTimeout = time(NULL) + srv->serverTimeout;
cnx->coClosing = 0; cnx->coClosing = 0;
cnx->coLog = logUnknownError; cnx->coLog = logUnknownError;
cnx->server = srv; cnx->server = srv;

View File

@ -23,6 +23,7 @@
static int const RINETD_BUFFER_SIZE = 16384; static int const RINETD_BUFFER_SIZE = 16384;
static int const RINETD_LISTEN_BACKLOG = 128; static int const RINETD_LISTEN_BACKLOG = 128;
static int const RINETD_DEFAULT_UDP_TIMEOUT = 72;
#define RINETD_CONFIG_FILE "/etc/rinetd.conf" #define RINETD_CONFIG_FILE "/etc/rinetd.conf"
#define RINETD_PID_FILE "/var/run/rinetd.pid" #define RINETD_PID_FILE "/var/run/rinetd.pid"
@ -44,5 +45,6 @@ extern FILE *logFile;
/* Functions */ /* Functions */
void addServer(char *bindAddress, int bindPort, int bindProto, void addServer(char *bindAddress, int bindPort, int bindProto,
char *connectAddress, int connectPort, int connectProto); char *connectAddress, int connectPort, int connectProto,
int serverTimeout);

View File

@ -8,6 +8,8 @@
#pragma once #pragma once
#include <time.h>
enum ruleType { enum ruleType {
allowRule, allowRule,
denyRule, denyRule,
@ -40,6 +42,9 @@ struct _server_info {
/* Offset and count into list of allow and deny rules. Any rules /* Offset and count into list of allow and deny rules. Any rules
prior to globalAllowRules and globalDenyRules are global rules. */ prior to globalAllowRules and globalDenyRules are global rules. */
int rulesStart, rulesCount; int rulesStart, rulesCount;
/* Timeout for UDP traffic before we consider the connection
was dropped by the remote host. */
int serverTimeout;
}; };
typedef struct _socket Socket; typedef struct _socket Socket;
@ -59,6 +64,7 @@ struct _connection_info
{ {
Socket remote, local; Socket remote, local;
struct sockaddr_in remoteAddress; struct sockaddr_in remoteAddress;
time_t remoteTimeout;
int coClosing; int coClosing;
int coLog; int coLog;
ServerInfo const *server; // only useful for logEvent ServerInfo const *server; // only useful for logEvent