aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xconfig.c6
-rwxr-xr-xinclude/asterisk/parking.h47
-rwxr-xr-xloader.c108
3 files changed, 109 insertions, 52 deletions
diff --git a/config.c b/config.c
index c63b2fded..b9f43a17e 100755
--- a/config.c
+++ b/config.c
@@ -162,7 +162,7 @@ struct ast_config *ast_load(char *configfile)
int lineno=0;
if (configfile[0] == '/') {
- strncpy(fn, configfile, sizeof(fn));
+ strncpy(fn, configfile, sizeof(fn)-1);
} else {
snprintf(fn, sizeof(fn), "%s/%s", AST_CONFIG_DIR, configfile);
}
@@ -221,7 +221,7 @@ struct ast_config *ast_load(char *configfile)
fclose(f);
return NULL;
}
- strncpy(tmpc->name, cur+1, sizeof(tmpc->name));
+ strncpy(tmpc->name, cur+1, sizeof(tmpc->name)-1);
tmpc->root = NULL;
tmpc->next = tmp->root;
tmp->root = tmpc;
@@ -261,7 +261,7 @@ struct ast_config *ast_load(char *configfile)
return NULL;
}
} else {
- ast_log(LOG_WARNING, "No '=' (equal sign) in line %d\n", lineno);
+ ast_log(LOG_WARNING, "No '=' (equal sign) in line %d of %s\n", lineno, configfile);
}
}
diff --git a/include/asterisk/parking.h b/include/asterisk/parking.h
new file mode 100755
index 000000000..6b3dec1f1
--- /dev/null
+++ b/include/asterisk/parking.h
@@ -0,0 +1,47 @@
+/*
+ * Asterisk -- A telephony toolkit for Linux.
+ *
+ * Call Parking API
+ *
+ * Copyright (C) 1999, Mark Spencer
+ *
+ * Mark Spencer <markster@linux-support.net>
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License.
+ *
+ * Includes code and algorithms from the Zapata library.
+ *
+ */
+
+#ifndef _PARKING_H
+#define _PARKING_H
+
+//! Park a call and read back parked location
+/*! \param chan the channel to actually be parked
+ \param host the channel which will have the parked location read to
+ Park the channel chan, and read back the parked location to the
+ host. If the call is not picked up within a specified period of
+ time, then the call will return to the last step that it was in
+ (in terms of exten, priority and context)
+*/
+extern int ast_park_call(struct ast_channel *chan, struct ast_channel *host);
+//! Park a call via a masqueraded channel
+/*! \param rchan the real channel to be parked
+ \param host the channel to have the parking read to
+ Masquerade the channel rchan into a new, empty channel which is then
+ parked with ast_park_call
+*/
+extern int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *host);
+
+//! Determine system parking extension
+/*! Returns the call parking extension for drivers that provide special
+ call parking help */
+extern char *ast_parking_ext(void);
+
+//! Bridge a call, optionally allowing redirection
+
+extern int ast_bridge_call(struct ast_channel *chan, struct ast_channel *peer, int allowredirect);
+
+
+#endif /* _PARKING_H */
diff --git a/loader.c b/loader.c
index 8293993f3..132656198 100755
--- a/loader.c
+++ b/loader.c
@@ -161,14 +161,19 @@ int ast_load_resource(char *resource_name)
struct ast_config *cfg;
/* Keep the module file parsing silent */
o = option_verbose;
- option_verbose = 0;
- cfg = ast_load(AST_MODULE_CONFIG);
- option_verbose = o;
- if (cfg) {
- if ((val = ast_variable_retrieve(cfg, "global", resource_name))
- && ast_true(val))
- flags |= RTLD_GLOBAL;
- ast_destroy(cfg);
+ if (strncasecmp(resource_name, "res_", 4)) {
+ option_verbose = 0;
+ cfg = ast_load(AST_MODULE_CONFIG);
+ option_verbose = o;
+ if (cfg) {
+ if ((val = ast_variable_retrieve(cfg, "global", resource_name))
+ && ast_true(val))
+ flags |= RTLD_GLOBAL;
+ ast_destroy(cfg);
+ }
+ } else {
+ /* Resource modules are always loaded global */
+ flags |= RTLD_GLOBAL;
}
if (ast_pthread_mutex_lock(&modlock))
@@ -188,9 +193,9 @@ int ast_load_resource(char *resource_name)
ast_pthread_mutex_unlock(&modlock);
return -1;
}
- strncpy(m->resource, resource_name, sizeof(m->resource));
+ strncpy(m->resource, resource_name, sizeof(m->resource)-1);
if (resource_name[0] == '/') {
- strncpy(fn, resource_name, sizeof(fn));
+ strncpy(fn, resource_name, sizeof(fn)-1);
} else {
snprintf(fn, sizeof(fn), "%s/%s", AST_MODULE_DIR, resource_name);
}
@@ -315,49 +320,54 @@ int load_modules()
/* Load all modules */
DIR *mods;
struct dirent *d;
- mods = opendir(AST_MODULE_DIR);
- if (mods) {
- while((d = readdir(mods))) {
- /* Must end in .so to load it. */
- if ((strlen(d->d_name) > 3) &&
- !strcasecmp(d->d_name + strlen(d->d_name) - 3, ".so") &&
- !ast_resource_exists(d->d_name)) {
- /* It's a shared library -- Just be sure we're allowed to load it -- kinda
- an inefficient way to do it, but oh well. */
- if (cfg) {
- v = ast_variable_browse(cfg, "modules");
- while(v) {
- if (!strcasecmp(v->name, "noload") &&
- !strcasecmp(v->value, d->d_name))
- break;
- v = v->next;
- }
- if (v) {
- if (option_verbose) {
- ast_verbose( VERBOSE_PREFIX_1 "[skipping %s]\n", d->d_name);
- fflush(stdout);
+ int x;
+ /* Make two passes. First, load any resource modules, then load the others. */
+ for (x=0;x<2;x++) {
+ mods = opendir(AST_MODULE_DIR);
+ if (mods) {
+ while((d = readdir(mods))) {
+ /* Must end in .so to load it. */
+ if ((strlen(d->d_name) > 3) && (x || !strncasecmp(d->d_name, "res_", 4)) &&
+ !strcasecmp(d->d_name + strlen(d->d_name) - 3, ".so") &&
+ !ast_resource_exists(d->d_name)) {
+ /* It's a shared library -- Just be sure we're allowed to load it -- kinda
+ an inefficient way to do it, but oh well. */
+ if (cfg) {
+ v = ast_variable_browse(cfg, "modules");
+ while(v) {
+ if (!strcasecmp(v->name, "noload") &&
+ !strcasecmp(v->value, d->d_name))
+ break;
+ v = v->next;
+ }
+ if (v) {
+ if (option_verbose) {
+ ast_verbose( VERBOSE_PREFIX_1 "[skipping %s]\n", d->d_name);
+ fflush(stdout);
+ }
+ continue;
}
- continue;
+
+ }
+ if (option_debug && !option_verbose)
+ ast_log(LOG_DEBUG, "Loading module %s\n", d->d_name);
+ if (option_verbose) {
+ ast_verbose( VERBOSE_PREFIX_1 "[%s]", d->d_name);
+ fflush(stdout);
+ }
+ if (ast_load_resource(d->d_name)) {
+ ast_log(LOG_WARNING, "Loading module %s failed!\n", d->d_name);
+ if (cfg)
+ ast_destroy(cfg);
+ return -1;
}
-
- }
- if (option_debug && !option_verbose)
- ast_log(LOG_DEBUG, "Loading module %s\n", d->d_name);
- if (option_verbose) {
- ast_verbose( VERBOSE_PREFIX_1 "[%s]", d->d_name);
- fflush(stdout);
- }
- if (ast_load_resource(d->d_name)) {
- ast_log(LOG_WARNING, "Loading module %s failed!\n", d->d_name);
- if (cfg)
- ast_destroy(cfg);
- return -1;
}
}
- };
- } else {
- if (!option_quiet)
- ast_log(LOG_WARNING, "Unable to open modules directory " AST_MODULE_DIR ".\n");
+ closedir(mods);
+ } else {
+ if (!option_quiet)
+ ast_log(LOG_WARNING, "Unable to open modules directory " AST_MODULE_DIR ".\n");
+ }
}
}
ast_destroy(cfg);