ben 96/07/27 06:08:31
Modified: src conf.h http_config.c http_config.h http_core.c
http_core.h
Log:
Major rehash of setrlimit stuff, for two reasons, first, to make it compile,
and second, to remove much redundant code.
Revision Changes Path
1.26 +1 -0 apache/src/conf.h
Index: conf.h
===================================================================
RCS file: /export/home/cvs/apache/src/conf.h,v
retrieving revision 1.25
retrieving revision 1.26
diff -C3 -r1.25 -r1.26
*** conf.h 1996/07/25 19:49:03 1.25
--- conf.h 1996/07/27 13:08:27 1.26
***************
*** 217,222 ****
--- 217,223 ----
#define HAVE_SYS_SELECT_H
#define USE_FCNTL_SERIALIZED_ACCEPT
#define HAVE_MMAP
+ #define NEED_SYS_RESOURCE_H
#define SecureWare
/* Although SCO 5 defines these in <strings.h> (note the "s") they don't
have
1.15 +1 -0 apache/src/http_config.c
Index: http_config.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -C3 -r1.14 -r1.15
*** http_config.c 1996/07/16 19:39:12 1.14
--- http_config.c 1996/07/27 13:08:28 1.15
***************
*** 395,400 ****
--- 395,401 ----
return pstrcat (parms->pool, cmd->name, " not allowed here", NULL);
parms->info = cmd->cmd_data;
+ parms->cmd = cmd;
switch (cmd->args_how) {
case RAW_ARGS:
1.8 +1 -0 apache/src/http_config.h
Index: http_config.h
===================================================================
RCS file: /export/home/cvs/apache/src/http_config.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -C3 -r1.7 -r1.8
*** http_config.h 1996/07/16 19:39:12 1.7
--- http_config.h 1996/07/27 13:08:28 1.8
***************
*** 123,128 ****
--- 123,129 ----
char *path; /* If configuring for a directory,
* pathname of that directory.
*/
+ command_rec *cmd; /* configuration command */
} cmd_parms;
/* This structure records the existence of handlers in a module... */
1.21 +50 -83 apache/src/http_core.c
Index: http_core.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_core.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -C3 -r1.20 -r1.21
*** http_core.c 1996/07/27 02:49:34 1.20
--- http_core.c 1996/07/27 13:08:29 1.21
***************
*** 839,859 ****
return NULL;
}
! char *set_limit_cpu (cmd_parms *cmd, core_dir_config *conf, char *arg)
{
- #ifdef RLIMIT_CPU
char *str;
! quad_t cur = 0;
! quad_t max = 0;
if ((str = getword_conf(cmd->pool, &arg)))
if (!strcasecmp(str, "max"))
! cur = conf->limit_cpu->rlim_max;
else
cur = atol(str);
else {
! log_error("Invalid parameters for RLimitCPU", cmd->server);
! return NULL;
}
if ((str = getword_conf(cmd->pool, &arg)))
--- 839,859 ----
return NULL;
}
! static void set_rlimit(cmd_parms *cmd, struct rlimit *limit, char *arg)
{
char *str;
! /* If your platform doesn't define rlim_t then typedef it in conf.h */
! rlim_t cur = 0;
! rlim_t max = 0;
if ((str = getword_conf(cmd->pool, &arg)))
if (!strcasecmp(str, "max"))
! cur = limit->rlim_max;
else
cur = atol(str);
else {
! log_printf(cmd->server, "Invalid parameters for %s", cmd->cmd->name);
! return;
}
if ((str = getword_conf(cmd->pool, &arg)))
***************
*** 861,957 ****
/* if we aren't running as root, cannot increase max */
if (geteuid()) {
! conf->limit_cpu->rlim_cur = cur;
if (max)
! log_error("Must be uid 0 to raise maximum RLIMIT_CPU", cmd->server);
}
else {
if (cur)
! conf->limit_cpu->rlim_cur = cur;
if (max)
! conf->limit_cpu->rlim_max = max;
}
- #else
- log_error("RLimitCPU not supported on this platform", cmd->server);
- #endif
- return NULL;
}
! char *set_limit_mem (cmd_parms *cmd, core_dir_config *conf, char *arg)
{
! #if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM)
! char *str;
! quad_t cur = 0;
! quad_t max = 0;
!
! if ((str = getword_conf(cmd->pool, &arg)))
! if (!strcasecmp(str, "max"))
! cur = conf->limit_mem->rlim_max;
! else
! cur = atol(str);
! else {
! log_error("Invalid parameters for RLimitMEM", cmd->server);
! return NULL;
! }
!
! if ((str = getword_conf(cmd->pool, &arg)))
! max = atol(str);
! /* if we aren't running as root, cannot increase max */
! if (geteuid()) {
! conf->limit_mem->rlim_cur = cur;
! if (max)
! log_error("Must be uid 0 to change maximum RLIMIT_MEM",
cmd->server);
! }
! else {
! if (cur)
! conf->limit_mem->rlim_cur = cur;
! if (max)
! conf->limit_mem->rlim_max = max;
! }
! #else
! log_error("RLimitMEM not supported on this platform", cmd->server);
#endif
return NULL;
}
char *set_limit_nproc (cmd_parms *cmd, core_dir_config *conf, char *arg)
{
! #ifdef RLIMIT_NPROC
! char *str;
! quad_t cur = 0;
! quad_t max = 0;
!
! if ((str = getword_conf(cmd->pool, &arg)))
! if (!strcasecmp(str, "max"))
! cur = conf->limit_nproc->rlim_max;
! else
! cur = atol(str);
! else {
! log_error("Invalid parameters for RLimitNPROC", cmd->server);
! return NULL;
! }
!
! if ((str = getword_conf(cmd->pool, &arg)))
! max = atol(str);
!
! /* if we aren't running as root, cannot increase max */
! if (geteuid()) {
! conf->limit_nproc->rlim_cur = cur;
! if (max)
! log_error("Must be uid 0 to raise maximum RLIMIT_NPROC",
cmd->server);
! }
! else {
! if (cur)
! conf->limit_nproc->rlim_cur = cur;
! if (max)
! conf->limit_nproc->rlim_max = max;
! }
! #else
! log_error("RLimitNPROC not supported on this platform", cmd->server);
! #endif
return NULL;
}
char *set_bind_address (cmd_parms *cmd, void *dummy, char *arg) {
bind_address.s_addr = get_virthost_addr (arg, NULL);
--- 861,909 ----
/* if we aren't running as root, cannot increase max */
if (geteuid()) {
! limit->rlim_cur = cur;
if (max)
! log_printf(cmd->server, "Must be uid 0 to raise maximum %s",
! cmd->cmd->name);
}
else {
if (cur)
! limit->rlim_cur = cur;
if (max)
! limit->rlim_max = max;
}
}
! static char *no_set_limit (cmd_parms *cmd, core_dir_config *conf, char *arg)
{
! log_printf(cmd->server, "%s not supported on this platform",
! cmd->cmd->name);
! return NULL;
! }
! #ifdef RLIMIT_CPU
! char *set_limit_cpu (cmd_parms *cmd, core_dir_config *conf, char *arg)
! {
! set_rlimit(cmd,conf->limit_cpu,arg);
! return NULL;
! }
#endif
+
+ #if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM)
+ char *set_limit_mem (cmd_parms *cmd, core_dir_config *conf, char *arg)
+ {
+ set_rlimit(cmd,conf->limit_mem,arg);
return NULL;
}
+ #endif
+ #ifdef RLIMIT_NPROC
char *set_limit_nproc (cmd_parms *cmd, core_dir_config *conf, char *arg)
{
! set_rlimit(cmd,conf->limit_nproc,arg);
return NULL;
}
+ #endif
char *set_bind_address (cmd_parms *cmd, void *dummy, char *arg) {
bind_address.s_addr = get_virthost_addr (arg, NULL);
***************
*** 1064,1074 ****
{ "ServersSafetyLimit", set_server_limit, NULL, RSRC_CONF, TAKE1, NULL },
{ "MaxClients", set_server_limit, NULL, RSRC_CONF, TAKE1, NULL },
{ "MaxRequestsPerChild", set_max_requests, NULL, RSRC_CONF, TAKE1, NULL },
! { "RLimitCPU", set_limit_cpu, (void*)XtOffsetOf(core_dir_config, limit_cpu),
OR_ALL, RAW_ARGS, "soft/hard limits for max CPU usage in seconds" },
! { "RLimitMEM", set_limit_mem, (void*)XtOffsetOf(core_dir_config, limit_mem),
OR_ALL, RAW_ARGS, "soft/hard limits for max memory usage per process"
},
! { "RLimitNPROC", set_limit_nproc, (void*)XtOffsetOf(core_dir_config,
limit_nproc),
OR_ALL, RAW_ARGS, "soft/hard limits for max number of processes per
uid" },
{ "BindAddress", set_bind_address, NULL, RSRC_CONF, TAKE1,
"'*', a numeric IP address, or the name of a host with a unique IP
address"},
--- 1016,1041 ----
{ "ServersSafetyLimit", set_server_limit, NULL, RSRC_CONF, TAKE1, NULL },
{ "MaxClients", set_server_limit, NULL, RSRC_CONF, TAKE1, NULL },
{ "MaxRequestsPerChild", set_max_requests, NULL, RSRC_CONF, TAKE1, NULL },
! { "RLimitCPU",
! #ifdef RMLIMIT_CPU
! set_limit_cpu, (void*)XtOffsetOf(core_dir_config, limit_cpu),
! #else
! no_set_limit, NULL,
! #endif
OR_ALL, RAW_ARGS, "soft/hard limits for max CPU usage in seconds" },
! { "RLimitMEM",
! #if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM)
! set_limit_mem, (void*)XtOffsetOf(core_dir_config, limit_mem),
! #else
! no_set_limit, NULL,
! #endif
OR_ALL, RAW_ARGS, "soft/hard limits for max memory usage per process"
},
! { "RLimitNPROC",
! #ifdef RLIMIT_NPROC
! set_limit_nproc, (void*)XtOffsetOf(core_dir_config, limit_nproc),
! #else
! no_set_limit, NULL,
! #endif
OR_ALL, RAW_ARGS, "soft/hard limits for max number of processes per
uid" },
{ "BindAddress", set_bind_address, NULL, RSRC_CONF, TAKE1,
"'*', a numeric IP address, or the name of a host with a unique IP
address"},
1.9 +5 -2 apache/src/http_core.h
Index: http_core.h
===================================================================
RCS file: /export/home/cvs/apache/src/http_core.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C3 -r1.8 -r1.9
*** http_core.h 1996/07/27 02:49:35 1.8
--- http_core.h 1996/07/27 13:08:29 1.9
***************
*** 108,113 ****
--- 108,116 ----
#ifdef CORE_PRIVATE
+ #ifdef NEED_SYS_RESOURCE_H
+ #include <sys/resource.h>
+ #endif
/*
* Core is also unlike other modules in being implemented in more than
* one file... so, data structures are declared here, even though most of
***************
*** 156,165 ****
#ifdef RLIMIT_CPU
struct rlimit *limit_cpu;
#endif
! #if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM)
struct rlimit *limit_mem;
#endif
! #ifdef RLIMIT_NPROC
struct rlimit *limit_nproc;
#endif
--- 159,168 ----
#ifdef RLIMIT_CPU
struct rlimit *limit_cpu;
#endif
! #if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM)
struct rlimit *limit_mem;
#endif
! #ifdef RLIMIT_NPROC
struct rlimit *limit_nproc;
#endif