#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 = "ac1f6a56484a8820659555499174e588" , .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 214 of file app_chanisavail.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 214 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_DEVICE_UNKNOWN, 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 status = AST_DEVICE_UNKNOWN; 00157 00158 if (string_compare) { 00159 /* ast_parse_device_state checks for "SIP/1234" as a channel name. 00160 ast_device_state will ask the SIP driver for the channel state. */ 00161 00162 snprintf(trychan, sizeof(trychan), "%s/%s",cur,number); 00163 status = inuse = ast_parse_device_state(trychan); 00164 } else if (option_state) { 00165 /* If the pbx says in use then don't bother trying further. 00166 This is to permit testing if someone's on a call, even if the 00167 channel can permit more calls (ie callwaiting, sip calls, etc). */ 00168 00169 snprintf(trychan, sizeof(trychan), "%s/%s",cur,number); 00170 status = inuse = ast_device_state(trychan); 00171 } 00172 snprintf(tmp, sizeof(tmp), "%d", status); 00173 ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp); 00174 if ((inuse <= 1) && (tempchan = ast_request(tech, chan->nativeformats, chan, number, &status))) { 00175 ast_str_append(&tmp_availchan, 0, "%s%s", ast_str_strlen(tmp_availchan) ? "&" : "", tempchan->name); 00176 00177 snprintf(tmp, sizeof(tmp), "%s/%s", tech, number); 00178 ast_str_append(&tmp_availorig, 0, "%s%s", ast_str_strlen(tmp_availorig) ? "&" : "", tmp); 00179 00180 snprintf(tmp, sizeof(tmp), "%d", status); 00181 ast_str_append(&tmp_availcause, 0, "%s%s", ast_str_strlen(tmp_availcause) ? "&" : "", tmp); 00182 00183 ast_hangup(tempchan); 00184 tempchan = NULL; 00185 00186 if (!option_all_avail) { 00187 break; 00188 } 00189 } 00190 cur = rest; 00191 } while (cur); 00192 } 00193 00194 pbx_builtin_setvar_helper(chan, "AVAILCHAN", ast_str_buffer(tmp_availchan)); 00195 /* Store the originally used channel too */ 00196 pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", ast_str_buffer(tmp_availorig)); 00197 pbx_builtin_setvar_helper(chan, "AVAILSTATUS", ast_str_buffer(tmp_availstat)); 00198 pbx_builtin_setvar_helper(chan, "AVAILCAUSECODE", ast_str_buffer(tmp_availcause)); 00199 00200 return 0; 00201 }
static int load_module | ( | void | ) | [static] |
Definition at line 208 of file app_chanisavail.c.
References AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_register_application_xml, and chanavail_exec().
00209 { 00210 return ast_register_application_xml(app, chanavail_exec) ? 00211 AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS; 00212 }
static int unload_module | ( | void | ) | [static] |
Definition at line 203 of file app_chanisavail.c.
References ast_unregister_application().
00204 { 00205 return ast_unregister_application(app); 00206 }
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 = "ac1f6a56484a8820659555499174e588" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static] |
Definition at line 214 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 214 of file app_chanisavail.c.