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 void30 eusage(void)31 {32 fprint(mapfd(2), "usage: ulimit [-SHa%s [limit]]\n", eargs);33 }35 #define Notset -436 #define Unlimited -337 #define Hard -238 #define Soft -140 void41 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 }ARGEND70 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 else106 fprint(fd, "ulimit -%c %d\n", *p, n);107 }108 goto out;109 }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 else120 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");140 }141 }142 }144 out:145 free(oargv);146 poplist();147 flush(err);148 }150 void151 execumask(void)152 {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++)162 ;164 ARGBEGIN{165 default:166 usage:167 fprint(mapfd(2), "usage: umask [mode]\n");168 goto out;169 }ARGEND171 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;180 }182 n = umask(0);183 umask(n);184 if(n < 0){185 fprint(mapfd(2), "umask: %r\n");186 goto out;187 }189 fprint(mapfd(1), "umask %03o\n", n);191 out:192 free(oargv);193 poplist();194 flush(err);195 }