/* * Asterisk -- An open source telephony toolkit. * * Copyright (c) 2003 - 2005 Tilghman Lesher. All rights reserved. * * Tilghman Lesher * * This code is released by the author with no restrictions on usage or distribution. * * See http://www.asterisk.org for more information about * the Asterisk project. Please do not directly contact * any of the maintainers of this project for assistance; * the project provides a web site, mailing lists and IRC * channels for your use. * */ /*! \file * * \brief Random application * * \author Tilghman Lesher * \ingroup applications */ #include #include #include #include #include "asterisk.h" ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/file.h" #include "asterisk/logger.h" #include "asterisk/options.h" #include "asterisk/channel.h" #include "asterisk/pbx.h" #include "asterisk/module.h" static char *tdesc = "Random goto"; static char *app_random = "Random"; static char *random_synopsis = "Conditionally branches, based upon a probability"; static char *random_descrip = "Random([probability]:[[context|]extension|]priority)\n" " probability := INTEGER in the range 1 to 100\n"; STANDARD_LOCAL_USER; LOCAL_USER_DECL; static char random_state[256]; static int random_exec(struct ast_channel *chan, void *data) { int res=0; struct localuser *u; char *s; char *prob; int probint; if (ast_strlen_zero(data)) { ast_log(LOG_WARNING, "Random requires an argument ([probability]:[[context|]extension|]priority)\n"); return -1; } LOCAL_USER_ADD(u); s = ast_strdupa(data); if (!s) { ast_log(LOG_ERROR, "Out of memory!\n"); LOCAL_USER_REMOVE(u); return -1; } prob = strsep(&s,":"); if ((!prob) || (sscanf(prob, "%d", &probint) != 1)) probint = 0; if ((random() % 100) + probint >= 100) { res = ast_parseable_goto(chan, s); if (option_verbose > 2) ast_verbose( VERBOSE_PREFIX_3 "Random branches to (%s,%s,%d)\n", chan->context,chan->exten, chan->priority+1); } LOCAL_USER_REMOVE(u); return res; } int unload_module(void) { int res; res = ast_unregister_application(app_random); STANDARD_HANGUP_LOCALUSERS; return res; } int load_module(void) { initstate((getppid() * 65535 + getpid()) % RAND_MAX, random_state, 256); return ast_register_application(app_random, random_exec, random_synopsis, random_descrip); } char *description(void) { return tdesc; } int usecount(void) { int res; STANDARD_USECOUNT(res); return res; } char *key() { return ASTERISK_GPL_KEY; }