| --- /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; |
| +} |