src/server/config/serverconfig.c

Sun, 27 Nov 2022 13:33:30 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sun, 27 Nov 2022 13:33:30 +0100
changeset 443
ef3c8a0e1fee
parent 425
6440171c257f
child 455
e52a9fc670d2
permissions
-rw-r--r--

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(&current->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 }

mercurial