silly people that don't want to install/run autoconf :-)
[asterisk/asterisk.git] / dnsmgr.c
old mode 100755 (executable)
new mode 100644 (file)
index 4143f7d..fac0c8d
--- a/dnsmgr.c
+++ b/dnsmgr.c
@@ -1,7 +1,7 @@
 /*
  * Asterisk -- An open source telephony toolkit.
  *
- * Copyright (C) 2005, Kevin P. Fleming
+ * Copyright (C) 2005-2006, Kevin P. Fleming
  *
  * Kevin P. Fleming <kpfleming@digium.com>
  *
@@ -19,7 +19,8 @@
 /*! \file
  *
  * \brief Background DNS update manager
- * 
+ *
+ * \author Kevin P. Fleming <kpfleming@digium.com> 
  */
 
 #include <sys/types.h>
@@ -82,11 +83,7 @@ struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct in_addr *result
 {
        struct ast_dnsmgr_entry *entry;
 
-       if (!name || !result || ast_strlen_zero(name))
-               return NULL;
-
-       entry = calloc(1, sizeof(*entry) + strlen(name));
-       if (!entry)
+       if (!result || ast_strlen_zero(name) || !(entry = ast_calloc(1, sizeof(*entry) + strlen(name))))
                return NULL;
 
        entry->result = result;
@@ -112,7 +109,7 @@ void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry)
 
 int ast_dnsmgr_lookup(const char *name, struct in_addr *result, struct ast_dnsmgr_entry **dnsmgr)
 {
-       if (!name || ast_strlen_zero(name) || !result || !dnsmgr)
+       if (ast_strlen_zero(name) || !result || !dnsmgr)
                return -1;
 
        if (*dnsmgr && !strcasecmp((*dnsmgr)->name, name))
@@ -187,8 +184,16 @@ static int refresh_list(void *data)
 
        ast_mutex_unlock(&refresh_lock);
 
-       /* automatically reschedule */
-       return -1;
+       /* automatically reschedule based on the interval */
+       return refresh_interval * 1000;
+}
+
+void dnsmgr_start_refresh(void)
+{
+       if (refresh_sched > -1) {
+               ast_sched_del(sched, refresh_sched);
+               refresh_sched = ast_sched_add_variable(sched, 100, refresh_list, &master_refresh_info, 1);
+       }
 }
 
 static int do_reload(int loading);
@@ -276,8 +281,7 @@ static struct ast_cli_entry cli_status = {
 
 int dnsmgr_init(void)
 {
-       sched = sched_context_create();
-       if (!sched) {
+       if (!(sched = sched_context_create())) {
                ast_log(LOG_ERROR, "Unable to create schedule context.\n");
                return -1;
        }
@@ -287,9 +291,9 @@ int dnsmgr_init(void)
        return do_reload(1);
 }
 
-void dnsmgr_reload(void)
+int dnsmgr_reload(void)
 {
-       do_reload(0);
+       return do_reload(0);
 }
 
 static int do_reload(int loading)
@@ -299,7 +303,6 @@ static int do_reload(int loading)
        const char *enabled_value;
        int interval;
        int was_enabled;
-       pthread_attr_t attr;
        int res = -1;
 
        /* ensure that no refresh cycles run while the reload is in progress */
@@ -328,22 +331,19 @@ static int do_reload(int loading)
                ast_config_destroy(config);
        }
 
-       if (enabled && refresh_interval) {
-               refresh_sched = ast_sched_add(sched, refresh_interval * 1000, refresh_list, &master_refresh_info);
+       if (enabled && refresh_interval)
                ast_log(LOG_NOTICE, "Managed DNS entries will be refreshed every %d seconds.\n", refresh_interval);
-       }
 
        /* if this reload enabled the manager, create the background thread
           if it does not exist */
        if (enabled && !was_enabled && (refresh_thread == AST_PTHREADT_NULL)) {
-               pthread_attr_init(&attr);
-               pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-               if (ast_pthread_create(&refresh_thread, &attr, do_refresh, NULL) < 0) {
+               if (ast_pthread_create(&refresh_thread, NULL, do_refresh, NULL) < 0) {
                        ast_log(LOG_ERROR, "Unable to start refresh thread.\n");
-                       ast_sched_del(sched, refresh_sched);
                }
                else {
                        ast_cli_register(&cli_refresh);
+                       /* make a background refresh happen right away */
+                       refresh_sched = ast_sched_add_variable(sched, 100, refresh_list, &master_refresh_info, 1);
                        res = 0;
                }
        }