X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcgtop%2Fcgtop.c;h=3009589597325246cccfbff32b699b220374097f;hp=f988adb363f5d428828241396d8896fa3e176d54;hb=e66bb58bed3fe5ef152268ac257b2801a7679549;hpb=63210a15e1efdbda3fb3abd9a6ae9961fd0ea153 diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c index f988adb36..300958959 100644 --- a/src/cgtop/cgtop.c +++ b/src/cgtop/cgtop.c @@ -55,6 +55,8 @@ typedef struct Group { } Group; static unsigned arg_depth = 3; +static unsigned arg_iterations = 0; +static bool arg_batch = false; static usec_t arg_delay = 1*USEC_PER_SEC; static enum { @@ -310,7 +312,7 @@ static int refresh_one( if (r <= 0) goto finish; - p = join(path, "/", fn, NULL); + p = strjoin(path, "/", fn, NULL); free(fn); if (!p) { @@ -505,6 +507,8 @@ static void help(void) { " -m Order by memory load\n" " -i Order by IO load\n" " -d --delay=DELAY Specify delay\n" + " -n --iterations=N Run for N iterations before exiting\n" + " -b --batch Run in batch mode, accepting no input\n" " --depth=DEPTH Maximum traversal depth (default: 2)\n", program_invocation_short_name); } @@ -516,10 +520,12 @@ static int parse_argv(int argc, char *argv[]) { }; static const struct option options[] = { - { "help", no_argument, NULL, 'h' }, - { "delay", required_argument, NULL, 'd' }, - { "depth", required_argument, NULL, ARG_DEPTH }, - { NULL, 0, NULL, 0 } + { "help", no_argument, NULL, 'h' }, + { "delay", required_argument, NULL, 'd' }, + { "iterations", required_argument, NULL, 'n' }, + { "batch", no_argument, NULL, 'b' }, + { "depth", required_argument, NULL, ARG_DEPTH }, + { NULL, 0, NULL, 0 } }; int c; @@ -528,7 +534,7 @@ static int parse_argv(int argc, char *argv[]) { assert(argc >= 1); assert(argv); - while ((c = getopt_long(argc, argv, "hptcmid:", options, NULL)) >= 0) { + while ((c = getopt_long(argc, argv, "hptcmin:bd:", options, NULL)) >= 0) { switch (c) { @@ -554,6 +560,19 @@ static int parse_argv(int argc, char *argv[]) { break; + case 'n': + r = safe_atou(optarg, &arg_iterations); + if (r < 0) { + log_error("Failed to parse iterations parameter."); + return -EINVAL; + } + + break; + + case 'b': + arg_batch = true; + break; + case 'p': arg_order = ORDER_PATH; break; @@ -608,8 +627,7 @@ int main(int argc, char *argv[]) { a = hashmap_new(string_hash_func, string_compare_func); b = hashmap_new(string_hash_func, string_compare_func); if (!a || !b) { - log_error("Out of memory"); - r = -ENOMEM; + r = log_oom(); goto finish; } @@ -641,17 +659,28 @@ int main(int argc, char *argv[]) { if (r < 0) goto finish; - r = read_one_char(stdin, &key, last_refresh + arg_delay - t, NULL); - if (r == -ETIMEDOUT) - continue; - if (r < 0) { - log_error("Couldn't read key: %s", strerror(-r)); - goto finish; + if (arg_iterations && iteration >= arg_iterations) + break; + + if (arg_batch) { + usleep(last_refresh + arg_delay - t); + } else { + r = read_one_char(stdin, &key, + last_refresh + arg_delay - t, NULL); + if (r == -ETIMEDOUT) + continue; + if (r < 0) { + log_error("Couldn't read key: %s", strerror(-r)); + goto finish; + } } fputs("\r \r", stdout); fflush(stdout); + if (arg_batch) + continue; + switch (key) { case ' ':