Sun, 27 Nov 2022 13:33:30 +0100
improve daemon startup
parent will wait until daemon is started and returns error code if startup failed
daemon startup log messages will be printed by parent
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
4 | * Copyright 2020 Olaf Wintermann. All rights reserved. |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include "serverconfig.h" |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
31 | #include "conf.h" |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
33 | #include <stdio.h> |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
34 | #include <stdlib.h> |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
35 | #include <string.h> |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
36 | #include <ctype.h> |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
37 | #include <errno.h> |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
39 | #include <cx/buffer.h> |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
40 | #include <cx/utils.h> |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
42 | ServerConfig* serverconfig_load(const char *file) { |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
43 | CxMempool *mp = cxBasicMempoolCreate(512); |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
44 | if(!mp) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
45 | return NULL; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
46 | } |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
47 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
48 | ConfigParser2 parser; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
49 | memset(&parser, 0, sizeof(ConfigParser2)); |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
50 | parser.mp = mp; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
51 | parser.allow_hierarchy = true; |
425
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
52 | parser.delim = ""; |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
53 | ConfigNode *root = serverconfig_load_file(&parser, file); |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
54 | if(!root) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
55 | cxMempoolDestroy(mp); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | return NULL; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
59 | ServerConfig *scfg = cxMalloc(mp->allocator, sizeof(ServerConfig)); |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
60 | if(!scfg) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
61 | cxMempoolDestroy(mp); |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
62 | return NULL; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
63 | } |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
64 | scfg->root = root; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
65 | scfg->mp = mp; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
66 | scfg->tab = cx_str("\t"); |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
67 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
68 | return scfg; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
69 | } |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
70 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
71 | ConfigNode* serverconfig_load_file(ConfigParser2 *parser, const char *file) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
72 | FILE *in = fopen(file, "r"); |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
73 | if(in == NULL) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
74 | parser->error = CONFIG_PARSER_IO_ERROR; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
75 | parser->io_errno = errno; |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
76 | return NULL; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
77 | } |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
78 | |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
79 | // temporary buffer to store the file content |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
80 | CxBuffer buf; |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
81 | if(cxBufferInit(&buf, NULL, 16384, cxDefaultAllocator, CX_BUFFER_AUTO_EXTEND|CX_BUFFER_FREE_CONTENTS)) { |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
82 | fclose(in); |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
83 | parser->error = CONFIG_PARSER_OOM; |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
84 | return NULL; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
85 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
86 | |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
87 | //ucx_stream_copy(in, buf, (read_func)fread, (write_func)ucx_buffer_write); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
88 | char readbuf[2048]; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
89 | size_t r; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
90 | while((r = fread(readbuf, 1, 2048, in)) > 0) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
91 | cxBufferWrite(readbuf, 1, r, &buf); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
92 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
93 | fclose(in); |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
94 | |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
95 | ConfigNode *root = serverconfig_parse(parser, cx_strn(buf.space, buf.size)); |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
96 | cxBufferDestroy(&buf); |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
97 | return root; |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
98 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | |
425
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
100 | static int scfg_char_is_delim(ConfigParser2 *parser, char c) { |
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
101 | size_t len = strlen(parser->delim); |
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
102 | for(int i=0;i<len;i++) { |
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
103 | if(c == parser->delim[i]) { |
423
bb7cff720dd0
add obj.conf expression parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
422
diff
changeset
|
104 | return 1; |
bb7cff720dd0
add obj.conf expression parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
422
diff
changeset
|
105 | } |
bb7cff720dd0
add obj.conf expression parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
422
diff
changeset
|
106 | } |
bb7cff720dd0
add obj.conf expression parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
422
diff
changeset
|
107 | return 0; |
bb7cff720dd0
add obj.conf expression parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
422
diff
changeset
|
108 | } |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
109 | |
425
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
110 | static CFGToken get_next_token(ConfigParser2 *parser, cxstring content, int *pos) { |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
111 | CFGToken token = { {NULL, 0}, CFG_NO_TOKEN }; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
112 | CFGTokenType type = CFG_TOKEN; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
113 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
114 | int start = *pos; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
115 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
116 | int token_begin = -1; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
117 | int token_end = content.length-1; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
118 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
119 | int quote = 0; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
120 | int comment = 0; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
121 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
122 | int i; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
123 | char prev = 0; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
124 | for(i=start;i<content.length;i++) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
125 | char c = content.ptr[i]; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
126 | if(c == '\n') { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
127 | if(quote) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
128 | *pos = i; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
129 | return token; // error |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
130 | } else if(start == i) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
131 | // single newline char token |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
132 | type = CFG_TOKEN_NEWLINE; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
133 | token_begin = i; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
134 | token_end = i+1; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
135 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
136 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
137 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
138 | token_end = i; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
139 | if(token_begin < 0) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
140 | // only space/comment token |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
141 | token_begin = start; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
142 | type = comment ? CFG_TOKEN_COMMENT : CFG_TOKEN_SPACE; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
143 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
144 | // make sure next run will return current newline char as token |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
145 | i--; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
146 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
147 | } else if(quote) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
148 | if(c == '"' && prev != '\\') { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
149 | quote = 0; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
150 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
151 | } else if(comment) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
152 | // ignore |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | if(c == '\n') { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
154 | comment = 0; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
155 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
156 | } else if(c == '#') { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
157 | comment = 1; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
158 | } else if(isspace(c)) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
159 | if(token_begin >= 0) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
160 | token_end = i; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
161 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
162 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
163 | } else if(c == '"') { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
164 | quote = 1; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
165 | if(token_begin < 0) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
166 | token_begin = i; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
167 | } |
425
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
168 | } else if(scfg_char_is_delim(parser, c)) { |
422
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
169 | if(token_begin >= 0) { |
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
170 | token_end = i; |
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
171 | i--; |
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
172 | break; |
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
173 | } else { |
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
174 | token_begin = i; |
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
175 | token_end = i+1; |
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
176 | break; |
76f2f5d532d0
extend serverconfig tokenizer to create separate tokens for brackets
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
419
diff
changeset
|
177 | } |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
178 | } else if(token_begin < 0) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
179 | token_begin = i; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
180 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
181 | prev = c; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
182 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
183 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
184 | *pos = i + 1; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
185 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
186 | if(token_begin < 0) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
187 | return token; // error |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
188 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
189 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
190 | token.type = type; |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
191 | token.content = cx_strsubsl(content, token_begin, token_end - token_begin); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
192 | return token; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
193 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
194 | |
258
134279e804b6
remove old server.conf parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
256
diff
changeset
|
195 | /* |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
196 | static void test_print_config(ConfigNode *parent) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
197 | UCX_FOREACH(elm, parent->children) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
198 | ConfigNode *node = elm->data; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
199 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
200 | if(node->type == CONFIG_NODE_SPACE) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
201 | printf("sp: %s", node->text_begin.ptr); |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
202 | } else if(node->type == CONFIG_NODE_COMMENT) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
203 | printf("cm: %s", node->text_begin.ptr); |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
204 | } else if(node->type == CONFIG_NODE_OBJECT) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
205 | printf("o{: %s : %s", node->name.ptr, node->text_begin.ptr); |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
206 | test_print_config(node); |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
207 | printf("o}: %s", node->text_end.ptr); |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
208 | } else if(node->type == CONFIG_NODE_DIRECTIVE) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
209 | printf("di: %s", node->text_begin.ptr); |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
210 | } else { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
211 | printf("fk: %s", node->text_begin.ptr); |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
212 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
213 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
214 | } |
258
134279e804b6
remove old server.conf parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
256
diff
changeset
|
215 | */ |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
216 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
217 | static void config_arg_set_value(CxAllocator *a, ConfigParam *arg, CFGToken token) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
218 | cxstring nv = cx_strchr(token.content, '='); |
367
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
219 | if(!nv.ptr) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
220 | arg->value = cx_strdup_a(a, token.content); |
367
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
221 | } else { |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
222 | intptr_t eq = (intptr_t)(nv.ptr - token.content.ptr); |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
223 | cxstring name = token.content; |
367
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
224 | name.length = (size_t)eq; |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
225 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
226 | cxstring value = nv; |
367
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
227 | value.ptr++; |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
228 | value.length--; |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
229 | if(value.length > 1 && value.ptr[0] == '"' && value.ptr[value.length-1] == '"') { |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
230 | value.ptr++; |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
231 | value.length -= 2; // remove quote |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
232 | } |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
233 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
234 | arg->name = cx_strdup_a(a, name); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
235 | arg->value = cx_strdup_a(a, value); |
367
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
236 | } |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
237 | } |
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
238 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
239 | static int nodestack_prepend(CxAllocator *a, ConfigNodeStack **stack, ConfigNode *node) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
240 | ConfigNodeStack *elm = cxMalloc(a, sizeof(ConfigNodeStack)); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
241 | if(!elm) return 1; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
242 | elm->node = node; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
243 | elm->next = NULL; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
244 | cx_linked_list_prepend((void**)stack, NULL, -1, offsetof(ConfigNodeStack, next), elm); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
245 | return 0; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
246 | } |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
247 | |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
248 | ConfigNode* serverconfig_parse(ConfigParser2 *parser, cxstring content) { |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
249 | CxMempool *mp = parser->mp; |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
250 | CxAllocator *a = (CxAllocator*)mp->allocator; |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
251 | |
425
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
252 | if(!parser->delim) { |
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
253 | parser->delim = ""; |
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
254 | } |
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
255 | |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
256 | // PARSE: |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
257 | // first non space/comment token is directive/object name |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
258 | // following tokens are arguments |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
259 | // newline starts new directive |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
260 | // '{' converts directive to object and following directives will |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
261 | // be placed into the object |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
262 | int pos = 0; // needed for tokenizer |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
263 | CFGToken token; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
264 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
265 | ConfigNode *root_obj = cxCalloc(a, 1, sizeof(ConfigNode)); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
266 | root_obj->type = CONFIG_NODE_OBJECT; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
267 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
268 | ConfigNodeStack *node_stack = cxMalloc(a, sizeof(ConfigNodeStack)); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
269 | node_stack->node = root_obj; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
270 | node_stack->next = NULL; |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
271 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
272 | ConfigNode *current = cxCalloc(a, 1, sizeof(ConfigNode)); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
273 | current->type = CONFIG_NODE_SPACE; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
274 | ConfigNode *obj = NULL; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
275 | int obj_closed = 0; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
276 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
277 | int text_start = 0; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
278 | int err = 0; |
425
6440171c257f
make config parser delimiters configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
424
diff
changeset
|
279 | while((token = get_next_token(parser, content, &pos)).type != CFG_NO_TOKEN) { |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
280 | //printf("%s [%.*s]\n", token_type_str(token.type), (int)token.content.length, token.content.ptr); |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
281 | |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
282 | switch(token.type) { |
269
3dfbd0b91950
add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
258
diff
changeset
|
283 | case CFG_NO_TOKEN: break; |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
284 | case CFG_TOKEN_COMMENT: { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
285 | if(current->type == CONFIG_NODE_SPACE) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
286 | current->type = CONFIG_NODE_COMMENT; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
287 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
288 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
289 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
290 | case CFG_TOKEN_SPACE: break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
291 | case CFG_TOKEN_NEWLINE: { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
292 | cxstring line = cx_strsubsl(content, text_start, pos - text_start); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
293 | text_start = pos; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
294 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
295 | cxmutstr line_cp = cx_strdup_a(a, line); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
296 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
297 | ConfigNode *parent = node_stack->node; |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
298 | if(current->type == CONFIG_NODE_CLOSE_OBJECT) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
299 | // this is a newline after a object is closed with '}' |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
300 | // the line containing "}\n" should be added to the object |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
301 | parent->text_end = line_cp; |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
302 | // validate |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
303 | if(parser->validateObjEnd && parser->validateObjEnd(parser, parent)) { |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
304 | // validation failed |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
305 | err = 1; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
306 | break; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
307 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
308 | // done with this object, remove it from the stack |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
309 | ConfigNodeStack *remove_item = node_stack; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
310 | node_stack = node_stack->next; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
311 | cxFree(a, remove_item); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
312 | } else if(current->type == CONFIG_NODE_OPEN_OBJECT) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
313 | // newline after a object is opened with '{' |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
314 | // append '{' to the object text |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
315 | cxmutstr new_textbegin = cx_strcat_a(a, 2, obj->text_begin, line_cp); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
316 | cxFree(a, obj->text_begin.ptr); |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
317 | cxFree(a, line_cp.ptr); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
318 | obj->text_begin = new_textbegin; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
319 | } else { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
320 | // normal line containing a directive, space or comment |
419
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
321 | |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
322 | // add it to parent node |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
323 | current->text_begin = line_cp; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
324 | CFG_NODE_ADD(&parent->children_begin, &parent->children_end, current); |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
325 | |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
326 | // validate after CFG_NODE_ADD, because now current->prev is set |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
327 | if(current->type == CONFIG_NODE_DIRECTIVE && |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
328 | parser->validateDirective && |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
329 | parser->validateDirective(parser, current)) |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
330 | { |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
331 | err = 1; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
332 | break; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
333 | } |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
334 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
335 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
336 | // obj points to the previous node that started as a directive |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
337 | // the type is set to CONFIG_NODE_OBECT if it was followed by |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
338 | // a '{' character |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
339 | if(obj && obj->type == CONFIG_NODE_OBJECT) { |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
340 | // new object started |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
341 | if(parser->validateObjBegin && parser->validateObjBegin(parser, obj)) { |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
342 | // validation callback failed |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
343 | err = 1; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
344 | break; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
345 | } |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
346 | |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
347 | // add it to the stack |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
348 | nodestack_prepend(a, &node_stack, obj); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
349 | obj = NULL; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
350 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
351 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
352 | current = cxCalloc(a, 1, sizeof(ConfigNode)); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
353 | current->type = CONFIG_NODE_SPACE; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
354 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
355 | obj_closed = 0; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
356 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
357 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
358 | case CFG_TOKEN: { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
359 | // normal text token |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
360 | // either a directive/obj name, parameter or { } |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
361 | |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
362 | if(!cx_strcmp(token.content, cx_str("{"))) { |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
363 | // check if the parser allows an object hierarchy |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
364 | if(!parser->allow_hierarchy) { |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
365 | parser->error = CONFIG_PARSER_SYNTAX_ERROR; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
366 | err = 1; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
367 | break; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
368 | } |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
369 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
370 | // obj is pointing to the previous node that started |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
371 | // a directive |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
372 | if(!obj) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
373 | err = 1; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
374 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
375 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
376 | obj->type = CONFIG_NODE_OBJECT; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
377 | if(current != obj) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
378 | current->type = CONFIG_NODE_OPEN_OBJECT; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
379 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
380 | } else if(!cx_strcmp(token.content, cx_str("}"))) { |
417
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
381 | // check if the parser allows an object hierarchy |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
382 | if(!parser->allow_hierarchy) { |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
383 | parser->error = CONFIG_PARSER_SYNTAX_ERROR; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
384 | err = 1; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
385 | break; |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
386 | } |
90805bb9fbd6
prepare serverconfig parser to be also used for obj.conf and init.conf
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
415
diff
changeset
|
387 | |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
388 | obj_closed = 1; // force newline before next directive |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
389 | obj = NULL; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
390 | current->type = CONFIG_NODE_CLOSE_OBJECT; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
391 | } else { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
392 | if(obj_closed) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
393 | err = 1; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
394 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
395 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
396 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
397 | if(!current->name.ptr) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
398 | // currently this could be a directive or object |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
399 | current->name = cx_strdup_a(a, token.content); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
400 | current->type = CONFIG_NODE_DIRECTIVE; |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
401 | obj = current; // potential object |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
402 | } else { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
403 | // name already set, therefore this token must |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
404 | // be a parameter |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
405 | ConfigParam *arg = cxCalloc(a, 1, sizeof(ConfigParam)); |
367
1592224f6059
add support for name/value config args
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
366
diff
changeset
|
406 | config_arg_set_value(a, arg, token); |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
407 | CFG_PARAM_ADD(¤t->args, NULL, arg); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
408 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
409 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
410 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
411 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
412 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
413 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
414 | if(err) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
415 | break; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
416 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
417 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
418 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
419 | if(pos < content.length || err) { |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
420 | // content not fully parsed because of an error |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
421 | cxMempoolDestroy(mp); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
422 | return NULL; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
423 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
424 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
425 | //test_print_config(&root_obj); |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
426 | return root_obj; |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
427 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
428 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
429 | void serverconfig_free(ServerConfig *cfg) { |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
430 | cxMempoolDestroy(cfg->mp); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
431 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
432 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
433 | ConfigNode* serverconfig_get_node(ConfigNode *parent, ConfigNodeType type, cxstring name) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
434 | for(ConfigNode *node=parent->children_begin;node;node=node->next) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
435 | if(node->type == type && !cx_strcasecmp(cx_strcast(node->name), name)) { |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
436 | return node; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
437 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
438 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
439 | return NULL; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
440 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
441 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
442 | CxList* serverconfig_get_node_list(ConfigNode *parent, ConfigNodeType type, cxstring name) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
443 | CxList *nodes = cxPointerLinkedListCreate(cxDefaultAllocator, cx_cmp_ptr); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
444 | |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
445 | for(ConfigNode *node=parent->children_begin;node;node=node->next) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
446 | if(node->type == type && !cx_strcasecmp(cx_strcast(node->name), name)) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
447 | cxListAdd(nodes, node); |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
448 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
449 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
450 | |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
451 | return nodes; |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
452 | } |
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
453 | |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
454 | cxstring serverconfig_object_directive_value(ConfigNode *obj, cxstring name) { |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
455 | ConfigNode *node = serverconfig_get_node(obj, CONFIG_NODE_DIRECTIVE, name); |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
456 | if(node && CFG_NUM_PARAMS(node->args) == 1) { |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
457 | ConfigParam *arg = node->args; |
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
458 | return (cxstring){ arg->value.ptr, arg->value.length }; |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
459 | } |
415
d938228c382e
switch from ucx 2 to 3
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
367
diff
changeset
|
460 | return (cxstring){ NULL, 0 }; |
256
19259b6c5cf7
replace old server config loader
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
461 | } |
269
3dfbd0b91950
add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
258
diff
changeset
|
462 | |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
463 | cxstring serverconfig_directive_get_arg(ConfigNode *directive, cxstring arg_name) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
464 | cxstring ret = (cxstring){ NULL, 0 }; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
465 | ConfigParam *arg = directive->args; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
466 | while(arg) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
467 | if(!cx_strcmp(arg_name, cx_strcast(arg->name))) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
468 | ret = cx_strcast(arg->value); |
269
3dfbd0b91950
add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
258
diff
changeset
|
469 | break; |
3dfbd0b91950
add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
258
diff
changeset
|
470 | } |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
471 | arg = arg->next; |
269
3dfbd0b91950
add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
258
diff
changeset
|
472 | } |
3dfbd0b91950
add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
258
diff
changeset
|
473 | |
3dfbd0b91950
add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
258
diff
changeset
|
474 | return ret; |
3dfbd0b91950
add ResourcePool initialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
258
diff
changeset
|
475 | } |
418
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
476 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
477 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
478 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
479 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
480 | /* -------------------------- utility functions -------------------------- */ |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
481 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
482 | int serverconfig_validate_directive_name( |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
483 | ConfigNode *directive, |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
484 | const char *names[], |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
485 | size_t numnames, |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
486 | size_t *nameindex) |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
487 | { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
488 | for(size_t i=0;i<numnames;i++) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
489 | if(!cx_strcmp(cx_strcast(directive->name), cx_str(names[i]))) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
490 | *nameindex = i; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
491 | return 0; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
492 | } |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
493 | } |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
494 | return 1; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
495 | } |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
496 | |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
497 | int serverconfig_check_param_names(ConfigNode *directive, ConfigParam **err) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
498 | ConfigParam *arg = directive->args; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
499 | while(arg) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
500 | if(arg->name.length == 0) { |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
501 | *err = arg; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
502 | return 1; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
503 | } |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
504 | arg = arg->next; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
505 | } |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
506 | return 0; |
b7dcc9c4f270
use server.conf parser for init.conf as well
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
417
diff
changeset
|
507 | } |
419
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
508 | |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
509 | ConfigNode* serverconfig_previous_dir_or_obj(ConfigNode *node) { |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
510 | node = node->prev; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
511 | while(node) { |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
512 | if(node->type == CONFIG_NODE_DIRECTIVE || node->type == CONFIG_NODE_OBJECT) { |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
513 | return node; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
514 | } |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
515 | node = node->prev; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
516 | } |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
517 | return NULL; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
518 | } |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
519 | |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
520 | size_t serverconfig_children_count(ConfigNode *node, ConfigNodeType type) { |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
521 | size_t count = 0; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
522 | node = node->children_begin; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
523 | while(node) { |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
524 | if(node->type == type) { |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
525 | count++; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
526 | } |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
527 | node = node->next; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
528 | } |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
529 | return count; |
f1d29785ad2d
new obj.conf parser based on serverconfig parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
418
diff
changeset
|
530 | } |