int c_ulimit(char **wp) { static const struct limits limits[] = { /* Do not use options -H, -S or -a or change the order. */ { "time(cpu-seconds)", RLIMIT_CPU, 1, 't' }, { "file(blocks)", RLIMIT_FSIZE, 512, 'f' }, { "coredump(blocks)", RLIMIT_CORE, 512, 'c' }, { "data(kbytes)", RLIMIT_DATA, 1024, 'd' }, { "stack(kbytes)", RLIMIT_STACK, 1024, 's' }, { "lockedmem(kbytes)", RLIMIT_MEMLOCK, 1024, 'l' }, { "memory(kbytes)", RLIMIT_RSS, 1024, 'm' }, { "nofiles(descriptors)", RLIMIT_NOFILE, 1, 'n' }, { "processes", RLIMIT_NPROC, 1, 'p' }, #ifdef RLIMIT_VMEM { "vmemory(kbytes)", RLIMIT_VMEM, 1024, 'v' }, #endif /* RLIMIT_VMEM */ { NULL, 0, 0, 0 }, }; static char _options[4 + NELEM(limits) * 2]; int how = SOFT | HARD; const struct limits *l; int optc, all = 0; if (!_options[0]) { /* build options string on first call - yuck */ char *p = _options; *p++ = 'H'; *p++ = 'S'; *p++ = 'a'; for (l = limits; l->name; l++) { *p++ = l->option; *p++ = '#'; } *p = '\0'; } /* First check for -a, -H and -S. */ while ((optc = ksh_getopt(wp, &builtin_opt, _options)) != -1) switch (optc) { case 'H': how = HARD; break; case 'S': how = SOFT; break; case 'a': all = 1; break; case '?': return (1); default: break; } if (wp[builtin_opt.optind] != NULL) { bi_errorf("usage: ulimit [-acdfHlmnpSst] [value]"); return (1); } /* Then parse and act on the actual limits, one at a time */ ksh_getopt_reset(&builtin_opt, GF_ERROR); while ((optc = ksh_getopt(wp, &builtin_opt, _options)) != -1) switch (optc) { case 'a': case 'H': case 'S': break; case '?': return (1); default: for (l = limits; l->name && l->option != optc; l++) ; if (!l->name) { internal_errorf(0, "ulimit: %c", optc); return (1); } if (builtin_opt.optarg) { if (set_ulimit(l, builtin_opt.optarg, how)) return (1); } else print_ulimit(l, how); break; } wp += builtin_opt.optind; if (all) { for (l = limits; l->name; l++) { shprintf("%-20s ", l->name); print_ulimit(l, how); } } else if (builtin_opt.optind == 1) { /* No limit specified, use file size */ l = &limits[1]; if (wp[0] != NULL) { if (set_ulimit(l, wp[0], how)) return (1); wp++; } else { print_ulimit(l, how); } } return (0); }
int c_ulimit(char **wp) { static const struct limits limits[] = { /* Do not use options -H, -S or -a or change the order. */ { "time(cpu-seconds)", RLIMIT_CPU, 1, 't' }, { "file(blocks)", RLIMIT_FSIZE, 512, 'f' }, { "coredump(blocks)", RLIMIT_CORE, 512, 'c' }, { "data(kbytes)", RLIMIT_DATA, 1024, 'd' }, { "stack(kbytes)", RLIMIT_STACK, 1024, 's' }, { "lockedmem(kbytes)", RLIMIT_MEMLOCK, 1024, 'l' }, { "memory(kbytes)", RLIMIT_RSS, 1024, 'm' }, { "nofiles(descriptors)", RLIMIT_NOFILE, 1, 'n' }, { "processes", RLIMIT_NPROC, 1, 'p' }, { NULL } }; const char *options = "HSat#f#c#d#s#l#m#n#p#"; int how = SOFT | HARD; const struct limits *l; int optc, all = 0; /* First check for -a, -H and -S. */ while ((optc = ksh_getopt(wp, &builtin_opt, options)) != -1) switch (optc) { case 'H': how = HARD; break; case 'S': how = SOFT; break; case 'a': all = 1; break; case '?': return 1; default: break; } if (wp[builtin_opt.optind] != NULL) { bi_errorf("usage: ulimit [-acdfHlmnpSst] [value]"); return 1; } /* Then parse and act on the actual limits, one at a time */ ksh_getopt_reset(&builtin_opt, GF_ERROR); while ((optc = ksh_getopt(wp, &builtin_opt, options)) != -1) switch (optc) { case 'a': case 'H': case 'S': break; case '?': return 1; default: for (l = limits; l->name && l->option != optc; l++) ; if (!l->name) { internal_warningf("%s: %c", __func__, optc); return 1; } if (builtin_opt.optarg) { if (set_ulimit(l, builtin_opt.optarg, how)) return 1; } else print_ulimit(l, how); break; } wp += builtin_opt.optind; if (all) { for (l = limits; l->name; l++) { shprintf("%-20s ", l->name); print_ulimit(l, how); } } else if (builtin_opt.optind == 1) { /* No limit specified, use file size */ l = &limits[1]; if (wp[0] != NULL) { if (set_ulimit(l, wp[0], how)) return 1; wp++; } else { print_ulimit(l, how); } } return 0; }