From 935c80d5e6ae1f562c47591f10e9102cedd93f8c Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Tue, 10 Jan 2006 00:55:45 +0000 Subject: [PATCH] Bug 5961 - new RAND() function git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7920 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- asterisk.c | 4 +- funcs/func_rand.c | 143 +++++++++++++++++++++++++++++++++++++++ include/asterisk/utils.h | 6 ++ utils.c | 13 ++++ 4 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 funcs/func_rand.c diff --git a/asterisk.c b/asterisk.c index 3563b41b24..b2ab024611 100644 --- a/asterisk.c +++ b/asterisk.c @@ -211,6 +211,8 @@ static int shuttingdown = 0; static int restartnow = 0; static pthread_t consolethread = AST_PTHREADT_NULL; +static char randompool[256]; + #if !defined(LOW_MEMORY) struct file_version { AST_LIST_ENTRY(file_version) list; @@ -2288,7 +2290,7 @@ int main(int argc, char *argv[]) Asterisk is started */ srand((unsigned int) getpid() + (unsigned int) time(NULL)); - srandom((unsigned int) getpid() + (unsigned int) time(NULL)); + initstate((unsigned int) getpid() * 65536 + (unsigned int) time(NULL), randompool, sizeof(randompool)); if (init_logger()) { printf(term_quit()); diff --git a/funcs/func_rand.c b/funcs/func_rand.c new file mode 100644 index 0000000000..dbd82c941b --- /dev/null +++ b/funcs/func_rand.c @@ -0,0 +1,143 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 2006, Digium, Inc. + * Copyright (C) 2006, Claude Patry + * + * 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. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +/*! \file + * + * \brief Generate Random Number + * + * \author Claude Patry + * \author Tilghman Lesher ( http://asterisk.drunkcoder.com/ ) + */ + +#include +#include +#include +#include + +#include "asterisk.h" + +/* ASTERISK_FILE_VERSION(__FILE__, "$Revision: 7682 $") */ + +#include "asterisk/channel.h" +#include "asterisk/pbx.h" +#include "asterisk/logger.h" +#include "asterisk/utils.h" +#include "asterisk/app.h" +#ifndef BUILTIN_FUNC +#include "asterisk/module.h" +#endif + + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + + +static char *acf_rand_exec(struct ast_channel *chan, char *cmd, char *data, char *buffer, size_t buflen) +{ + struct localuser *u; + char *args[2] = { "", "" }, *s; + int min_int, response_int, max_int; + + LOCAL_USER_ACF_ADD(u); + + if (!(s = ast_strdupa(data))) { + ast_log(LOG_WARNING, "Out of memory\n"); + *buffer = '\0'; + LOCAL_USER_REMOVE(u); + return buffer; + } + + ast_app_separate_args(s, '|', args, sizeof(args) / sizeof(args[0])); + + if (ast_strlen_zero(args[0]) || sscanf(args[0], "%d", &min_int) != 1) { + min_int = 0; + } + + if (ast_strlen_zero(args[1]) || sscanf(args[1], "%d", &max_int) != 1) { + max_int = RAND_MAX; + } + + if (max_int < min_int) { + int tmp = max_int; + max_int = min_int; + min_int = tmp; + ast_log(LOG_DEBUG, "max