/* * Modified doit function from softlimit.c of daemontools 0.76. */ #include <sys/resource.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc, char **argv) { char *arg; unsigned long long u; struct rlimit r; if (argc < 2) { fprintf(stderr, "usage: %s <rlimit-data>\n", getprogname()); return 1; } arg = argv[1]; if (getrlimit(RLIMIT_DATA, &r) == -1) { fprintf(stderr, "%s: ", getprogname()); perror("getrlimit failed"); return 1; } printf("getrlimit RLIMIT_DATA rlim_cur: %llu\n", (unsigned long long)r.rlim_cur); printf("getrlimit RLIMIT_DATA rlim_max: %llu\n", (unsigned long long)r.rlim_max); if (strcmp(arg,"=") == 0) { r.rlim_cur = r.rlim_max; } else { if (sscanf(arg, "%llu", &u) != 1) { fprintf(stderr, "%s: rlimit-data arg not unsigned integer\n", getprogname()); return 1; } r.rlim_cur = (rlim_t)u; if (r.rlim_cur > r.rlim_max) { r.rlim_cur = r.rlim_max; } } printf("setrlimit RLIMIT_DATA rlim_cur: %llu\n", (unsigned long long)r.rlim_cur); printf("setrlimit RLIMIT_DATA rlim_max: %llu\n", (unsigned long long)r.rlim_max); if (setrlimit(RLIMIT_DATA, &r) == -1) { fprintf(stderr, "%s: ", getprogname()); perror("setrlimit failed"); return 1; } return 0; }