- --- /dev/null
- +++ b/src/cfg_parser.c
- @@ -0,0 +1,1374 @@
- +
- +#line 1 "cfg_parser.rl"
- +/*
- + * tcpproxy
- + *
- + * tcpproxy is a simple tcp connection proxy which combines the
- + * features of rinetd and 6tunnel. tcpproxy supports IPv4 and
- + * IPv6 and also supports connections from IPv6 to IPv4
- + * endpoints and vice versa.
- + *
- + *
- + * Copyright (C) 2010-2015 Christian Pointner <equinox@spreadspace.org>
- + *
- + * This file is part of tcpproxy.
- + *
- + * tcpproxy is free software: you can redistribute it and/or modify
- + * it under the terms of the GNU General Public License as published by
- + * the Free Software Foundation, either version 3 of the License, or
- + * any later version.
- + *
- + * tcpproxy is distributed in the hope that it will be useful,
- + * but WITHOUT ANY WARRANTY; without even the implied warranty of
- + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- + * GNU General Public License for more details.
- + *
- + * You should have received a copy of the GNU General Public License
- + * along with tcpproxy. If not, see <http://www.gnu.org/licenses/>.
- + */
- +
- +#include <stdlib.h>
- +#include <string.h>
- +#include <errno.h>
- +#include <sys/types.h>
- +#include <sys/stat.h>
- +#include <fcntl.h>
- +#include <unistd.h>
- +#include <sys/mman.h>
- +
- +#include "datatypes.h"
- +#include "log.h"
- +#include "options.h"
- +#include "tcp.h"
- +#include "listener.h"
- +
- +struct listener {
- + char* la_;
- + resolv_type_t lrt_;
- + char* lp_;
- + char* ra_;
- + resolv_type_t rrt_;
- + char* rp_;
- + char* sa_;
- +};
- +
- +static void init_listener_struct(struct listener* l)
- +{
- + if(!l) return;
- +
- + l->la_ = NULL;
- + l->lrt_ = ANY;
- + l->lp_ = NULL;
- + l->ra_ = NULL;
- + l->rrt_ = ANY;
- + l->rp_ = NULL;
- + l->sa_ = NULL;
- +}
- +
- +static void clear_listener_struct(struct listener* l)
- +{
- + if(!l) return;
- +
- + if(l->la_)
- + free(l->la_);
- + if(l->lp_)
- + free(l->lp_);
- + if(l->ra_)
- + free(l->ra_);
- + if(l->rp_)
- + free(l->rp_);
- + if(l->sa_)
- + free(l->sa_);
- +
- + init_listener_struct(l);
- +}
- +
- +static int owrt_string(char** dest, char* start, char* end)
- +{
- + if(!dest || start >= end)
- + return -1;
- +
- + if(*dest) free(*dest);
- + int n = end - start;
- + *dest = malloc(n+1);
- + if(!(*dest))
- + return -2;
- +
- + memcpy(*dest, start, n);
- + (*dest)[n] = 0;
- +
- + return 0;
- +}
- +
- +
- +#line 162 "cfg_parser.rl"
- +
- +
- +
- +int parse_listener(char* p, char* pe, listeners_t* listener)
- +{
- + int cs, ret = 0, cur_line = 1;
- +
- +
- +#line 114 "cfg_parser.c"
- +static const int cfg_parser_start = 67;
- +static const int cfg_parser_first_final = 67;
- +static const int cfg_parser_error = 0;
- +
- +static const int cfg_parser_en_main = 67;
- +
- +
- +#line 170 "cfg_parser.rl"
- +
- +#line 124 "cfg_parser.c"
- + {
- + cs = cfg_parser_start;
- + }
- +
- +#line 171 "cfg_parser.rl"
- +
- + char* cpy_start = NULL;
- + struct listener lst;
- + init_listener_struct(&lst);
- +
- + char* eof = pe;
- +
- +#line 137 "cfg_parser.c"
- + {
- + if ( p == pe )
- + goto _test_eof;
- + goto _resume;
- +
- +_again:
- + switch ( cs ) {
- + case 67: goto st67;
- + case 0: goto st0;
- + case 1: goto st1;
- + case 2: goto st2;
- + case 3: goto st3;
- + case 4: goto st4;
- + case 5: goto st5;
- + case 6: goto st6;
- + case 7: goto st7;
- + case 8: goto st8;
- + case 9: goto st9;
- + case 10: goto st10;
- + case 11: goto st11;
- + case 12: goto st12;
- + case 13: goto st13;
- + case 14: goto st14;
- + case 15: goto st15;
- + case 16: goto st16;
- + case 17: goto st17;
- + case 18: goto st18;
- + case 19: goto st19;
- + case 20: goto st20;
- + case 21: goto st21;
- + case 22: goto st22;
- + case 23: goto st23;
- + case 24: goto st24;
- + case 25: goto st25;
- + case 26: goto st26;
- + case 27: goto st27;
- + case 28: goto st28;
- + case 29: goto st29;
- + case 30: goto st30;
- + case 31: goto st31;
- + case 32: goto st32;
- + case 33: goto st33;
- + case 34: goto st34;
- + case 35: goto st35;
- + case 36: goto st36;
- + case 37: goto st37;
- + case 38: goto st38;
- + case 39: goto st39;
- + case 40: goto st40;
- + case 41: goto st41;
- + case 42: goto st42;
- + case 43: goto st43;
- + case 44: goto st44;
- + case 45: goto st45;
- + case 46: goto st46;
- + case 47: goto st47;
- + case 48: goto st48;
- + case 49: goto st49;
- + case 50: goto st50;
- + case 51: goto st51;
- + case 52: goto st52;
- + case 53: goto st53;
- + case 54: goto st54;
- + case 55: goto st55;
- + case 56: goto st56;
- + case 57: goto st57;
- + case 58: goto st58;
- + case 59: goto st59;
- + case 60: goto st60;
- + case 61: goto st61;
- + case 62: goto st62;
- + case 63: goto st63;
- + case 64: goto st64;
- + case 65: goto st65;
- + case 66: goto st66;
- + default: break;
- + }
- +
- + if ( ++p == pe )
- + goto _test_eof;
- +_resume:
- + switch ( cs )
- + {
- +tr1:
- +#line 127 "cfg_parser.rl"
- + {cur_line++;}
- + goto st67;
- +tr90:
- +#line 114 "cfg_parser.rl"
- + {
- + ret = listeners_add(listener, lst.la_, lst.lrt_, lst.lp_, lst.ra_, lst.rrt_, lst.rp_, lst.sa_);
- + clear_listener_struct(&lst);
- + }
- + goto st67;
- +st67:
- + if ( ++p == pe )
- + goto _test_eof67;
- +case 67:
- +#line 236 "cfg_parser.c"
- + switch( (*p) ) {
- + case 10: goto tr1;
- + case 32: goto st67;
- + case 35: goto st1;
- + case 108: goto st2;
- + }
- + if ( 9 <= (*p) && (*p) <= 13 )
- + goto st67;
- + goto tr2;
- +tr2:
- +#line 118 "cfg_parser.rl"
- + {
- + if(p == eof)
- + log_printf(ERROR, "config file syntax error: unexpected end of file");
- + else
- + log_printf(ERROR, "config file syntax error at line %d", cur_line);
- +
- + {cs = (cfg_parser_error); goto _again;}
- + }
- + goto st0;
- +#line 257 "cfg_parser.c"
- +st0:
- +cs = 0;
- + goto _out;
- +st1:
- + if ( ++p == pe )
- + goto _test_eof1;
- +case 1:
- + if ( (*p) == 10 )
- + goto tr1;
- + goto st1;
- +st2:
- + if ( ++p == pe )
- + goto _test_eof2;
- +case 2:
- + if ( (*p) == 105 )
- + goto st3;
- + goto tr2;
- +st3:
- + if ( ++p == pe )
- + goto _test_eof3;
- +case 3:
- + if ( (*p) == 115 )
- + goto st4;
- + goto tr2;
- +st4:
- + if ( ++p == pe )
- + goto _test_eof4;
- +case 4:
- + if ( (*p) == 116 )
- + goto st5;
- + goto tr2;
- +st5:
- + if ( ++p == pe )
- + goto _test_eof5;
- +case 5:
- + if ( (*p) == 101 )
- + goto st6;
- + goto tr2;
- +st6:
- + if ( ++p == pe )
- + goto _test_eof6;
- +case 6:
- + if ( (*p) == 110 )
- + goto st7;
- + goto tr2;
- +st7:
- + if ( ++p == pe )
- + goto _test_eof7;
- +case 7:
- + switch( (*p) ) {
- + case 9: goto st8;
- + case 32: goto st8;
- + }
- + goto tr2;
- +st8:
- + if ( ++p == pe )
- + goto _test_eof8;
- +case 8:
- + switch( (*p) ) {
- + case 9: goto st8;
- + case 32: goto st8;
- + case 42: goto st9;
- + case 58: goto tr12;
- + }
- + if ( (*p) < 65 ) {
- + if ( (*p) > 46 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto tr11;
- + } else if ( (*p) >= 45 )
- + goto tr10;
- + } else if ( (*p) > 70 ) {
- + if ( (*p) < 97 ) {
- + if ( 71 <= (*p) && (*p) <= 90 )
- + goto tr10;
- + } else if ( (*p) > 102 ) {
- + if ( 103 <= (*p) && (*p) <= 122 )
- + goto tr10;
- + } else
- + goto tr11;
- + } else
- + goto tr11;
- + goto tr2;
- +st9:
- + if ( ++p == pe )
- + goto _test_eof9;
- +case 9:
- + switch( (*p) ) {
- + case 9: goto st10;
- + case 32: goto st10;
- + }
- + goto tr2;
- +tr91:
- +#line 105 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.la_), cpy_start, p); cpy_start = NULL; }
- + goto st10;
- +st10:
- + if ( ++p == pe )
- + goto _test_eof10;
- +case 10:
- +#line 357 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto st10;
- + case 32: goto st10;
- + case 45: goto tr14;
- + }
- + if ( (*p) < 65 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto tr14;
- + } else if ( (*p) > 90 ) {
- + if ( 97 <= (*p) && (*p) <= 122 )
- + goto tr14;
- + } else
- + goto tr14;
- + goto tr2;
- +tr14:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st11;
- +st11:
- + if ( ++p == pe )
- + goto _test_eof11;
- +case 11:
- +#line 380 "cfg_parser.c"
- + switch( (*p) ) {
- + case 10: goto tr16;
- + case 32: goto tr15;
- + case 35: goto tr17;
- + case 45: goto st11;
- + case 123: goto tr19;
- + }
- + if ( (*p) < 48 ) {
- + if ( 9 <= (*p) && (*p) <= 13 )
- + goto tr15;
- + } else if ( (*p) > 57 ) {
- + if ( (*p) > 90 ) {
- + if ( 97 <= (*p) && (*p) <= 122 )
- + goto st11;
- + } else if ( (*p) >= 65 )
- + goto st11;
- + } else
- + goto st11;
- + goto tr2;
- +tr21:
- +#line 127 "cfg_parser.rl"
- + {cur_line++;}
- + goto st12;
- +tr15:
- +#line 106 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.lp_), cpy_start, p); cpy_start = NULL; }
- + goto st12;
- +tr16:
- +#line 106 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.lp_), cpy_start, p); cpy_start = NULL; }
- +#line 127 "cfg_parser.rl"
- + {cur_line++;}
- + goto st12;
- +st12:
- + if ( ++p == pe )
- + goto _test_eof12;
- +case 12:
- +#line 418 "cfg_parser.c"
- + switch( (*p) ) {
- + case 10: goto tr21;
- + case 32: goto st12;
- + case 35: goto st13;
- + case 123: goto st14;
- + }
- + if ( 9 <= (*p) && (*p) <= 13 )
- + goto st12;
- + goto tr2;
- +tr17:
- +#line 106 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.lp_), cpy_start, p); cpy_start = NULL; }
- + goto st13;
- +st13:
- + if ( ++p == pe )
- + goto _test_eof13;
- +case 13:
- +#line 436 "cfg_parser.c"
- + if ( (*p) == 10 )
- + goto tr21;
- + goto st13;
- +tr24:
- +#line 127 "cfg_parser.rl"
- + {cur_line++;}
- + goto st14;
- +tr19:
- +#line 106 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.lp_), cpy_start, p); cpy_start = NULL; }
- + goto st14;
- +tr48:
- +#line 110 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.rp_), cpy_start, p); cpy_start = NULL; }
- + goto st14;
- +tr87:
- +#line 113 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.sa_), cpy_start, p); cpy_start = NULL; }
- + goto st14;
- +st14:
- + if ( ++p == pe )
- + goto _test_eof14;
- +case 14:
- +#line 460 "cfg_parser.c"
- + switch( (*p) ) {
- + case 10: goto tr24;
- + case 32: goto st14;
- + case 35: goto st15;
- + case 114: goto st16;
- + case 115: goto st52;
- + case 125: goto st63;
- + }
- + if ( 9 <= (*p) && (*p) <= 13 )
- + goto st14;
- + goto tr2;
- +st15:
- + if ( ++p == pe )
- + goto _test_eof15;
- +case 15:
- + if ( (*p) == 10 )
- + goto tr24;
- + goto st15;
- +st16:
- + if ( ++p == pe )
- + goto _test_eof16;
- +case 16:
- + if ( (*p) == 101 )
- + goto st17;
- + goto tr2;
- +st17:
- + if ( ++p == pe )
- + goto _test_eof17;
- +case 17:
- + switch( (*p) ) {
- + case 109: goto st18;
- + case 115: goto st43;
- + }
- + goto tr2;
- +st18:
- + if ( ++p == pe )
- + goto _test_eof18;
- +case 18:
- + if ( (*p) == 111 )
- + goto st19;
- + goto tr2;
- +st19:
- + if ( ++p == pe )
- + goto _test_eof19;
- +case 19:
- + if ( (*p) == 116 )
- + goto st20;
- + goto tr2;
- +st20:
- + if ( ++p == pe )
- + goto _test_eof20;
- +case 20:
- + if ( (*p) == 101 )
- + goto st21;
- + goto tr2;
- +st21:
- + if ( ++p == pe )
- + goto _test_eof21;
- +case 21:
- + switch( (*p) ) {
- + case 9: goto st22;
- + case 32: goto st22;
- + case 45: goto st31;
- + case 58: goto st23;
- + }
- + goto tr2;
- +st22:
- + if ( ++p == pe )
- + goto _test_eof22;
- +case 22:
- + switch( (*p) ) {
- + case 9: goto st22;
- + case 32: goto st22;
- + case 58: goto st23;
- + }
- + goto tr2;
- +st23:
- + if ( ++p == pe )
- + goto _test_eof23;
- +case 23:
- + switch( (*p) ) {
- + case 9: goto st24;
- + case 32: goto st24;
- + }
- + goto tr2;
- +st24:
- + if ( ++p == pe )
- + goto _test_eof24;
- +case 24:
- + switch( (*p) ) {
- + case 9: goto st24;
- + case 32: goto st24;
- + case 58: goto tr41;
- + }
- + if ( (*p) < 65 ) {
- + if ( (*p) > 46 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto tr40;
- + } else if ( (*p) >= 45 )
- + goto tr39;
- + } else if ( (*p) > 70 ) {
- + if ( (*p) < 97 ) {
- + if ( 71 <= (*p) && (*p) <= 90 )
- + goto tr39;
- + } else if ( (*p) > 102 ) {
- + if ( 103 <= (*p) && (*p) <= 122 )
- + goto tr39;
- + } else
- + goto tr40;
- + } else
- + goto tr40;
- + goto tr2;
- +tr39:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st25;
- +st25:
- + if ( ++p == pe )
- + goto _test_eof25;
- +case 25:
- +#line 581 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr42;
- + case 32: goto tr42;
- + }
- + if ( (*p) < 48 ) {
- + if ( 45 <= (*p) && (*p) <= 46 )
- + goto st25;
- + } else if ( (*p) > 57 ) {
- + if ( (*p) > 90 ) {
- + if ( 97 <= (*p) && (*p) <= 122 )
- + goto st25;
- + } else if ( (*p) >= 65 )
- + goto st25;
- + } else
- + goto st25;
- + goto tr2;
- +tr42:
- +#line 109 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.ra_), cpy_start, p); cpy_start = NULL; }
- + goto st26;
- +st26:
- + if ( ++p == pe )
- + goto _test_eof26;
- +case 26:
- +#line 606 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto st26;
- + case 32: goto st26;
- + case 45: goto tr45;
- + }
- + if ( (*p) < 65 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto tr45;
- + } else if ( (*p) > 90 ) {
- + if ( 97 <= (*p) && (*p) <= 122 )
- + goto tr45;
- + } else
- + goto tr45;
- + goto tr2;
- +tr45:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st27;
- +st27:
- + if ( ++p == pe )
- + goto _test_eof27;
- +case 27:
- +#line 629 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr46;
- + case 32: goto tr46;
- + case 45: goto st27;
- + case 59: goto tr48;
- + }
- + if ( (*p) < 65 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto st27;
- + } else if ( (*p) > 90 ) {
- + if ( 97 <= (*p) && (*p) <= 122 )
- + goto st27;
- + } else
- + goto st27;
- + goto tr2;
- +tr46:
- +#line 110 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.rp_), cpy_start, p); cpy_start = NULL; }
- + goto st28;
- +tr63:
- +#line 111 "cfg_parser.rl"
- + { lst.rrt_ = IPV4_ONLY; }
- + goto st28;
- +tr64:
- +#line 112 "cfg_parser.rl"
- + { lst.rrt_ = IPV6_ONLY; }
- + goto st28;
- +tr73:
- +#line 107 "cfg_parser.rl"
- + { lst.lrt_ = IPV4_ONLY; }
- + goto st28;
- +tr74:
- +#line 108 "cfg_parser.rl"
- + { lst.lrt_ = IPV6_ONLY; }
- + goto st28;
- +tr85:
- +#line 113 "cfg_parser.rl"
- + { ret = owrt_string(&(lst.sa_), cpy_start, p); cpy_start = NULL; }
- + goto st28;
- +st28:
- + if ( ++p == pe )
- + goto _test_eof28;
- +case 28:
- +#line 673 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto st28;
- + case 32: goto st28;
- + case 59: goto st14;
- + }
- + goto tr2;
- +tr40:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st29;
- +st29:
- + if ( ++p == pe )
- + goto _test_eof29;
- +case 29:
- +#line 688 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr42;
- + case 32: goto tr42;
- + case 58: goto st30;
- + }
- + if ( (*p) < 65 ) {
- + if ( (*p) > 46 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto st29;
- + } else if ( (*p) >= 45 )
- + goto st25;
- + } else if ( (*p) > 70 ) {
- + if ( (*p) < 97 ) {
- + if ( 71 <= (*p) && (*p) <= 90 )
- + goto st25;
- + } else if ( (*p) > 102 ) {
- + if ( 103 <= (*p) && (*p) <= 122 )
- + goto st25;
- + } else
- + goto st29;
- + } else
- + goto st29;
- + goto tr2;
- +tr41:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st30;
- +st30:
- + if ( ++p == pe )
- + goto _test_eof30;
- +case 30:
- +#line 720 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr42;
- + case 32: goto tr42;
- + }
- + if ( (*p) < 65 ) {
- + if ( 48 <= (*p) && (*p) <= 58 )
- + goto st30;
- + } else if ( (*p) > 70 ) {
- + if ( 97 <= (*p) && (*p) <= 102 )
- + goto st30;
- + } else
- + goto st30;
- + goto tr2;
- +st31:
- + if ( ++p == pe )
- + goto _test_eof31;
- +case 31:
- + if ( (*p) == 114 )
- + goto st32;
- + goto tr2;
- +st32:
- + if ( ++p == pe )
- + goto _test_eof32;
- +case 32:
- + if ( (*p) == 101 )
- + goto st33;
- + goto tr2;
- +st33:
- + if ( ++p == pe )
- + goto _test_eof33;
- +case 33:
- + if ( (*p) == 115 )
- + goto st34;
- + goto tr2;
- +st34:
- + if ( ++p == pe )
- + goto _test_eof34;
- +case 34:
- + if ( (*p) == 111 )
- + goto st35;
- + goto tr2;
- +st35:
- + if ( ++p == pe )
- + goto _test_eof35;
- +case 35:
- + if ( (*p) == 108 )
- + goto st36;
- + goto tr2;
- +st36:
- + if ( ++p == pe )
- + goto _test_eof36;
- +case 36:
- + if ( (*p) == 118 )
- + goto st37;
- + goto tr2;
- +st37:
- + if ( ++p == pe )
- + goto _test_eof37;
- +case 37:
- + switch( (*p) ) {
- + case 9: goto st37;
- + case 32: goto st37;
- + case 58: goto st38;
- + }
- + goto tr2;
- +st38:
- + if ( ++p == pe )
- + goto _test_eof38;
- +case 38:
- + switch( (*p) ) {
- + case 9: goto st39;
- + case 32: goto st39;
- + }
- + goto tr2;
- +st39:
- + if ( ++p == pe )
- + goto _test_eof39;
- +case 39:
- + switch( (*p) ) {
- + case 9: goto st39;
- + case 32: goto st39;
- + case 73: goto st40;
- + case 105: goto st40;
- + }
- + goto tr2;
- +st40:
- + if ( ++p == pe )
- + goto _test_eof40;
- +case 40:
- + switch( (*p) ) {
- + case 80: goto st41;
- + case 112: goto st41;
- + }
- + goto tr2;
- +st41:
- + if ( ++p == pe )
- + goto _test_eof41;
- +case 41:
- + switch( (*p) ) {
- + case 86: goto st42;
- + case 118: goto st42;
- + }
- + goto tr2;
- +st42:
- + if ( ++p == pe )
- + goto _test_eof42;
- +case 42:
- + switch( (*p) ) {
- + case 52: goto tr63;
- + case 54: goto tr64;
- + }
- + goto tr2;
- +st43:
- + if ( ++p == pe )
- + goto _test_eof43;
- +case 43:
- + if ( (*p) == 111 )
- + goto st44;
- + goto tr2;
- +st44:
- + if ( ++p == pe )
- + goto _test_eof44;
- +case 44:
- + if ( (*p) == 108 )
- + goto st45;
- + goto tr2;
- +st45:
- + if ( ++p == pe )
- + goto _test_eof45;
- +case 45:
- + if ( (*p) == 118 )
- + goto st46;
- + goto tr2;
- +st46:
- + if ( ++p == pe )
- + goto _test_eof46;
- +case 46:
- + switch( (*p) ) {
- + case 9: goto st46;
- + case 32: goto st46;
- + case 58: goto st47;
- + }
- + goto tr2;
- +st47:
- + if ( ++p == pe )
- + goto _test_eof47;
- +case 47:
- + switch( (*p) ) {
- + case 9: goto st48;
- + case 32: goto st48;
- + }
- + goto tr2;
- +st48:
- + if ( ++p == pe )
- + goto _test_eof48;
- +case 48:
- + switch( (*p) ) {
- + case 9: goto st48;
- + case 32: goto st48;
- + case 73: goto st49;
- + case 105: goto st49;
- + }
- + goto tr2;
- +st49:
- + if ( ++p == pe )
- + goto _test_eof49;
- +case 49:
- + switch( (*p) ) {
- + case 80: goto st50;
- + case 112: goto st50;
- + }
- + goto tr2;
- +st50:
- + if ( ++p == pe )
- + goto _test_eof50;
- +case 50:
- + switch( (*p) ) {
- + case 86: goto st51;
- + case 118: goto st51;
- + }
- + goto tr2;
- +st51:
- + if ( ++p == pe )
- + goto _test_eof51;
- +case 51:
- + switch( (*p) ) {
- + case 52: goto tr73;
- + case 54: goto tr74;
- + }
- + goto tr2;
- +st52:
- + if ( ++p == pe )
- + goto _test_eof52;
- +case 52:
- + if ( (*p) == 111 )
- + goto st53;
- + goto tr2;
- +st53:
- + if ( ++p == pe )
- + goto _test_eof53;
- +case 53:
- + if ( (*p) == 117 )
- + goto st54;
- + goto tr2;
- +st54:
- + if ( ++p == pe )
- + goto _test_eof54;
- +case 54:
- + if ( (*p) == 114 )
- + goto st55;
- + goto tr2;
- +st55:
- + if ( ++p == pe )
- + goto _test_eof55;
- +case 55:
- + if ( (*p) == 99 )
- + goto st56;
- + goto tr2;
- +st56:
- + if ( ++p == pe )
- + goto _test_eof56;
- +case 56:
- + if ( (*p) == 101 )
- + goto st57;
- + goto tr2;
- +st57:
- + if ( ++p == pe )
- + goto _test_eof57;
- +case 57:
- + switch( (*p) ) {
- + case 9: goto st57;
- + case 32: goto st57;
- + case 58: goto st58;
- + }
- + goto tr2;
- +st58:
- + if ( ++p == pe )
- + goto _test_eof58;
- +case 58:
- + switch( (*p) ) {
- + case 9: goto st59;
- + case 32: goto st59;
- + }
- + goto tr2;
- +st59:
- + if ( ++p == pe )
- + goto _test_eof59;
- +case 59:
- + switch( (*p) ) {
- + case 9: goto st59;
- + case 32: goto st59;
- + case 58: goto tr84;
- + }
- + if ( (*p) < 65 ) {
- + if ( (*p) > 46 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto tr83;
- + } else if ( (*p) >= 45 )
- + goto tr82;
- + } else if ( (*p) > 70 ) {
- + if ( (*p) < 97 ) {
- + if ( 71 <= (*p) && (*p) <= 90 )
- + goto tr82;
- + } else if ( (*p) > 102 ) {
- + if ( 103 <= (*p) && (*p) <= 122 )
- + goto tr82;
- + } else
- + goto tr83;
- + } else
- + goto tr83;
- + goto tr2;
- +tr82:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st60;
- +st60:
- + if ( ++p == pe )
- + goto _test_eof60;
- +case 60:
- +#line 1000 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr85;
- + case 32: goto tr85;
- + case 59: goto tr87;
- + }
- + if ( (*p) < 48 ) {
- + if ( 45 <= (*p) && (*p) <= 46 )
- + goto st60;
- + } else if ( (*p) > 57 ) {
- + if ( (*p) > 90 ) {
- + if ( 97 <= (*p) && (*p) <= 122 )
- + goto st60;
- + } else if ( (*p) >= 65 )
- + goto st60;
- + } else
- + goto st60;
- + goto tr2;
- +tr83:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st61;
- +st61:
- + if ( ++p == pe )
- + goto _test_eof61;
- +case 61:
- +#line 1026 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr85;
- + case 32: goto tr85;
- + case 58: goto st62;
- + case 59: goto tr87;
- + }
- + if ( (*p) < 65 ) {
- + if ( (*p) > 46 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto st61;
- + } else if ( (*p) >= 45 )
- + goto st60;
- + } else if ( (*p) > 70 ) {
- + if ( (*p) < 97 ) {
- + if ( 71 <= (*p) && (*p) <= 90 )
- + goto st60;
- + } else if ( (*p) > 102 ) {
- + if ( 103 <= (*p) && (*p) <= 122 )
- + goto st60;
- + } else
- + goto st61;
- + } else
- + goto st61;
- + goto tr2;
- +tr84:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st62;
- +st62:
- + if ( ++p == pe )
- + goto _test_eof62;
- +case 62:
- +#line 1059 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr85;
- + case 32: goto tr85;
- + case 59: goto tr87;
- + }
- + if ( (*p) < 65 ) {
- + if ( 48 <= (*p) && (*p) <= 58 )
- + goto st62;
- + } else if ( (*p) > 70 ) {
- + if ( 97 <= (*p) && (*p) <= 102 )
- + goto st62;
- + } else
- + goto st62;
- + goto tr2;
- +st63:
- + if ( ++p == pe )
- + goto _test_eof63;
- +case 63:
- + if ( (*p) == 59 )
- + goto tr90;
- + goto tr2;
- +tr10:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st64;
- +st64:
- + if ( ++p == pe )
- + goto _test_eof64;
- +case 64:
- +#line 1089 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr91;
- + case 32: goto tr91;
- + }
- + if ( (*p) < 48 ) {
- + if ( 45 <= (*p) && (*p) <= 46 )
- + goto st64;
- + } else if ( (*p) > 57 ) {
- + if ( (*p) > 90 ) {
- + if ( 97 <= (*p) && (*p) <= 122 )
- + goto st64;
- + } else if ( (*p) >= 65 )
- + goto st64;
- + } else
- + goto st64;
- + goto tr2;
- +tr11:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st65;
- +st65:
- + if ( ++p == pe )
- + goto _test_eof65;
- +case 65:
- +#line 1114 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr91;
- + case 32: goto tr91;
- + case 58: goto st66;
- + }
- + if ( (*p) < 65 ) {
- + if ( (*p) > 46 ) {
- + if ( 48 <= (*p) && (*p) <= 57 )
- + goto st65;
- + } else if ( (*p) >= 45 )
- + goto st64;
- + } else if ( (*p) > 70 ) {
- + if ( (*p) < 97 ) {
- + if ( 71 <= (*p) && (*p) <= 90 )
- + goto st64;
- + } else if ( (*p) > 102 ) {
- + if ( 103 <= (*p) && (*p) <= 122 )
- + goto st64;
- + } else
- + goto st65;
- + } else
- + goto st65;
- + goto tr2;
- +tr12:
- +#line 104 "cfg_parser.rl"
- + { cpy_start = p; }
- + goto st66;
- +st66:
- + if ( ++p == pe )
- + goto _test_eof66;
- +case 66:
- +#line 1146 "cfg_parser.c"
- + switch( (*p) ) {
- + case 9: goto tr91;
- + case 32: goto tr91;
- + }
- + if ( (*p) < 65 ) {
- + if ( 48 <= (*p) && (*p) <= 58 )
- + goto st66;
- + } else if ( (*p) > 70 ) {
- + if ( 97 <= (*p) && (*p) <= 102 )
- + goto st66;
- + } else
- + goto st66;
- + goto tr2;
- + }
- + _test_eof67: cs = 67; goto _test_eof;
- + _test_eof1: cs = 1; goto _test_eof;
- + _test_eof2: cs = 2; goto _test_eof;
- + _test_eof3: cs = 3; goto _test_eof;
- + _test_eof4: cs = 4; goto _test_eof;
- + _test_eof5: cs = 5; goto _test_eof;
- + _test_eof6: cs = 6; goto _test_eof;
- + _test_eof7: cs = 7; goto _test_eof;
- + _test_eof8: cs = 8; goto _test_eof;
- + _test_eof9: cs = 9; goto _test_eof;
- + _test_eof10: cs = 10; goto _test_eof;
- + _test_eof11: cs = 11; goto _test_eof;
- + _test_eof12: cs = 12; goto _test_eof;
- + _test_eof13: cs = 13; goto _test_eof;
- + _test_eof14: cs = 14; goto _test_eof;
- + _test_eof15: cs = 15; goto _test_eof;
- + _test_eof16: cs = 16; goto _test_eof;
- + _test_eof17: cs = 17; goto _test_eof;
- + _test_eof18: cs = 18; goto _test_eof;
- + _test_eof19: cs = 19; goto _test_eof;
- + _test_eof20: cs = 20; goto _test_eof;
- + _test_eof21: cs = 21; goto _test_eof;
- + _test_eof22: cs = 22; goto _test_eof;
- + _test_eof23: cs = 23; goto _test_eof;
- + _test_eof24: cs = 24; goto _test_eof;
- + _test_eof25: cs = 25; goto _test_eof;
- + _test_eof26: cs = 26; goto _test_eof;
- + _test_eof27: cs = 27; goto _test_eof;
- + _test_eof28: cs = 28; goto _test_eof;
- + _test_eof29: cs = 29; goto _test_eof;
- + _test_eof30: cs = 30; goto _test_eof;
- + _test_eof31: cs = 31; goto _test_eof;
- + _test_eof32: cs = 32; goto _test_eof;
- + _test_eof33: cs = 33; goto _test_eof;
- + _test_eof34: cs = 34; goto _test_eof;
- + _test_eof35: cs = 35; goto _test_eof;
- + _test_eof36: cs = 36; goto _test_eof;
- + _test_eof37: cs = 37; goto _test_eof;
- + _test_eof38: cs = 38; goto _test_eof;
- + _test_eof39: cs = 39; goto _test_eof;
- + _test_eof40: cs = 40; goto _test_eof;
- + _test_eof41: cs = 41; goto _test_eof;
- + _test_eof42: cs = 42; goto _test_eof;
- + _test_eof43: cs = 43; goto _test_eof;
- + _test_eof44: cs = 44; goto _test_eof;
- + _test_eof45: cs = 45; goto _test_eof;
- + _test_eof46: cs = 46; goto _test_eof;
- + _test_eof47: cs = 47; goto _test_eof;
- + _test_eof48: cs = 48; goto _test_eof;
- + _test_eof49: cs = 49; goto _test_eof;
- + _test_eof50: cs = 50; goto _test_eof;
- + _test_eof51: cs = 51; goto _test_eof;
- + _test_eof52: cs = 52; goto _test_eof;
- + _test_eof53: cs = 53; goto _test_eof;
- + _test_eof54: cs = 54; goto _test_eof;
- + _test_eof55: cs = 55; goto _test_eof;
- + _test_eof56: cs = 56; goto _test_eof;
- + _test_eof57: cs = 57; goto _test_eof;
- + _test_eof58: cs = 58; goto _test_eof;
- + _test_eof59: cs = 59; goto _test_eof;
- + _test_eof60: cs = 60; goto _test_eof;
- + _test_eof61: cs = 61; goto _test_eof;
- + _test_eof62: cs = 62; goto _test_eof;
- + _test_eof63: cs = 63; goto _test_eof;
- + _test_eof64: cs = 64; goto _test_eof;
- + _test_eof65: cs = 65; goto _test_eof;
- + _test_eof66: cs = 66; goto _test_eof;
- +
- + _test_eof: {}
- + if ( p == eof )
- + {
- + switch ( cs ) {
- + case 1:
- + case 2:
- + case 3:
- + case 4:
- + case 5:
- + case 6:
- + case 7:
- + case 8:
- + case 9:
- + case 10:
- + case 11:
- + case 12:
- + case 13:
- + case 14:
- + case 15:
- + case 16:
- + case 17:
- + case 18:
- + case 19:
- + case 20:
- + case 21:
- + case 22:
- + case 23:
- + case 24:
- + case 25:
- + case 26:
- + case 27:
- + case 28:
- + case 29:
- + case 30:
- + case 31:
- + case 32:
- + case 33:
- + case 34:
- + case 35:
- + case 36:
- + case 37:
- + case 38:
- + case 39:
- + case 40:
- + case 41:
- + case 42:
- + case 43:
- + case 44:
- + case 45:
- + case 46:
- + case 47:
- + case 48:
- + case 49:
- + case 50:
- + case 51:
- + case 52:
- + case 53:
- + case 54:
- + case 55:
- + case 56:
- + case 57:
- + case 58:
- + case 59:
- + case 60:
- + case 61:
- + case 62:
- + case 63:
- + case 64:
- + case 65:
- + case 66:
- +#line 118 "cfg_parser.rl"
- + {
- + if(p == eof)
- + log_printf(ERROR, "config file syntax error: unexpected end of file");
- + else
- + log_printf(ERROR, "config file syntax error at line %d", cur_line);
- +
- + {cs = (cfg_parser_error); goto _again;}
- + }
- + break;
- +#line 1309 "cfg_parser.c"
- + }
- + }
- +
- + _out: {}
- + }
- +
- +#line 178 "cfg_parser.rl"
- +
- + if(cs == cfg_parser_error) {
- + listeners_revert(listener);
- + ret = 1;
- + }
- + else
- + ret = listeners_update(listener);
- +
- + clear_listener_struct(&lst);
- +
- + return ret;
- +}
- +
- +int read_configfile(const char* filename, listeners_t* listener)
- +{
- + int fd = open(filename, 0);
- + if(fd < 0) {
- + log_printf(ERROR, "open('%s') failed: %s", filename, strerror(errno));
- + return -1;
- + }
- +
- + struct stat sb;
- + if(fstat(fd, &sb) == -1) {
- + log_printf(ERROR, "fstat() error: %s", strerror(errno));
- + close(fd);
- + return -1;
- + }
- +
- + if(!sb.st_size) {
- + log_printf(ERROR, "config file %s is empty", filename);
- + close(fd);
- + return -1;
- + }
- +
- + if(!S_ISREG(sb.st_mode)) {
- + log_printf(ERROR, "config file %s is not a regular file", filename);
- + close(fd);
- + return -1;
- + }
- +
- + char* p = (char*)mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
- + if(p == MAP_FAILED) {
- + log_printf(ERROR, "mmap() error: %s", strerror(errno));
- + close(fd);
- + return -1;
- + }
- + close(fd);
- +
- + log_printf(DEBUG, "mapped %ld bytes from file %s at address 0x%08lX", sb.st_size, filename, p);
- + int ret = parse_listener(p, p + sb.st_size, listener);
- +
- + if(munmap(p, sb.st_size) == -1) {
- + log_printf(ERROR, "munmap() error: %s", strerror(errno));
- + return -1;
- + }
- + log_printf(DEBUG, "unmapped file %s", filename);
- +
- + return ret;
- +}
|