diff options
author | matteo <matteo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-03-16 06:00:11 +0000 |
---|---|---|
committer | matteo <matteo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-03-16 06:00:11 +0000 |
commit | 40b9926da3752f8e6f5d1a23d4dd8ae8655df2b1 (patch) | |
tree | 9235ce2b731423c7bd45914947a3e092a690abe9 /apps | |
parent | 30610b61ae18888f54ae12b9cef4a95917e969e6 (diff) |
Sun Mar 16 07:00:01 CET 2003
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@646 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rwxr-xr-x | apps/Makefile | 2 | ||||
-rwxr-xr-x | apps/app_chanisavail.c | 130 |
2 files changed, 131 insertions, 1 deletions
diff --git a/apps/Makefile b/apps/Makefile index 48087f76c..30e1a9f27 100755 --- a/apps/Makefile +++ b/apps/Makefile @@ -19,7 +19,7 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom. app_queue.so app_senddtmf.so app_parkandannounce.so app_striplsd.so \ app_setcidname.so app_lookupcidname.so app_substring.so app_macro.so \ app_authenticate.so app_softhangup.so app_lookupblacklist.so \ - app_waitforring.so app_privacy.so app_db.so + app_waitforring.so app_privacy.so app_db.so app_chanisavail.so #APPS+=app_sql_postgres.so #APPS+=app_sql_odbc.so diff --git a/apps/app_chanisavail.c b/apps/app_chanisavail.c new file mode 100755 index 000000000..e2ad6e7e9 --- /dev/null +++ b/apps/app_chanisavail.c @@ -0,0 +1,130 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * Check if Channel is Available + * + * Copyright (C) 2003, Digium + * + * Mark Spencer <markster@digium.com> + * James Golovich <james@gnuinter.net> + * + * This program is free software, distributed under the terms of + * the GNU General Public License + * + */ + +#include <asterisk/lock.h> +#include <asterisk/file.h> +#include <asterisk/logger.h> +#include <asterisk/channel.h> +#include <asterisk/pbx.h> +#include <asterisk/module.h> +#include <asterisk/app.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> +#include <sys/ioctl.h> + +#include <pthread.h> + +static char *tdesc = "Check if channel is available"; + +static char *app = "ChanIsAvail"; + +static char *synopsis = "Check if channel is available"; + +static char *descrip = +" ChanIsAvail(Technology/resource[&Technology2/resource2...]): \n" +"Checks is any of the requested channels are available. If none\n" +"of the requested channels are available the new priority will\n" +"be n+101 (unless such a priority does not exist, in which case\n" +"ChanIsAvail will return -1. If any of the requested channels\n" +"are available, the next priority will be n+1 and ChanIsAvail\n" +"will return 0.\n"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + +static int chanavail_exec(struct ast_channel *chan, void *data) +{ + int res=-1; + struct localuser *u; + char info[256], *peers, *tech, *number, *rest, *cur; + struct ast_channel *tempchan; + + if (!data) { + ast_log(LOG_WARNING, "ChanIsAvail requires an argument (Zap/1&Zap/2)\n"); + return -1; + } + LOCAL_USER_ADD(u); + + strncpy(info, (char *)data, strlen((char *)data) + AST_MAX_EXTENSION-1); + peers = info; + if (peers) { + cur = peers; + do { + /* remember where to start next time */ + rest = strchr(cur, '&'); + if (rest) { + *rest = 0; + rest++; + } + tech = cur; + number = strchr(tech, '/'); + if (!number) { + ast_log(LOG_WARNING, "ChanIsAvail argument takes format (Zap/[device])\n"); + continue; + } + *number = '\0'; + number++; + if ((tempchan = ast_request(tech, chan->nativeformats, number))) { + ast_hangup(tempchan); + tempchan = NULL; + res = 1; + break; + } + cur = rest; + } while (cur); + } + + if (res < 1) { + if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid)) + chan->priority+=100; + else + return -1; + } + + LOCAL_USER_REMOVE(u); + return 0; +} + +int unload_module(void) +{ + STANDARD_HANGUP_LOCALUSERS; + return ast_unregister_application(app); +} + +int load_module(void) +{ + return ast_register_application(app, chanavail_exec, synopsis, descrip); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} + +char *key() +{ + return ASTERISK_GPL_KEY; +} |