diff options
Diffstat (limited to 'src/builtin_ulimit.cpp')
-rw-r--r-- | src/builtin_ulimit.cpp | 522 |
1 files changed, 166 insertions, 356 deletions
diff --git a/src/builtin_ulimit.cpp b/src/builtin_ulimit.cpp index 3b2dadd6..f873c385 100644 --- a/src/builtin_ulimit.cpp +++ b/src/builtin_ulimit.cpp @@ -1,246 +1,146 @@ -/** \file builtin_ulimit.c Functions defining the ulimit builtin - -Functions used for implementing the ulimit builtin. - -*/ -#include "config.h" - -#include <stdlib.h> -#include <stdio.h> -#include <wchar.h> -#include <wctype.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <unistd.h> +// Functions used for implementing the ulimit builtin. #include <errno.h> - -#include "fallback.h" -#include "util.h" +#include <sys/resource.h> +#include <wchar.h> #include "builtin.h" #include "common.h" +#include "fallback.h" // IWYU pragma: keep +#include "io.h" +#include "util.h" #include "wgetopt.h" - - -/** - Struct describing a resource limit -*/ -struct resource_t -{ - /** - Resource id - */ - int resource; - /** - Description of resource - */ - const wchar_t *desc; - /** - Switch used on commandline to specify resource - */ - wchar_t switch_char; - /** - The implicit multiplier used when setting getting values - */ - int multiplier; -} -; - -/** - Array of resource_t structs, describing all known resource types. -*/ -static const struct resource_t resource_arr[] = -{ - { - RLIMIT_CORE, L"Maximum size of core files created", L'c', 1024 - } - , - { - RLIMIT_DATA, L"Maximum size of a process’s data segment", L'd', 1024 - } - , - { - RLIMIT_FSIZE, L"Maximum size of files created by the shell", L'f', 1024 - } - , +#include "wutil.h" // IWYU pragma: keep + +class parser_t; + +/// Struct describing a resource limit. +struct resource_t { + int resource; // resource ID + const wchar_t *desc; // description of resource + wchar_t switch_char; // switch used on commandline to specify resource + int multiplier; // the implicit multiplier used when setting getting values +}; + +/// Array of resource_t structs, describing all known resource types. +static const struct resource_t resource_arr[] = { + {RLIMIT_CORE, L"Maximum size of core files created", L'c', 1024}, + {RLIMIT_DATA, L"Maximum size of a process’s data segment", L'd', 1024}, + {RLIMIT_FSIZE, L"Maximum size of files created by the shell", L'f', 1024}, #ifdef RLIMIT_MEMLOCK - { - RLIMIT_MEMLOCK, L"Maximum size that may be locked into memory", L'l', 1024 - } - , + {RLIMIT_MEMLOCK, L"Maximum size that may be locked into memory", L'l', 1024}, #endif #ifdef RLIMIT_RSS - { - RLIMIT_RSS, L"Maximum resident set size", L'm', 1024 - } - , + {RLIMIT_RSS, L"Maximum resident set size", L'm', 1024}, #endif - { - RLIMIT_NOFILE, L"Maximum number of open file descriptors", L'n', 1 - } - , - { - RLIMIT_STACK, L"Maximum stack size", L's', 1024 - } - , - { - RLIMIT_CPU, L"Maximum amount of cpu time in seconds", L't', 1 - } - , + {RLIMIT_NOFILE, L"Maximum number of open file descriptors", L'n', 1}, + {RLIMIT_STACK, L"Maximum stack size", L's', 1024}, + {RLIMIT_CPU, L"Maximum amount of cpu time in seconds", L't', 1}, #ifdef RLIMIT_NPROC - { - RLIMIT_NPROC, L"Maximum number of processes available to a single user", L'u', 1 - } - , + {RLIMIT_NPROC, L"Maximum number of processes available to a single user", L'u', 1}, #endif #ifdef RLIMIT_AS - { - RLIMIT_AS, L"Maximum amount of virtual memory available to the shell", L'v', 1024 - } - , + {RLIMIT_AS, L"Maximum amount of virtual memory available to the shell", L'v', 1024}, #endif - { - 0, 0, 0, 0 - } -} -; - -/** - Get the implicit multiplication factor for the specified resource limit -*/ -static int get_multiplier(int what) -{ - int i; + {0, 0, 0, 0}}; - for (i=0; resource_arr[i].desc; i++) - { - if (resource_arr[i].resource == what) - { +/// Get the implicit multiplication factor for the specified resource limit. +static int get_multiplier(int what) { + for (int i = 0; resource_arr[i].desc; i++) { + if (resource_arr[i].resource == what) { return resource_arr[i].multiplier; } } return -1; } -/** - Return the value for the specified resource limit. This function - does _not_ multiply the limit value by the multiplier constant used - by the commandline ulimit. -*/ -static rlim_t get(int resource, int hard) -{ +/// Return the value for the specified resource limit. This function does _not_ multiply the limit +/// value by the multiplier constant used by the commandline ulimit. +static rlim_t get(int resource, int hard) { struct rlimit ls; getrlimit(resource, &ls); - return hard ? ls.rlim_max:ls.rlim_cur; + return hard ? ls.rlim_max : ls.rlim_cur; } -/** - Print the value of the specified resource limit -*/ -static void print(int resource, int hard, io_streams_t &streams) -{ +/// Print the value of the specified resource limit. +static void print(int resource, int hard, io_streams_t &streams) { rlim_t l = get(resource, hard); if (l == RLIM_INFINITY) streams.out.append(L"unlimited\n"); else - streams.out.append_format( L"%d\n", l / get_multiplier(resource)); - + streams.out.append_format(L"%d\n", l / get_multiplier(resource)); } -/** - Print values of all resource limits -*/ -static void print_all(int hard, io_streams_t &streams) -{ +/// Print values of all resource limits. +static void print_all(int hard, io_streams_t &streams) { int i; - int w=0; + int w = 0; - for (i=0; resource_arr[i].desc; i++) - { - w=maxi(w, fish_wcswidth(resource_arr[i].desc)); + for (i = 0; resource_arr[i].desc; i++) { + w = maxi(w, fish_wcswidth(resource_arr[i].desc)); } - for (i=0; resource_arr[i].desc; i++) - { + for (i = 0; resource_arr[i].desc; i++) { struct rlimit ls; rlim_t l; getrlimit(resource_arr[i].resource, &ls); - l = hard ? ls.rlim_max:ls.rlim_cur; + l = hard ? ls.rlim_max : ls.rlim_cur; - const wchar_t *unit = ((resource_arr[i].resource==RLIMIT_CPU)?L"(seconds, ":(get_multiplier(resource_arr[i].resource)==1?L"(":L"(kB, ")); + const wchar_t *unit = + ((resource_arr[i].resource == RLIMIT_CPU) + ? L"(seconds, " + : (get_multiplier(resource_arr[i].resource) == 1 ? L"(" : L"(kB, ")); - streams.out.append_format( - L"%-*ls %10ls-%lc) ", - w, - resource_arr[i].desc, - unit, - resource_arr[i].switch_char); + streams.out.append_format(L"%-*ls %10ls-%lc) ", w, resource_arr[i].desc, unit, + resource_arr[i].switch_char); - if (l == RLIM_INFINITY) - { + if (l == RLIM_INFINITY) { streams.out.append(L"unlimited\n"); - } - else - { - streams.out.append_format( L"%d\n", l/get_multiplier(resource_arr[i].resource)); + } else { + streams.out.append_format(L"%d\n", l / get_multiplier(resource_arr[i].resource)); } } - } -/** - Returns the description for the specified resource limit -*/ -static const wchar_t *get_desc(int what) -{ +/// Returns the description for the specified resource limit. +static const wchar_t *get_desc(int what) { int i; - for (i=0; resource_arr[i].desc; i++) - { - if (resource_arr[i].resource == what) - { + for (i = 0; resource_arr[i].desc; i++) { + if (resource_arr[i].resource == what) { return resource_arr[i].desc; } } return L"Not a resource"; } -/** - Set the new value of the specified resource limit. This function - does _not_ multiply the limit value by the multiplier constant used - by the commandline ulimit. -*/ -static int set(int resource, int hard, int soft, rlim_t value, io_streams_t &streams) -{ +/// Set the new value of the specified resource limit. This function does _not_ multiply the limit +// value by the multiplier constant used by the commandline ulimit. +static int set(int resource, int hard, int soft, rlim_t value, io_streams_t &streams) { struct rlimit ls; getrlimit(resource, &ls); - if (hard) - { + if (hard) { ls.rlim_max = value; } - if (soft) - { + if (soft) { ls.rlim_cur = value; - /* - Do not attempt to set the soft limit higher than the hard limit - */ + // Do not attempt to set the soft limit higher than the hard limit. if ((value == RLIM_INFINITY && ls.rlim_max != RLIM_INFINITY) || - (value != RLIM_INFINITY && ls.rlim_max != RLIM_INFINITY && value > ls.rlim_max)) - { + (value != RLIM_INFINITY && ls.rlim_max != RLIM_INFINITY && value > ls.rlim_max)) { ls.rlim_cur = ls.rlim_max; } } - if (setrlimit(resource, &ls)) - { + if (setrlimit(resource, &ls)) { if (errno == EPERM) - streams.err.append_format(L"ulimit: Permission denied when changing resource of type '%ls'\n", get_desc(resource)); + streams.err.append_format( + L"ulimit: Permission denied when changing resource of type '%ls'\n", + get_desc(resource)); else builtin_wperror(L"ulimit", streams); return 1; @@ -248,190 +148,125 @@ static int set(int resource, int hard, int soft, rlim_t value, io_streams_t &str return 0; } -/** - The ulimit builtin, used for setting resource limits. Defined in - builtin_ulimit.c. -*/ -static int builtin_ulimit(parser_t &parser, io_streams_t &streams, wchar_t **argv) -{ +/// The ulimit builtin, used for setting resource limits. +int builtin_ulimit(parser_t &parser, io_streams_t &streams, wchar_t **argv) { wgetopter_t w; - int hard=0; - int soft=0; + int hard = 0; + int soft = 0; int what = RLIMIT_FSIZE; int report_all = 0; int argc = builtin_count_args(argv); - w.woptind=0; - - while (1) - { - static const struct woption - long_options[] = - { - { - L"all", no_argument, 0, 'a' - } - , - { - L"hard", no_argument, 0, 'H' - } - , - { - L"soft", no_argument, 0, 'S' - } - , - { - L"core-size", no_argument, 0, 'c' - } - , - { - L"data-size", no_argument, 0, 'd' - } - , - { - L"file-size", no_argument, 0, 'f' - } - , - { - L"lock-size", no_argument, 0, 'l' - } - , - { - L"resident-set-size", no_argument, 0, 'm' - } - , - { - L"file-descriptor-count", no_argument, 0, 'n' - } - , - { - L"stack-size", no_argument, 0, 's' - } - , - { - L"cpu-time", no_argument, 0, 't' - } - , - { - L"process-count", no_argument, 0, 'u' - } - , - { - L"virtual-memory-size", no_argument, 0, 'v' - } - , - { - L"help", no_argument, 0, 'h' - } - , - { - 0, 0, 0, 0 - } - } - ; - + w.woptind = 0; + + while (1) { + static const struct woption long_options[] = { + {L"all", no_argument, 0, 'a'}, + {L"hard", no_argument, 0, 'H'}, + {L"soft", no_argument, 0, 'S'}, + {L"core-size", no_argument, 0, 'c'}, + {L"data-size", no_argument, 0, 'd'}, + {L"file-size", no_argument, 0, 'f'}, + {L"lock-size", no_argument, 0, 'l'}, + {L"resident-set-size", no_argument, 0, 'm'}, + {L"file-descriptor-count", no_argument, 0, 'n'}, + {L"stack-size", no_argument, 0, 's'}, + {L"cpu-time", no_argument, 0, 't'}, + {L"process-count", no_argument, 0, 'u'}, + {L"virtual-memory-size", no_argument, 0, 'v'}, + {L"help", no_argument, 0, 'h'}, + {0, 0, 0, 0}}; int opt_index = 0; - int opt = w.wgetopt_long(argc, - argv, - L"aHScdflmnstuvh", - long_options, - &opt_index); - if (opt == -1) - break; + int opt = w.wgetopt_long(argc, argv, L"aHScdflmnstuvh", long_options, &opt_index); + if (opt == -1) break; - switch (opt) - { - case 0: - if (long_options[opt_index].flag != 0) - break; - streams.err.append_format(BUILTIN_ERR_UNKNOWN, - argv[0], - long_options[opt_index].name); + switch (opt) { + case 0: { + if (long_options[opt_index].flag != 0) break; + streams.err.append_format(BUILTIN_ERR_UNKNOWN, argv[0], + long_options[opt_index].name); builtin_print_help(parser, streams, argv[0], streams.err); - return 1; - - case L'a': - report_all=1; + } + case L'a': { + report_all = 1; break; - - case L'H': - hard=1; + } + case L'H': { + hard = 1; break; - - case L'S': - soft=1; + } + case L'S': { + soft = 1; break; - - case L'c': - what=RLIMIT_CORE; + } + case L'c': { + what = RLIMIT_CORE; break; - - case L'd': - what=RLIMIT_DATA; + } + case L'd': { + what = RLIMIT_DATA; break; - - case L'f': - what=RLIMIT_FSIZE; + } + case L'f': { + what = RLIMIT_FSIZE; break; + } #ifdef RLIMIT_MEMLOCK - case L'l': - what=RLIMIT_MEMLOCK; + case L'l': { + what = RLIMIT_MEMLOCK; break; + } #endif - #ifdef RLIMIT_RSS - case L'm': - what=RLIMIT_RSS; + case L'm': { + what = RLIMIT_RSS; break; + } #endif - - case L'n': - what=RLIMIT_NOFILE; + case L'n': { + what = RLIMIT_NOFILE; break; - - case L's': - what=RLIMIT_STACK; + } + case L's': { + what = RLIMIT_STACK; break; - - case L't': - what=RLIMIT_CPU; + } + case L't': { + what = RLIMIT_CPU; break; - + } #ifdef RLIMIT_NPROC - case L'u': - what=RLIMIT_NPROC; + case L'u': { + what = RLIMIT_NPROC; break; + } #endif - #ifdef RLIMIT_AS - case L'v': - what=RLIMIT_AS; + case L'v': { + what = RLIMIT_AS; break; + } #endif - - case L'h': + case L'h': { builtin_print_help(parser, streams, argv[0], streams.out); return 0; - - case L'?': - builtin_unknown_option(parser, streams, argv[0], argv[w.woptind-1]); + } + case L'?': { + builtin_unknown_option(parser, streams, argv[0], argv[w.woptind - 1]); return 1; + } } } - if (report_all) - { - if (argc - w.woptind == 0) - { + if (report_all) { + if (argc - w.woptind == 0) { print_all(hard, streams); - } - else - { + } else { streams.err.append(argv[0]); streams.err.append(L": Too many arguments\n"); builtin_print_help(parser, streams, argv[0], streams.err); @@ -441,54 +276,32 @@ static int builtin_ulimit(parser_t &parser, io_streams_t &streams, wchar_t **arg return 0; } - switch (argc - w.woptind) - { - case 0: - { - /* - Show current limit value - */ + switch (argc - w.woptind) { + case 0: { // show current limit value print(what, hard, streams); break; } - - case 1: - { - /* - Change current limit value - */ + case 1: { // change current limit value rlim_t new_limit; wchar_t *end; - /* - Set both hard and soft limits if nothing else was specified - */ - if (!(hard+soft)) - { - hard=soft=1; + // Set both hard and soft limits if nothing else was specified. + if (!(hard + soft)) { + hard = soft = 1; } - if (wcscasecmp(argv[w.woptind], L"unlimited")==0) - { + if (wcscasecmp(argv[w.woptind], L"unlimited") == 0) { new_limit = RLIM_INFINITY; - } - else if (wcscasecmp(argv[w.woptind], L"hard")==0) - { + } else if (wcscasecmp(argv[w.woptind], L"hard") == 0) { new_limit = get(what, 1); - } - else if (wcscasecmp(argv[w.woptind], L"soft")==0) - { + } else if (wcscasecmp(argv[w.woptind], L"soft") == 0) { new_limit = get(what, soft); - } - else - { - errno=0; + } else { + errno = 0; new_limit = wcstol(argv[w.woptind], &end, 10); - if (errno || *end) - { - streams.err.append_format(L"%ls: Invalid limit '%ls'\n", - argv[0], - argv[w.woptind]); + if (errno || *end) { + streams.err.append_format(L"%ls: Invalid limit '%ls'\n", argv[0], + argv[w.woptind]); builtin_print_help(parser, streams, argv[0], streams.err); return 1; } @@ -497,15 +310,12 @@ static int builtin_ulimit(parser_t &parser, io_streams_t &streams, wchar_t **arg return set(what, hard, soft, new_limit, streams); } - - default: - { + default: { streams.err.append(argv[0]); streams.err.append(L": Too many arguments\n"); builtin_print_help(parser, streams, argv[0], streams.err); return 1; } - } return 0; } |