1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/* ISC license. */
#include <sys/types.h>
#include <sys/resource.h>
#include <skalibs/strerr2.h>
#include <skalibs/sgetopt.h>
#include <skalibs/uint64.h>
#include <skalibs/djbunix.h>
#define USAGE "s6-softlimit [ -a allbytes ] [ -c corebytes ] [ -d databytes ] [ -f filebytes ] [ -l lockbytes ] [ -m membytes ] [ -o openfiles ] [ -p processes ] [ -r residentbytes ] [ -s stackbytes ] [ -t cpusecs ] prog..."
static void doit (int res, char const *arg)
{
struct rlimit r ;
if (getrlimit(res, &r) < 0) strerr_diefu1sys(111, "getrlimit") ;
if ((arg[0] == '=') && !arg[1]) r.rlim_cur = r.rlim_max ;
else
{
uint64 n ;
if (!uint640_scan(arg, &n)) strerr_dieusage(100, USAGE) ;
if (n > (uint64)r.rlim_max) n = (uint64)r.rlim_max ;
r.rlim_cur = (rlim_t)n ;
}
if (setrlimit(res, &r) < 0) strerr_diefu1sys(111, "setrlimit") ;
}
int main (int argc, char const *const *argv, char const *const *envp)
{
subgetopt_t l = SUBGETOPT_ZERO ;
PROG = "s6-softlimit" ;
for (;;)
{
register int opt = subgetopt_r(argc, argv, "a:c:d:f:l:m:o:p:r:s:t:", &l) ;
if (opt == -1) break ;
switch (opt)
{
case 'a' :
#ifdef RLIMIT_AS
doit(RLIMIT_AS, l.arg) ;
#endif
#ifdef RLIMIT_VMEM
doit(RLIMIT_VMEM, l.arg) ;
#endif
break ;
case 'c' :
#ifdef RLIMIT_CORE
doit(RLIMIT_CORE, l.arg) ;
#endif
break ;
case 'd' :
#ifdef RLIMIT_DATA
doit(RLIMIT_DATA, l.arg) ;
#endif
break ;
case 'f' :
#ifdef RLIMIT_FSIZE
doit(RLIMIT_FSIZE, l.arg) ;
#endif
break ;
case 'l' :
#ifdef RLIMIT_MEMLOCK
doit(RLIMIT_MEMLOCK, l.arg) ;
#endif
break ;
case 'm' :
#ifdef RLIMIT_DATA
doit(RLIMIT_DATA, l.arg) ;
#endif
#ifdef RLIMIT_STACK
doit(RLIMIT_STACK, l.arg) ;
#endif
#ifdef RLIMIT_MEMLOCK
doit(RLIMIT_MEMLOCK, l.arg) ;
#endif
#ifdef RLIMIT_VMEM
doit(RLIMIT_VMEM, l.arg) ;
#endif
#ifdef RLIMIT_AS
doit(RLIMIT_AS, l.arg) ;
#endif
break ;
case 'o' :
#ifdef RLIMIT_NOFILE
doit(RLIMIT_NOFILE, l.arg) ;
#endif
#ifdef RLIMIT_OFILE
doit(RLIMIT_OFILE, l.arg) ;
#endif
break ;
case 'p' :
#ifdef RLIMIT_NPROC
doit(RLIMIT_NPROC, l.arg) ;
#endif
break ;
case 'r' :
#ifdef RLIMIT_RSS
doit(RLIMIT_RSS, l.arg) ;
#endif
break ;
case 's' :
#ifdef RLIMIT_STACK
doit(RLIMIT_STACK, l.arg) ;
#endif
break ;
case 't' :
#ifdef RLIMIT_CPU
doit(RLIMIT_CPU, l.arg) ;
#endif
break ;
}
}
argc -= l.ind ; argv += l.ind ;
if (!argc) strerr_dieusage(100, USAGE) ;
pathexec_run(argv[0], argv, envp) ;
strerr_dieexec(111, argv[0]) ;
}
|