Blame


1 39cff6e7 2004-10-17 devnull #include <u.h>
2 39cff6e7 2004-10-17 devnull #include <sys/time.h>
3 f7b74c17 2004-12-28 devnull #include <sys/stat.h>
4 39cff6e7 2004-10-17 devnull #include <sys/resource.h>
5 edc77f0b 2007-03-25 devnull #include <errno.h>
6 edc77f0b 2007-03-25 devnull #include <fcntl.h>
7 39cff6e7 2004-10-17 devnull #include <libc.h>
8 39cff6e7 2004-10-17 devnull #include "rc.h"
9 39cff6e7 2004-10-17 devnull #include "exec.h"
10 39cff6e7 2004-10-17 devnull #include "io.h"
11 39cff6e7 2004-10-17 devnull #include "fns.h"
12 39cff6e7 2004-10-17 devnull #include "getflags.h"
13 39cff6e7 2004-10-17 devnull
14 39cff6e7 2004-10-17 devnull extern char **mkargv(word*);
15 39cff6e7 2004-10-17 devnull extern int mapfd(int);
16 39cff6e7 2004-10-17 devnull
17 39cff6e7 2004-10-17 devnull static char *eargs = "cdflmnstuv";
18 39cff6e7 2004-10-17 devnull static int rlx[] = {
19 39cff6e7 2004-10-17 devnull RLIMIT_CORE,
20 39cff6e7 2004-10-17 devnull RLIMIT_DATA,
21 39cff6e7 2004-10-17 devnull RLIMIT_FSIZE,
22 005a85f3 2005-01-07 devnull #ifdef RLIMIT_MEMLOCK
23 39cff6e7 2004-10-17 devnull RLIMIT_MEMLOCK,
24 005a85f3 2005-01-07 devnull #else
25 005a85f3 2005-01-07 devnull 0,
26 005a85f3 2005-01-07 devnull #endif
27 005a85f3 2005-01-07 devnull #ifdef RLIMIT_RSS
28 39cff6e7 2004-10-17 devnull RLIMIT_RSS,
29 005a85f3 2005-01-07 devnull #else
30 005a85f3 2005-01-07 devnull 0,
31 005a85f3 2005-01-07 devnull #endif
32 39cff6e7 2004-10-17 devnull RLIMIT_NOFILE,
33 39cff6e7 2004-10-17 devnull RLIMIT_STACK,
34 39cff6e7 2004-10-17 devnull RLIMIT_CPU,
35 005a85f3 2005-01-07 devnull #ifdef RLIMIT_NPROC
36 39cff6e7 2004-10-17 devnull RLIMIT_NPROC,
37 005a85f3 2005-01-07 devnull #else
38 005a85f3 2005-01-07 devnull 0,
39 005a85f3 2005-01-07 devnull #endif
40 005a85f3 2005-01-07 devnull #ifdef RLIMIT_RSS
41 39cff6e7 2004-10-17 devnull RLIMIT_RSS,
42 005a85f3 2005-01-07 devnull #else
43 005a85f3 2005-01-07 devnull 0,
44 005a85f3 2005-01-07 devnull #endif
45 39cff6e7 2004-10-17 devnull };
46 39cff6e7 2004-10-17 devnull
47 39cff6e7 2004-10-17 devnull static void
48 39cff6e7 2004-10-17 devnull eusage(void)
49 39cff6e7 2004-10-17 devnull {
50 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "usage: ulimit [-SHa%s [limit]]\n", eargs);
51 39cff6e7 2004-10-17 devnull }
52 39cff6e7 2004-10-17 devnull
53 39cff6e7 2004-10-17 devnull #define Notset -4
54 39cff6e7 2004-10-17 devnull #define Unlimited -3
55 39cff6e7 2004-10-17 devnull #define Hard -2
56 39cff6e7 2004-10-17 devnull #define Soft -1
57 39cff6e7 2004-10-17 devnull
58 39cff6e7 2004-10-17 devnull void
59 39cff6e7 2004-10-17 devnull execulimit(void)
60 39cff6e7 2004-10-17 devnull {
61 39cff6e7 2004-10-17 devnull int fd, n, argc, sethard, setsoft, limit;
62 39cff6e7 2004-10-17 devnull int flag[256];
63 39cff6e7 2004-10-17 devnull char **argv, **oargv, *p;
64 39cff6e7 2004-10-17 devnull char *argv0;
65 39cff6e7 2004-10-17 devnull struct rlimit rl;
66 39cff6e7 2004-10-17 devnull
67 39cff6e7 2004-10-17 devnull argv0 = nil;
68 39cff6e7 2004-10-17 devnull setstatus("");
69 39cff6e7 2004-10-17 devnull oargv = mkargv(runq->argv->words);
70 39cff6e7 2004-10-17 devnull argv = oargv+1;
71 39cff6e7 2004-10-17 devnull for(argc=0; argv[argc]; argc++)
72 39cff6e7 2004-10-17 devnull ;
73 39cff6e7 2004-10-17 devnull
74 39cff6e7 2004-10-17 devnull memset(flag, 0, sizeof flag);
75 39cff6e7 2004-10-17 devnull ARGBEGIN{
76 39cff6e7 2004-10-17 devnull default:
77 39cff6e7 2004-10-17 devnull if(strchr(eargs, ARGC()) == nil){
78 39cff6e7 2004-10-17 devnull eusage();
79 39cff6e7 2004-10-17 devnull return;
80 39cff6e7 2004-10-17 devnull }
81 39cff6e7 2004-10-17 devnull case 'S':
82 39cff6e7 2004-10-17 devnull case 'H':
83 39cff6e7 2004-10-17 devnull case 'a':
84 39cff6e7 2004-10-17 devnull flag[ARGC()] = 1;
85 39cff6e7 2004-10-17 devnull break;
86 39cff6e7 2004-10-17 devnull }ARGEND
87 39cff6e7 2004-10-17 devnull
88 39cff6e7 2004-10-17 devnull if(argc > 1){
89 39cff6e7 2004-10-17 devnull eusage();
90 39cff6e7 2004-10-17 devnull goto out;
91 39cff6e7 2004-10-17 devnull }
92 39cff6e7 2004-10-17 devnull
93 39cff6e7 2004-10-17 devnull fd = mapfd(1);
94 39cff6e7 2004-10-17 devnull
95 39cff6e7 2004-10-17 devnull sethard = 1;
96 39cff6e7 2004-10-17 devnull setsoft = 1;
97 39cff6e7 2004-10-17 devnull if(flag['S'] && flag['H'])
98 39cff6e7 2004-10-17 devnull ;
99 39cff6e7 2004-10-17 devnull else if(flag['S'])
100 39cff6e7 2004-10-17 devnull sethard = 0;
101 39cff6e7 2004-10-17 devnull else if(flag['H'])
102 39cff6e7 2004-10-17 devnull setsoft = 0;
103 39cff6e7 2004-10-17 devnull
104 39cff6e7 2004-10-17 devnull limit = Notset;
105 39cff6e7 2004-10-17 devnull if(argc>0){
106 39cff6e7 2004-10-17 devnull if(strcmp(argv[0], "unlimited") == 0)
107 39cff6e7 2004-10-17 devnull limit = Unlimited;
108 39cff6e7 2004-10-17 devnull else if(strcmp(argv[0], "hard") == 0)
109 39cff6e7 2004-10-17 devnull limit = Hard;
110 39cff6e7 2004-10-17 devnull else if(strcmp(argv[0], "soft") == 0)
111 39cff6e7 2004-10-17 devnull limit = Soft;
112 39cff6e7 2004-10-17 devnull else if((limit = strtol(argv[0], &p, 0)) < 0 || *p != 0){
113 39cff6e7 2004-10-17 devnull eusage();
114 39cff6e7 2004-10-17 devnull goto out;
115 39cff6e7 2004-10-17 devnull }
116 39cff6e7 2004-10-17 devnull }
117 39cff6e7 2004-10-17 devnull if(flag['a']){
118 39cff6e7 2004-10-17 devnull for(p=eargs; *p; p++){
119 39cff6e7 2004-10-17 devnull getrlimit(rlx[p-eargs], &rl);
120 39cff6e7 2004-10-17 devnull n = flag['H'] ? rl.rlim_max : rl.rlim_cur;
121 39cff6e7 2004-10-17 devnull if(n == -1)
122 39cff6e7 2004-10-17 devnull fprint(fd, "ulimit -%c unlimited\n", *p);
123 39cff6e7 2004-10-17 devnull else
124 39cff6e7 2004-10-17 devnull fprint(fd, "ulimit -%c %d\n", *p, n);
125 39cff6e7 2004-10-17 devnull }
126 39cff6e7 2004-10-17 devnull goto out;
127 39cff6e7 2004-10-17 devnull }
128 39cff6e7 2004-10-17 devnull for(p=eargs; *p; p++){
129 39cff6e7 2004-10-17 devnull if(flag[(uchar)*p]){
130 39cff6e7 2004-10-17 devnull n = 0;
131 39cff6e7 2004-10-17 devnull getrlimit(rlx[p-eargs], &rl);
132 39cff6e7 2004-10-17 devnull switch(limit){
133 39cff6e7 2004-10-17 devnull case Notset:
134 39cff6e7 2004-10-17 devnull n = flag['H'] ? rl.rlim_max : rl.rlim_cur;
135 39cff6e7 2004-10-17 devnull if(n == -1)
136 39cff6e7 2004-10-17 devnull fprint(fd, "ulimit -%c unlimited\n", *p);
137 39cff6e7 2004-10-17 devnull else
138 39cff6e7 2004-10-17 devnull fprint(fd, "ulimit -%c %d\n", *p, n);
139 39cff6e7 2004-10-17 devnull break;
140 39cff6e7 2004-10-17 devnull case Hard:
141 39cff6e7 2004-10-17 devnull n = rl.rlim_max;
142 39cff6e7 2004-10-17 devnull goto set;
143 39cff6e7 2004-10-17 devnull case Soft:
144 39cff6e7 2004-10-17 devnull n = rl.rlim_cur;
145 39cff6e7 2004-10-17 devnull goto set;
146 39cff6e7 2004-10-17 devnull case Unlimited:
147 39cff6e7 2004-10-17 devnull n = -1;
148 39cff6e7 2004-10-17 devnull goto set;
149 39cff6e7 2004-10-17 devnull default:
150 39cff6e7 2004-10-17 devnull n = limit;
151 39cff6e7 2004-10-17 devnull set:
152 39cff6e7 2004-10-17 devnull if(setsoft)
153 39cff6e7 2004-10-17 devnull rl.rlim_cur = n;
154 39cff6e7 2004-10-17 devnull if(sethard)
155 39cff6e7 2004-10-17 devnull rl.rlim_max = n;
156 39cff6e7 2004-10-17 devnull if(setrlimit(rlx[p-eargs], &rl) < 0)
157 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "setrlimit: %r\n");
158 39cff6e7 2004-10-17 devnull }
159 39cff6e7 2004-10-17 devnull }
160 39cff6e7 2004-10-17 devnull }
161 39cff6e7 2004-10-17 devnull
162 39cff6e7 2004-10-17 devnull out:
163 39cff6e7 2004-10-17 devnull free(oargv);
164 39cff6e7 2004-10-17 devnull poplist();
165 39cff6e7 2004-10-17 devnull flush(err);
166 39cff6e7 2004-10-17 devnull }
167 39cff6e7 2004-10-17 devnull
168 39cff6e7 2004-10-17 devnull void
169 39cff6e7 2004-10-17 devnull execumask(void)
170 39cff6e7 2004-10-17 devnull {
171 39cff6e7 2004-10-17 devnull int n, argc;
172 39cff6e7 2004-10-17 devnull char **argv, **oargv, *p;
173 39cff6e7 2004-10-17 devnull char *argv0;
174 39cff6e7 2004-10-17 devnull
175 39cff6e7 2004-10-17 devnull argv0 = nil;
176 39cff6e7 2004-10-17 devnull setstatus("");
177 39cff6e7 2004-10-17 devnull oargv = mkargv(runq->argv->words);
178 39cff6e7 2004-10-17 devnull argv = oargv+1;
179 39cff6e7 2004-10-17 devnull for(argc=0; argv[argc]; argc++)
180 39cff6e7 2004-10-17 devnull ;
181 39cff6e7 2004-10-17 devnull
182 39cff6e7 2004-10-17 devnull ARGBEGIN{
183 39cff6e7 2004-10-17 devnull default:
184 39cff6e7 2004-10-17 devnull usage:
185 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "usage: umask [mode]\n");
186 39cff6e7 2004-10-17 devnull goto out;
187 39cff6e7 2004-10-17 devnull }ARGEND
188 39cff6e7 2004-10-17 devnull
189 39cff6e7 2004-10-17 devnull if(argc > 1)
190 39cff6e7 2004-10-17 devnull goto usage;
191 39cff6e7 2004-10-17 devnull
192 39cff6e7 2004-10-17 devnull if(argc == 1){
193 39cff6e7 2004-10-17 devnull n = strtol(argv[0], &p, 8);
194 39cff6e7 2004-10-17 devnull if(*p != 0 || p == argv[0])
195 39cff6e7 2004-10-17 devnull goto usage;
196 f7b74c17 2004-12-28 devnull umask(n);
197 39cff6e7 2004-10-17 devnull goto out;
198 39cff6e7 2004-10-17 devnull }
199 39cff6e7 2004-10-17 devnull
200 39cff6e7 2004-10-17 devnull n = umask(0);
201 39cff6e7 2004-10-17 devnull umask(n);
202 39cff6e7 2004-10-17 devnull if(n < 0){
203 39cff6e7 2004-10-17 devnull fprint(mapfd(2), "umask: %r\n");
204 39cff6e7 2004-10-17 devnull goto out;
205 39cff6e7 2004-10-17 devnull }
206 39cff6e7 2004-10-17 devnull
207 39cff6e7 2004-10-17 devnull fprint(mapfd(1), "umask %03o\n", n);
208 39cff6e7 2004-10-17 devnull
209 39cff6e7 2004-10-17 devnull out:
210 39cff6e7 2004-10-17 devnull free(oargv);
211 39cff6e7 2004-10-17 devnull poplist();
212 39cff6e7 2004-10-17 devnull flush(err);
213 39cff6e7 2004-10-17 devnull }
214 edc77f0b 2007-03-25 devnull
215 edc77f0b 2007-03-25 devnull /*
216 edc77f0b 2007-03-25 devnull * Cope with non-blocking read.
217 edc77f0b 2007-03-25 devnull */
218 edc77f0b 2007-03-25 devnull long
219 edc77f0b 2007-03-25 devnull readnb(int fd, char *buf, long cnt)
220 edc77f0b 2007-03-25 devnull {
221 edc77f0b 2007-03-25 devnull int n, didreset;
222 edc77f0b 2007-03-25 devnull int flgs;
223 edc77f0b 2007-03-25 devnull
224 edc77f0b 2007-03-25 devnull didreset = 0;
225 edc77f0b 2007-03-25 devnull while((n = read(fd, buf, cnt)) == -1)
226 edc77f0b 2007-03-25 devnull if(!didreset && errno == EAGAIN){
227 edc77f0b 2007-03-25 devnull if((flgs = fcntl(fd, F_GETFL, 0)) == -1)
228 edc77f0b 2007-03-25 devnull return -1;
229 edc77f0b 2007-03-25 devnull flgs &= ~O_NONBLOCK;
230 edc77f0b 2007-03-25 devnull if(fcntl(fd, F_SETFL, flgs) == -1)
231 edc77f0b 2007-03-25 devnull return -1;
232 edc77f0b 2007-03-25 devnull didreset = 1;
233 edc77f0b 2007-03-25 devnull }
234 edc77f0b 2007-03-25 devnull
235 edc77f0b 2007-03-25 devnull return n;
236 edc77f0b 2007-03-25 devnull }