#include "asterisk.h"
#include <sys/ioctl.h>
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/app.h"
#include "asterisk/devicestate.h"
Go to the source code of this file.
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static int | chanavail_exec (struct ast_channel *chan, const char *data) |
static int | load_module (void) |
static int | unload_module (void) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Check channel availability" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } |
static const char | app [] = "ChanIsAvail" |
static struct ast_module_info * | ast_module_info = &__mod_info |
James Golovich <james@gnuinter.net>
Definition in file app_chanisavail.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 212 of file app_chanisavail.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 212 of file app_chanisavail.c.
static int chanavail_exec | ( | struct ast_channel * | chan, | |
const char * | data | |||
) | [static] |
Definition at line 102 of file app_chanisavail.c.
References args, AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_device_state(), ast_hangup(), ast_log(), ast_parse_device_state(), ast_request(), AST_STANDARD_APP_ARGS, ast_str_alloca, ast_str_append(), ast_str_buffer(), ast_str_strlen(), ast_strdupa, ast_strlen_zero(), LOG_WARNING, ast_channel::name, ast_channel::nativeformats, pbx_builtin_setvar_helper(), and status.
Referenced by load_module().
00103 { 00104 int inuse=-1, option_state=0, string_compare=0, option_all_avail=0; 00105 int status; 00106 char *info, tmp[512], trychan[512], *peers, *tech, *number, *rest, *cur; 00107 struct ast_str *tmp_availchan = ast_str_alloca(2048); 00108 struct ast_str *tmp_availorig = ast_str_alloca(2048); 00109 struct ast_str *tmp_availstat = ast_str_alloca(2048); 00110 struct ast_str *tmp_availcause = ast_str_alloca(2048); 00111 struct ast_channel *tempchan; 00112 AST_DECLARE_APP_ARGS(args, 00113 AST_APP_ARG(reqchans); 00114 AST_APP_ARG(options); 00115 ); 00116 00117 if (ast_strlen_zero(data)) { 00118 ast_log(LOG_WARNING, "ChanIsAvail requires an argument (DAHDI/1&DAHDI/2)\n"); 00119 return -1; 00120 } 00121 00122 info = ast_strdupa(data); 00123 00124 AST_STANDARD_APP_ARGS(args, info); 00125 00126 if (args.options) { 00127 if (strchr(args.options, 'a')) { 00128 option_all_avail = 1; 00129 } 00130 if (strchr(args.options, 's')) { 00131 option_state = 1; 00132 } 00133 if (strchr(args.options, 't')) { 00134 string_compare = 1; 00135 } 00136 } 00137 peers = args.reqchans; 00138 if (peers) { 00139 cur = peers; 00140 do { 00141 /* remember where to start next time */ 00142 rest = strchr(cur, '&'); 00143 if (rest) { 00144 *rest = 0; 00145 rest++; 00146 } 00147 tech = cur; 00148 number = strchr(tech, '/'); 00149 if (!number) { 00150 ast_log(LOG_WARNING, "ChanIsAvail argument takes format ([technology]/[device])\n"); 00151 return -1; 00152 } 00153 *number = '\0'; 00154 number++; 00155 00156 if (string_compare) { 00157 /* ast_parse_device_state checks for "SIP/1234" as a channel name. 00158 ast_device_state will ask the SIP driver for the channel state. */ 00159 00160 snprintf(trychan, sizeof(trychan), "%s/%s",cur,number); 00161 status = inuse = ast_parse_device_state(trychan); 00162 } else if (option_state) { 00163 /* If the pbx says in use then don't bother trying further. 00164 This is to permit testing if someone's on a call, even if the 00165 channel can permit more calls (ie callwaiting, sip calls, etc). */ 00166 00167 snprintf(trychan, sizeof(trychan), "%s/%s",cur,number); 00168 status = inuse = ast_device_state(trychan); 00169 } 00170 snprintf(tmp, sizeof(tmp), "%d", status); 00171 ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp); 00172 if ((inuse <= 1) && (tempchan = ast_request(tech, chan->nativeformats, chan, number, &status))) { 00173 ast_str_append(&tmp_availchan, 0, "%s%s", ast_str_strlen(tmp_availchan) ? "&" : "", tempchan->name); 00174 00175 snprintf(tmp, sizeof(tmp), "%s/%s", tech, number); 00176 ast_str_append(&tmp_availorig, 0, "%s%s", ast_str_strlen(tmp_availorig) ? "&" : "", tmp); 00177 00178 snprintf(tmp, sizeof(tmp), "%d", status); 00179 ast_str_append(&tmp_availcause, 0, "%s%s", ast_str_strlen(tmp_availcause) ? "&" : "", tmp); 00180 00181 ast_hangup(tempchan); 00182 tempchan = NULL; 00183 00184 if (!option_all_avail) { 00185 break; 00186 } 00187 } 00188 cur = rest; 00189 } while (cur); 00190 } 00191 00192 pbx_builtin_setvar_helper(chan, "AVAILCHAN", ast_str_buffer(tmp_availchan)); 00193 /* Store the originally used channel too */ 00194 pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", ast_str_buffer(tmp_availorig)); 00195 pbx_builtin_setvar_helper(chan, "AVAILSTATUS", ast_str_buffer(tmp_availstat)); 00196 pbx_builtin_setvar_helper(chan, "AVAILCAUSECODE", ast_str_buffer(tmp_availcause)); 00197 00198 return 0; 00199 }
static int load_module | ( | void | ) | [static] |
Definition at line 206 of file app_chanisavail.c.
References AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_register_application_xml, and chanavail_exec().
00207 { 00208 return ast_register_application_xml(app, chanavail_exec) ? 00209 AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; 00210 }
static int unload_module | ( | void | ) | [static] |
Definition at line 201 of file app_chanisavail.c.
References ast_unregister_application().
00202 { 00203 return ast_unregister_application(app); 00204 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Check channel availability" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static] |
Definition at line 212 of file app_chanisavail.c.
const char app[] = "ChanIsAvail" [static] |
Definition at line 48 of file app_chanisavail.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 212 of file app_chanisavail.c.