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

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"
Include dependency graph for res_limit.c:

Go to the source code of this file.

Data Structures

struct  limits
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (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 __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Resource limits" , .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_cli_entry cli_ulimit
 
static const struct limits limits []
 

Detailed Description

Resource limits.

Author
Tilghman Lesher res_l.nosp@m.imit.nosp@m._2006.nosp@m.07@t.nosp@m.he-ti.nosp@m.lghm.nosp@m.an.co.nosp@m.m

Definition in file res_limit.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 215 of file res_limit.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 215 of file res_limit.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 215 of file res_limit.c.

◆ complete_ulimit()

static char * complete_ulimit ( struct ast_cli_args a)
static

Definition at line 86 of file res_limit.c.

87{
88 int which = 0, i;
89 int wordlen = strlen(a->word);
90
91 if (a->pos > 1)
92 return NULL;
93 for (i = 0; i < ARRAY_LEN(limits); i++) {
94 if (!strncasecmp(limits[i].clicmd, a->word, wordlen)) {
95 if (++which > a->n)
96 return ast_strdup(limits[i].clicmd);
97 }
98 }
99 return NULL;
100}
#define ast_strdup(str)
A wrapper for strdup()
Definition astmm.h:241
#define NULL
Definition resample.c:96
static struct test_val a
#define ARRAY_LEN(a)
Definition utils.h:703

References a, ARRAY_LEN, ast_strdup, and NULL.

Referenced by handle_cli_ulimit().

◆ handle_cli_ulimit()

static char * handle_cli_ulimit ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 102 of file res_limit.c.

103{
104 int resource;
105 struct rlimit rlimit = { 0, 0 };
106
107 switch (cmd) {
108 case CLI_INIT:
109 e->command = "ulimit";
110 e->usage =
111 "Usage: ulimit {data|"
112#ifdef RLIMIT_RSS
113 "limit|"
114#endif
115 "file|"
116#ifdef RLIMIT_RSS
117 "memory|"
118#endif
119 "stack|time|"
120#ifdef RLIMIT_NPROC
121 "processes|"
122#endif
123#ifdef VMEM_DEF
124 "virtual|"
125#endif
126 "core|descriptors} [<num>]\n"
127 " Shows or sets the corresponding resource limit.\n"
128 " data Process data segment [readonly]\n"
129#ifdef RLIMIT_RSS
130 " lock Memory lock size [readonly]\n"
131#endif
132 " file File size\n"
133#ifdef RLIMIT_RSS
134 " memory Process resident memory [readonly]\n"
135#endif
136 " stack Process stack size [readonly]\n"
137 " time CPU usage [readonly]\n"
138#ifdef RLIMIT_NPROC
139 " processes Child processes\n"
140#endif
141#ifdef VMEM_DEF
142 " virtual Process virtual memory [readonly]\n"
143#endif
144 " core Core dump file size\n"
145 " descriptors Number of file descriptors\n";
146 return NULL;
147 case CLI_GENERATE:
148 return complete_ulimit(a);
149 }
150
151 if (a->argc > 3)
152 return CLI_SHOWUSAGE;
153
154 if (a->argc == 1) {
155 char arg2[15];
156 const char * const newargv[2] = { "ulimit", arg2 };
157 for (resource = 0; resource < ARRAY_LEN(limits); resource++) {
158 struct ast_cli_args newArgs = { .argv = newargv, .argc = 2 };
159 ast_copy_string(arg2, limits[resource].clicmd, sizeof(arg2));
160 handle_cli_ulimit(e, CLI_HANDLER, &newArgs);
161 }
162 return CLI_SUCCESS;
163 } else {
164 resource = str2limit(a->argv[1]);
165 if (resource == -1) {
166 ast_cli(a->fd, "Unknown resource\n");
167 return CLI_FAILURE;
168 }
169
170 if (a->argc == 3) {
171 int x;
172#ifdef RLIMIT_NPROC
173 if (resource != RLIMIT_NOFILE && resource != RLIMIT_CORE && resource != RLIMIT_NPROC && resource != RLIMIT_FSIZE) {
174#else
175 if (resource != RLIMIT_NOFILE && resource != RLIMIT_CORE && resource != RLIMIT_FSIZE) {
176#endif
177 ast_cli(a->fd, "Resource not permitted to be set\n");
178 return CLI_FAILURE;
179 }
180
181 sscanf(a->argv[2], "%30d", &x);
182 rlimit.rlim_max = rlimit.rlim_cur = x;
183 setrlimit(resource, &rlimit);
184 return CLI_SUCCESS;
185 } else {
186 if (!getrlimit(resource, &rlimit)) {
187 char printlimit[32];
188 const char *desc;
189 if (rlimit.rlim_max == RLIM_INFINITY)
190 ast_copy_string(printlimit, "effectively unlimited", sizeof(printlimit));
191 else
192 snprintf(printlimit, sizeof(printlimit), "limited to %d", (int) rlimit.rlim_cur);
193 desc = str2desc(a->argv[1]);
194 ast_cli(a->fd, "%c%s (%s) is %s.\n", toupper(desc[0]), desc + 1, a->argv[1], printlimit);
195 } else
196 ast_cli(a->fd, "Could not retrieve resource limits for %s: %s\n", str2desc(a->argv[1]), strerror(errno));
197 return CLI_SUCCESS;
198 }
199 }
200}
static const char desc[]
Definition cdr_radius.c:84
#define CLI_SHOWUSAGE
Definition cli.h:45
#define CLI_SUCCESS
Definition cli.h:44
void ast_cli(int fd, const char *fmt,...)
Definition clicompat.c:6
@ CLI_HANDLER
Definition cli.h:154
@ CLI_INIT
Definition cli.h:152
@ CLI_GENERATE
Definition cli.h:153
#define CLI_FAILURE
Definition cli.h:46
int errno
static const char * str2desc(const char *string)
Definition res_limit.c:76
static char * handle_cli_ulimit(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition res_limit.c:102
static char * complete_ulimit(struct ast_cli_args *a)
Definition res_limit.c:86
static int str2limit(const char *string)
Definition res_limit.c:66
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition strings.h:425
const char *const * argv
Definition cli.h:161
char * command
Definition cli.h:186
const char * usage
Definition cli.h:177

References a, 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, handle_cli_ulimit(), NULL, str2desc(), str2limit(), and ast_cli_entry::usage.

Referenced by handle_cli_ulimit().

◆ load_module()

static int load_module ( void  )
static

Definition at line 210 of file res_limit.c.

211{
213}
#define ast_cli_register(e)
Registers a command or an array of commands.
Definition cli.h:256
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition module.h:78
static struct ast_cli_entry cli_ulimit
Definition res_limit.c:202

References ast_cli_register, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, and cli_ulimit.

◆ str2desc()

static const char * str2desc ( const char *  string)
static

Definition at line 76 of file res_limit.c.

77{
78 size_t i;
79 for (i = 0; i < ARRAY_LEN(limits); i++) {
80 if (!strcmp(string, limits[i].clicmd))
81 return limits[i].desc;
82 }
83 return "<unknown>";
84}

References ARRAY_LEN, and desc.

Referenced by handle_cli_ulimit().

◆ str2limit()

static int str2limit ( const char *  string)
static

Definition at line 66 of file res_limit.c.

67{
68 size_t i;
69 for (i = 0; i < ARRAY_LEN(limits); i++) {
70 if (!strcasecmp(string, limits[i].clicmd))
71 return limits[i].resource;
72 }
73 return -1;
74}

References ARRAY_LEN.

Referenced by handle_cli_ulimit().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 205 of file res_limit.c.

206{
208}
int ast_cli_unregister(struct ast_cli_entry *e)
Unregisters a command or an array of commands.
Definition main/cli.c:2408

References ast_cli_unregister(), and cli_ulimit.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Resource limits" , .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 215 of file res_limit.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 215 of file res_limit.c.

◆ cli_ulimit

struct ast_cli_entry cli_ulimit
static
Initial value:
=
{ .handler = handle_cli_ulimit , .summary = "Set or show process resource limits" ,}

Definition at line 202 of file res_limit.c.

Referenced by load_module(), and unload_module().

◆ limits

const struct limits limits[]
static