45 |
45 |
46 #include "vserver.h" |
46 #include "vserver.h" |
47 #include "../util/pblock.h" |
47 #include "../util/pblock.h" |
48 |
48 |
49 #include "../config/objconf.h" |
49 #include "../config/objconf.h" |
|
50 #include "../config/initconf.h" |
50 |
51 |
51 VirtualServer *default_vs; |
52 VirtualServer *default_vs; |
|
53 |
|
54 pool_handle_t *cfg_pool; |
|
55 |
|
56 // TODO: Funktion für ConfigDirective -> directive |
|
57 // TODO: Funktion für UcxList parameter list -> pblock |
|
58 // TODO: ConfigurationManager |
|
59 // TODO: server.conf |
52 |
60 |
53 void load_init_conf(char *file) { |
61 void load_init_conf(char *file) { |
54 printf("load_init_conf\n"); |
62 printf("load_init_conf\n"); |
55 |
63 |
56 pool_handle_t *pool = pool_create(); |
64 InitConfig *cfg = load_init_config("conf/init.conf"); |
57 |
65 if(cfg == NULL) { |
58 FILE *in = fopen("conf/init.conf", "r"); |
|
59 if(in == NULL) { |
|
60 fprintf(stderr, "Cannot open conf/init.conf\n"); |
|
61 return; |
66 return; |
62 } |
67 } |
63 |
68 |
64 char buf[512]; |
69 cfg_pool = pool_create(); // one pool for one Configuration |
65 buf[0] = 0; |
70 UcxDlist *dirs = cfg->directives; |
66 int len = 512; |
71 while(dirs != NULL) { |
67 |
72 ConfigDirective *dir = dirs->data; |
68 while(!feof(in)) { |
73 |
69 fgets(buf, len, in); |
74 /* create NSAPI directive */ |
70 |
75 directive *d = malloc(sizeof(directive)); |
71 if(*buf == 0) { |
76 d->param = pblock_create_pool(cfg_pool, 8); |
|
77 UcxList *param = dir->param; |
|
78 while(param != NULL) { |
|
79 ConfigParam *p = param->data; |
|
80 pblock_nvlinsert( |
|
81 p->name.ptr, |
|
82 p->name.length, |
|
83 p->value.ptr, |
|
84 p->value.length, |
|
85 d->param); |
|
86 param = param->next; |
|
87 } |
|
88 |
|
89 /* get function */ |
|
90 char *func_name = pblock_findval("fn", d->param); |
|
91 d->func = get_function(func_name); |
|
92 if(d->func == NULL) { |
|
93 free(d); |
72 continue; |
94 continue; |
73 } |
95 } |
74 |
96 |
75 char *ptr; |
97 /* execute init directive */ |
76 if((ptr = strrchr(buf, '\n'))) { |
98 d->func->func(d->param, NULL, NULL); |
77 ptr[0] = 0; |
99 |
78 } |
100 dirs = dirs->next; |
79 |
101 } |
80 sstr_t line = string_trim(sstr(buf)); |
102 |
81 if(line.length > 0) { |
103 free_init_config(cfg); |
82 sstr_t type; |
|
83 directive *d = parse_directive(pool, line, &type); |
|
84 if(sstrcmp(type, sstr("Init"))) { |
|
85 d->func->func(d->param, NULL, NULL); |
|
86 } |
|
87 } |
|
88 } |
|
89 } |
104 } |
90 |
105 |
91 void load_server_conf(char *file) { |
106 void load_server_conf(char *file) { |
92 printf("load_server_conf\n"); |
107 printf("load_server_conf\n"); |
93 |
108 |
101 // virtual server |
116 // virtual server |
102 default_vs = vs_new(); |
117 default_vs = vs_new(); |
103 // load obj.conf |
118 // load obj.conf |
104 default_vs->objects = load_obj_conf("conf/obj.conf"); |
119 default_vs->objects = load_obj_conf("conf/obj.conf"); |
105 default_vs->default_obj_name = "default"; |
120 default_vs->default_obj_name = "default"; |
106 |
121 |
107 // begin objset test |
|
108 /* |
|
109 httpd_objset *objset = default_vs->objset; |
|
110 for(int i=0;i<objset->pos;i++) { |
|
111 httpd_object *obj = objset->obj[i]; |
|
112 printf("<object [%s]>\n", obj->name); |
|
113 for(int j=0;j<obj->nd;j++) { |
|
114 dtable *dt; |
|
115 switch(j) { |
|
116 case NSAPIAuthTrans: { |
|
117 printf(" Get AuthTrans Directives\n"); |
|
118 dt = object_get_dtable(obj, NSAPIAuthTrans); |
|
119 break; |
|
120 } |
|
121 case NSAPINameTrans: { |
|
122 printf(" Get NameTrans Directives\n"); |
|
123 dt = object_get_dtable(obj, NSAPINameTrans); |
|
124 break; |
|
125 } |
|
126 case NSAPIPathCheck: { |
|
127 printf(" Get PathCheck Directives\n"); |
|
128 dt = object_get_dtable(obj, NSAPIPathCheck); |
|
129 break; |
|
130 } |
|
131 case NSAPIService: { |
|
132 printf(" Get Service Directives\n"); |
|
133 dt = object_get_dtable(obj, NSAPIService); |
|
134 break; |
|
135 } |
|
136 default: { |
|
137 printf("j: %d\n", j); |
|
138 dt = object_get_dtable(obj, j); |
|
139 break; |
|
140 } |
|
141 } |
|
142 if(dt != NULL) { |
|
143 printf(" dtable[%d].length = %d\n", dt, dt->ndir); |
|
144 } else { |
|
145 continue; |
|
146 } |
|
147 for(int k=0;k<dt->ndir;k++) { |
|
148 directive *d = dt->directive[k]; |
|
149 if(d == NULL) { |
|
150 printf("d is null\n"); |
|
151 } else { |
|
152 printf(" Directive[%d].name = %s\n", d, d->func->name); |
|
153 } |
|
154 } |
|
155 } |
|
156 } |
|
157 */ |
|
158 // end objset test |
|
159 } |
122 } |
160 |
123 |
161 VirtualServer* conf_get_default_vs() { |
124 VirtualServer* conf_get_default_vs() { |
162 return default_vs; |
125 return default_vs; |
163 } |
126 } |
239 /* next */ |
202 /* next */ |
240 i++; |
203 i++; |
241 objlist = objlist->next; |
204 objlist = objlist->next; |
242 } |
205 } |
243 |
206 |
244 |
207 free_object_config(cfg); |
245 |
|
246 |
|
247 |
|
248 |
208 |
249 return conf; |
209 return conf; |
250 } |
210 } |
251 |
|
252 void obj_conf_parse_line(ObjectConfParser *parser, sstr_t line) { |
|
253 //printf("{%s}[%d]\n", line.ptr, line.length); |
|
254 if(line.ptr[0] == '#') { |
|
255 return; |
|
256 } |
|
257 |
|
258 if(line.length < 3) { |
|
259 // to short for everything |
|
260 fprintf(stderr, "obj.conf: line to short \"%s\"\n", line.ptr); |
|
261 return; |
|
262 } |
|
263 |
|
264 // TODO: ersetzen |
|
265 if(line.ptr[0] == '<') { |
|
266 if(line.ptr[1] == '/') { |
|
267 // end tag |
|
268 if(line.ptr[2] == 'O' && parser->obj != NULL) { |
|
269 // end of Object |
|
270 httpobjconf_add_object(parser->conf, parser->obj); |
|
271 parser->obj = NULL; |
|
272 return; |
|
273 } |
|
274 } else { |
|
275 // new tag |
|
276 httpd_object *obj = parse_new_object_tag(line); |
|
277 parser->obj = obj; |
|
278 } |
|
279 } else { |
|
280 // directive |
|
281 sstr_t dtype; |
|
282 directive *d = parse_directive(parser->conf->pool, line, &dtype); |
|
283 int dt = get_directive_type_from_string(dtype); |
|
284 object_add_directive(parser->obj, d, dt); |
|
285 } |
|
286 } |
|
287 |
|
288 |
|
289 /* utils */ |
|
290 |
|
291 sstr_t string_trim(sstr_t string) { |
|
292 sstr_t newstr = string; |
|
293 int nsoff = 0; |
|
294 int l = 1; |
|
295 for(int i=0;i<string.length;i++) { |
|
296 char c = string.ptr[i]; |
|
297 if(l) { |
|
298 /* leading whitespace */ |
|
299 if(c > 32) { |
|
300 l = 0; |
|
301 nsoff = i; |
|
302 newstr.ptr = &string.ptr[i]; |
|
303 newstr.length = string.length - nsoff; |
|
304 } |
|
305 } else { |
|
306 /* trailing whitespace */ |
|
307 if(c > 32) { |
|
308 newstr.length = (i - nsoff) + 1; |
|
309 } |
|
310 } |
|
311 } |
|
312 return newstr; |
|
313 } |
|
314 |
|
315 httpd_object* parse_new_object_tag(sstr_t line) { |
|
316 int i = 0; |
|
317 int b = 0; |
|
318 sstr_t name; |
|
319 sstr_t value; |
|
320 |
|
321 char *obj_name = NULL; |
|
322 char *obj_ppath = NULL; |
|
323 |
|
324 for(;i<line.length;i++) { |
|
325 if(line.ptr[i] < 33) { |
|
326 b = 1; |
|
327 } else if(b == 1) { |
|
328 break; |
|
329 } |
|
330 } |
|
331 if(!b || line.ptr[i] < 33) { |
|
332 printf("1\n"); |
|
333 return NULL; |
|
334 } |
|
335 b = 0; |
|
336 |
|
337 /* parse name=value params */ |
|
338 for(;i<line.length;i++) { |
|
339 if(line.ptr[i] == '>') { |
|
340 break; |
|
341 } |
|
342 |
|
343 /* get name */ |
|
344 name.ptr = line.ptr + i; |
|
345 for(;i<line.length;i++) { |
|
346 if(line.ptr[i] == '=') { |
|
347 b = 1; |
|
348 i++; |
|
349 break; |
|
350 } |
|
351 } |
|
352 if(!b) { |
|
353 printf("2\n"); |
|
354 return NULL; |
|
355 } |
|
356 name.length = line.ptr + i - name.ptr - 1; |
|
357 |
|
358 if(line.ptr[i] == '\"') { |
|
359 i++; // TODO: Bug wenn end of line - wird nicht erkannt! |
|
360 } |
|
361 value.ptr = line.ptr + i; |
|
362 for(;i<line.length;i++) { |
|
363 char c = line.ptr[i]; |
|
364 if(c < 33 || c == '\"' || c == '>') { |
|
365 b = 1; |
|
366 break; |
|
367 } |
|
368 } |
|
369 if(!b) { |
|
370 printf("3\n"); |
|
371 return NULL; |
|
372 } |
|
373 value.length = line.ptr + i - value.ptr; |
|
374 |
|
375 if(sstrcmp(name, sstrn("name", 4)) == 0) { |
|
376 obj_name = sstrdub(value).ptr; |
|
377 } else if (sstrcmp(name, sstrn("ppath", 5)) == 0) { |
|
378 obj_ppath = sstrdub(value).ptr; |
|
379 } |
|
380 |
|
381 /* |
|
382 printf("name: [%d]{", name.length); |
|
383 fwrite(name.ptr, 1, name.length, stdout); |
|
384 printf("}\n"); |
|
385 printf("value: [%d]{", value.length); |
|
386 fwrite(value.ptr, 1, value.length, stdout); |
|
387 printf("}\n"); |
|
388 */ |
|
389 |
|
390 char c = line.ptr[i]; |
|
391 if(c == '>') { |
|
392 break; |
|
393 } else { |
|
394 i++; |
|
395 } |
|
396 } |
|
397 |
|
398 if(obj_name != NULL || obj_ppath != NULL) { |
|
399 httpd_object *o = object_new(obj_name); |
|
400 o->path = obj_ppath; |
|
401 return o; |
|
402 } |
|
403 |
|
404 return NULL; |
|
405 } |
|
406 |
|
407 directive* parse_directive(pool_handle_t *pool, sstr_t line, sstr_t *type) { |
|
408 int i = 0; |
|
409 int b = 0; |
|
410 |
|
411 sstr_t directive_type = line; |
|
412 |
|
413 directive *directive = malloc(sizeof(directive)); |
|
414 directive->cond = NULL; |
|
415 directive->param = pblock_create_pool(pool, 8); |
|
416 |
|
417 for(;i<line.length;i++) { |
|
418 if(line.ptr[i] < 33) { |
|
419 b = 1; |
|
420 directive_type.length = i; |
|
421 if(directive_type.length <= 0) { |
|
422 fprintf(stderr, "parse error: cannot parse directive\n"); |
|
423 return NULL; |
|
424 } |
|
425 } else if(b == 1) { |
|
426 break; |
|
427 } |
|
428 } |
|
429 |
|
430 /* parse name=value params */ |
|
431 sstr_t name; |
|
432 sstr_t value; |
|
433 for(;i<line.length;i++) { |
|
434 /* get name */ |
|
435 name.ptr = line.ptr + i; |
|
436 for(;i<line.length;i++) { |
|
437 if(line.ptr[i] == '=') { |
|
438 b = 1; |
|
439 i++; |
|
440 break; |
|
441 } |
|
442 } |
|
443 if(!b) { |
|
444 printf("2\n"); |
|
445 return NULL; |
|
446 } |
|
447 name.length = line.ptr + i - name.ptr - 1; |
|
448 |
|
449 if(line.ptr[i] == '\"') { |
|
450 i++; // TODO: Bug wenn end of line - wird nicht erkannt! |
|
451 } |
|
452 value.ptr = line.ptr + i; |
|
453 for(;i<line.length;i++) { |
|
454 char c = line.ptr[i]; |
|
455 if(c < 33 || c == '\"') { |
|
456 b = 1; |
|
457 break; |
|
458 } |
|
459 } |
|
460 if(!b) { |
|
461 printf("3\n"); |
|
462 return NULL; |
|
463 } |
|
464 value.length = line.ptr + i - value.ptr; |
|
465 |
|
466 name = string_trim(name); |
|
467 value = string_trim(value); |
|
468 |
|
469 /* insert name and value into directive pblock */ |
|
470 pblock_nvlinsert( |
|
471 name.ptr, |
|
472 name.length, |
|
473 value.ptr, |
|
474 value.length, |
|
475 directive->param); |
|
476 } |
|
477 |
|
478 /* get function */ |
|
479 char *func_name = pblock_findval("fn", directive->param); |
|
480 directive->func = get_function(func_name); |
|
481 |
|
482 *type = directive_type; |
|
483 return directive; |
|
484 } |
|
485 |
|
486 int get_directive_type_from_string(sstr_t type) { |
|
487 /* get nsapi function type */ |
|
488 int dt = -1; |
|
489 if(sstrcmp(type, sstr("AuthTrans")) == 0) { |
|
490 dt = 0; |
|
491 } else if(sstrcmp(type, sstr("NameTrans")) == 0) { |
|
492 dt = 1; |
|
493 } else if(sstrcmp(type, sstr("PathCheck")) == 0) { |
|
494 dt = 2; |
|
495 } else if(sstrcmp(type, sstr("ObjectType")) == 0) { |
|
496 dt = 3; |
|
497 } else if(sstrcmp(type, sstr("Service")) == 0) { |
|
498 dt = 4; |
|
499 } else if(sstrcmp(type, sstr("AddLog")) == 0) { |
|
500 dt = 5; |
|
501 } |
|
502 return dt; |
|
503 } |
|