Asterisk - The Open Source Telephony Project GIT-master-a63eec2
Loading...
Searching...
No Matches
Functions | Variables
func_logic.c File Reference

Conditional logic dialplan functions. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/app.h"
Include dependency graph for func_logic.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static int acf_if (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int delete_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
 
static int exists (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
static int iftime (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
static int import_helper (struct ast_channel *chan, const char *cmd, char *data, char *buf, struct ast_str **str, ssize_t len)
 
static int import_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
static int import_read2 (struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)
 
static int isnull (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
static int load_module (void)
 
static int set (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
static int set2 (struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)
 
static int unload_module (void)
 
static int variable_exists_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Logical dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_custom_function delete_function
 
static struct ast_custom_function exists_function
 
static struct ast_custom_function if_function
 
static struct ast_custom_function if_time_function
 
static struct ast_custom_function import_function
 
static struct ast_custom_function isnull_function
 
static struct ast_custom_function set_function
 
static struct ast_custom_function variable_exists_function
 

Detailed Description

Conditional logic dialplan functions.

Author
Anthony Minessale II

Definition in file func_logic.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 430 of file func_logic.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 430 of file func_logic.c.

◆ acf_if()

static int acf_if ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 229 of file func_logic.c.

231{
233 AST_APP_ARG(expr);
234 AST_APP_ARG(remainder);
235 );
237 AST_APP_ARG(iftrue);
238 AST_APP_ARG(iffalse);
239 );
240 args2.iftrue = args2.iffalse = NULL; /* you have to set these, because if there is nothing after the '?',
241 then args1.remainder will be NULL, not a pointer to a null string, and
242 then any garbage in args2.iffalse will not be cleared, and you'll crash.
243 -- and if you mod the ast_app_separate_args func instead, you'll really
244 mess things up badly, because the rest of everything depends on null args
245 for non-specified stuff. */
246
247 AST_NONSTANDARD_APP_ARGS(args1, data, '?');
248 AST_NONSTANDARD_APP_ARGS(args2, args1.remainder, ':');
249
250 if (ast_strlen_zero(args1.expr) || !(args2.iftrue || args2.iffalse)) {
251 ast_debug(1, "<expr>='%s', <true>='%s', and <false>='%s'\n", args1.expr, args2.iftrue, args2.iffalse);
252 return -1;
253 }
254
255 args1.expr = ast_strip(args1.expr);
256 if (args2.iftrue)
257 args2.iftrue = ast_strip(args2.iftrue);
258 if (args2.iffalse)
259 args2.iffalse = ast_strip(args2.iffalse);
260
261 ast_copy_string(buf, pbx_checkcondition(args1.expr) ? (S_OR(args2.iftrue, "")) : (S_OR(args2.iffalse, "")), len);
262
263 return 0;
264}
char buf[BUFSIZE]
Definition eagi_proxy.c:66
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#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_NONSTANDARD_APP_ARGS(args, parse, sep)
Performs the 'nonstandard' argument separation process for an application.
#define ast_debug(level,...)
Log a DEBUG message.
int pbx_checkcondition(const char *condition)
Evaluate a condition.
Definition pbx.c:8307
#define NULL
Definition resample.c:96
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
Definition strings.h:223

References AST_APP_ARG, ast_copy_string(), ast_debug, AST_DECLARE_APP_ARGS, AST_NONSTANDARD_APP_ARGS, ast_strip(), ast_strlen_zero(), buf, len(), NULL, pbx_checkcondition(), and S_OR.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 430 of file func_logic.c.

◆ delete_write()

static int delete_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
)
static

Definition at line 337 of file func_logic.c.

338{
339 pbx_builtin_setvar_helper(chan, data, NULL);
340
341 return 0;
342}
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.

References ast_channel::data, NULL, and pbx_builtin_setvar_helper().

◆ exists()

static int exists ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 185 of file func_logic.c.

187{
188 strcpy(buf, data && *data ? "1" : "0");
189
190 return 0;
191}

References buf.

Referenced by ast_mwi_mailbox_update(), chan_pjsip_cng_tone_detected(), copy_message(), and socket_process_helper().

◆ iftime()

static int iftime ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 193 of file func_logic.c.

195{
196 struct ast_timing timing;
197 char *expr;
198 char *iftrue;
199 char *iffalse;
200
201 data = ast_strip_quoted(data, "\"", "\"");
202 expr = strsep(&data, "?");
203 iftrue = strsep(&data, ":");
204 iffalse = data;
205
206 if (ast_strlen_zero(expr) || !(iftrue || iffalse)) {
208 "Syntax IFTIME(<timespec>?[<true>][:<false>])\n");
209 return -1;
210 }
211
212 if (!ast_build_timing(&timing, expr)) {
213 ast_log(LOG_WARNING, "Invalid Time Spec.\n");
214 ast_destroy_timing(&timing);
215 return -1;
216 }
217
218 if (iftrue)
219 iftrue = ast_strip_quoted(iftrue, "\"", "\"");
220 if (iffalse)
221 iffalse = ast_strip_quoted(iffalse, "\"", "\"");
222
223 ast_copy_string(buf, ast_check_timing(&timing) ? S_OR(iftrue, "") : S_OR(iffalse, ""), len);
224 ast_destroy_timing(&timing);
225
226 return 0;
227}
char * strsep(char **str, const char *delims)
#define ast_log
Definition astobj2.c:42
#define LOG_WARNING
int ast_build_timing(struct ast_timing *i, const char *info_in)
Construct a timing bitmap, for use in time-based conditionals.
Definition extconf.c:3804
int ast_check_timing(const struct ast_timing *i)
Evaluate a pre-constructed bitmap as to whether the current time falls within the range specified.
Definition extconf.c:3998
int ast_destroy_timing(struct ast_timing *i)
Deallocates memory structures associated with a timing bitmap.
Definition pbx_timing.c:279
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
Definition utils.c:1854

References ast_build_timing(), ast_check_timing(), ast_copy_string(), ast_destroy_timing(), ast_log, ast_strip_quoted(), ast_strlen_zero(), buf, len(), LOG_WARNING, S_OR, and strsep().

◆ import_helper()

static int import_helper ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
struct ast_str **  str,
ssize_t  len 
)
static

Definition at line 296 of file func_logic.c.

297{
299 AST_APP_ARG(channel);
300 AST_APP_ARG(varname);
301 );
303 if (buf) {
304 *buf = '\0';
305 }
306
307 if (!ast_strlen_zero(args.varname)) {
308 struct ast_channel *chan2;
309
310 if ((chan2 = ast_channel_get_by_name(args.channel))) {
311 char *s = ast_alloca(strlen(args.varname) + 4);
312 sprintf(s, "${%s}", args.varname);
313 ast_channel_lock(chan2);
314 if (buf) {
316 } else {
318 }
319 ast_channel_unlock(chan2);
320 chan2 = ast_channel_unref(chan2);
321 }
322 }
323
324 return 0;
325}
const char * str
Definition app_jack.c:150
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
Definition astmm.h:288
#define ast_channel_lock(chan)
Definition channel.h:2972
struct ast_channel * ast_channel_get_by_name(const char *search)
Find a channel by name or uniqueid.
Definition channel.c:1398
#define ast_channel_unref(c)
Decrease channel reference count.
Definition channel.h:3008
#define ast_channel_unlock(chan)
Definition channel.h:2973
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
void pbx_substitute_variables_helper(struct ast_channel *c, const char *cp1, char *cp2, int count)
Definition ael_main.c:211
static struct @519 args
Main Channel structure associated with a channel.

References args, ast_alloca, AST_APP_ARG, ast_channel_get_by_name(), ast_channel_lock, ast_channel_unlock, ast_channel_unref, AST_DECLARE_APP_ARGS, AST_STANDARD_APP_ARGS, ast_str_substitute_variables(), ast_strlen_zero(), buf, len(), pbx_substitute_variables_helper(), and str.

Referenced by import_read(), and import_read2().

◆ import_read()

static int import_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 327 of file func_logic.c.

328{
329 return import_helper(chan, cmd, data, buf, NULL, len);
330}
static int import_helper(struct ast_channel *chan, const char *cmd, char *data, char *buf, struct ast_str **str, ssize_t len)
Definition func_logic.c:296

References buf, ast_channel::data, import_helper(), len(), and NULL.

◆ import_read2()

static int import_read2 ( struct ast_channel chan,
const char *  cmd,
char *  data,
struct ast_str **  str,
ssize_t  len 
)
static

Definition at line 332 of file func_logic.c.

333{
334 return import_helper(chan, cmd, data, NULL, str, len);
335}

References ast_channel::data, import_helper(), len(), NULL, and str.

◆ isnull()

static int isnull ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 177 of file func_logic.c.

179{
180 strcpy(buf, data && *data ? "0" : "1");
181
182 return 0;
183}

References buf.

◆ load_module()

static int load_module ( void  )
static

Definition at line 414 of file func_logic.c.

415{
416 int res = 0;
417
426
427 return res;
428}
static struct ast_custom_function exists_function
Definition func_logic.c:366
static struct ast_custom_function variable_exists_function
Definition func_logic.c:393
static struct ast_custom_function import_function
Definition func_logic.c:382
static struct ast_custom_function set_function
Definition func_logic.c:360
static struct ast_custom_function if_function
Definition func_logic.c:372
static struct ast_custom_function delete_function
Definition func_logic.c:388
static struct ast_custom_function if_time_function
Definition func_logic.c:377
static struct ast_custom_function isnull_function
Definition func_logic.c:354
#define ast_custom_function_register(acf)
Register a custom function.
Definition pbx.h:1562

References ast_custom_function_register, delete_function, exists_function, if_function, if_time_function, import_function, isnull_function, set_function, and variable_exists_function.

◆ set()

static int set ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 266 of file func_logic.c.

268{
269 char *varname;
270 char *val;
271
272 varname = strsep(&data, "=");
273 val = data;
274
275 if (ast_strlen_zero(varname) || !val) {
276 ast_log(LOG_WARNING, "Syntax SET(<varname>=[<value>])\n");
277 return -1;
278 }
279
280 varname = ast_strip(varname);
281 val = ast_strip(val);
282 pbx_builtin_setvar_helper(chan, varname, val);
284
285 return 0;
286}

References ast_copy_string(), ast_log, ast_strip(), ast_strlen_zero(), buf, len(), LOG_WARNING, pbx_builtin_setvar_helper(), and strsep().

Referenced by handle_video_on_join(), set2(), and test_sorcery_transform().

◆ set2()

static int set2 ( struct ast_channel chan,
const char *  cmd,
char *  data,
struct ast_str **  str,
ssize_t  len 
)
static

Definition at line 288 of file func_logic.c.

289{
290 if (len > -1) {
291 ast_str_make_space(str, len == 0 ? strlen(data) : len);
292 }
293 return set(chan, cmd, data, ast_str_buffer(*str), ast_str_size(*str));
294}
static int set(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_logic.c:266
#define ast_str_make_space(buf, new_len)
Definition strings.h:828
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
size_t attribute_pure ast_str_size(const struct ast_str *buf)
Returns the current maximum length (without reallocation) of the current buffer.
Definition strings.h:742

References ast_str_buffer(), ast_str_make_space, ast_str_size(), len(), set(), and str.

◆ unload_module()

static int unload_module ( void  )
static

◆ variable_exists_read()

static int variable_exists_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 344 of file func_logic.c.

346{
347 const char *var = pbx_builtin_getvar_helper(chan, data);
348
349 strcpy(buf, var ? "1" : "0");
350
351 return 0;
352}
#define var
Definition ast_expr2f.c:605
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.

References buf, ast_channel::data, pbx_builtin_getvar_helper(), and var.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Logical dialplan functions" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
static

Definition at line 430 of file func_logic.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 430 of file func_logic.c.

◆ delete_function

struct ast_custom_function delete_function
static
Initial value:
= {
.name = "DELETE",
.write = delete_write,
}
static int delete_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
Definition func_logic.c:337

Definition at line 388 of file func_logic.c.

388 {
389 .name = "DELETE",
390 .write = delete_write,
391};

Referenced by load_module(), and unload_module().

◆ exists_function

struct ast_custom_function exists_function
static
Initial value:
= {
.name = "EXISTS",
.read = exists,
.read_max = 2,
}
static int exists(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_logic.c:185

Definition at line 366 of file func_logic.c.

366 {
367 .name = "EXISTS",
368 .read = exists,
369 .read_max = 2,
370};

Referenced by load_module(), and unload_module().

◆ if_function

struct ast_custom_function if_function
static
Initial value:
= {
.name = "IF",
.read = acf_if,
}
static int acf_if(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_logic.c:229

Definition at line 372 of file func_logic.c.

372 {
373 .name = "IF",
374 .read = acf_if,
375};

Referenced by load_module(), and unload_module().

◆ if_time_function

struct ast_custom_function if_time_function
static
Initial value:
= {
.name = "IFTIME",
.read = iftime,
}
static int iftime(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_logic.c:193

Definition at line 377 of file func_logic.c.

377 {
378 .name = "IFTIME",
379 .read = iftime,
380};

Referenced by load_module(), and unload_module().

◆ import_function

struct ast_custom_function import_function
static
Initial value:
= {
.name = "IMPORT",
.read = import_read,
.read2 = import_read2,
}
static int import_read2(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)
Definition func_logic.c:332
static int import_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_logic.c:327

Definition at line 382 of file func_logic.c.

382 {
383 .name = "IMPORT",
384 .read = import_read,
385 .read2 = import_read2,
386};

Referenced by load_module(), and unload_module().

◆ isnull_function

struct ast_custom_function isnull_function
static
Initial value:
= {
.name = "ISNULL",
.read = isnull,
.read_max = 2,
}
static int isnull(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_logic.c:177

Definition at line 354 of file func_logic.c.

354 {
355 .name = "ISNULL",
356 .read = isnull,
357 .read_max = 2,
358};

Referenced by load_module(), and unload_module().

◆ set_function

struct ast_custom_function set_function
static
Initial value:
= {
.name = "SET",
.read = set,
.read2 = set2,
}
static int set2(struct ast_channel *chan, const char *cmd, char *data, struct ast_str **str, ssize_t len)
Definition func_logic.c:288

Definition at line 360 of file func_logic.c.

360 {
361 .name = "SET",
362 .read = set,
363 .read2 = set2,
364};

Referenced by load_module(), and unload_module().

◆ variable_exists_function

struct ast_custom_function variable_exists_function
static
Initial value:
= {
.name = "VARIABLE_EXISTS",
}
static int variable_exists_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
Definition func_logic.c:344

Definition at line 393 of file func_logic.c.

393 {
394 .name = "VARIABLE_EXISTS",
395 .read = variable_exists_read,
396};

Referenced by load_module(), and unload_module().