Add logging to file
[umurmur.git] / src / conf.c
1 /* Copyright (C) 2009-2010, Martin Johansson <martin@fatbob.nu>
2    Copyright (C) 2005-2010, Thorvald Natvig <thorvald@natvig.com>
3
4    All rights reserved.
5
6    Redistribution and use in source and binary forms, with or without
7    modification, are permitted provided that the following conditions
8    are met:
9
10    - Redistributions of source code must retain the above copyright notice,
11      this list of conditions and the following disclaimer.
12    - Redistributions in binary form must reproduce the above copyright notice,
13      this list of conditions and the following disclaimer in the documentation
14      and/or other materials provided with the distribution.
15    - Neither the name of the Developers nor the names of its contributors may
16      be used to endorse or promote products derived from this software without
17      specific prior written permission.
18
19    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 #include <libconfig.h>
36
37 #include "types.h"
38 #include "conf.h"
39 #include "log.h"
40
41 static config_t configuration;
42
43 #define DEFAULT_CONFIG "/etc/umurmur.conf"
44 #define DEFAULT_WELCOME "Welcome to uMurmur!"
45 #define DEFAULT_MAX_CLIENTS 10
46 #define DEFAULT_MAX_BANDWIDTH 48000
47 #define DEFAULT_BINDPORT 64738
48
49 const char defaultconfig[] = DEFAULT_CONFIG;
50
51 void Conf_init(const char *conffile)
52 {
53         config_init(&configuration);
54         if (conffile == NULL)
55                 conffile = defaultconfig;
56         if (config_read_file(&configuration, conffile) != CONFIG_TRUE) {
57                 Log_fatal("Error in config file %s line %d: %s", conffile,
58                                   config_error_line(&configuration), config_error_text(&configuration));
59         }
60 }
61
62 void Conf_deinit()
63 {
64         config_destroy(&configuration);
65 }
66
67 const char *getStrConf(param_t param)
68 {
69         config_setting_t *setting = NULL;
70         const char *strsetting = NULL;
71         
72         switch (param) {
73         case CERTIFICATE:
74                 setting = config_lookup(&configuration, "certificate");
75                 if (!setting)
76                         return "/etc/umurmur/certificate.crt";
77                 else {
78                         if ((strsetting = config_setting_get_string(setting)) != NULL)
79                                 return strsetting;
80                         else
81                                 return "/etc/umurmur/certificate.crt";
82                 }
83                 break;
84         case KEY:
85                 setting = config_lookup(&configuration, "private_key");
86                 if (!setting)
87                         return "/etc/umurmur/private_key.key";
88                 else {
89                         if ((strsetting = config_setting_get_string(setting)) != NULL)
90                                 return strsetting;
91                         else
92                                 return "/etc/umurmur/private_key.key";
93                 }
94                 break;
95         case PASSPHRASE:
96                 setting = config_lookup(&configuration, "password");
97                 if (!setting)
98                         return "";
99                 else {
100                         if ((strsetting = config_setting_get_string(setting)) != NULL)
101                                 return strsetting;
102                         else
103                                 return "";
104                 }
105                 break;
106         case BINDADDR:
107                 setting = config_lookup(&configuration, "bindaddr");
108                 if (!setting)
109                         return "";
110                 else {
111                         if ((strsetting = config_setting_get_string(setting)) != NULL)
112                                 return strsetting;
113                         else
114                                 return "";
115                 }
116                 break;
117         case WELCOMETEXT:
118                 setting = config_lookup(&configuration, "welcometext");
119                 if (!setting)
120                         return DEFAULT_WELCOME;
121                 else {
122                         if ((strsetting = config_setting_get_string(setting)) != NULL)
123                                 return strsetting;
124                         else
125                         return DEFAULT_WELCOME;
126                 }
127                 break;
128         case DEFAULT_CHANNEL:
129                 setting = config_lookup(&configuration, "default_channel");
130                 if (!setting)
131                         return "";
132                 else {
133                         if ((strsetting = config_setting_get_string(setting)) != NULL)
134                                 return strsetting;
135                         else
136                         return "";
137                 }
138                 break;
139         case USERNAME:
140                 setting = config_lookup(&configuration, "username");
141                 if (!setting)
142                         return "";
143                 else {
144                         if ((strsetting = config_setting_get_string(setting)) != NULL)
145                                 return strsetting;
146                         else
147                         return "";
148                 }
149                 break;
150         case GROUPNAME:
151                 setting = config_lookup(&configuration, "groupname");
152                 if (!setting)
153                         return "";
154                 else {
155                         if ((strsetting = config_setting_get_string(setting)) != NULL)
156                                 return strsetting;
157                         else
158                         return "";
159                 }
160                 break;
161         case LOGFILE:
162                 setting = config_lookup(&configuration, "logfile");
163                 if (!setting)
164                         return NULL;
165                 else {
166                         if ((strsetting = config_setting_get_string(setting)) != NULL)
167                                 return strsetting;
168                         else
169                         return NULL;
170                 }
171                 break;
172         default:
173                 doAssert(false);
174                 break;
175         }
176         return NULL;
177 }
178
179 int getIntConf(param_t param)
180 {
181         config_setting_t *setting = NULL;
182         
183         switch (param) {
184         case BINDPORT:
185                 setting = config_lookup(&configuration, "bindport");
186                 if (!setting)
187                         return DEFAULT_BINDPORT;
188                 else {
189                         return config_setting_get_int(setting);
190                 }
191                 break;
192         case MAX_BANDWIDTH:
193                 setting = config_lookup(&configuration, "max_bandwidth");
194                 if (!setting)
195                         return DEFAULT_MAX_BANDWIDTH;
196                 else {
197                         return config_setting_get_int(setting);
198                 }
199                 break;
200         case MAX_CLIENTS:
201                 setting = config_lookup(&configuration, "max_users");
202                 if (!setting)
203                         return DEFAULT_MAX_CLIENTS;
204                 else {
205                         return config_setting_get_int(setting);
206                 }
207                 break;
208         default:
209                 doAssert(false);
210         }
211 }
212
213 int Conf_getNextChannel(conf_channel_t *chdesc, int index)
214 {
215         config_setting_t *setting = NULL;
216         int maxconfig = 64, ret = 0;
217         char configstr[maxconfig];
218         
219         ret = snprintf(configstr, maxconfig, "channels.[%d].name", index);
220         setting = config_lookup(&configuration, configstr);
221         if (ret >= maxconfig || ret < 0 || setting == NULL)
222                 return -1; /* Required */
223         chdesc->name =  config_setting_get_string(setting);
224         
225         ret = snprintf(configstr, maxconfig, "channels.[%d].parent", index);
226         setting = config_lookup(&configuration, configstr);
227         if (ret >= maxconfig || ret < 0 || setting == NULL)
228                 return -1; /* Required */
229         chdesc->parent = config_setting_get_string(setting);
230         
231         ret = snprintf(configstr, maxconfig, "channels.[%d].description", index);
232         setting = config_lookup(&configuration, configstr);
233         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
234                 chdesc->description = NULL;
235         else
236                 chdesc->description = config_setting_get_string(setting);
237         
238         ret = snprintf(configstr, maxconfig, "channels.[%d].noenter", index);
239         setting = config_lookup(&configuration, configstr);
240         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
241                 chdesc->noenter = false;
242         else
243                 chdesc->noenter = config_setting_get_bool(setting);
244
245         return 0;
246 }
247
248 int Conf_getNextChannelLink(conf_channel_link_t *chlink, int index)
249 {
250         config_setting_t *setting = NULL;
251         int maxconfig = 64, ret = 0;
252         char configstr[maxconfig];
253         
254         ret = snprintf(configstr, maxconfig, "channel_links.[%d].source", index);
255         setting = config_lookup(&configuration, configstr);
256         if (ret >= maxconfig || ret < 0 || setting == NULL)
257                 return -1;
258         chlink->source = config_setting_get_string(setting);
259
260         ret = snprintf(configstr, maxconfig, "channel_links.[%d].destination", index);
261         setting = config_lookup(&configuration, configstr);
262         if (ret >= maxconfig || ret < 0 || setting == NULL)
263                 return -1;
264         chlink->destination = config_setting_get_string(setting);
265
266         return 0;
267 }