1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32
33 #include <cx/mempool.h>
34 #include "mimeconf.h"
35 #include "logging.h"
36
37 #define MIMECONFIG_MAX_TOKENS 4096
38
39 MimeConfig *load_mime_config(
const char *file) {
40 FILE *in = fopen(file,
"r");
41 if(in ==
NULL) {
42 ws_cfg_log(
LOG_FAILURE,
"Cannot load mime config file %s: %s", file, strerror(errno));
43 return NULL;
44 }
45
46 MimeConfig *conf = malloc(
sizeof(MimeConfig));
47 conf->parser.parse = mimeconf_parse;
48 conf->directives_begin =
NULL;
49 conf->directives_end =
NULL;
50 conf->ntypes =
0;
51 int r = cfg_parse_basic_file((ConfigParser*)conf, in);
52 if(r !=
0) {
53 ws_cfg_log(
LOG_FAILURE,
"Cannot parse mime config file %s", file);
54 fclose(in);
55 free(conf);
56
57 return NULL;
58 }
59
60 fclose(in);
61
62 return conf;
63 }
64
65 void free_mime_config(MimeConfig *conf) {
66 cxMempoolDestroy(conf->parser.mp->data);
67 free(conf);
68 }
69
70 int mimeconf_parse(
void *p, ConfigLine *begin, ConfigLine *end, cxmutstr line) {
71 MimeConfig *conf = p;
72 CxAllocator *mp = conf->parser.mp;
73
74
75 MimeDirective *dir =
OBJ_NEW_N(mp, MimeDirective);
76
77 ConfigParam *params = cfg_param_list(line, mp);
78 for(ConfigParam *param=params;param;param=param->next) {
79 if(!cx_strcmp(cx_strcast(param->name), cx_str(
"type"))) {
80 dir->type = param->value;
81 }
else if(!cx_strcmp(cx_strcast(param->name), cx_str(
"exts"))) {
82
83 dir->nextensions = cx_strsplit_a(mp, cx_strcast(param->value), cx_strn(
",",
1),
MIMECONFIG_MAX_TOKENS, &dir->extensions);
84 }
85 }
86
87 CFG_MIME_ADD(&conf->directives_begin, &conf->directives_end, dir);
88
89 conf->ntypes++;
90
91 return 0;
92 }
93