Check if Channel is Available. More...
#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 | |
AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Check channel availability") | |
static int | chanavail_exec (struct ast_channel *chan, const char *data) |
static int | load_module (void) |
static int | unload_module (void) |
Variables | |
static const char | app [] = "ChanIsAvail" |
Check if Channel is Available.
Definition in file app_chanisavail.c.
AST_MODULE_INFO_STANDARD | ( | ASTERISK_GPL_KEY | , | |
"Check channel availability" | ||||
) |
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_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::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 }
const char app[] = "ChanIsAvail" [static] |
Definition at line 48 of file app_chanisavail.c.