Resource limits. More...
#include "asterisk.h"#include <ctype.h>#include <sys/time.h>#include <sys/resource.h>#include "asterisk/module.h"#include "asterisk/cli.h"
Go to the source code of this file.
Data Structures | |
| struct | limits |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| static char * | complete_ulimit (struct ast_cli_args *a) |
| static char * | handle_cli_ulimit (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
| static int | load_module (void) |
| static const char * | str2desc (const char *string) |
| static int | str2limit (const char *string) |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Resource limits" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ast_cli_entry | cli_ulimit |
| static struct limits | limits [] |
Resource limits.
Definition in file res_limit.c.
| static void __reg_module | ( | void | ) | [static] |
Definition at line 214 of file res_limit.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 214 of file res_limit.c.
| static char* complete_ulimit | ( | struct ast_cli_args * | a | ) | [static] |
Definition at line 85 of file res_limit.c.
References ARRAY_LEN, ast_strdup, ast_cli_args::n, ast_cli_args::pos, and ast_cli_args::word.
Referenced by handle_cli_ulimit().
| static char* handle_cli_ulimit | ( | struct ast_cli_entry * | e, |
| int | cmd, | ||
| struct ast_cli_args * | a | ||
| ) | [static] |
Definition at line 101 of file res_limit.c.
References ast_cli_args::argc, ast_cli_args::argv, ARRAY_LEN, ast_cli(), ast_copy_string(), CLI_FAILURE, CLI_GENERATE, CLI_HANDLER, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, complete_ulimit(), desc, errno, ast_cli_args::fd, str2desc(), str2limit(), and ast_cli_entry::usage.
{
int resource;
struct rlimit rlimit = { 0, 0 };
switch (cmd) {
case CLI_INIT:
e->command = "ulimit";
e->usage =
"Usage: ulimit {data|"
#ifdef RLIMIT_RSS
"limit|"
#endif
"file|"
#ifdef RLIMIT_RSS
"memory|"
#endif
"stack|time|"
#ifdef RLIMIT_NPROC
"processes|"
#endif
#ifdef VMEM_DEF
"virtual|"
#endif
"core|descriptors} [<num>]\n"
" Shows or sets the corresponding resource limit.\n"
" data Process data segment [readonly]\n"
#ifdef RLIMIT_RSS
" lock Memory lock size [readonly]\n"
#endif
" file File size\n"
#ifdef RLIMIT_RSS
" memory Process resident memory [readonly]\n"
#endif
" stack Process stack size [readonly]\n"
" time CPU usage [readonly]\n"
#ifdef RLIMIT_NPROC
" processes Child processes\n"
#endif
#ifdef VMEM_DEF
" virtual Process virtual memory [readonly]\n"
#endif
" core Core dump file size\n"
" descriptors Number of file descriptors\n";
return NULL;
case CLI_GENERATE:
return complete_ulimit(a);
}
if (a->argc > 3)
return CLI_SHOWUSAGE;
if (a->argc == 1) {
char arg2[15];
char *newargv[2] = { "ulimit", arg2 };
for (resource = 0; resource < ARRAY_LEN(limits); resource++) {
struct ast_cli_args newArgs = { .argv = newargv, .argc = 2 };
ast_copy_string(arg2, limits[resource].clicmd, sizeof(arg2));
handle_cli_ulimit(e, CLI_HANDLER, &newArgs);
}
return CLI_SUCCESS;
} else {
resource = str2limit(a->argv[1]);
if (resource == -1) {
ast_cli(a->fd, "Unknown resource\n");
return CLI_FAILURE;
}
if (a->argc == 3) {
int x;
#ifdef RLIMIT_NPROC
if (resource != RLIMIT_NOFILE && resource != RLIMIT_CORE && resource != RLIMIT_NPROC && resource != RLIMIT_FSIZE) {
#else
if (resource != RLIMIT_NOFILE && resource != RLIMIT_CORE && resource != RLIMIT_FSIZE) {
#endif
ast_cli(a->fd, "Resource not permitted to be set\n");
return CLI_FAILURE;
}
sscanf(a->argv[2], "%30d", &x);
rlimit.rlim_max = rlimit.rlim_cur = x;
setrlimit(resource, &rlimit);
return CLI_SUCCESS;
} else {
if (!getrlimit(resource, &rlimit)) {
char printlimit[32];
const char *desc;
if (rlimit.rlim_max == RLIM_INFINITY)
ast_copy_string(printlimit, "effectively unlimited", sizeof(printlimit));
else
snprintf(printlimit, sizeof(printlimit), "limited to %d", (int) rlimit.rlim_cur);
desc = str2desc(a->argv[1]);
ast_cli(a->fd, "%c%s (%s) is %s.\n", toupper(desc[0]), desc + 1, a->argv[1], printlimit);
} else
ast_cli(a->fd, "Could not retrieve resource limits for %s: %s\n", str2desc(a->argv[1]), strerror(errno));
return CLI_SUCCESS;
}
}
}
| static int load_module | ( | void | ) | [static] |
Definition at line 209 of file res_limit.c.
References ast_cli_register(), AST_MODULE_LOAD_FAILURE, and AST_MODULE_LOAD_SUCCESS.
{
return ast_cli_register(&cli_ulimit) ? AST_MODULE_LOAD_FAILURE : AST_MODULE_LOAD_SUCCESS;
}
| static const char* str2desc | ( | const char * | string | ) | [static] |
Definition at line 75 of file res_limit.c.
References ARRAY_LEN, and desc.
Referenced by handle_cli_ulimit().
| static int str2limit | ( | const char * | string | ) | [static] |
| static int unload_module | ( | void | ) | [static] |
Definition at line 204 of file res_limit.c.
References ast_cli_unregister().
{
return ast_cli_unregister(&cli_ulimit);
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Resource limits" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 214 of file res_limit.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 214 of file res_limit.c.
struct ast_cli_entry cli_ulimit [static] |
AST_CLI_DEFINE(handle_cli_ulimit, "Set or show process resource limits")
Definition at line 201 of file res_limit.c.