1 39cff6e7 2004-10-17 devnull #include <u.h>
2 39cff6e7 2004-10-17 devnull #include <sys/time.h>
3 39cff6e7 2004-10-17 devnull #include <sys/resource.h>
4 39cff6e7 2004-10-17 devnull #include <libc.h>
5 39cff6e7 2004-10-17 devnull #include "rc.h"
6 39cff6e7 2004-10-17 devnull #include "exec.h"
7 39cff6e7 2004-10-17 devnull #include "io.h"
8 39cff6e7 2004-10-17 devnull #include "fns.h"
9 39cff6e7 2004-10-17 devnull #include "getflags.h"
11 39cff6e7 2004-10-17 devnull extern char **mkargv(word*);
12 39cff6e7 2004-10-17 devnull extern int mapfd(int);
14 39cff6e7 2004-10-17 devnull static char *eargs = "cdflmnstuv";
15 39cff6e7 2004-10-17 devnull static int rlx[] = {
16 39cff6e7 2004-10-17 devnull RLIMIT_CORE,
17 39cff6e7 2004-10-17 devnull RLIMIT_DATA,
18 39cff6e7 2004-10-17 devnull RLIMIT_FSIZE,
19 39cff6e7 2004-10-17 devnull RLIMIT_MEMLOCK,
20 39cff6e7 2004-10-17 devnull RLIMIT_RSS,
21 39cff6e7 2004-10-17 devnull RLIMIT_NOFILE,
22 39cff6e7 2004-10-17 devnull RLIMIT_STACK,
23 39cff6e7 2004-10-17 devnull RLIMIT_CPU,
24 39cff6e7 2004-10-17 devnull RLIMIT_NPROC,
25 39cff6e7 2004-10-17 devnull RLIMIT_RSS,
28 39cff6e7 2004-10-17 devnull static void
29 39cff6e7 2004-10-17 devnull eusage(void)
31 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "usage: ulimit [-SHa%s [limit]]\n", eargs);
34 39cff6e7 2004-10-17 devnull #define Notset -4
35 39cff6e7 2004-10-17 devnull #define Unlimited -3
36 39cff6e7 2004-10-17 devnull #define Hard -2
37 39cff6e7 2004-10-17 devnull #define Soft -1
40 39cff6e7 2004-10-17 devnull execulimit(void)
42 39cff6e7 2004-10-17 devnull int fd, n, argc, sethard, setsoft, limit;
43 39cff6e7 2004-10-17 devnull int flag[256];
44 39cff6e7 2004-10-17 devnull char **argv, **oargv, *p;
45 39cff6e7 2004-10-17 devnull char *argv0;
46 39cff6e7 2004-10-17 devnull struct rlimit rl;
48 39cff6e7 2004-10-17 devnull argv0 = nil;
49 39cff6e7 2004-10-17 devnull setstatus("");
50 39cff6e7 2004-10-17 devnull oargv = mkargv(runq->argv->words);
51 39cff6e7 2004-10-17 devnull argv = oargv+1;
52 39cff6e7 2004-10-17 devnull for(argc=0; argv[argc]; argc++)
55 39cff6e7 2004-10-17 devnull memset(flag, 0, sizeof flag);
56 39cff6e7 2004-10-17 devnull ARGBEGIN{
58 39cff6e7 2004-10-17 devnull if(strchr(eargs, ARGC()) == nil){
59 39cff6e7 2004-10-17 devnull eusage();
62 39cff6e7 2004-10-17 devnull case 'S':
63 39cff6e7 2004-10-17 devnull case 'H':
64 39cff6e7 2004-10-17 devnull case 'a':
65 39cff6e7 2004-10-17 devnull flag[ARGC()] = 1;
69 39cff6e7 2004-10-17 devnull if(argc > 1){
70 39cff6e7 2004-10-17 devnull eusage();
71 39cff6e7 2004-10-17 devnull goto out;
74 39cff6e7 2004-10-17 devnull fd = mapfd(1);
76 39cff6e7 2004-10-17 devnull sethard = 1;
77 39cff6e7 2004-10-17 devnull setsoft = 1;
78 39cff6e7 2004-10-17 devnull if(flag['S'] && flag['H'])
80 39cff6e7 2004-10-17 devnull else if(flag['S'])
81 39cff6e7 2004-10-17 devnull sethard = 0;
82 39cff6e7 2004-10-17 devnull else if(flag['H'])
83 39cff6e7 2004-10-17 devnull setsoft = 0;
85 39cff6e7 2004-10-17 devnull limit = Notset;
86 39cff6e7 2004-10-17 devnull if(argc>0){
87 39cff6e7 2004-10-17 devnull if(strcmp(argv[0], "unlimited") == 0)
88 39cff6e7 2004-10-17 devnull limit = Unlimited;
89 39cff6e7 2004-10-17 devnull else if(strcmp(argv[0], "hard") == 0)
90 39cff6e7 2004-10-17 devnull limit = Hard;
91 39cff6e7 2004-10-17 devnull else if(strcmp(argv[0], "soft") == 0)
92 39cff6e7 2004-10-17 devnull limit = Soft;
93 39cff6e7 2004-10-17 devnull else if((limit = strtol(argv[0], &p, 0)) < 0 || *p != 0){
94 39cff6e7 2004-10-17 devnull eusage();
95 39cff6e7 2004-10-17 devnull goto out;
98 39cff6e7 2004-10-17 devnull if(flag['a']){
99 39cff6e7 2004-10-17 devnull for(p=eargs; *p; p++){
100 39cff6e7 2004-10-17 devnull getrlimit(rlx[p-eargs], &rl);
101 39cff6e7 2004-10-17 devnull n = flag['H'] ? rl.rlim_max : rl.rlim_cur;
102 39cff6e7 2004-10-17 devnull if(n == -1)
103 39cff6e7 2004-10-17 devnull fprint(fd, "ulimit -%c unlimited\n", *p);
105 39cff6e7 2004-10-17 devnull fprint(fd, "ulimit -%c %d\n", *p, n);
107 39cff6e7 2004-10-17 devnull goto out;
109 39cff6e7 2004-10-17 devnull for(p=eargs; *p; p++){
110 39cff6e7 2004-10-17 devnull if(flag[(uchar)*p]){
112 39cff6e7 2004-10-17 devnull getrlimit(rlx[p-eargs], &rl);
113 39cff6e7 2004-10-17 devnull switch(limit){
114 39cff6e7 2004-10-17 devnull case Notset:
115 39cff6e7 2004-10-17 devnull n = flag['H'] ? rl.rlim_max : rl.rlim_cur;
116 39cff6e7 2004-10-17 devnull if(n == -1)
117 39cff6e7 2004-10-17 devnull fprint(fd, "ulimit -%c unlimited\n", *p);
119 39cff6e7 2004-10-17 devnull fprint(fd, "ulimit -%c %d\n", *p, n);
121 39cff6e7 2004-10-17 devnull case Hard:
122 39cff6e7 2004-10-17 devnull n = rl.rlim_max;
123 39cff6e7 2004-10-17 devnull goto set;
124 39cff6e7 2004-10-17 devnull case Soft:
125 39cff6e7 2004-10-17 devnull n = rl.rlim_cur;
126 39cff6e7 2004-10-17 devnull goto set;
127 39cff6e7 2004-10-17 devnull case Unlimited:
129 39cff6e7 2004-10-17 devnull goto set;
130 39cff6e7 2004-10-17 devnull default:
131 39cff6e7 2004-10-17 devnull n = limit;
133 39cff6e7 2004-10-17 devnull if(setsoft)
134 39cff6e7 2004-10-17 devnull rl.rlim_cur = n;
135 39cff6e7 2004-10-17 devnull if(sethard)
136 39cff6e7 2004-10-17 devnull rl.rlim_max = n;
137 39cff6e7 2004-10-17 devnull if(setrlimit(rlx[p-eargs], &rl) < 0)
138 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "setrlimit: %r\n");
144 39cff6e7 2004-10-17 devnull free(oargv);
145 39cff6e7 2004-10-17 devnull poplist();
146 39cff6e7 2004-10-17 devnull flush(err);
150 39cff6e7 2004-10-17 devnull execumask(void)
152 39cff6e7 2004-10-17 devnull int n, argc;
153 39cff6e7 2004-10-17 devnull char **argv, **oargv, *p;
154 39cff6e7 2004-10-17 devnull char *argv0;
156 39cff6e7 2004-10-17 devnull argv0 = nil;
157 39cff6e7 2004-10-17 devnull setstatus("");
158 39cff6e7 2004-10-17 devnull oargv = mkargv(runq->argv->words);
159 39cff6e7 2004-10-17 devnull argv = oargv+1;
160 39cff6e7 2004-10-17 devnull for(argc=0; argv[argc]; argc++)
163 39cff6e7 2004-10-17 devnull ARGBEGIN{
164 39cff6e7 2004-10-17 devnull default:
166 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "usage: umask [mode]\n");
167 39cff6e7 2004-10-17 devnull goto out;
170 39cff6e7 2004-10-17 devnull if(argc > 1)
171 39cff6e7 2004-10-17 devnull goto usage;
173 39cff6e7 2004-10-17 devnull if(argc == 1){
174 39cff6e7 2004-10-17 devnull n = strtol(argv[0], &p, 8);
175 39cff6e7 2004-10-17 devnull if(*p != 0 || p == argv[0])
176 39cff6e7 2004-10-17 devnull goto usage;
177 39cff6e7 2004-10-17 devnull if(umask(n) < 0){
178 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "umask: %r\n");
179 39cff6e7 2004-10-17 devnull goto out;
181 39cff6e7 2004-10-17 devnull goto out;
184 39cff6e7 2004-10-17 devnull n = umask(0);
185 39cff6e7 2004-10-17 devnull umask(n);
186 39cff6e7 2004-10-17 devnull if(n < 0){
187 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "umask: %r\n");
188 39cff6e7 2004-10-17 devnull goto out;
191 39cff6e7 2004-10-17 devnull fprint(mapfd(1), "umask %03o\n", n);
194 39cff6e7 2004-10-17 devnull free(oargv);
195 39cff6e7 2004-10-17 devnull poplist();
196 39cff6e7 2004-10-17 devnull flush(err);