Blob


1 #include <u.h>
2 #include <sys/time.h>
3 #include <sys/stat.h>
4 #include <sys/resource.h>
5 #include <libc.h>
6 #include "rc.h"
7 #include "exec.h"
8 #include "io.h"
9 #include "fns.h"
10 #include "getflags.h"
12 extern char **mkargv(word*);
13 extern int mapfd(int);
15 static char *eargs = "cdflmnstuv";
16 static int rlx[] = {
17 RLIMIT_CORE,
18 RLIMIT_DATA,
19 RLIMIT_FSIZE,
20 #ifdef RLIMIT_MEMLOCK
21 RLIMIT_MEMLOCK,
22 #else
23 0,
24 #endif
25 #ifdef RLIMIT_RSS
26 RLIMIT_RSS,
27 #else
28 0,
29 #endif
30 RLIMIT_NOFILE,
31 RLIMIT_STACK,
32 RLIMIT_CPU,
33 #ifdef RLIMIT_NPROC
34 RLIMIT_NPROC,
35 #else
36 0,
37 #endif
38 #ifdef RLIMIT_RSS
39 RLIMIT_RSS,
40 #else
41 0,
42 #endif
43 };
45 static void
46 eusage(void)
47 {
48 fprint(mapfd(2), "usage: ulimit [-SHa%s [limit]]\n", eargs);
49 }
51 #define Notset -4
52 #define Unlimited -3
53 #define Hard -2
54 #define Soft -1
56 void
57 execulimit(void)
58 {
59 int fd, n, argc, sethard, setsoft, limit;
60 int flag[256];
61 char **argv, **oargv, *p;
62 char *argv0;
63 struct rlimit rl;
65 argv0 = nil;
66 setstatus("");
67 oargv = mkargv(runq->argv->words);
68 argv = oargv+1;
69 for(argc=0; argv[argc]; argc++)
70 ;
72 memset(flag, 0, sizeof flag);
73 ARGBEGIN{
74 default:
75 if(strchr(eargs, ARGC()) == nil){
76 eusage();
77 return;
78 }
79 case 'S':
80 case 'H':
81 case 'a':
82 flag[ARGC()] = 1;
83 break;
84 }ARGEND
86 if(argc > 1){
87 eusage();
88 goto out;
89 }
91 fd = mapfd(1);
93 sethard = 1;
94 setsoft = 1;
95 if(flag['S'] && flag['H'])
96 ;
97 else if(flag['S'])
98 sethard = 0;
99 else if(flag['H'])
100 setsoft = 0;
102 limit = Notset;
103 if(argc>0){
104 if(strcmp(argv[0], "unlimited") == 0)
105 limit = Unlimited;
106 else if(strcmp(argv[0], "hard") == 0)
107 limit = Hard;
108 else if(strcmp(argv[0], "soft") == 0)
109 limit = Soft;
110 else if((limit = strtol(argv[0], &p, 0)) < 0 || *p != 0){
111 eusage();
112 goto out;
115 if(flag['a']){
116 for(p=eargs; *p; p++){
117 getrlimit(rlx[p-eargs], &rl);
118 n = flag['H'] ? rl.rlim_max : rl.rlim_cur;
119 if(n == -1)
120 fprint(fd, "ulimit -%c unlimited\n", *p);
121 else
122 fprint(fd, "ulimit -%c %d\n", *p, n);
124 goto out;
126 for(p=eargs; *p; p++){
127 if(flag[(uchar)*p]){
128 n = 0;
129 getrlimit(rlx[p-eargs], &rl);
130 switch(limit){
131 case Notset:
132 n = flag['H'] ? rl.rlim_max : rl.rlim_cur;
133 if(n == -1)
134 fprint(fd, "ulimit -%c unlimited\n", *p);
135 else
136 fprint(fd, "ulimit -%c %d\n", *p, n);
137 break;
138 case Hard:
139 n = rl.rlim_max;
140 goto set;
141 case Soft:
142 n = rl.rlim_cur;
143 goto set;
144 case Unlimited:
145 n = -1;
146 goto set;
147 default:
148 n = limit;
149 set:
150 if(setsoft)
151 rl.rlim_cur = n;
152 if(sethard)
153 rl.rlim_max = n;
154 if(setrlimit(rlx[p-eargs], &rl) < 0)
155 fprint(mapfd(2), "setrlimit: %r\n");
160 out:
161 free(oargv);
162 poplist();
163 flush(err);
166 void
167 execumask(void)
169 int n, argc;
170 char **argv, **oargv, *p;
171 char *argv0;
173 argv0 = nil;
174 setstatus("");
175 oargv = mkargv(runq->argv->words);
176 argv = oargv+1;
177 for(argc=0; argv[argc]; argc++)
180 ARGBEGIN{
181 default:
182 usage:
183 fprint(mapfd(2), "usage: umask [mode]\n");
184 goto out;
185 }ARGEND
187 if(argc > 1)
188 goto usage;
190 if(argc == 1){
191 n = strtol(argv[0], &p, 8);
192 if(*p != 0 || p == argv[0])
193 goto usage;
194 umask(n);
195 goto out;
198 n = umask(0);
199 umask(n);
200 if(n < 0){
201 fprint(mapfd(2), "umask: %r\n");
202 goto out;
205 fprint(mapfd(1), "umask %03o\n", n);
207 out:
208 free(oargv);
209 poplist();
210 flush(err);