Update copyright year.
[umurmur.git] / src / conf.c
index 63e209c285e57c28046e87934073432af10dae75..a110056d3e1cef926fc9a11bacf4c451ee7ddcd4 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (C) 2009, Martin Johansson <martin@fatbob.nu>
-   Copyright (C) 2005-2009, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2013, Martin Johansson <martin@fatbob.nu>
+   Copyright (C) 2005-2013, Thorvald Natvig <thorvald@natvig.com>
 
    All rights reserved.
 
 #include <stdlib.h>
 #include <string.h>
 
-#ifdef WRT_TARGET
-#include <libconfig/libconfig.h>
-#else
 #include <libconfig.h>
-#endif
 
 #include "types.h"
 #include "conf.h"
 
 static config_t configuration;
 
-#define DEFAULT_CONFIG "/etc/umurmur.conf"
 #define DEFAULT_WELCOME "Welcome to uMurmur!"
 #define DEFAULT_MAX_CLIENTS 10
-#define DEFAULT_MAX_BANDWIDTH 5000
+#define DEFAULT_MAX_BANDWIDTH 48000
 #define DEFAULT_BINDPORT 64738
+#define DEFAULT_BAN_LENGTH (60*60)
+#define DEFAULT_OPUS_THRESHOLD 100
 
 const char defaultconfig[] = DEFAULT_CONFIG;
 
-int Conf_init(const char *conffile)
+void Conf_init(const char *conffile)
 {
-       const char *conf;
-       
        config_init(&configuration);
        if (conffile == NULL)
-               conf = defaultconfig;
-       else
-               conf = conffile;
-       if (config_read_file(&configuration, conf) != CONFIG_TRUE) {
-               fprintf(stderr, "Error in config file %s: %s at line %d\n", conffile,
-                               config_error_text(&configuration), config_error_line(&configuration));
-               exit(1);
+               conffile = defaultconfig;
+       if (config_read_file(&configuration, conffile) != CONFIG_TRUE) {
+               Log_fatal("Error in config file %s line %d: %s", conffile,
+                                 config_error_line(&configuration), config_error_text(&configuration));
        }
-       return 0;
+}
+
+bool_t Conf_ok(const char *conffile)
+{
+       bool_t rc = true;
+       config_init(&configuration);
+       if (conffile == NULL)
+               conffile = defaultconfig;
+       if (config_read_file(&configuration, conffile) != CONFIG_TRUE) {
+               fprintf(stderr, "Error in config file %s line %d: %s\n", conffile,
+                       config_error_line(&configuration), config_error_text(&configuration));
+               rc = false;
+       }
+       config_destroy(&configuration);
+       return rc;
 }
 
 void Conf_deinit()
@@ -113,6 +119,17 @@ const char *getStrConf(param_t param)
                                return "";
                }
                break;
+       case ADMIN_PASSPHRASE:
+               setting = config_lookup(&configuration, "admin_password");
+               if (!setting)
+                       return "";
+               else {
+                       if ((strsetting = config_setting_get_string(setting)) != NULL)
+                               return strsetting;
+                       else
+                               return "";
+               }
+               break;
        case BINDADDR:
                setting = config_lookup(&configuration, "bindaddr");
                if (!setting)
@@ -135,7 +152,7 @@ const char *getStrConf(param_t param)
                        return DEFAULT_WELCOME;
                }
                break;
-       case DEAFULT_CHANNEL:
+       case DEFAULT_CHANNEL:
                setting = config_lookup(&configuration, "default_channel");
                if (!setting)
                        return "";
@@ -146,6 +163,50 @@ const char *getStrConf(param_t param)
                        return "";
                }
                break;
+       case USERNAME:
+               setting = config_lookup(&configuration, "username");
+               if (!setting)
+                       return "";
+               else {
+                       if ((strsetting = config_setting_get_string(setting)) != NULL)
+                               return strsetting;
+                       else
+                       return "";
+               }
+               break;
+       case GROUPNAME:
+               setting = config_lookup(&configuration, "groupname");
+               if (!setting)
+                       return "";
+               else {
+                       if ((strsetting = config_setting_get_string(setting)) != NULL)
+                               return strsetting;
+                       else
+                       return "";
+               }
+               break;
+       case LOGFILE:
+               setting = config_lookup(&configuration, "logfile");
+               if (!setting)
+                       return NULL;
+               else {
+                       if ((strsetting = config_setting_get_string(setting)) != NULL)
+                               return strsetting;
+                       else
+                       return NULL;
+               }
+               break;
+       case BANFILE:
+               setting = config_lookup(&configuration, "banfile");
+               if (!setting)
+                       return NULL;
+               else {
+                       if ((strsetting = config_setting_get_string(setting)) != NULL)
+                               return strsetting;
+                       else
+                       return NULL;
+               }
+               break;
        default:
                doAssert(false);
                break;
@@ -166,6 +227,14 @@ int getIntConf(param_t param)
                        return config_setting_get_int(setting);
                }
                break;
+       case BAN_LENGTH:
+               setting = config_lookup(&configuration, "ban_length");
+               if (!setting)
+                       return DEFAULT_BAN_LENGTH;
+               else {
+                       return config_setting_get_int(setting);
+               }
+               break;
        case MAX_BANDWIDTH:
                setting = config_lookup(&configuration, "max_bandwidth");
                if (!setting)
@@ -182,6 +251,45 @@ int getIntConf(param_t param)
                        return config_setting_get_int(setting);
                }
                break;
+       case OPUS_THRESHOLD:
+               setting = config_lookup(&configuration, "opus_threshold");
+               if (!setting)
+                       return DEFAULT_OPUS_THRESHOLD;
+               else {
+                       return config_setting_get_int(setting);
+               }
+               break;
+       default:
+               doAssert(false);
+       }
+}
+
+bool_t getBoolConf(param_t param)
+{
+       config_setting_t *setting = NULL;
+       
+       switch (param) {
+       case ALLOW_TEXTMESSAGE:
+               setting = config_lookup(&configuration, "allow_textmessage");
+               if (!setting)
+                       return true;
+               else
+                       return config_setting_get_bool(setting);
+               break;
+       case ENABLE_BAN:
+               setting = config_lookup(&configuration, "enable_ban");
+               if (!setting)
+                       return false;
+               else
+                       return config_setting_get_bool(setting);
+               break;
+       case SYNC_BANFILE:
+               setting = config_lookup(&configuration, "sync_banfile");
+               if (!setting)
+                       return false;
+               else
+                       return config_setting_get_bool(setting);
+               break;
        default:
                doAssert(false);
        }
@@ -190,25 +298,41 @@ int getIntConf(param_t param)
 int Conf_getNextChannel(conf_channel_t *chdesc, int index)
 {
        config_setting_t *setting = NULL;
-       char configstr[64];
+       int maxconfig = 64, ret = 0;
+       char configstr[maxconfig];
        
-       sprintf(configstr, "channels.[%d].name", index);
+       ret = snprintf(configstr, maxconfig, "channels.[%d].name", index);
        setting = config_lookup(&configuration, configstr);
-       if (setting == NULL)
-               return -1;
-       strncpy(chdesc->name, config_setting_get_string(setting), MAX_TEXT);
+       if (ret >= maxconfig || ret < 0 || setting == NULL)
+               return -1; /* Required */
+       chdesc->name =  config_setting_get_string(setting);
        
-       sprintf(configstr, "channels.[%d].parent", index);
+       ret = snprintf(configstr, maxconfig, "channels.[%d].parent", index);
        setting = config_lookup(&configuration, configstr);
-       if (setting == NULL)
-               return -1;
-       strncpy(chdesc->parent, config_setting_get_string(setting), MAX_TEXT);
+       if (ret >= maxconfig || ret < 0 || setting == NULL)
+               return -1; /* Required */
+       chdesc->parent = config_setting_get_string(setting);
        
-       sprintf(configstr, "channels.[%d].description", index);
+       ret = snprintf(configstr, maxconfig, "channels.[%d].description", index);
        setting = config_lookup(&configuration, configstr);
-       if (setting == NULL)
-               return -1;
-       strncpy(chdesc->description, config_setting_get_string(setting), MAX_TEXT);
+       if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
+               chdesc->description = NULL;
+       else
+               chdesc->description = config_setting_get_string(setting);
+       
+       ret = snprintf(configstr, maxconfig, "channels.[%d].password", index);
+       setting = config_lookup(&configuration, configstr);
+       if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
+               chdesc->password = NULL;
+       else
+               chdesc->password = config_setting_get_string(setting);
+       
+       ret = snprintf(configstr, maxconfig, "channels.[%d].noenter", index);
+       setting = config_lookup(&configuration, configstr);
+       if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
+               chdesc->noenter = false;
+       else
+               chdesc->noenter = config_setting_get_bool(setting);
 
        return 0;
 }
@@ -216,19 +340,20 @@ int Conf_getNextChannel(conf_channel_t *chdesc, int index)
 int Conf_getNextChannelLink(conf_channel_link_t *chlink, int index)
 {
        config_setting_t *setting = NULL;
-       char configstr[64];
+       int maxconfig = 64, ret = 0;
+       char configstr[maxconfig];
        
-       sprintf(configstr, "channel_links.[%d].source", index);
+       ret = snprintf(configstr, maxconfig, "channel_links.[%d].source", index);
        setting = config_lookup(&configuration, configstr);
-       if (setting == NULL)
+       if (ret >= maxconfig || ret < 0 || setting == NULL)
                return -1;
-       strncpy(chlink->source, config_setting_get_string(setting), MAX_TEXT);
+       chlink->source = config_setting_get_string(setting);
 
-       sprintf(configstr, "channel_links.[%d].destination", index);
+       ret = snprintf(configstr, maxconfig, "channel_links.[%d].destination", index);
        setting = config_lookup(&configuration, configstr);
-       if (setting == NULL)
+       if (ret >= maxconfig || ret < 0 || setting == NULL)
                return -1;
-       strncpy(chlink->destination, config_setting_get_string(setting), MAX_TEXT);
+       chlink->destination = config_setting_get_string(setting);
 
        return 0;
 }