summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sp_config.c102
1 files changed, 59 insertions, 43 deletions
diff --git a/src/sp_config.c b/src/sp_config.c
index 72781c6..db3f12d 100644
--- a/src/sp_config.c
+++ b/src/sp_config.c
@@ -56,12 +56,19 @@ static int parse_line(char *line) {
56} 56}
57 57
58/* keyword parsing */ 58/* keyword parsing */
59#define CHECK_DUPLICATE_KEYWORD(retval) \
60 if (*(void**)(retval)) { \
61 sp_log_err("config", "duplicate %s) on line %zu near `%s`", keyword, sp_line_no, line); \
62 return -1; }
63
64
59int parse_empty(char *restrict line, char *restrict keyword, void *retval) { 65int parse_empty(char *restrict line, char *restrict keyword, void *retval) {
60 *(bool *)retval = true; 66 *(bool *)retval = true;
61 return 0; 67 return 0;
62} 68}
63 69
64int parse_list(char *restrict line, char *restrict keyword, void *list_ptr) { 70int parse_list(char *restrict line, char *restrict keyword, void *list_ptr) {
71 CHECK_DUPLICATE_KEYWORD(list_ptr);
65 zend_string *value = NULL; 72 zend_string *value = NULL;
66 sp_list_node **list = list_ptr; 73 sp_list_node **list = list_ptr;
67 char *token, *tmp; 74 char *token, *tmp;
@@ -86,48 +93,50 @@ int parse_list(char *restrict line, char *restrict keyword, void *list_ptr) {
86} 93}
87 94
88int parse_php_type(char *restrict line, char *restrict keyword, void *retval) { 95int parse_php_type(char *restrict line, char *restrict keyword, void *retval) {
96 CHECK_DUPLICATE_KEYWORD(retval);
89 size_t consumed = 0; 97 size_t consumed = 0;
90 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); 98 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword);
91 if (value) { 99 if (!value) {
92 if (zend_string_equals_literal_ci(value, "undef")) { 100 return -1;
93 *(sp_php_type *)retval = SP_PHP_TYPE_UNDEF; 101 }
94 } else if (zend_string_equals_literal_ci(value, "null")) { 102
95 *(sp_php_type *)retval = SP_PHP_TYPE_NULL; 103 if (zend_string_equals_literal_ci(value, "undef")) {
96 } else if (zend_string_equals_literal_ci(value, "true")) { 104 *(sp_php_type *)retval = SP_PHP_TYPE_UNDEF;
97 *(sp_php_type *)retval = SP_PHP_TYPE_TRUE; 105 } else if (zend_string_equals_literal_ci(value, "null")) {
98 } else if (zend_string_equals_literal_ci(value, "false")) { 106 *(sp_php_type *)retval = SP_PHP_TYPE_NULL;
99 *(sp_php_type *)retval = SP_PHP_TYPE_FALSE; 107 } else if (zend_string_equals_literal_ci(value, "true")) {
100 } else if (zend_string_equals_literal_ci(value, "long")) { 108 *(sp_php_type *)retval = SP_PHP_TYPE_TRUE;
101 *(sp_php_type *)retval = SP_PHP_TYPE_LONG; 109 } else if (zend_string_equals_literal_ci(value, "false")) {
102 } else if (zend_string_equals_literal_ci(value, "double")) { 110 *(sp_php_type *)retval = SP_PHP_TYPE_FALSE;
103 *(sp_php_type *)retval = SP_PHP_TYPE_DOUBLE; 111 } else if (zend_string_equals_literal_ci(value, "long")) {
104 } else if (zend_string_equals_literal_ci(value, "string")) { 112 *(sp_php_type *)retval = SP_PHP_TYPE_LONG;
105 *(sp_php_type *)retval = SP_PHP_TYPE_STRING; 113 } else if (zend_string_equals_literal_ci(value, "double")) {
106 } else if (zend_string_equals_literal_ci(value, "array")) { 114 *(sp_php_type *)retval = SP_PHP_TYPE_DOUBLE;
107 *(sp_php_type *)retval = SP_PHP_TYPE_ARRAY; 115 } else if (zend_string_equals_literal_ci(value, "string")) {
108 } else if (zend_string_equals_literal_ci(value, "object")) { 116 *(sp_php_type *)retval = SP_PHP_TYPE_STRING;
109 *(sp_php_type *)retval = SP_PHP_TYPE_OBJECT; 117 } else if (zend_string_equals_literal_ci(value, "array")) {
110 } else if (zend_string_equals_literal_ci(value, "resource")) { 118 *(sp_php_type *)retval = SP_PHP_TYPE_ARRAY;
111 *(sp_php_type *)retval = SP_PHP_TYPE_RESOURCE; 119 } else if (zend_string_equals_literal_ci(value, "object")) {
112 } else if (zend_string_equals_literal_ci(value, "reference")) { 120 *(sp_php_type *)retval = SP_PHP_TYPE_OBJECT;
113 *(sp_php_type *)retval = SP_PHP_TYPE_REFERENCE; 121 } else if (zend_string_equals_literal_ci(value, "resource")) {
114 } else { 122 *(sp_php_type *)retval = SP_PHP_TYPE_RESOURCE;
115 pefree(value, 1); 123 } else if (zend_string_equals_literal_ci(value, "reference")) {
116 sp_log_err("error", 124 *(sp_php_type *)retval = SP_PHP_TYPE_REFERENCE;
117 "%s) is expecting a valid php type ('false', 'true',"
118 " 'array'. 'object', 'long', 'double', 'null', 'resource', "
119 "'reference', 'undef') on line %zu",
120 keyword, sp_line_no);
121 return -1;
122 }
123 pefree(value, 1);
124 return consumed;
125 } else { 125 } else {
126 pefree(value, 1);
127 sp_log_err("error",
128 "%s) is expecting a valid php type ('false', 'true',"
129 " 'array'. 'object', 'long', 'double', 'null', 'resource', "
130 "'reference', 'undef') on line %zu",
131 keyword, sp_line_no);
126 return -1; 132 return -1;
127 } 133 }
134 pefree(value, 1);
135 return consumed;
128} 136}
129 137
130int parse_str(char *restrict line, char *restrict keyword, void *retval) { 138int parse_str(char *restrict line, char *restrict keyword, void *retval) {
139 CHECK_DUPLICATE_KEYWORD(retval);
131 zend_string *value = NULL; 140 zend_string *value = NULL;
132 141
133 size_t consumed = 0; 142 size_t consumed = 0;
@@ -140,27 +149,34 @@ int parse_str(char *restrict line, char *restrict keyword, void *retval) {
140} 149}
141 150
142int parse_cidr(char *restrict line, char *restrict keyword, void *retval) { 151int parse_cidr(char *restrict line, char *restrict keyword, void *retval) {
152 CHECK_DUPLICATE_KEYWORD(retval);
153
143 size_t consumed = 0; 154 size_t consumed = 0;
144 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); 155 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword);
156
157 if (!value) {
158 sp_log_err("config", "%s doesn't contain a valid cidr on line %zu", line, sp_line_no);
159 return -1;
160 }
161
145 sp_cidr *cidr = pecalloc(sizeof(sp_cidr), 1, 1); 162 sp_cidr *cidr = pecalloc(sizeof(sp_cidr), 1, 1);
146 163
147 if (value) { 164 if (0 == get_ip_and_cidr(ZSTR_VAL(value), cidr)) {
148 if (-1 == get_ip_and_cidr(ZSTR_VAL(value), cidr)) { 165 pefree(cidr, 1);
149 return -1; 166 *(sp_cidr **)retval = NULL;
150 }
151 *(sp_cidr **)retval = cidr;
152 return consumed;
153 } else {
154 sp_log_err("config", "%s doesn't contain a valid cidr on line %zu", line,
155 sp_line_no);
156 return -1; 167 return -1;
157 } 168 }
169
170 *(sp_cidr **)retval = cidr;
171 return consumed;
158} 172}
159 173
160int parse_regexp(char *restrict line, char *restrict keyword, void *retval) { 174int parse_regexp(char *restrict line, char *restrict keyword, void *retval) {
161 /* TODO: Do we want to use pcre_study? 175 /* TODO: Do we want to use pcre_study?
162 * (http://www.pcre.org/original/doc/html/pcre_study.html) 176 * (http://www.pcre.org/original/doc/html/pcre_study.html)
163 * maybe not: http://sljit.sourceforge.net/pcre.html*/ 177 * maybe not: http://sljit.sourceforge.net/pcre.html*/
178 CHECK_DUPLICATE_KEYWORD(retval);
179
164 size_t consumed = 0; 180 size_t consumed = 0;
165 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); 181 zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword);
166 182