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 RLIMIT_MEMLOCK,
21 RLIMIT_RSS,
22 RLIMIT_NOFILE,
23 RLIMIT_STACK,
24 RLIMIT_CPU,
25 RLIMIT_NPROC,
26 RLIMIT_RSS,
27 };
29 static void
30 eusage(void)
31 {
32 fprint(mapfd(2), "usage: ulimit [-SHa%s [limit]]\n", eargs);
33 }
35 #define Notset -4
36 #define Unlimited -3
37 #define Hard -2
38 #define Soft -1
40 void
41 execulimit(void)
42 {
43 int fd, n, argc, sethard, setsoft, limit;
44 int flag[256];
45 char **argv, **oargv, *p;
46 char *argv0;
47 struct rlimit rl;
49 argv0 = nil;
50 setstatus("");
51 oargv = mkargv(runq->argv->words);
52 argv = oargv+1;
53 for(argc=0; argv[argc]; argc++)
54 ;
56 memset(flag, 0, sizeof flag);
57 ARGBEGIN{
58 default:
59 if(strchr(eargs, ARGC()) == nil){
60 eusage();
61 return;
62 }
63 case 'S':
64 case 'H':
65 case 'a':
66 flag[ARGC()] = 1;
67 break;
68 }ARGEND
70 if(argc > 1){
71 eusage();
72 goto out;
73 }
75 fd = mapfd(1);
77 sethard = 1;
78 setsoft = 1;
79 if(flag['S'] && flag['H'])
80 ;
81 else if(flag['S'])
82 sethard = 0;
83 else if(flag['H'])
84 setsoft = 0;
86 limit = Notset;
87 if(argc>0){
88 if(strcmp(argv[0], "unlimited") == 0)
89 limit = Unlimited;
90 else if(strcmp(argv[0], "hard") == 0)
91 limit = Hard;
92 else if(strcmp(argv[0], "soft") == 0)
93 limit = Soft;
94 else if((limit = strtol(argv[0], &p, 0)) < 0 || *p != 0){
95 eusage();
96 goto out;
97 }
98 }
99 if(flag['a']){
100 for(p=eargs; *p; p++){
101 getrlimit(rlx[p-eargs], &rl);
102 n = flag['H'] ? rl.rlim_max : rl.rlim_cur;
103 if(n == -1)
104 fprint(fd, "ulimit -%c unlimited\n", *p);
105 else
106 fprint(fd, "ulimit -%c %d\n", *p, n);
108 goto out;
110 for(p=eargs; *p; p++){
111 if(flag[(uchar)*p]){
112 n = 0;
113 getrlimit(rlx[p-eargs], &rl);
114 switch(limit){
115 case Notset:
116 n = flag['H'] ? rl.rlim_max : rl.rlim_cur;
117 if(n == -1)
118 fprint(fd, "ulimit -%c unlimited\n", *p);
119 else
120 fprint(fd, "ulimit -%c %d\n", *p, n);
121 break;
122 case Hard:
123 n = rl.rlim_max;
124 goto set;
125 case Soft:
126 n = rl.rlim_cur;
127 goto set;
128 case Unlimited:
129 n = -1;
130 goto set;
131 default:
132 n = limit;
133 set:
134 if(setsoft)
135 rl.rlim_cur = n;
136 if(sethard)
137 rl.rlim_max = n;
138 if(setrlimit(rlx[p-eargs], &rl) < 0)
139 fprint(mapfd(2), "setrlimit: %r\n");
144 out:
145 free(oargv);
146 poplist();
147 flush(err);
150 void
151 execumask(void)
153 int n, argc;
154 char **argv, **oargv, *p;
155 char *argv0;
157 argv0 = nil;
158 setstatus("");
159 oargv = mkargv(runq->argv->words);
160 argv = oargv+1;
161 for(argc=0; argv[argc]; argc++)
164 ARGBEGIN{
165 default:
166 usage:
167 fprint(mapfd(2), "usage: umask [mode]\n");
168 goto out;
169 }ARGEND
171 if(argc > 1)
172 goto usage;
174 if(argc == 1){
175 n = strtol(argv[0], &p, 8);
176 if(*p != 0 || p == argv[0])
177 goto usage;
178 umask(n);
179 goto out;
182 n = umask(0);
183 umask(n);
184 if(n < 0){
185 fprint(mapfd(2), "umask: %r\n");
186 goto out;
189 fprint(mapfd(1), "umask %03o\n", n);
191 out:
192 free(oargv);
193 poplist();
194 flush(err);