src/server/daemon/conf.c

changeset 17
d2a97bbeb57d
parent 16
a9bbd82d2dce
equal deleted inserted replaced
16:a9bbd82d2dce 17:d2a97bbeb57d
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 }
171 return NULL; 134 return NULL;
172 } 135 }
173 136
174 /* create object config */ 137 /* create object config */
175 HTTPObjectConfig *conf = calloc(sizeof(HTTPObjectConfig), 1); 138 HTTPObjectConfig *conf = calloc(sizeof(HTTPObjectConfig), 1);
176 conf->pool = pool_create(); 139 conf->pool = cfg_pool;
177 140
178 /* convert ObjectConfig to HTTPObjectConfig */ 141 /* convert ObjectConfig to HTTPObjectConfig */
179 142
180 /* add objects */ 143 /* add objects */
181 conf->nobj = ucx_dlist_size(cfg->objects); 144 conf->nobj = ucx_dlist_size(cfg->objects);
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 }

mercurial