39 #include "asterisk/_private.h"
79 #define REFRESH_DEFAULT 300
87 unsigned int regex_present:1;
98 struct ast_dnsmgr_entry *entry;
99 int total_size =
sizeof(*entry) + strlen(name) + (service ? strlen(service) + 1 : 0);
107 strcpy(entry->name, name);
109 entry->
service = ((
char *) entry) +
sizeof(*entry) + strlen(name);
110 strcpy(entry->
service, service);
134 ast_verb(6,
"removing dns manager for '%s'\n", entry->name);
148 if (*dnsmgr && !strcasecmp((*dnsmgr)->name, name)) {
153 family = result->
ss.ss_family;
163 ast_verb(6,
"doing dnsmgr_lookup for '%s'\n", name);
173 ast_verb(6,
"adding dns manager for '%s'\n", name);
175 (*dnsmgr)->update_func = func;
176 (*dnsmgr)->data =
data;
201 ast_verb(6,
"refreshing '%s'\n", entry->name);
217 entry->name, old_addr, new_addr);
255 pthread_testcancel();
257 pthread_testcancel();
266 struct ast_dnsmgr_entry *entry;
275 ast_verb(6,
"Refreshing DNS lookups.\n");
293 if (refresh_sched > -1) {
307 "Usage: dnsmgr reload\n"
308 " Reloads the DNS manager configuration.\n";
330 "Usage: dnsmgr refresh [pattern]\n"
331 " Peforms an immediate refresh of the managed DNS entries.\n"
332 " Optional regular expression pattern is used to filter the entries to refresh.\n";
339 ast_cli(a->
fd,
"DNS Manager is disabled.\n");
348 if (regcomp(&info.
filter, a->
argv[2], REG_EXTENDED | REG_NOSUB)) {
367 struct ast_dnsmgr_entry *entry;
372 "Usage: dnsmgr status\n"
373 " Displays the DNS manager status.\n";
388 ast_cli(a->
fd,
"Number of entries: %d\n", count);
407 pthread_cancel(refresh_thread);
408 pthread_kill(refresh_thread, SIGURG);
409 pthread_join(refresh_thread, NULL);
441 const char *interval_value;
442 const char *enabled_value;
467 if (sscanf(interval_value,
"%30d", &interval) < 1)
469 else if (interval < 0)
470 ast_log(
LOG_WARNING,
"Invalid refresh interval '%d' specified, using default\n", interval);
496 pthread_cancel(refresh_thread);
497 pthread_kill(refresh_thread, SIGURG);
498 pthread_join(refresh_thread, NULL);
struct sockaddr_storage ss
#define AST_CLI_DEFINE(fn, txt,...)
static struct refresh_info master_refresh_info
Asterisk main include file. File version handling, generic pbx functions.
const char * ast_variable_retrieve(const struct ast_config *config, const char *category, const char *variable)
Gets a variable.
static const char config[]
#define AST_RWLIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a read/write list of specified type, statically initialized...
int ast_sched_add_variable(struct sched_context *con, int when, ast_sched_cb callback, const void *data, int variable) attribute_warn_unused_result
Schedule callback(data) to happen when ms into the future.
int ast_cli_register(struct ast_cli_entry *e)
Registers a command or an array of commands.
int ast_sockaddr_parse(struct ast_sockaddr *addr, const char *str, int flags)
Parse an IPv4 or IPv6 address string.
static int refresh_interval
static void ast_sockaddr_copy(struct ast_sockaddr *dst, const struct ast_sockaddr *src)
Copies the data from one ast_sockaddr to another.
struct entry_list * entries
#define AST_RWLIST_WRLOCK(head)
Write locks a list.
int ast_cli_unregister(struct ast_cli_entry *e)
Unregisters a command or an array of commands.
descriptor for a cli entry.
#define AST_RWLIST_UNLOCK(head)
Attempts to unlock a read/write based list.
static struct ast_cli_entry cli_reload
static char * handle_cli_refresh(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Configuration File Parser.
static pthread_t refresh_thread
struct ast_dnsmgr_entry * ast_dnsmgr_get(const char *name, struct ast_sockaddr *result, const char *service)
Allocate a new DNS manager entry.
Background DNS update manager.
#define ast_mutex_lock(a)
static struct ast_cli_entry cli_refresh
int ast_sockaddr_cmp(const struct ast_sockaddr *a, const struct ast_sockaddr *b)
Compares two ast_sockaddr structures.
int ast_dnsmgr_refresh(struct ast_dnsmgr_entry *entry)
Force a refresh of a dnsmgr entry.
void ast_cli(int fd, const char *fmt,...)
Socket address structure.
struct ast_config * ast_config_load2(const char *filename, const char *who_asked, struct ast_flags flags)
Load a config file.
#define ast_verb(level,...)
void ast_config_destroy(struct ast_config *config)
Destroys a config.
#define ast_pthread_create_background(a, b, c, d)
#define CONFIG_STATUS_FILEMISSING
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
#define AST_RWLIST_RDLOCK(head)
Read locks a list.
#define AST_RWLIST_INSERT_HEAD
#define EVENT_FLAG_SYSTEM
dns_update_func update_func
#define AST_SCHED_DEL(sched, id)
a loop construct to ensure that the scheduled task get deleted. The idea is that if we loop attemptin...
#define ast_mutex_trylock(a)
void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry)
Free a DNS manager entry.
#define AST_PTHREADT_NULL
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Access Control of various sorts.
static int do_reload(int loading)
#define AST_RWLIST_TRAVERSE
Scheduler Routines (derived from cheops)
int ast_register_atexit(void(*func)(void))
Register a function to be executed before Asterisk exits.
struct ast_sockaddr * result
A set of macros to manage forward-linked lists.
static struct sched_context * sched
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
static struct ast_cli_entry cli_status
#define ast_strdupa(s)
duplicate a string in memory from the stack
static ast_mutex_t refresh_lock
void(* dns_update_func)(struct ast_sockaddr *old_addr, struct ast_sockaddr *new_addr, void *data)
static void dnsmgr_shutdown(void)
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true". This function checks to see whether a string passed to it is an indication of an "true" value. It checks to see if the string is "yes", "true", "y", "t", "on" or "1".
void sched_context_destroy(struct sched_context *c)
destroys a schedule context Destroys (free's) the given sched_context structure
unsigned int regex_present
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
static int refresh_list(const void *data)
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
static int dnsmgr_refresh(struct ast_dnsmgr_entry *entry, int verbose)
static char * handle_cli_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Structure used to handle boolean flags.
int ast_sched_runq(struct sched_context *con)
Runs the queue.
int ast_get_ip_or_srv(struct ast_sockaddr *addr, const char *hostname, const char *service)
Get the IP address given a hostname and optional service.
static int internal_dnsmgr_lookup(const char *name, struct ast_sockaddr *result, struct ast_dnsmgr_entry **dnsmgr, const char *service, dns_update_func func, void *data)
struct sched_context * sched_context_create(void)
New schedule context.
Standard Command Line Interface.
int ast_dnsmgr_lookup(const char *name, struct ast_sockaddr *result, struct ast_dnsmgr_entry **dnsmgr, const char *service)
Allocate and initialize a DNS manager entry.
int ast_sched_wait(struct sched_context *con) attribute_warn_unused_result
Determines number of seconds until the next outstanding event to take place Determine the number of s...
void dnsmgr_start_refresh(void)
static char * handle_cli_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
int ast_dnsmgr_changed(struct ast_dnsmgr_entry *entry)
Check is see if a dnsmgr entry has changed.
#define AST_RWLIST_REMOVE
#define ast_mutex_init(pmutex)
#define CONFIG_STATUS_FILEINVALID
#define ast_mutex_destroy(a)
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
static struct entry_list entry_list
static void * do_refresh(void *data)
#define AST_MUTEX_DEFINE_STATIC(mutex)
Structure for mutex and tracking information.
int ast_dnsmgr_lookup_cb(const char *name, struct ast_sockaddr *result, struct ast_dnsmgr_entry **dnsmgr, const char *service, dns_update_func func, void *data)
Allocate and initialize a DNS manager entry, with update callback.
struct ast_dnsmgr_entry * ast_dnsmgr_get_family(const char *name, struct ast_sockaddr *result, const char *service, unsigned int family)
Allocate a new DNS manager entry.
#define ASTERISK_FILE_VERSION(file, version)
Register/unregister a source code file with the core.
#define CONFIG_STATUS_FILEUNCHANGED
#define ast_mutex_unlock(a)