fix authentication header extra space (issue #5329)
[asterisk/asterisk.git] / dnsmgr.c
index 09a097d..95253d0 100755 (executable)
--- a/dnsmgr.c
+++ b/dnsmgr.c
@@ -1,14 +1,25 @@
 /*
- * Asterisk -- A telephony toolkit for Linux.
+ * Asterisk -- An open source telephony toolkit.
  *
- * Background DNS update manager
- * 
  * Copyright (C) 2005, Kevin P. Fleming
  *
  * Kevin P. Fleming <kpfleming@digium.com>
  *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
  * This program is free software, distributed under the terms of
- * the GNU General Public License
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*
+ *
+ * Background DNS update manager
+ * 
  */
 
 #include <sys/types.h>
 #include <regex.h>
 #include <signal.h>
 
-#include <asterisk/dnsmgr.h>
-#include <asterisk/linkedlists.h>
-#include <asterisk/utils.h>
-#include <asterisk/config.h>
-#include <asterisk/logger.h>
-#include <asterisk/sched.h>
-#include <asterisk/options.h>
-#include <asterisk/cli.h>
 #include "asterisk.h"
 
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/dnsmgr.h"
+#include "asterisk/linkedlists.h"
+#include "asterisk/utils.h"
+#include "asterisk/config.h"
+#include "asterisk/logger.h"
+#include "asterisk/sched.h"
+#include "asterisk/options.h"
+#include "asterisk/cli.h"
+
 static struct sched_context *sched;
 static int refresh_sched = -1;
 static pthread_t refresh_thread = AST_PTHREADT_NULL;
@@ -55,6 +69,7 @@ static int refresh_interval;
 struct refresh_info {
        struct entry_list *entries;
        int verbose;
+       unsigned int regex_present:1;
        regex_t filter;
 };
 
@@ -70,7 +85,7 @@ struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct in_addr *result
        if (!name || !result || ast_strlen_zero(name))
                return NULL;
 
-       entry = calloc(1, sizeof(*result) + strlen(name));
+       entry = calloc(1, sizeof(*entry) + strlen(name));
        if (!entry)
                return NULL;
 
@@ -86,13 +101,13 @@ struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct in_addr *result
 
 void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry)
 {
-       /* if there is an entry (and not the special flag value), remove/free it */
-       if (entry && (entry != (typeof(entry)) -1)) {
-               AST_LIST_LOCK(&entry_list);
-               AST_LIST_REMOVE(&entry_list, entry, list);
-               AST_LIST_UNLOCK(&entry_list);
-               free(entry);
-       };
+       if (!entry)
+               return;
+
+       AST_LIST_LOCK(&entry_list);
+       AST_LIST_REMOVE(&entry_list, entry, list);
+       AST_LIST_UNLOCK(&entry_list);
+       free(entry);
 }
 
 int ast_dnsmgr_lookup(const char *name, struct in_addr *result, struct ast_dnsmgr_entry **dnsmgr)
@@ -119,15 +134,13 @@ int ast_dnsmgr_lookup(const char *name, struct in_addr *result, struct ast_dnsmg
 
                if ((hp = ast_gethostbyname(name, &ahp)))
                        memcpy(result, hp->h_addr, sizeof(result));
-               /* flag value to indicate no manager was allocated */
-               *dnsmgr = (typeof(*dnsmgr)) -1;
+               return 0;
        } else {
                if (option_verbose > 2)
                        ast_verbose(VERBOSE_PREFIX_2 "adding manager for '%s'\n", name);
                *dnsmgr = ast_dnsmgr_get(name, result);
+               return !*dnsmgr;
        }
-
-       return !*dnsmgr;
 }
 
 static void *do_refresh(void *data)
@@ -159,7 +172,7 @@ static int refresh_list(void *data)
                ast_verbose(VERBOSE_PREFIX_2 "Refreshing DNS lookups.\n");
        AST_LIST_LOCK(info->entries);
        AST_LIST_TRAVERSE(info->entries, entry, list) {
-               if (info->filter.used && regexec(&info->filter, entry->name, 0, NULL, 0))
+               if (info->regex_present && regexec(&info->filter, entry->name, 0, NULL, 0))
                    continue;
 
                if (info->verbose && (option_verbose > 2))
@@ -202,11 +215,13 @@ static int handle_cli_refresh(int fd, int argc, char *argv[])
        if (argc == 3) {
                if (regcomp(&info.filter, argv[2], REG_EXTENDED | REG_NOSUB))
                        return RESULT_SHOWUSAGE;
+               else
+                       info.regex_present = 1;
        }
 
        refresh_list(&info);
 
-       if (info.filter.used)
+       if (info.regex_present)
                regfree(&info.filter);
 
        return 0;
@@ -299,7 +314,7 @@ static int do_reload(int loading)
                ast_sched_del(sched, refresh_sched);
 
        if ((config = ast_config_load("dnsmgr.conf"))) {
-               if ((enabled_value = ast_variable_retrieve(config, "general", "enabled"))) {
+               if ((enabled_value = ast_variable_retrieve(config, "general", "enable"))) {
                        enabled = ast_true(enabled_value);
                }
                if ((interval_value = ast_variable_retrieve(config, "general", "refreshinterval"))) {