00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "asterisk.h"
00031
00032 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 229969 $")
00033
00034 #include <sys/ioctl.h>
00035
00036 #include "asterisk/lock.h"
00037 #include "asterisk/file.h"
00038 #include "asterisk/channel.h"
00039 #include "asterisk/pbx.h"
00040 #include "asterisk/module.h"
00041 #include "asterisk/app.h"
00042 #include "asterisk/devicestate.h"
00043
00044 static char *app = "ChanIsAvail";
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 static int chanavail_exec(struct ast_channel *chan, void *data)
00098 {
00099 int inuse=-1, option_state=0, string_compare=0, option_all_avail=0;
00100 int status;
00101 char *info, tmp[512], trychan[512], *peers, *tech, *number, *rest, *cur;
00102 struct ast_str *tmp_availchan = ast_str_alloca(2048);
00103 struct ast_str *tmp_availorig = ast_str_alloca(2048);
00104 struct ast_str *tmp_availstat = ast_str_alloca(2048);
00105 struct ast_channel *tempchan;
00106 AST_DECLARE_APP_ARGS(args,
00107 AST_APP_ARG(reqchans);
00108 AST_APP_ARG(options);
00109 );
00110
00111 if (ast_strlen_zero(data)) {
00112 ast_log(LOG_WARNING, "ChanIsAvail requires an argument (DAHDI/1&DAHDI/2)\n");
00113 return -1;
00114 }
00115
00116 info = ast_strdupa(data);
00117
00118 AST_STANDARD_APP_ARGS(args, info);
00119
00120 if (args.options) {
00121 if (strchr(args.options, 'a')) {
00122 option_all_avail = 1;
00123 }
00124 if (strchr(args.options, 's')) {
00125 option_state = 1;
00126 }
00127 if (strchr(args.options, 't')) {
00128 string_compare = 1;
00129 }
00130 }
00131 peers = args.reqchans;
00132 if (peers) {
00133 cur = peers;
00134 do {
00135
00136 rest = strchr(cur, '&');
00137 if (rest) {
00138 *rest = 0;
00139 rest++;
00140 }
00141 tech = cur;
00142 number = strchr(tech, '/');
00143 if (!number) {
00144 ast_log(LOG_WARNING, "ChanIsAvail argument takes format ([technology]/[device])\n");
00145 return -1;
00146 }
00147 *number = '\0';
00148 number++;
00149
00150 if (string_compare) {
00151
00152
00153
00154 snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
00155 status = inuse = ast_parse_device_state(trychan);
00156 } else if (option_state) {
00157
00158
00159
00160
00161 snprintf(trychan, sizeof(trychan), "%s/%s",cur,number);
00162 status = inuse = ast_device_state(trychan);
00163 }
00164 if ((inuse <= 1) && (tempchan = ast_request(tech, chan->nativeformats, number, &status))) {
00165 ast_str_append(&tmp_availchan, 0, "%s%s", ast_str_strlen(tmp_availchan) ? "&" : "", tempchan->name);
00166
00167 snprintf(tmp, sizeof(tmp), "%s/%s", tech, number);
00168 ast_str_append(&tmp_availorig, 0, "%s%s", ast_str_strlen(tmp_availorig) ? "&" : "", tmp);
00169
00170 snprintf(tmp, sizeof(tmp), "%d", status);
00171 ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp);
00172
00173 ast_hangup(tempchan);
00174 tempchan = NULL;
00175
00176 if (!option_all_avail) {
00177 break;
00178 }
00179 } else {
00180 snprintf(tmp, sizeof(tmp), "%d", status);
00181 ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp);
00182 }
00183 cur = rest;
00184 } while (cur);
00185 }
00186
00187 pbx_builtin_setvar_helper(chan, "AVAILCHAN", ast_str_buffer(tmp_availchan));
00188
00189 pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", ast_str_buffer(tmp_availorig));
00190 pbx_builtin_setvar_helper(chan, "AVAILSTATUS", ast_str_buffer(tmp_availstat));
00191
00192 return 0;
00193 }
00194
00195 static int unload_module(void)
00196 {
00197 return ast_unregister_application(app);
00198 }
00199
00200 static int load_module(void)
00201 {
00202 return ast_register_application_xml(app, chanavail_exec) ?
00203 AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS;
00204 }
00205
00206 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Check channel availability");