Add optional call limit

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5712 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2-netsec
Mark Spencer 20 years ago
parent 9f9fcca6c0
commit 38b7f7b4a4

Binary file not shown.

@ -87,6 +87,7 @@ int option_timestamp = 0;
int option_overrideconfig = 0; int option_overrideconfig = 0;
int option_reconnect = 0; int option_reconnect = 0;
int option_transcode_slin = 1; int option_transcode_slin = 1;
int option_maxcalls = 0;
int fully_booted = 0; int fully_booted = 0;
char record_cache_dir[AST_CACHE_DIR_LEN] = AST_TMP_DIR; char record_cache_dir[AST_CACHE_DIR_LEN] = AST_TMP_DIR;
char debug_filename[AST_FILENAME_MAX] = ""; char debug_filename[AST_FILENAME_MAX] = "";
@ -1658,6 +1659,11 @@ static void ast_readconfig(void) {
/* Build transcode paths via SLINEAR, instead of directly */ /* Build transcode paths via SLINEAR, instead of directly */
} else if (!strcasecmp(v->name, "transcode_via_sln")) { } else if (!strcasecmp(v->name, "transcode_via_sln")) {
option_transcode_slin = ast_true(v->value); option_transcode_slin = ast_true(v->value);
} else if (!strcasecmp(v->name, "maxcalls")) {
if ((sscanf(v->value, "%d", &option_maxcalls) != 1) ||
(option_maxcalls < 0)) {
option_maxcalls = 0;
}
} }
v = v->next; v = v->next;
} }
@ -1711,7 +1717,7 @@ int main(int argc, char *argv[])
} }
*/ */
/* Check for options */ /* Check for options */
while((c=getopt(argc, argv, "tThfdvVqprRgcinx:U:G:C:")) != -1) { while((c=getopt(argc, argv, "tThfdvVqprRgcinx:U:G:C:M:")) != -1) {
switch(c) { switch(c) {
case 'd': case 'd':
option_debug++; option_debug++;
@ -1743,6 +1749,10 @@ int main(int argc, char *argv[])
option_verbose++; option_verbose++;
option_nofork++; option_nofork++;
break; break;
case 'M':
if ((sscanf(optarg, "%d", &option_maxcalls) != 1) || (option_maxcalls < 0))
option_maxcalls = 0;
break;
case 'q': case 'q':
option_quiet++; option_quiet++;
break; break;

@ -26,6 +26,7 @@
<arg><option>-U </option><replaceable class="parameter">user</replaceable></arg> <arg><option>-U </option><replaceable class="parameter">user</replaceable></arg>
<arg><option>-G </option><replaceable class="parameter">group</replaceable></arg> <arg><option>-G </option><replaceable class="parameter">group</replaceable></arg>
<arg><option>-x </option><replaceable class="parameter">command</replaceable></arg> <arg><option>-x </option><replaceable class="parameter">command</replaceable></arg>
<arg><option>-M </option><replaceable class="parameter">value</replaceable></arg>
</cmdsynopsis> </cmdsynopsis>
<cmdsynopsis> <cmdsynopsis>
@ -141,6 +142,16 @@
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term>-M <replaceable class="parameter">value</replaceable></term>
<listitem>
<para>
Limits the maximum number of calls to the specified value. This can
be useful to prevent a system from being brought down by terminating
too many simultaneous calls.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term>-n</term> <term>-n</term>
<listitem> <listitem>

@ -429,8 +429,13 @@ static int handle_chanlist(int fd, int argc, char *argv[])
ast_mutex_unlock(&c->lock); ast_mutex_unlock(&c->lock);
c = ast_channel_walk_locked(c); c = ast_channel_walk_locked(c);
} }
if(!concise) if(!concise) {
ast_cli(fd, "%d active channel(s)\n", numchans); ast_cli(fd, "%d active channel(s)\n", numchans);
if (option_maxcalls)
ast_cli(fd, "%d of %d max active call(s) (%5.2f%% of capacity)\n", ast_active_calls(), option_maxcalls, ((float)ast_active_calls() / (float)option_maxcalls) * 100.0);
else
ast_cli(fd, "%d active call(s)\n", ast_active_calls());
}
return RESULT_SUCCESS; return RESULT_SUCCESS;
} }

@ -33,6 +33,7 @@ extern int option_exec_includes;
extern int option_cache_record_files; extern int option_cache_record_files;
extern int option_timestamp; extern int option_timestamp;
extern int option_transcode_slin; extern int option_transcode_slin;
extern int option_maxcalls;
extern char defaultlanguage[]; extern char defaultlanguage[];
extern time_t ast_startuptime; extern time_t ast_startuptime;
extern time_t ast_lastreloadtime; extern time_t ast_lastreloadtime;

@ -602,6 +602,9 @@ int ast_async_goto_if_exists(struct ast_channel *chan, char* context, char *exte
struct ast_custom_function* ast_custom_function_find(char *name); struct ast_custom_function* ast_custom_function_find(char *name);
int ast_custom_function_unregister(struct ast_custom_function *acf); int ast_custom_function_unregister(struct ast_custom_function *acf);
int ast_custom_function_register(struct ast_custom_function *acf); int ast_custom_function_register(struct ast_custom_function *acf);
/* Number of active calls */
int ast_active_calls(void);
/*! executes a read operation on a function */ /*! executes a read operation on a function */
/*! /*!

33
pbx.c

@ -213,6 +213,9 @@ static struct varshead globals;
static int autofallthrough = 0; static int autofallthrough = 0;
AST_MUTEX_DEFINE_STATIC(maxcalllock);
static int countcalls = 0;
AST_MUTEX_DEFINE_STATIC(acflock); /* Lock for the custom function list */ AST_MUTEX_DEFINE_STATIC(acflock); /* Lock for the custom function list */
static struct ast_custom_function *acf_root = NULL; static struct ast_custom_function *acf_root = NULL;
@ -2232,7 +2235,7 @@ int ast_exec_extension(struct ast_channel *c, const char *context, const char *e
return pbx_extension_helper(c, NULL, context, exten, priority, NULL, callerid, HELPER_EXEC); return pbx_extension_helper(c, NULL, context, exten, priority, NULL, callerid, HELPER_EXEC);
} }
int ast_pbx_run(struct ast_channel *c) static int __ast_pbx_run(struct ast_channel *c)
{ {
int firstpass = 1; int firstpass = 1;
char digit; char digit;
@ -2497,6 +2500,34 @@ int ast_pbx_start(struct ast_channel *c)
return 0; return 0;
} }
int ast_pbx_run(struct ast_channel *c)
{
int res = 0;
ast_mutex_lock(&maxcalllock);
if (option_maxcalls) {
if (countcalls >= option_maxcalls) {
ast_log(LOG_NOTICE, "Maximum call limit of %d calls exceeded by '%s'!\n", option_maxcalls, c->name);
res = -1;
}
}
if (!res)
countcalls++;
ast_mutex_unlock(&maxcalllock);
if (!res) {
res = __ast_pbx_run(c);
ast_mutex_lock(&maxcalllock);
if (countcalls > 0)
countcalls--;
ast_mutex_unlock(&maxcalllock);
}
return res;
}
int ast_active_calls(void)
{
return countcalls;
}
int pbx_set_autofallthrough(int newval) int pbx_set_autofallthrough(int newval)
{ {
int oldval; int oldval;

Loading…
Cancel
Save