diff -Nur tcpproxy-1.1.orig/src/cfg_parser.c tcpproxy-1.1/src/cfg_parser.c --- tcpproxy-1.1.orig/src/cfg_parser.c 1970-01-01 01:00:00.000000000 +0100 +++ tcpproxy-1.1/src/cfg_parser.c 2014-02-24 04:05:11.087171984 +0100 @@ -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-2013 Christian Pointner + * + * 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 . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#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; +}