Make configuration file errors print the error via standard logging function. Clean...
[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         default:
140                 doAssert(false);
141                 break;
142         }
143         return NULL;
144 }
145
146 int getIntConf(param_t param)
147 {
148         config_setting_t *setting = NULL;
149         
150         switch (param) {
151         case BINDPORT:
152                 setting = config_lookup(&configuration, "bindport");
153                 if (!setting)
154                         return DEFAULT_BINDPORT;
155                 else {
156                         return config_setting_get_int(setting);
157                 }
158                 break;
159         case MAX_BANDWIDTH:
160                 setting = config_lookup(&configuration, "max_bandwidth");
161                 if (!setting)
162                         return DEFAULT_MAX_BANDWIDTH;
163                 else {
164                         return config_setting_get_int(setting);
165                 }
166                 break;
167         case MAX_CLIENTS:
168                 setting = config_lookup(&configuration, "max_users");
169                 if (!setting)
170                         return DEFAULT_MAX_CLIENTS;
171                 else {
172                         return config_setting_get_int(setting);
173                 }
174                 break;
175         default:
176                 doAssert(false);
177         }
178 }
179
180 int Conf_getNextChannel(conf_channel_t *chdesc, int index)
181 {
182         config_setting_t *setting = NULL;
183         int maxconfig = 64, ret = 0;
184         char configstr[maxconfig];
185         
186         ret = snprintf(configstr, maxconfig, "channels.[%d].name", index);
187         setting = config_lookup(&configuration, configstr);
188         if (ret >= maxconfig || ret < 0 || setting == NULL)
189                 return -1; /* Required */
190         chdesc->name =  config_setting_get_string(setting);
191         
192         ret = snprintf(configstr, maxconfig, "channels.[%d].parent", index);
193         setting = config_lookup(&configuration, configstr);
194         if (ret >= maxconfig || ret < 0 || setting == NULL)
195                 return -1; /* Required */
196         chdesc->parent = config_setting_get_string(setting);
197         
198         ret = snprintf(configstr, maxconfig, "channels.[%d].description", index);
199         setting = config_lookup(&configuration, configstr);
200         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
201                 chdesc->description = NULL;
202         else
203                 chdesc->description = config_setting_get_string(setting);
204         
205         ret = snprintf(configstr, maxconfig, "channels.[%d].noenter", index);
206         setting = config_lookup(&configuration, configstr);
207         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
208                 chdesc->noenter = false;
209         else
210                 chdesc->noenter = config_setting_get_bool(setting);
211
212         return 0;
213 }
214
215 int Conf_getNextChannelLink(conf_channel_link_t *chlink, int index)
216 {
217         config_setting_t *setting = NULL;
218         int maxconfig = 64, ret = 0;
219         char configstr[maxconfig];
220         
221         ret = snprintf(configstr, maxconfig, "channel_links.[%d].source", index);
222         setting = config_lookup(&configuration, configstr);
223         if (ret >= maxconfig || ret < 0 || setting == NULL)
224                 return -1;
225         chlink->source = config_setting_get_string(setting);
226
227         ret = snprintf(configstr, maxconfig, "channel_links.[%d].destination", index);
228         setting = config_lookup(&configuration, configstr);
229         if (ret >= maxconfig || ret < 0 || setting == NULL)
230                 return -1;
231         chlink->destination = config_setting_get_string(setting);
232
233         return 0;
234 }