Asterisk - The Open Source Telephony Project GIT-master-2de1a68
Functions | Variables
app_chanisavail.c File Reference

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"
Include dependency graph for app_chanisavail.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (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_DEFAULT , .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 = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, .unload = unload_module, .optional_modules = "func_cdr" }
 
static const char app [] = "ChanIsAvail"
 
static const struct ast_module_infoast_module_info = &__mod_info
 

Detailed Description

Check if Channel is Available.

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m
James Golovich james.nosp@m.@gnu.nosp@m.inter.nosp@m..net

Definition in file app_chanisavail.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 238 of file app_chanisavail.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 238 of file app_chanisavail.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 238 of file app_chanisavail.c.

◆ chanavail_exec()

static int chanavail_exec ( struct ast_channel chan,
const char *  data 
)
static

Definition at line 102 of file app_chanisavail.c.

103{
104 int inuse = -1;
105 int option_state = 0;
106 int string_compare = 0;
107 int option_all_avail = 0;
108 int status;
109 char *info;
110 char trychan[512];
111 char *rest;
112 char *tech;
113 char *number;
114 struct ast_str *tmp_availchan = ast_str_alloca(2048);
115 struct ast_str *tmp_availorig = ast_str_alloca(2048);
116 struct ast_str *tmp_availstat = ast_str_alloca(2048);
117 struct ast_str *tmp_availcause = ast_str_alloca(2048);
118 struct ast_channel *tempchan;
119 struct ast_custom_function *cdr_prop_func = ast_custom_function_find("CDR_PROP");
120 struct ast_format_cap *caps = NULL;
122 AST_APP_ARG(reqchans);
124 );
125
126 info = ast_strdupa(data ?: "");
127
129
130 ao2_lock(chan);
132 ao2_unlock(chan);
133
134 if (args.options) {
135 if (strchr(args.options, 'a')) {
136 option_all_avail = 1;
137 }
138 if (strchr(args.options, 's')) {
139 option_state = 1;
140 }
141 if (strchr(args.options, 't')) {
142 string_compare = 1;
143 }
144 }
145
146 rest = args.reqchans;
147 if (!rest) {
148 rest = "";
149 }
150 while ((tech = strsep(&rest, "&"))) {
151 tech = ast_strip(tech);
152
153 number = strchr(tech, '/');
154 if (!number) {
155 if (!ast_strlen_zero(tech)) {
156 ast_log(LOG_WARNING, "Invalid ChanIsAvail technology/resource argument: '%s'\n",
157 tech);
158 }
159
160 ast_str_append(&tmp_availstat, 0, "%s%d",
161 ast_str_strlen(tmp_availstat) ? "&" : "", AST_DEVICE_INVALID);
162 continue;
163 }
164 *number++ = '\0';
165
167
168 if (string_compare) {
169 /* ast_parse_device_state checks for "SIP/1234" as a channel name.
170 ast_device_state will ask the SIP driver for the channel state. */
171
172 snprintf(trychan, sizeof(trychan), "%s/%s", tech, number);
173 status = inuse = ast_parse_device_state(trychan);
174 } else if (option_state) {
175 /* If the pbx says in use then don't bother trying further.
176 This is to permit testing if someone's on a call, even if the
177 channel can permit more calls (ie callwaiting, sip calls, etc). */
178
179 snprintf(trychan, sizeof(trychan), "%s/%s", tech, number);
180 status = inuse = ast_device_state(trychan);
181 }
182 ast_str_append(&tmp_availstat, 0, "%s%d", ast_str_strlen(tmp_availstat) ? "&" : "", status);
183
184 if ((inuse <= (int) AST_DEVICE_NOT_INUSE)
185 && (tempchan = ast_request(tech, caps, NULL, chan, number, &status))) {
186
187 ast_str_append(&tmp_availchan, 0, "%s%s",
188 ast_str_strlen(tmp_availchan) ? "&" : "", ast_channel_name(tempchan));
189
190 ast_str_append(&tmp_availorig, 0, "%s%s/%s",
191 ast_str_strlen(tmp_availorig) ? "&" : "", tech, number);
192
193 ast_str_append(&tmp_availcause, 0, "%s%d",
194 ast_str_strlen(tmp_availcause) ? "&" : "", status);
195
196 /* Disable CDR for this temporary channel. */
197 if (cdr_prop_func) {
198 ast_func_write(tempchan, "CDR_PROP(disable)", "1");
199 }
200
201 ast_hangup(tempchan);
202 tempchan = NULL;
203
204 if (!option_all_avail) {
205 break;
206 }
207 }
208
209 }
210
211 ao2_cleanup(caps);
212
213 pbx_builtin_setvar_helper(chan, "AVAILCHAN", ast_str_buffer(tmp_availchan));
214 /* Store the originally used channel too */
215 pbx_builtin_setvar_helper(chan, "AVAILORIGCHAN", ast_str_buffer(tmp_availorig));
216 pbx_builtin_setvar_helper(chan, "AVAILSTATUS", ast_str_buffer(tmp_availstat));
217 pbx_builtin_setvar_helper(chan, "AVAILCAUSECODE", ast_str_buffer(tmp_availcause));
218
219 return 0;
220}
jack_status_t status
Definition: app_jack.c:146
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ast_log
Definition: astobj2.c:42
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define ao2_unlock(a)
Definition: astobj2.h:729
#define ao2_lock(a)
Definition: astobj2.h:717
#define ao2_bump(obj)
Bump refcount on an AO2 object by one, returning the object.
Definition: astobj2.h:480
const char * ast_channel_name(const struct ast_channel *chan)
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2541
struct ast_format_cap * ast_channel_nativeformats(const struct ast_channel *chan)
struct ast_channel * ast_request(const char *type, struct ast_format_cap *request_cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *addr, int *cause)
Requests a channel.
Definition: channel.c:6353
enum ast_device_state ast_parse_device_state(const char *device)
Search the Channels by Name.
Definition: devicestate.c:287
ast_device_state
Device States.
Definition: devicestate.h:52
@ AST_DEVICE_UNKNOWN
Definition: devicestate.h:53
@ AST_DEVICE_INVALID
Definition: devicestate.h:57
@ AST_DEVICE_NOT_INUSE
Definition: devicestate.h:54
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
char * strsep(char **str, const char *delims)
#define LOG_WARNING
def info(msg)
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name.
int ast_func_write(struct ast_channel *chan, const char *function, const char *value)
executes a write operation on a function
#define NULL
Definition: resample.c:96
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1139
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
#define ast_str_alloca(init_len)
Definition: strings.h:848
size_t ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
Definition: strings.h:730
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition: strings.h:223
Main Channel structure associated with a channel.
Data structure associated with a custom dialplan function.
Definition: pbx.h:118
Format capabilities structure, holds formats + preference order + etc.
Definition: format_cap.c:54
Support for dynamic strings.
Definition: strings.h:623
Number structure.
Definition: app_followme.c:154
const char * args
static struct test_options options

References ao2_bump, ao2_cleanup, ao2_lock, ao2_unlock, args, AST_APP_ARG, ast_channel_name(), ast_channel_nativeformats(), ast_custom_function_find(), AST_DECLARE_APP_ARGS, AST_DEVICE_INVALID, AST_DEVICE_NOT_INUSE, AST_DEVICE_UNKNOWN, ast_func_write(), 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_strip(), ast_strlen_zero(), sip_to_pjsip::info(), LOG_WARNING, NULL, options, pbx_builtin_setvar_helper(), status, and strsep().

Referenced by load_module().

◆ load_module()

static int load_module ( void  )
static

Definition at line 227 of file app_chanisavail.c.

228{
231}
static const char app[]
static int chanavail_exec(struct ast_channel *chan, const char *data)
@ AST_MODULE_LOAD_SUCCESS
Definition: module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
Definition: module.h:626

References app, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_register_application_xml, and chanavail_exec().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 222 of file app_chanisavail.c.

223{
225}
int ast_unregister_application(const char *app)
Unregister an application.
Definition: pbx_app.c:392

References app, and ast_unregister_application().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .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 = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, .unload = unload_module, .optional_modules = "func_cdr" }
static

Definition at line 238 of file app_chanisavail.c.

◆ app

const char app[] = "ChanIsAvail"
static

Definition at line 46 of file app_chanisavail.c.

Referenced by load_module(), and unload_module().

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 238 of file app_chanisavail.c.