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_MEMLOCK21 RLIMIT_MEMLOCK,22 #else23 0,24 #endif25 #ifdef RLIMIT_RSS26 RLIMIT_RSS,27 #else28 0,29 #endif30 RLIMIT_NOFILE,31 RLIMIT_STACK,32 RLIMIT_CPU,33 #ifdef RLIMIT_NPROC34 RLIMIT_NPROC,35 #else36 0,37 #endif38 #ifdef RLIMIT_RSS39 RLIMIT_RSS,40 #else41 0,42 #endif43 };45 static void46 eusage(void)47 {48 fprint(mapfd(2), "usage: ulimit [-SHa%s [limit]]\n", eargs);49 }51 #define Notset -452 #define Unlimited -353 #define Hard -254 #define Soft -156 void57 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 }ARGEND86 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;113 }114 }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 else122 fprint(fd, "ulimit -%c %d\n", *p, n);123 }124 goto out;125 }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 else136 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");156 }157 }158 }160 out:161 free(oargv);162 poplist();163 flush(err);164 }166 void167 execumask(void)168 {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++)178 ;180 ARGBEGIN{181 default:182 usage:183 fprint(mapfd(2), "usage: umask [mode]\n");184 goto out;185 }ARGEND187 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;196 }198 n = umask(0);199 umask(n);200 if(n < 0){201 fprint(mapfd(2), "umask: %r\n");202 goto out;203 }205 fprint(mapfd(1), "umask %03o\n", n);207 out:208 free(oargv);209 poplist();210 flush(err);211 }