Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1255213 > unrolled thread
| Started by | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| First post | 2015-10-24 17:50 +0200 |
| Last post | 2015-10-29 10:50 +0100 |
| Articles | 14 — 5 participants |
Back to article view | Back to linux.kernel
[PATCH 1/4] perf tools: Improve ambiguous option help message Namhyung Kim <namhyung@kernel.org> - 2015-10-24 17:50 +0200
[PATCH 2/4] perf report: Rename to --show-cpu-utilization Namhyung Kim <namhyung@kernel.org> - 2015-10-24 17:50 +0200
Re: [PATCH 2/4] perf report: Rename to --show-cpu-utilization Ingo Molnar <mingo@kernel.org> - 2015-10-25 10:00 +0100
[tip:perf/core] perf report: Rename to --show-cpu-utilization tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-10-29 10:50 +0100
[PATCH 4/4] perf tools: Introduce usage_with_options_msg() Namhyung Kim <namhyung@kernel.org> - 2015-10-24 17:50 +0200
Re: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-26 18:20 +0100
RE: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> - 2015-10-27 00:20 +0100
Re: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-10-27 13:40 +0100
[tip:perf/core] perf tools: Introduce usage_with_options_msg() tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-10-29 10:50 +0100
[PATCH 3/4] perf tools: Setup pager when printing usage and help Namhyung Kim <namhyung@kernel.org> - 2015-10-24 17:50 +0200
Re: [PATCH 3/4] perf tools: Setup pager when printing usage and help Ingo Molnar <mingo@kernel.org> - 2015-10-25 10:10 +0100
[tip:perf/core] perf tools: Setup pager when printing usage and help tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-10-29 10:50 +0100
Re: [PATCH 1/4] perf tools: Improve ambiguous option help message Ingo Molnar <mingo@kernel.org> - 2015-10-25 09:50 +0100
[tip:perf/core] perf tools: Improve ambiguous option help message tip-bot for Namhyung Kim <tipbot@zytor.com> - 2015-10-29 10:50 +0100
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-10-24 17:50 +0200 |
| Subject | [PATCH 1/4] perf tools: Improve ambiguous option help message |
| Message-ID | <qn9eV-4A2-3@gated-at.bofh.it> |
Currently if an option name is ambiguous it only prints first two
matched option names but no help. It'd be better it could show all
possible names and help messages too.
Before:
$ perf report --show
Error: Ambiguous option: show (could be --show-total-period or
--show-ref-call-graph)
Usage: perf report [<options>]
After:
$ perf report --show
Error: Ambiguous option: show (could be --show-total-period or
--show-ref-call-graph)
Usage: perf report [<options>]
-n, --show-nr-samples
Show a column with the number of samples
--showcpuutilization
Show sample percentage for different cpu modes
-I, --show-info Display extended information about perf.data file
--show-total-period
Show a column with the sum of periods
--show-ref-call-graph
Show callgraph from reference event
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/parse-options.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 22c2806bda98..b8d98229a8af 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -770,24 +770,23 @@ int parse_options_usage(const char * const *usagestr,
opt:
for ( ; opts->type != OPTION_END; opts++) {
if (short_opt) {
- if (opts->short_name == *optstr)
+ if (opts->short_name == *optstr) {
+ print_option_help(opts, 0);
break;
+ }
continue;
}
if (opts->long_name == NULL)
continue;
- if (!prefixcmp(optstr, opts->long_name))
- break;
- if (!prefixcmp(optstr, "no-") &&
- !prefixcmp(optstr + 3, opts->long_name))
- break;
+ if (!prefixcmp(opts->long_name, optstr))
+ print_option_help(opts, 0);
+ if (!prefixcmp("no-", optstr) &&
+ !prefixcmp(opts->long_name, optstr + 3))
+ print_option_help(opts, 0);
}
- if (opts->type != OPTION_END)
- print_option_help(opts, 0);
-
return PARSE_OPT_HELP;
}
--
2.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-10-24 17:50 +0200 |
| Subject | [PATCH 2/4] perf report: Rename to --show-cpu-utilization |
| Message-ID | <qn9eV-4A2-7@gated-at.bofh.it> |
| In reply to | #1255213 |
So that it can be more consistent with other --show-* options. The old
name (--showcpuutilization) is provided only for compatibility.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/Documentation/perf-report.txt | 2 +-
tools/perf/builtin-report.c | 4 +++-
tools/perf/util/parse-options.h | 1 +
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
index ab1fd64e3627..5ce8da1e1256 100644
--- a/tools/perf/Documentation/perf-report.txt
+++ b/tools/perf/Documentation/perf-report.txt
@@ -29,7 +29,7 @@ OPTIONS
--show-nr-samples::
Show the number of samples for each symbol
---showcpuutilization::
+--show-cpu-utilization::
Show sample percentage for different cpu modes.
-T::
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 50dd4d3d8667..2853ad2bd435 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -699,8 +699,10 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
" Please refer the man page for the complete list."),
OPT_STRING('F', "fields", &field_order, "key[,keys...]",
"output field(s): overhead, period, sample plus all of sort keys"),
- OPT_BOOLEAN(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
+ OPT_BOOLEAN(0, "show-cpu-utilization", &symbol_conf.show_cpu_utilization,
"Show sample percentage for different cpu modes"),
+ OPT_BOOLEAN_FLAG(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
+ "Show sample percentage for different cpu modes", PARSE_OPT_HIDDEN),
OPT_STRING('p', "parent", &parent_pattern, "regex",
"regex filter to identify parent, see: '--sort parent'"),
OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 367d8b816cc7..182c86099330 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -111,6 +111,7 @@ struct option {
#define OPT_GROUP(h) { .type = OPTION_GROUP, .help = (h) }
#define OPT_BIT(s, l, v, h, b) { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h), .defval = (b) }
#define OPT_BOOLEAN(s, l, v, h) { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h) }
+#define OPT_BOOLEAN_FLAG(s, l, v, h, f) { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h), .flags = (f) }
#define OPT_BOOLEAN_SET(s, l, v, os, h) \
{ .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), \
.value = check_vtype(v, bool *), .help = (h), \
--
2.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2015-10-25 10:00 +0100 |
| Subject | Re: [PATCH 2/4] perf report: Rename to --show-cpu-utilization |
| Message-ID | <qnpjI-8sg-1@gated-at.bofh.it> |
| In reply to | #1255214 |
* Namhyung Kim <namhyung@kernel.org> wrote: > So that it can be more consistent with other --show-* options. The old > name (--showcpuutilization) is provided only for compatibility. 1) Btw., maybe we could enhance the option parser to strip all (non-leading) dashes from long-form option names? That way both variants would work naturally, and if someone thinks it's called '--show-cpuutilization' that would work as well. 2) Also, another enhancement would be to allow partial matches, so that --showcpu would match on the first long-form option name that matches. Right now we do: triton:~/tip> perf report -h --showcpu Usage: perf report [<options>] triton:~/tip> Which arguably isn't very helpful! :-) 3) The only drawback of doing partial matches would be if we introduce new variants - but we'd still 'break' safely: if for example --show-cpu-usage is introduced in a couple of years, then previous usage of: perf report --showcpu would emit your ambiguous-options warning that you improved in this series. We'd output the two options that match and the user could adjust the parameter to whichever he meant. It would still very smooth behavior from a UI ergonomy POV IMHO. 4) Another possible tweak would be to print a non-fatal info line when a user didn't use the canonical form of the option. So writing: perf report --showcpu would result in (stdout) output like this: # Option parser: '--showcpu' matched on '--show-cpu-utilization' The disadvantage of this would be the extra nuisance factor, so I'm not sure we want this aspect. Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Namhyung Kim <tipbot@zytor.com> |
|---|---|
| Date | 2015-10-29 10:50 +0100 |
| Subject | [tip:perf/core] perf report: Rename to --show-cpu-utilization |
| Message-ID | <qoS0i-6Ul-19@gated-at.bofh.it> |
| In reply to | #1255214 |
Commit-ID: b272a59d835cd8ca6b45f41c66c61b473996c759
Gitweb: http://git.kernel.org/tip/b272a59d835cd8ca6b45f41c66c61b473996c759
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Sun, 25 Oct 2015 00:49:25 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 26 Oct 2015 14:06:04 -0300
perf report: Rename to --show-cpu-utilization
So that it can be more consistent with other --show-* options. The old
name (--showcpuutilization) is provided only for compatibility.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445701767-12731-2-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/Documentation/perf-report.txt | 2 +-
tools/perf/builtin-report.c | 4 +++-
tools/perf/util/parse-options.h | 1 +
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt
index ab1fd64..5ce8da1 100644
--- a/tools/perf/Documentation/perf-report.txt
+++ b/tools/perf/Documentation/perf-report.txt
@@ -29,7 +29,7 @@ OPTIONS
--show-nr-samples::
Show the number of samples for each symbol
---showcpuutilization::
+--show-cpu-utilization::
Show sample percentage for different cpu modes.
-T::
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 50dd4d3..2853ad2 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -699,8 +699,10 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
" Please refer the man page for the complete list."),
OPT_STRING('F', "fields", &field_order, "key[,keys...]",
"output field(s): overhead, period, sample plus all of sort keys"),
- OPT_BOOLEAN(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
+ OPT_BOOLEAN(0, "show-cpu-utilization", &symbol_conf.show_cpu_utilization,
"Show sample percentage for different cpu modes"),
+ OPT_BOOLEAN_FLAG(0, "showcpuutilization", &symbol_conf.show_cpu_utilization,
+ "Show sample percentage for different cpu modes", PARSE_OPT_HIDDEN),
OPT_STRING('p', "parent", &parent_pattern, "regex",
"regex filter to identify parent, see: '--sort parent'"),
OPT_BOOLEAN('x', "exclude-other", &symbol_conf.exclude_other,
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 367d8b8..182c860 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -111,6 +111,7 @@ struct option {
#define OPT_GROUP(h) { .type = OPTION_GROUP, .help = (h) }
#define OPT_BIT(s, l, v, h, b) { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = check_vtype(v, int *), .help = (h), .defval = (b) }
#define OPT_BOOLEAN(s, l, v, h) { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h) }
+#define OPT_BOOLEAN_FLAG(s, l, v, h, f) { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = check_vtype(v, bool *), .help = (h), .flags = (f) }
#define OPT_BOOLEAN_SET(s, l, v, os, h) \
{ .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), \
.value = check_vtype(v, bool *), .help = (h), \
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-10-24 17:50 +0200 |
| Subject | [PATCH 4/4] perf tools: Introduce usage_with_options_msg() |
| Message-ID | <qn9eV-4A2-9@gated-at.bofh.it> |
| In reply to | #1255213 |
Now usage_with_options() setup a pager before printing message so normal
printf() or pr_err() will not be shown. The usage_with_options_msg()
can be used to print some help message before usage strings.
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/builtin-evlist.c | 4 ++--
tools/perf/builtin-probe.c | 20 ++++++++++++--------
tools/perf/builtin-record.c | 11 ++++++-----
tools/perf/builtin-sched.c | 4 ++--
tools/perf/builtin-script.c | 8 ++++----
tools/perf/util/parse-options.c | 15 +++++++++++++++
tools/perf/util/parse-options.h | 4 ++++
tools/perf/util/strbuf.c | 22 +++++++++++++++-------
tools/perf/util/strbuf.h | 2 ++
9 files changed, 62 insertions(+), 28 deletions(-)
diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c
index 695ec5a50cf2..f4d62510acbb 100644
--- a/tools/perf/builtin-evlist.c
+++ b/tools/perf/builtin-evlist.c
@@ -61,8 +61,8 @@ int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused)
usage_with_options(evlist_usage, options);
if (details.event_group && (details.verbose || details.freq)) {
- pr_err("--group option is not compatible with other options\n");
- usage_with_options(evlist_usage, options);
+ usage_with_options_msg(evlist_usage, options,
+ "--group option is not compatible with other options\n");
}
return __cmd_evlist(input_name, &details);
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 530c3a28a58c..132afc97676c 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -528,12 +528,12 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
PARSE_OPT_STOP_AT_NON_OPTION);
if (argc > 0) {
if (strcmp(argv[0], "-") == 0) {
- pr_warning(" Error: '-' is not supported.\n");
- usage_with_options(probe_usage, options);
+ usage_with_options_msg(probe_usage, options,
+ "'-' is not supported.\n");
}
if (params.command && params.command != 'a') {
- pr_warning(" Error: another command except --add is set.\n");
- usage_with_options(probe_usage, options);
+ usage_with_options_msg(probe_usage, options,
+ "another command except --add is set.\n");
}
ret = parse_probe_event_argv(argc, argv);
if (ret < 0) {
@@ -562,8 +562,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
switch (params.command) {
case 'l':
if (params.uprobes) {
- pr_warning(" Error: Don't use --list with --exec.\n");
- usage_with_options(probe_usage, options);
+ pr_err(" Error: Don't use --list with --exec.\n");
+ parse_options_usage(probe_usage, options, "l", true);
+ parse_options_usage(NULL, options, "x", true);
+ return -EINVAL;
}
ret = show_perf_probe_events(params.filter);
if (ret < 0)
@@ -603,8 +605,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
case 'a':
/* Ensure the last given target is used */
if (params.target && !params.target_used) {
- pr_warning(" Error: -x/-m must follow the probe definitions.\n");
- usage_with_options(probe_usage, options);
+ pr_err(" Error: -x/-m must follow the probe definitions.\n");
+ parse_options_usage(probe_usage, options, "m", true);
+ parse_options_usage(NULL, options, "x", true);
+ return -EINVAL;
}
ret = perf_add_probe_events(params.events, params.nevents);
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 2740d7a82ae8..de02267c73d8 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1135,14 +1135,15 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
usage_with_options(record_usage, record_options);
if (nr_cgroups && !rec->opts.target.system_wide) {
- ui__error("cgroup monitoring only available in"
- " system-wide mode\n");
- usage_with_options(record_usage, record_options);
+ usage_with_options_msg(record_usage, record_options,
+ "cgroup monitoring only available in system-wide mode");
+
}
if (rec->opts.record_switch_events &&
!perf_can_record_switch_events()) {
- ui__error("kernel does not support recording context switch events (--switch-events option)\n");
- usage_with_options(record_usage, record_options);
+ ui__error("kernel does not support recording context switch events\n");
+ parse_options_usage(record_usage, record_options, "switch-events", 0);
+ return -EINVAL;
}
if (!rec->itr) {
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 33962612a5e9..0ee6d900e100 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -1728,8 +1728,8 @@ static void setup_sorting(struct perf_sched *sched, const struct option *options
for (tok = strtok_r(str, ", ", &tmp);
tok; tok = strtok_r(NULL, ", ", &tmp)) {
if (sort_dimension__add(tok, &sched->sort_list) < 0) {
- error("Unknown --sort key: `%s'", tok);
- usage_with_options(usage_msg, options);
+ usage_with_options_msg(usage_msg, options,
+ "Unknown --sort key: `%s'", tok);
}
}
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 2653c0273b89..278acb22f029 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -1767,9 +1767,9 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
if (!rec_script_path && !rep_script_path) {
- fprintf(stderr, " Couldn't find script %s\n\n See perf"
+ usage_with_options_msg(script_usage, options,
+ "Couldn't find script `%s'\n\n See perf"
" script -l for available scripts.\n", argv[0]);
- usage_with_options(script_usage, options);
}
if (is_top_script(argv[0])) {
@@ -1780,10 +1780,10 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
rep_args = has_required_arg(rep_script_path);
rec_args = (argc - 1) - rep_args;
if (rec_args < 0) {
- fprintf(stderr, " %s script requires options."
+ usage_with_options_msg(script_usage, options,
+ "`%s' script requires options."
"\n\n See perf script -l for available "
"scripts and options.\n", argv[0]);
- usage_with_options(script_usage, options);
}
}
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index eeeed98eb26d..230e771407a3 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -760,6 +760,21 @@ void usage_with_options(const char * const *usagestr,
exit(129);
}
+void usage_with_options_msg(const char * const *usagestr,
+ const struct option *opts, const char *fmt, ...)
+{
+ va_list ap;
+
+ exit_browser(false);
+
+ va_start(ap, fmt);
+ strbuf_addv(&error_buf, fmt, ap);
+ va_end(ap);
+
+ usage_with_options_internal(usagestr, opts, 0, NULL);
+ exit(129);
+}
+
int parse_options_usage(const char * const *usagestr,
const struct option *opts,
const char *optstr, bool short_opt)
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 182c86099330..a8e407bc251e 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -161,6 +161,10 @@ extern int parse_options_subcommand(int argc, const char **argv,
extern NORETURN void usage_with_options(const char * const *usagestr,
const struct option *options);
+extern NORETURN __attribute__((format(printf,3,4)))
+void usage_with_options_msg(const char * const *usagestr,
+ const struct option *options,
+ const char *fmt, ...);
/*----- incremantal advanced APIs -----*/
diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
index 4abe23550c73..25671fa16618 100644
--- a/tools/perf/util/strbuf.c
+++ b/tools/perf/util/strbuf.c
@@ -82,23 +82,22 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len)
strbuf_setlen(sb, sb->len + len);
}
-void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
+void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap)
{
int len;
- va_list ap;
+ va_list ap_saved;
if (!strbuf_avail(sb))
strbuf_grow(sb, 64);
- va_start(ap, fmt);
+
+ va_copy(ap_saved, ap);
len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
- va_end(ap);
if (len < 0)
die("your vsnprintf is broken");
if (len > strbuf_avail(sb)) {
strbuf_grow(sb, len);
- va_start(ap, fmt);
- len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
- va_end(ap);
+ len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved);
+ va_end(ap_saved);
if (len > strbuf_avail(sb)) {
die("this should not happen, your vsnprintf is broken");
}
@@ -106,6 +105,15 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
strbuf_setlen(sb, sb->len + len);
}
+void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ strbuf_addv(sb, fmt, ap);
+ va_end(ap);
+}
+
ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
{
size_t oldlen = sb->len;
diff --git a/tools/perf/util/strbuf.h b/tools/perf/util/strbuf.h
index 436ac319f6c7..529f2f035249 100644
--- a/tools/perf/util/strbuf.h
+++ b/tools/perf/util/strbuf.h
@@ -39,6 +39,7 @@
*/
#include <assert.h>
+#include <stdarg.h>
extern char strbuf_slopbuf[];
struct strbuf {
@@ -85,6 +86,7 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
__attribute__((format(printf,2,3)))
extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
+extern void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap);
/* XXX: if read fails, any partial read is undone */
extern ssize_t strbuf_read(struct strbuf *, int fd, ssize_t hint);
--
2.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-10-26 18:20 +0100 |
| Subject | Re: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() |
| Message-ID | <qnTB8-2zF-13@gated-at.bofh.it> |
| In reply to | #1255215 |
Em Sun, Oct 25, 2015 at 12:49:27AM +0900, Namhyung Kim escreveu:
> Now usage_with_options() setup a pager before printing message so normal
> printf() or pr_err() will not be shown. The usage_with_options_msg()
> can be used to print some help message before usage strings.
Haven't tested, but intent looks good, Masami, could you please check if
all is ok and provide an Acked-by and/or Tested-by?
- Arnaldo
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
> tools/perf/builtin-evlist.c | 4 ++--
> tools/perf/builtin-probe.c | 20 ++++++++++++--------
> tools/perf/builtin-record.c | 11 ++++++-----
> tools/perf/builtin-sched.c | 4 ++--
> tools/perf/builtin-script.c | 8 ++++----
> tools/perf/util/parse-options.c | 15 +++++++++++++++
> tools/perf/util/parse-options.h | 4 ++++
> tools/perf/util/strbuf.c | 22 +++++++++++++++-------
> tools/perf/util/strbuf.h | 2 ++
> 9 files changed, 62 insertions(+), 28 deletions(-)
>
> diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c
> index 695ec5a50cf2..f4d62510acbb 100644
> --- a/tools/perf/builtin-evlist.c
> +++ b/tools/perf/builtin-evlist.c
> @@ -61,8 +61,8 @@ int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused)
> usage_with_options(evlist_usage, options);
>
> if (details.event_group && (details.verbose || details.freq)) {
> - pr_err("--group option is not compatible with other options\n");
> - usage_with_options(evlist_usage, options);
> + usage_with_options_msg(evlist_usage, options,
> + "--group option is not compatible with other options\n");
> }
>
> return __cmd_evlist(input_name, &details);
> diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
> index 530c3a28a58c..132afc97676c 100644
> --- a/tools/perf/builtin-probe.c
> +++ b/tools/perf/builtin-probe.c
> @@ -528,12 +528,12 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> PARSE_OPT_STOP_AT_NON_OPTION);
> if (argc > 0) {
> if (strcmp(argv[0], "-") == 0) {
> - pr_warning(" Error: '-' is not supported.\n");
> - usage_with_options(probe_usage, options);
> + usage_with_options_msg(probe_usage, options,
> + "'-' is not supported.\n");
> }
> if (params.command && params.command != 'a') {
> - pr_warning(" Error: another command except --add is set.\n");
> - usage_with_options(probe_usage, options);
> + usage_with_options_msg(probe_usage, options,
> + "another command except --add is set.\n");
> }
> ret = parse_probe_event_argv(argc, argv);
> if (ret < 0) {
> @@ -562,8 +562,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> switch (params.command) {
> case 'l':
> if (params.uprobes) {
> - pr_warning(" Error: Don't use --list with --exec.\n");
> - usage_with_options(probe_usage, options);
> + pr_err(" Error: Don't use --list with --exec.\n");
> + parse_options_usage(probe_usage, options, "l", true);
> + parse_options_usage(NULL, options, "x", true);
> + return -EINVAL;
> }
> ret = show_perf_probe_events(params.filter);
> if (ret < 0)
> @@ -603,8 +605,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
> case 'a':
> /* Ensure the last given target is used */
> if (params.target && !params.target_used) {
> - pr_warning(" Error: -x/-m must follow the probe definitions.\n");
> - usage_with_options(probe_usage, options);
> + pr_err(" Error: -x/-m must follow the probe definitions.\n");
> + parse_options_usage(probe_usage, options, "m", true);
> + parse_options_usage(NULL, options, "x", true);
> + return -EINVAL;
> }
>
> ret = perf_add_probe_events(params.events, params.nevents);
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index 2740d7a82ae8..de02267c73d8 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -1135,14 +1135,15 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
> usage_with_options(record_usage, record_options);
>
> if (nr_cgroups && !rec->opts.target.system_wide) {
> - ui__error("cgroup monitoring only available in"
> - " system-wide mode\n");
> - usage_with_options(record_usage, record_options);
> + usage_with_options_msg(record_usage, record_options,
> + "cgroup monitoring only available in system-wide mode");
> +
> }
> if (rec->opts.record_switch_events &&
> !perf_can_record_switch_events()) {
> - ui__error("kernel does not support recording context switch events (--switch-events option)\n");
> - usage_with_options(record_usage, record_options);
> + ui__error("kernel does not support recording context switch events\n");
> + parse_options_usage(record_usage, record_options, "switch-events", 0);
> + return -EINVAL;
> }
>
> if (!rec->itr) {
> diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
> index 33962612a5e9..0ee6d900e100 100644
> --- a/tools/perf/builtin-sched.c
> +++ b/tools/perf/builtin-sched.c
> @@ -1728,8 +1728,8 @@ static void setup_sorting(struct perf_sched *sched, const struct option *options
> for (tok = strtok_r(str, ", ", &tmp);
> tok; tok = strtok_r(NULL, ", ", &tmp)) {
> if (sort_dimension__add(tok, &sched->sort_list) < 0) {
> - error("Unknown --sort key: `%s'", tok);
> - usage_with_options(usage_msg, options);
> + usage_with_options_msg(usage_msg, options,
> + "Unknown --sort key: `%s'", tok);
> }
> }
>
> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
> index 2653c0273b89..278acb22f029 100644
> --- a/tools/perf/builtin-script.c
> +++ b/tools/perf/builtin-script.c
> @@ -1767,9 +1767,9 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
> rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
>
> if (!rec_script_path && !rep_script_path) {
> - fprintf(stderr, " Couldn't find script %s\n\n See perf"
> + usage_with_options_msg(script_usage, options,
> + "Couldn't find script `%s'\n\n See perf"
> " script -l for available scripts.\n", argv[0]);
> - usage_with_options(script_usage, options);
> }
>
> if (is_top_script(argv[0])) {
> @@ -1780,10 +1780,10 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
> rep_args = has_required_arg(rep_script_path);
> rec_args = (argc - 1) - rep_args;
> if (rec_args < 0) {
> - fprintf(stderr, " %s script requires options."
> + usage_with_options_msg(script_usage, options,
> + "`%s' script requires options."
> "\n\n See perf script -l for available "
> "scripts and options.\n", argv[0]);
> - usage_with_options(script_usage, options);
> }
> }
>
> diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
> index eeeed98eb26d..230e771407a3 100644
> --- a/tools/perf/util/parse-options.c
> +++ b/tools/perf/util/parse-options.c
> @@ -760,6 +760,21 @@ void usage_with_options(const char * const *usagestr,
> exit(129);
> }
>
> +void usage_with_options_msg(const char * const *usagestr,
> + const struct option *opts, const char *fmt, ...)
> +{
> + va_list ap;
> +
> + exit_browser(false);
> +
> + va_start(ap, fmt);
> + strbuf_addv(&error_buf, fmt, ap);
> + va_end(ap);
> +
> + usage_with_options_internal(usagestr, opts, 0, NULL);
> + exit(129);
> +}
> +
> int parse_options_usage(const char * const *usagestr,
> const struct option *opts,
> const char *optstr, bool short_opt)
> diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
> index 182c86099330..a8e407bc251e 100644
> --- a/tools/perf/util/parse-options.h
> +++ b/tools/perf/util/parse-options.h
> @@ -161,6 +161,10 @@ extern int parse_options_subcommand(int argc, const char **argv,
>
> extern NORETURN void usage_with_options(const char * const *usagestr,
> const struct option *options);
> +extern NORETURN __attribute__((format(printf,3,4)))
> +void usage_with_options_msg(const char * const *usagestr,
> + const struct option *options,
> + const char *fmt, ...);
>
> /*----- incremantal advanced APIs -----*/
>
> diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
> index 4abe23550c73..25671fa16618 100644
> --- a/tools/perf/util/strbuf.c
> +++ b/tools/perf/util/strbuf.c
> @@ -82,23 +82,22 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len)
> strbuf_setlen(sb, sb->len + len);
> }
>
> -void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
> +void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap)
> {
> int len;
> - va_list ap;
> + va_list ap_saved;
>
> if (!strbuf_avail(sb))
> strbuf_grow(sb, 64);
> - va_start(ap, fmt);
> +
> + va_copy(ap_saved, ap);
> len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
> - va_end(ap);
> if (len < 0)
> die("your vsnprintf is broken");
> if (len > strbuf_avail(sb)) {
> strbuf_grow(sb, len);
> - va_start(ap, fmt);
> - len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
> - va_end(ap);
> + len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved);
> + va_end(ap_saved);
> if (len > strbuf_avail(sb)) {
> die("this should not happen, your vsnprintf is broken");
> }
> @@ -106,6 +105,15 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
> strbuf_setlen(sb, sb->len + len);
> }
>
> +void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
> +{
> + va_list ap;
> +
> + va_start(ap, fmt);
> + strbuf_addv(sb, fmt, ap);
> + va_end(ap);
> +}
> +
> ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
> {
> size_t oldlen = sb->len;
> diff --git a/tools/perf/util/strbuf.h b/tools/perf/util/strbuf.h
> index 436ac319f6c7..529f2f035249 100644
> --- a/tools/perf/util/strbuf.h
> +++ b/tools/perf/util/strbuf.h
> @@ -39,6 +39,7 @@
> */
>
> #include <assert.h>
> +#include <stdarg.h>
>
> extern char strbuf_slopbuf[];
> struct strbuf {
> @@ -85,6 +86,7 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
>
> __attribute__((format(printf,2,3)))
> extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
> +extern void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap);
>
> /* XXX: if read fails, any partial read is undone */
> extern ssize_t strbuf_read(struct strbuf *, int fd, ssize_t hint);
> --
> 2.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-10-27 00:20 +0100 |
| Subject | RE: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() |
| Message-ID | <qnZdw-60t-13@gated-at.bofh.it> |
| In reply to | #1255215 |
PkZyb206IE5hbWh5dW5nIEtpbSBbbWFpbHRvOm5hbWh5dW5nQGdtYWlsLmNvbV0gT24gQmVoYWxm IE9mIE5hbWh5dW5nIEtpbQ0KPg0KPk5vdyB1c2FnZV93aXRoX29wdGlvbnMoKSBzZXR1cCBhIHBh Z2VyIGJlZm9yZSBwcmludGluZyBtZXNzYWdlIHNvIG5vcm1hbA0KPnByaW50ZigpIG9yIHByX2Vy cigpIHdpbGwgbm90IGJlIHNob3duLiAgVGhlIHVzYWdlX3dpdGhfb3B0aW9uc19tc2coKQ0KPmNh biBiZSB1c2VkIHRvIHByaW50IHNvbWUgaGVscCBtZXNzYWdlIGJlZm9yZSB1c2FnZSBzdHJpbmdz Lg0KDQpUaGFua3MhIGxvb2tzIGdvb2QgdG8gbWUgIDopDQoNCkFja2VkLWJ5OiBNYXNhbWkgSGly YW1hdHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KDQoNCj4NCj5DYzogTWFz YW1pIEhpcmFtYXRzdSA8bWFzYW1pLmhpcmFtYXRzdS5wdEBoaXRhY2hpLmNvbT4NCj5TaWduZWQt b2ZmLWJ5OiBOYW1oeXVuZyBLaW0gPG5hbWh5dW5nQGtlcm5lbC5vcmc+DQo+LS0tDQo+IHRvb2xz L3BlcmYvYnVpbHRpbi1ldmxpc3QuYyAgICAgfCAgNCArKy0tDQo+IHRvb2xzL3BlcmYvYnVpbHRp bi1wcm9iZS5jICAgICAgfCAyMCArKysrKysrKysrKystLS0tLS0tLQ0KPiB0b29scy9wZXJmL2J1 aWx0aW4tcmVjb3JkLmMgICAgIHwgMTEgKysrKysrLS0tLS0NCj4gdG9vbHMvcGVyZi9idWlsdGlu LXNjaGVkLmMgICAgICB8ICA0ICsrLS0NCj4gdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jICAg ICB8ICA4ICsrKystLS0tDQo+IHRvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMgfCAxNSAr KysrKysrKysrKysrKysNCj4gdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaCB8ICA0ICsr KysNCj4gdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5jICAgICAgICB8IDIyICsrKysrKysrKysrKysr Ky0tLS0tLS0NCj4gdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5oICAgICAgICB8ICAyICsrDQo+IDkg ZmlsZXMgY2hhbmdlZCwgNjIgaW5zZXJ0aW9ucygrKSwgMjggZGVsZXRpb25zKC0pDQo+DQo+ZGlm ZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRp bi1ldmxpc3QuYw0KPmluZGV4IDY5NWVjNWE1MGNmMi4uZjRkNjI1MTBhY2JiIDEwMDY0NA0KPi0t LSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1ldmxpc3QuYw0KPisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRp bi1ldmxpc3QuYw0KPkBAIC02MSw4ICs2MSw4IEBAIGludCBjbWRfZXZsaXN0KGludCBhcmdjLCBj b25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQ0KPiAJ CXVzYWdlX3dpdGhfb3B0aW9ucyhldmxpc3RfdXNhZ2UsIG9wdGlvbnMpOw0KPg0KPiAJaWYgKGRl dGFpbHMuZXZlbnRfZ3JvdXAgJiYgKGRldGFpbHMudmVyYm9zZSB8fCBkZXRhaWxzLmZyZXEpKSB7 DQo+LQkJcHJfZXJyKCItLWdyb3VwIG9wdGlvbiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG90aGVy IG9wdGlvbnNcbiIpOw0KPi0JCXVzYWdlX3dpdGhfb3B0aW9ucyhldmxpc3RfdXNhZ2UsIG9wdGlv bnMpOw0KPisJCXVzYWdlX3dpdGhfb3B0aW9uc19tc2coZXZsaXN0X3VzYWdlLCBvcHRpb25zLA0K PisJCQkiLS1ncm91cCBvcHRpb24gaXMgbm90IGNvbXBhdGlibGUgd2l0aCBvdGhlciBvcHRpb25z XG4iKTsNCj4gCX0NCj4NCj4gCXJldHVybiBfX2NtZF9ldmxpc3QoaW5wdXRfbmFtZSwgJmRldGFp bHMpOw0KPmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYyBiL3Rvb2xzL3Bl cmYvYnVpbHRpbi1wcm9iZS5jDQo+aW5kZXggNTMwYzNhMjhhNThjLi4xMzJhZmM5NzY3NmMgMTAw NjQ0DQo+LS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMNCj4rKysgYi90b29scy9wZXJm L2J1aWx0aW4tcHJvYmUuYw0KPkBAIC01MjgsMTIgKzUyOCwxMiBAQCBfX2NtZF9wcm9iZShpbnQg YXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX21heWJlX3VudXNl ZCkNCj4gCQkJICAgICBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsNCj4gCWlmIChhcmdj ID4gMCkgew0KPiAJCWlmIChzdHJjbXAoYXJndlswXSwgIi0iKSA9PSAwKSB7DQo+LQkJCXByX3dh cm5pbmcoIiAgRXJyb3I6ICctJyBpcyBub3Qgc3VwcG9ydGVkLlxuIik7DQo+LQkJCXVzYWdlX3dp dGhfb3B0aW9ucyhwcm9iZV91c2FnZSwgb3B0aW9ucyk7DQo+KwkJCXVzYWdlX3dpdGhfb3B0aW9u c19tc2cocHJvYmVfdXNhZ2UsIG9wdGlvbnMsDQo+KwkJCQkiJy0nIGlzIG5vdCBzdXBwb3J0ZWQu XG4iKTsNCj4gCQl9DQo+IAkJaWYgKHBhcmFtcy5jb21tYW5kICYmIHBhcmFtcy5jb21tYW5kICE9 ICdhJykgew0KPi0JCQlwcl93YXJuaW5nKCIgIEVycm9yOiBhbm90aGVyIGNvbW1hbmQgZXhjZXB0 IC0tYWRkIGlzIHNldC5cbiIpOw0KPi0JCQl1c2FnZV93aXRoX29wdGlvbnMocHJvYmVfdXNhZ2Us IG9wdGlvbnMpOw0KPisJCQl1c2FnZV93aXRoX29wdGlvbnNfbXNnKHByb2JlX3VzYWdlLCBvcHRp b25zLA0KPisJCQkJImFub3RoZXIgY29tbWFuZCBleGNlcHQgLS1hZGQgaXMgc2V0LlxuIik7DQo+ IAkJfQ0KPiAJCXJldCA9IHBhcnNlX3Byb2JlX2V2ZW50X2FyZ3YoYXJnYywgYXJndik7DQo+IAkJ aWYgKHJldCA8IDApIHsNCj5AQCAtNTYyLDggKzU2MiwxMCBAQCBfX2NtZF9wcm9iZShpbnQgYXJn YywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX21heWJlX3VudXNlZCkN Cj4gCXN3aXRjaCAocGFyYW1zLmNvbW1hbmQpIHsNCj4gCWNhc2UgJ2wnOg0KPiAJCWlmIChwYXJh bXMudXByb2Jlcykgew0KPi0JCQlwcl93YXJuaW5nKCIgIEVycm9yOiBEb24ndCB1c2UgLS1saXN0 IHdpdGggLS1leGVjLlxuIik7DQo+LQkJCXVzYWdlX3dpdGhfb3B0aW9ucyhwcm9iZV91c2FnZSwg b3B0aW9ucyk7DQo+KwkJCXByX2VycigiICBFcnJvcjogRG9uJ3QgdXNlIC0tbGlzdCB3aXRoIC0t ZXhlYy5cbiIpOw0KPisJCQlwYXJzZV9vcHRpb25zX3VzYWdlKHByb2JlX3VzYWdlLCBvcHRpb25z LCAibCIsIHRydWUpOw0KPisJCQlwYXJzZV9vcHRpb25zX3VzYWdlKE5VTEwsIG9wdGlvbnMsICJ4 IiwgdHJ1ZSk7DQo+KwkJCXJldHVybiAtRUlOVkFMOw0KPiAJCX0NCj4gCQlyZXQgPSBzaG93X3Bl cmZfcHJvYmVfZXZlbnRzKHBhcmFtcy5maWx0ZXIpOw0KPiAJCWlmIChyZXQgPCAwKQ0KPkBAIC02 MDMsOCArNjA1LDEwIEBAIF9fY21kX3Byb2JlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwg Y29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQ0KPiAJY2FzZSAnYSc6DQo+IAkJLyog RW5zdXJlIHRoZSBsYXN0IGdpdmVuIHRhcmdldCBpcyB1c2VkICovDQo+IAkJaWYgKHBhcmFtcy50 YXJnZXQgJiYgIXBhcmFtcy50YXJnZXRfdXNlZCkgew0KPi0JCQlwcl93YXJuaW5nKCIgIEVycm9y OiAteC8tbSBtdXN0IGZvbGxvdyB0aGUgcHJvYmUgZGVmaW5pdGlvbnMuXG4iKTsNCj4tCQkJdXNh Z2Vfd2l0aF9vcHRpb25zKHByb2JlX3VzYWdlLCBvcHRpb25zKTsNCj4rCQkJcHJfZXJyKCIgIEVy cm9yOiAteC8tbSBtdXN0IGZvbGxvdyB0aGUgcHJvYmUgZGVmaW5pdGlvbnMuXG4iKTsNCj4rCQkJ cGFyc2Vfb3B0aW9uc191c2FnZShwcm9iZV91c2FnZSwgb3B0aW9ucywgIm0iLCB0cnVlKTsNCj4r CQkJcGFyc2Vfb3B0aW9uc191c2FnZShOVUxMLCBvcHRpb25zLCAieCIsIHRydWUpOw0KPisJCQly ZXR1cm4gLUVJTlZBTDsNCj4gCQl9DQo+DQo+IAkJcmV0ID0gcGVyZl9hZGRfcHJvYmVfZXZlbnRz KHBhcmFtcy5ldmVudHMsIHBhcmFtcy5uZXZlbnRzKTsNCj5kaWZmIC0tZ2l0IGEvdG9vbHMvcGVy Zi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jDQo+aW5kZXgg Mjc0MGQ3YTgyYWU4Li5kZTAyMjY3YzczZDggMTAwNjQ0DQo+LS0tIGEvdG9vbHMvcGVyZi9idWls dGluLXJlY29yZC5jDQo+KysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jDQo+QEAgLTEx MzUsMTQgKzExMzUsMTUgQEAgaW50IGNtZF9yZWNvcmQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiph cmd2LCBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpDQo+IAkJdXNhZ2Vfd2l0aF9v cHRpb25zKHJlY29yZF91c2FnZSwgcmVjb3JkX29wdGlvbnMpOw0KPg0KPiAJaWYgKG5yX2Nncm91 cHMgJiYgIXJlYy0+b3B0cy50YXJnZXQuc3lzdGVtX3dpZGUpIHsNCj4tCQl1aV9fZXJyb3IoImNn cm91cCBtb25pdG9yaW5nIG9ubHkgYXZhaWxhYmxlIGluIg0KPi0JCQkgICIgc3lzdGVtLXdpZGUg bW9kZVxuIik7DQo+LQkJdXNhZ2Vfd2l0aF9vcHRpb25zKHJlY29yZF91c2FnZSwgcmVjb3JkX29w dGlvbnMpOw0KPisJCXVzYWdlX3dpdGhfb3B0aW9uc19tc2cocmVjb3JkX3VzYWdlLCByZWNvcmRf b3B0aW9ucywNCj4rCQkJImNncm91cCBtb25pdG9yaW5nIG9ubHkgYXZhaWxhYmxlIGluIHN5c3Rl bS13aWRlIG1vZGUiKTsNCj4rDQo+IAl9DQo+IAlpZiAocmVjLT5vcHRzLnJlY29yZF9zd2l0Y2hf ZXZlbnRzICYmDQo+IAkgICAgIXBlcmZfY2FuX3JlY29yZF9zd2l0Y2hfZXZlbnRzKCkpIHsNCj4t CQl1aV9fZXJyb3IoImtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHJlY29yZGluZyBjb250ZXh0IHN3 aXRjaCBldmVudHMgKC0tc3dpdGNoLWV2ZW50cyBvcHRpb24pXG4iKTsNCj4tCQl1c2FnZV93aXRo X29wdGlvbnMocmVjb3JkX3VzYWdlLCByZWNvcmRfb3B0aW9ucyk7DQo+KwkJdWlfX2Vycm9yKCJr ZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCByZWNvcmRpbmcgY29udGV4dCBzd2l0Y2ggZXZlbnRzXG4i KTsNCj4rCQlwYXJzZV9vcHRpb25zX3VzYWdlKHJlY29yZF91c2FnZSwgcmVjb3JkX29wdGlvbnMs ICJzd2l0Y2gtZXZlbnRzIiwgMCk7DQo+KwkJcmV0dXJuIC1FSU5WQUw7DQo+IAl9DQo+DQo+IAlp ZiAoIXJlYy0+aXRyKSB7DQo+ZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5j IGIvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMNCj5pbmRleCAzMzk2MjYxMmE1ZTkuLjBlZTZk OTAwZTEwMCAxMDA2NDQNCj4tLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYw0KPisrKyBi L3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jDQo+QEAgLTE3MjgsOCArMTcyOCw4IEBAIHN0YXRp YyB2b2lkIHNldHVwX3NvcnRpbmcoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkLCBjb25zdCBzdHJ1 Y3Qgb3B0aW9uICpvcHRpb25zDQo+IAlmb3IgKHRvayA9IHN0cnRva19yKHN0ciwgIiwgIiwgJnRt cCk7DQo+IAkJCXRvazsgdG9rID0gc3RydG9rX3IoTlVMTCwgIiwgIiwgJnRtcCkpIHsNCj4gCQlp ZiAoc29ydF9kaW1lbnNpb25fX2FkZCh0b2ssICZzY2hlZC0+c29ydF9saXN0KSA8IDApIHsNCj4t CQkJZXJyb3IoIlVua25vd24gLS1zb3J0IGtleTogYCVzJyIsIHRvayk7DQo+LQkJCXVzYWdlX3dp dGhfb3B0aW9ucyh1c2FnZV9tc2csIG9wdGlvbnMpOw0KPisJCQl1c2FnZV93aXRoX29wdGlvbnNf bXNnKHVzYWdlX21zZywgb3B0aW9ucywNCj4rCQkJCQkiVW5rbm93biAtLXNvcnQga2V5OiBgJXMn IiwgdG9rKTsNCj4gCQl9DQo+IAl9DQo+DQo+ZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRp bi1zY3JpcHQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYw0KPmluZGV4IDI2NTNjMDI3 M2I4OS4uMjc4YWNiMjJmMDI5IDEwMDY0NA0KPi0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3Jp cHQuYw0KPisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYw0KPkBAIC0xNzY3LDkgKzE3 NjcsOSBAQCBpbnQgY21kX3NjcmlwdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0 IGNoYXIgKnByZWZpeCBfX21heWJlX3VudXNlZCkNCj4gCQlyZXBfc2NyaXB0X3BhdGggPSBnZXRf c2NyaXB0X3BhdGgoYXJndlswXSwgUkVQT1JUX1NVRkZJWCk7DQo+DQo+IAkJaWYgKCFyZWNfc2Ny aXB0X3BhdGggJiYgIXJlcF9zY3JpcHRfcGF0aCkgew0KPi0JCQlmcHJpbnRmKHN0ZGVyciwgIiBD b3VsZG4ndCBmaW5kIHNjcmlwdCAlc1xuXG4gU2VlIHBlcmYiDQo+KwkJCXVzYWdlX3dpdGhfb3B0 aW9uc19tc2coc2NyaXB0X3VzYWdlLCBvcHRpb25zLA0KPisJCQkJIkNvdWxkbid0IGZpbmQgc2Ny aXB0IGAlcydcblxuIFNlZSBwZXJmIg0KPiAJCQkJIiBzY3JpcHQgLWwgZm9yIGF2YWlsYWJsZSBz Y3JpcHRzLlxuIiwgYXJndlswXSk7DQo+LQkJCXVzYWdlX3dpdGhfb3B0aW9ucyhzY3JpcHRfdXNh Z2UsIG9wdGlvbnMpOw0KPiAJCX0NCj4NCj4gCQlpZiAoaXNfdG9wX3NjcmlwdChhcmd2WzBdKSkg ew0KPkBAIC0xNzgwLDEwICsxNzgwLDEwIEBAIGludCBjbWRfc2NyaXB0KGludCBhcmdjLCBjb25z dCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQ0KPiAJCQly ZXBfYXJncyA9IGhhc19yZXF1aXJlZF9hcmcocmVwX3NjcmlwdF9wYXRoKTsNCj4gCQkJcmVjX2Fy Z3MgPSAoYXJnYyAtIDEpIC0gcmVwX2FyZ3M7DQo+IAkJCWlmIChyZWNfYXJncyA8IDApIHsNCj4t CQkJCWZwcmludGYoc3RkZXJyLCAiICVzIHNjcmlwdCByZXF1aXJlcyBvcHRpb25zLiINCj4rCQkJ CXVzYWdlX3dpdGhfb3B0aW9uc19tc2coc2NyaXB0X3VzYWdlLCBvcHRpb25zLA0KPisJCQkJCSJg JXMnIHNjcmlwdCByZXF1aXJlcyBvcHRpb25zLiINCj4gCQkJCQkiXG5cbiBTZWUgcGVyZiBzY3Jp cHQgLWwgZm9yIGF2YWlsYWJsZSAiDQo+IAkJCQkJInNjcmlwdHMgYW5kIG9wdGlvbnMuXG4iLCBh cmd2WzBdKTsNCj4tCQkJCXVzYWdlX3dpdGhfb3B0aW9ucyhzY3JpcHRfdXNhZ2UsIG9wdGlvbnMp Ow0KPiAJCQl9DQo+IAkJfQ0KPg0KPmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2Ut b3B0aW9ucy5jIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYw0KPmluZGV4IGVlZWVk OThlYjI2ZC4uMjMwZTc3MTQwN2EzIDEwMDY0NA0KPi0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJz ZS1vcHRpb25zLmMNCj4rKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jDQo+QEAg LTc2MCw2ICs3NjAsMjEgQEAgdm9pZCB1c2FnZV93aXRoX29wdGlvbnMoY29uc3QgY2hhciAqIGNv bnN0ICp1c2FnZXN0ciwNCj4gCWV4aXQoMTI5KTsNCj4gfQ0KPg0KPit2b2lkIHVzYWdlX3dpdGhf b3B0aW9uc19tc2coY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwNCj4rCQkJICAgIGNvbnN0 IHN0cnVjdCBvcHRpb24gKm9wdHMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQ0KPit7DQo+Kwl2YV9s aXN0IGFwOw0KPisNCj4rCWV4aXRfYnJvd3NlcihmYWxzZSk7DQo+Kw0KPisJdmFfc3RhcnQoYXAs IGZtdCk7DQo+KwlzdHJidWZfYWRkdigmZXJyb3JfYnVmLCBmbXQsIGFwKTsNCj4rCXZhX2VuZChh cCk7DQo+Kw0KPisJdXNhZ2Vfd2l0aF9vcHRpb25zX2ludGVybmFsKHVzYWdlc3RyLCBvcHRzLCAw LCBOVUxMKTsNCj4rCWV4aXQoMTI5KTsNCj4rfQ0KPisNCj4gaW50IHBhcnNlX29wdGlvbnNfdXNh Z2UoY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwNCj4gCQkJY29uc3Qgc3RydWN0IG9wdGlv biAqb3B0cywNCj4gCQkJY29uc3QgY2hhciAqb3B0c3RyLCBib29sIHNob3J0X29wdCkNCj5kaWZm IC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaCBiL3Rvb2xzL3BlcmYvdXRp bC9wYXJzZS1vcHRpb25zLmgNCj5pbmRleCAxODJjODYwOTkzMzAuLmE4ZTQwN2JjMjUxZSAxMDA2 NDQNCj4tLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oDQo+KysrIGIvdG9vbHMv cGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaA0KPkBAIC0xNjEsNiArMTYxLDEwIEBAIGV4dGVybiBp bnQgcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwN Cj4NCj4gZXh0ZXJuIE5PUkVUVVJOIHZvaWQgdXNhZ2Vfd2l0aF9vcHRpb25zKGNvbnN0IGNoYXIg KiBjb25zdCAqdXNhZ2VzdHIsDQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKTsNCj4rZXh0ZXJuIE5PUkVUVVJOIF9f YXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMyw0KSkpDQo+K3ZvaWQgdXNhZ2Vfd2l0aF9vcHRp b25zX21zZyhjb25zdCBjaGFyICogY29uc3QgKnVzYWdlc3RyLA0KPisJCQkgICAgY29uc3Qgc3Ry dWN0IG9wdGlvbiAqb3B0aW9ucywNCj4rCQkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsNCj4N Cj4gLyotLS0tLSBpbmNyZW1hbnRhbCBhZHZhbmNlZCBBUElzIC0tLS0tKi8NCj4NCj5kaWZmIC0t Z2l0IGEvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5jIGIvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5j DQo+aW5kZXggNGFiZTIzNTUwYzczLi4yNTY3MWZhMTY2MTggMTAwNjQ0DQo+LS0tIGEvdG9vbHMv cGVyZi91dGlsL3N0cmJ1Zi5jDQo+KysrIGIvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5jDQo+QEAg LTgyLDIzICs4MiwyMiBAQCB2b2lkIHN0cmJ1Zl9hZGQoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0 IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pDQo+IAlzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsg bGVuKTsNCj4gfQ0KPg0KPi12b2lkIHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25z dCBjaGFyICpmbXQsIC4uLikNCj4rdm9pZCBzdHJidWZfYWRkdihzdHJ1Y3Qgc3RyYnVmICpzYiwg Y29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQ0KPiB7DQo+IAlpbnQgbGVuOw0KPi0JdmFfbGlz dCBhcDsNCj4rCXZhX2xpc3QgYXBfc2F2ZWQ7DQo+DQo+IAlpZiAoIXN0cmJ1Zl9hdmFpbChzYikp DQo+IAkJc3RyYnVmX2dyb3coc2IsIDY0KTsNCj4tCXZhX3N0YXJ0KGFwLCBmbXQpOw0KPisNCj4r CXZhX2NvcHkoYXBfc2F2ZWQsIGFwKTsNCj4gCWxlbiA9IHZzbnByaW50ZihzYi0+YnVmICsgc2It Pmxlbiwgc2ItPmFsbG9jIC0gc2ItPmxlbiwgZm10LCBhcCk7DQo+LQl2YV9lbmQoYXApOw0KPiAJ aWYgKGxlbiA8IDApDQo+IAkJZGllKCJ5b3VyIHZzbnByaW50ZiBpcyBicm9rZW4iKTsNCj4gCWlm IChsZW4gPiBzdHJidWZfYXZhaWwoc2IpKSB7DQo+IAkJc3RyYnVmX2dyb3coc2IsIGxlbik7DQo+ LQkJdmFfc3RhcnQoYXAsIGZtdCk7DQo+LQkJbGVuID0gdnNucHJpbnRmKHNiLT5idWYgKyBzYi0+ bGVuLCBzYi0+YWxsb2MgLSBzYi0+bGVuLCBmbXQsIGFwKTsNCj4tCQl2YV9lbmQoYXApOw0KPisJ CWxlbiA9IHZzbnByaW50ZihzYi0+YnVmICsgc2ItPmxlbiwgc2ItPmFsbG9jIC0gc2ItPmxlbiwg Zm10LCBhcF9zYXZlZCk7DQo+KwkJdmFfZW5kKGFwX3NhdmVkKTsNCj4gCQlpZiAobGVuID4gc3Ry YnVmX2F2YWlsKHNiKSkgew0KPiAJCQlkaWUoInRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHlvdXIg dnNucHJpbnRmIGlzIGJyb2tlbiIpOw0KPiAJCX0NCj5AQCAtMTA2LDYgKzEwNSwxNSBAQCB2b2lk IHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikNCj4g CXN0cmJ1Zl9zZXRsZW4oc2IsIHNiLT5sZW4gKyBsZW4pOw0KPiB9DQo+DQo+K3ZvaWQgc3RyYnVm X2FkZGYoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQ0KPit7DQo+Kwl2 YV9saXN0IGFwOw0KPisNCj4rCXZhX3N0YXJ0KGFwLCBmbXQpOw0KPisJc3RyYnVmX2FkZHYoc2Is IGZtdCwgYXApOw0KPisJdmFfZW5kKGFwKTsNCj4rfQ0KPisNCj4gc3NpemVfdCBzdHJidWZfcmVh ZChzdHJ1Y3Qgc3RyYnVmICpzYiwgaW50IGZkLCBzc2l6ZV90IGhpbnQpDQo+IHsNCj4gCXNpemVf dCBvbGRsZW4gPSBzYi0+bGVuOw0KPmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3RyYnVm LmggYi90b29scy9wZXJmL3V0aWwvc3RyYnVmLmgNCj5pbmRleCA0MzZhYzMxOWY2YzcuLjUyOWYy ZjAzNTI0OSAxMDA2NDQNCj4tLS0gYS90b29scy9wZXJmL3V0aWwvc3RyYnVmLmgNCj4rKysgYi90 b29scy9wZXJmL3V0aWwvc3RyYnVmLmgNCj5AQCAtMzksNiArMzksNyBAQA0KPiAgKi8NCj4NCj4g I2luY2x1ZGUgPGFzc2VydC5oPg0KPisjaW5jbHVkZSA8c3RkYXJnLmg+DQo+DQo+IGV4dGVybiBj aGFyIHN0cmJ1Zl9zbG9wYnVmW107DQo+IHN0cnVjdCBzdHJidWYgew0KPkBAIC04NSw2ICs4Niw3 IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBzdHJidWZfYWRkc3RyKHN0cnVjdCBzdHJidWYgKnNiLCBj b25zdCBjaGFyICpzKSB7DQo+DQo+IF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMiwzKSkp DQo+IGV4dGVybiB2b2lkIHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFy ICpmbXQsIC4uLik7DQo+K2V4dGVybiB2b2lkIHN0cmJ1Zl9hZGR2KHN0cnVjdCBzdHJidWYgKnNi LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOw0KPg0KPiAvKiBYWFg6IGlmIHJlYWQgZmFp bHMsIGFueSBwYXJ0aWFsIHJlYWQgaXMgdW5kb25lICovDQo+IGV4dGVybiBzc2l6ZV90IHN0cmJ1 Zl9yZWFkKHN0cnVjdCBzdHJidWYgKiwgaW50IGZkLCBzc2l6ZV90IGhpbnQpOw0KPi0tDQo+Mi42 LjANCg0K -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Arnaldo Carvalho de Melo <acme@kernel.org> |
|---|---|
| Date | 2015-10-27 13:40 +0100 |
| Subject | Re: [PATCH 4/4] perf tools: Introduce usage_with_options_msg() |
| Message-ID | <qobHJ-5cG-33@gated-at.bofh.it> |
| In reply to | #1256341 |
Em Mon, Oct 26, 2015 at 11:13:32PM +0000, 平松雅巳 / HIRAMATU,MASAMI escreveu: > >From: Namhyung Kim [mailto:namhyung@gmail.com] On Behalf Of Namhyung Kim > > > >Now usage_with_options() setup a pager before printing message so normal > >printf() or pr_err() will not be shown. The usage_with_options_msg() > >can be used to print some help message before usage strings. > > Thanks! looks good to me :) > > Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Thanks, applied. - Arnaldo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Namhyung Kim <tipbot@zytor.com> |
|---|---|
| Date | 2015-10-29 10:50 +0100 |
| Subject | [tip:perf/core] perf tools: Introduce usage_with_options_msg() |
| Message-ID | <qoS0j-6Ul-41@gated-at.bofh.it> |
| In reply to | #1255215 |
Commit-ID: c71183697250b356be6c7c1abc2e9a74073e1dca
Gitweb: http://git.kernel.org/tip/c71183697250b356be6c7c1abc2e9a74073e1dca
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Sun, 25 Oct 2015 00:49:27 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 27 Oct 2015 09:28:44 -0300
perf tools: Introduce usage_with_options_msg()
Now usage_with_options() setup a pager before printing message so normal
printf() or pr_err() will not be shown. The usage_with_options_msg()
can be used to print some help message before usage strings.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445701767-12731-4-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/builtin-evlist.c | 4 ++--
tools/perf/builtin-probe.c | 20 ++++++++++++--------
tools/perf/builtin-record.c | 11 ++++++-----
tools/perf/builtin-sched.c | 4 ++--
tools/perf/builtin-script.c | 8 ++++----
tools/perf/util/parse-options.c | 15 +++++++++++++++
tools/perf/util/parse-options.h | 4 ++++
tools/perf/util/strbuf.c | 22 +++++++++++++++-------
tools/perf/util/strbuf.h | 2 ++
9 files changed, 62 insertions(+), 28 deletions(-)
diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c
index 695ec5a..f4d6251 100644
--- a/tools/perf/builtin-evlist.c
+++ b/tools/perf/builtin-evlist.c
@@ -61,8 +61,8 @@ int cmd_evlist(int argc, const char **argv, const char *prefix __maybe_unused)
usage_with_options(evlist_usage, options);
if (details.event_group && (details.verbose || details.freq)) {
- pr_err("--group option is not compatible with other options\n");
- usage_with_options(evlist_usage, options);
+ usage_with_options_msg(evlist_usage, options,
+ "--group option is not compatible with other options\n");
}
return __cmd_evlist(input_name, &details);
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c
index 530c3a2..132afc9 100644
--- a/tools/perf/builtin-probe.c
+++ b/tools/perf/builtin-probe.c
@@ -528,12 +528,12 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
PARSE_OPT_STOP_AT_NON_OPTION);
if (argc > 0) {
if (strcmp(argv[0], "-") == 0) {
- pr_warning(" Error: '-' is not supported.\n");
- usage_with_options(probe_usage, options);
+ usage_with_options_msg(probe_usage, options,
+ "'-' is not supported.\n");
}
if (params.command && params.command != 'a') {
- pr_warning(" Error: another command except --add is set.\n");
- usage_with_options(probe_usage, options);
+ usage_with_options_msg(probe_usage, options,
+ "another command except --add is set.\n");
}
ret = parse_probe_event_argv(argc, argv);
if (ret < 0) {
@@ -562,8 +562,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
switch (params.command) {
case 'l':
if (params.uprobes) {
- pr_warning(" Error: Don't use --list with --exec.\n");
- usage_with_options(probe_usage, options);
+ pr_err(" Error: Don't use --list with --exec.\n");
+ parse_options_usage(probe_usage, options, "l", true);
+ parse_options_usage(NULL, options, "x", true);
+ return -EINVAL;
}
ret = show_perf_probe_events(params.filter);
if (ret < 0)
@@ -603,8 +605,10 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
case 'a':
/* Ensure the last given target is used */
if (params.target && !params.target_used) {
- pr_warning(" Error: -x/-m must follow the probe definitions.\n");
- usage_with_options(probe_usage, options);
+ pr_err(" Error: -x/-m must follow the probe definitions.\n");
+ parse_options_usage(probe_usage, options, "m", true);
+ parse_options_usage(NULL, options, "x", true);
+ return -EINVAL;
}
ret = perf_add_probe_events(params.events, params.nevents);
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 2740d7a..de02267 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -1135,14 +1135,15 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
usage_with_options(record_usage, record_options);
if (nr_cgroups && !rec->opts.target.system_wide) {
- ui__error("cgroup monitoring only available in"
- " system-wide mode\n");
- usage_with_options(record_usage, record_options);
+ usage_with_options_msg(record_usage, record_options,
+ "cgroup monitoring only available in system-wide mode");
+
}
if (rec->opts.record_switch_events &&
!perf_can_record_switch_events()) {
- ui__error("kernel does not support recording context switch events (--switch-events option)\n");
- usage_with_options(record_usage, record_options);
+ ui__error("kernel does not support recording context switch events\n");
+ parse_options_usage(record_usage, record_options, "switch-events", 0);
+ return -EINVAL;
}
if (!rec->itr) {
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c
index 3396261..0ee6d90 100644
--- a/tools/perf/builtin-sched.c
+++ b/tools/perf/builtin-sched.c
@@ -1728,8 +1728,8 @@ static void setup_sorting(struct perf_sched *sched, const struct option *options
for (tok = strtok_r(str, ", ", &tmp);
tok; tok = strtok_r(NULL, ", ", &tmp)) {
if (sort_dimension__add(tok, &sched->sort_list) < 0) {
- error("Unknown --sort key: `%s'", tok);
- usage_with_options(usage_msg, options);
+ usage_with_options_msg(usage_msg, options,
+ "Unknown --sort key: `%s'", tok);
}
}
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 2653c02..278acb2 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -1767,9 +1767,9 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
rep_script_path = get_script_path(argv[0], REPORT_SUFFIX);
if (!rec_script_path && !rep_script_path) {
- fprintf(stderr, " Couldn't find script %s\n\n See perf"
+ usage_with_options_msg(script_usage, options,
+ "Couldn't find script `%s'\n\n See perf"
" script -l for available scripts.\n", argv[0]);
- usage_with_options(script_usage, options);
}
if (is_top_script(argv[0])) {
@@ -1780,10 +1780,10 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
rep_args = has_required_arg(rep_script_path);
rec_args = (argc - 1) - rep_args;
if (rec_args < 0) {
- fprintf(stderr, " %s script requires options."
+ usage_with_options_msg(script_usage, options,
+ "`%s' script requires options."
"\n\n See perf script -l for available "
"scripts and options.\n", argv[0]);
- usage_with_options(script_usage, options);
}
}
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index eeeed98..230e771 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -760,6 +760,21 @@ void usage_with_options(const char * const *usagestr,
exit(129);
}
+void usage_with_options_msg(const char * const *usagestr,
+ const struct option *opts, const char *fmt, ...)
+{
+ va_list ap;
+
+ exit_browser(false);
+
+ va_start(ap, fmt);
+ strbuf_addv(&error_buf, fmt, ap);
+ va_end(ap);
+
+ usage_with_options_internal(usagestr, opts, 0, NULL);
+ exit(129);
+}
+
int parse_options_usage(const char * const *usagestr,
const struct option *opts,
const char *optstr, bool short_opt)
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 182c860..a8e407b 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -161,6 +161,10 @@ extern int parse_options_subcommand(int argc, const char **argv,
extern NORETURN void usage_with_options(const char * const *usagestr,
const struct option *options);
+extern NORETURN __attribute__((format(printf,3,4)))
+void usage_with_options_msg(const char * const *usagestr,
+ const struct option *options,
+ const char *fmt, ...);
/*----- incremantal advanced APIs -----*/
diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c
index 4abe235..25671fa 100644
--- a/tools/perf/util/strbuf.c
+++ b/tools/perf/util/strbuf.c
@@ -82,23 +82,22 @@ void strbuf_add(struct strbuf *sb, const void *data, size_t len)
strbuf_setlen(sb, sb->len + len);
}
-void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
+void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap)
{
int len;
- va_list ap;
+ va_list ap_saved;
if (!strbuf_avail(sb))
strbuf_grow(sb, 64);
- va_start(ap, fmt);
+
+ va_copy(ap_saved, ap);
len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
- va_end(ap);
if (len < 0)
die("your vsnprintf is broken");
if (len > strbuf_avail(sb)) {
strbuf_grow(sb, len);
- va_start(ap, fmt);
- len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
- va_end(ap);
+ len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap_saved);
+ va_end(ap_saved);
if (len > strbuf_avail(sb)) {
die("this should not happen, your vsnprintf is broken");
}
@@ -106,6 +105,15 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
strbuf_setlen(sb, sb->len + len);
}
+void strbuf_addf(struct strbuf *sb, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ strbuf_addv(sb, fmt, ap);
+ va_end(ap);
+}
+
ssize_t strbuf_read(struct strbuf *sb, int fd, ssize_t hint)
{
size_t oldlen = sb->len;
diff --git a/tools/perf/util/strbuf.h b/tools/perf/util/strbuf.h
index 436ac31..529f2f0 100644
--- a/tools/perf/util/strbuf.h
+++ b/tools/perf/util/strbuf.h
@@ -39,6 +39,7 @@
*/
#include <assert.h>
+#include <stdarg.h>
extern char strbuf_slopbuf[];
struct strbuf {
@@ -85,6 +86,7 @@ static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
__attribute__((format(printf,2,3)))
extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...);
+extern void strbuf_addv(struct strbuf *sb, const char *fmt, va_list ap);
/* XXX: if read fails, any partial read is undone */
extern ssize_t strbuf_read(struct strbuf *, int fd, ssize_t hint);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Namhyung Kim <namhyung@kernel.org> |
|---|---|
| Date | 2015-10-24 17:50 +0200 |
| Subject | [PATCH 3/4] perf tools: Setup pager when printing usage and help |
| Message-ID | <qn9eV-4A2-11@gated-at.bofh.it> |
| In reply to | #1255213 |
It's annoying to see error or help message when command has many options
like in perf record, report or top. So setup pager when print parser
error or help message - it should be OK since no UI is enabled at the
parsing time. The usage_with_options() already disables it by calling
exit_browser() anyway.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
tools/perf/util/parse-options.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index b8d98229a8af..eeeed98eb26d 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -7,6 +7,8 @@
#define OPT_SHORT 1
#define OPT_UNSET 2
+static struct strbuf error_buf = STRBUF_INIT;
+
static int opterror(const struct option *opt, const char *reason, int flags)
{
if (flags & OPT_SHORT)
@@ -540,9 +542,11 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
exit(130);
default: /* PARSE_OPT_UNKNOWN */
if (ctx.argv[0][1] == '-') {
- error("unknown option `%s'", ctx.argv[0] + 2);
+ strbuf_addf(&error_buf, "unknown option `%s'",
+ ctx.argv[0] + 2);
} else {
- error("unknown switch `%c'", *ctx.opt);
+ strbuf_addf(&error_buf, "unknown switch `%c'",
+ *ctx.opt);
}
usage_with_options(usagestr, options);
}
@@ -711,6 +715,13 @@ int usage_with_options_internal(const char * const *usagestr,
if (!usagestr)
return PARSE_OPT_HELP;
+ setup_pager();
+
+ if (strbuf_avail(&error_buf)) {
+ fprintf(stderr, " Error: %s\n", error_buf.buf);
+ strbuf_release(&error_buf);
+ }
+
fprintf(stderr, "\n Usage: %s\n", *usagestr++);
while (*usagestr && **usagestr)
fprintf(stderr, " or: %s\n", *usagestr++);
--
2.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2015-10-25 10:10 +0100 |
| Subject | Re: [PATCH 3/4] perf tools: Setup pager when printing usage and help |
| Message-ID | <qnptn-mg-7@gated-at.bofh.it> |
| In reply to | #1255216 |
* Namhyung Kim <namhyung@kernel.org> wrote: > It's annoying to see error or help message when command has many options like in > perf record, report or top. [...] That's indeed so. > [...] So setup pager when print parser error or help message - it should be OK > since no UI is enabled at the parsing time. The usage_with_options() already > disables it by calling exit_browser() anyway. So I wanted to write that this has a disadvantage as well, that the pager disrupts the regular 'timeline', 'append-only' visual flow of a regular shell workflow. But then I tried your patches, and for short outputs (such as 'perf stat -h') the pager is not activated, while for longer output (such as 'perf report -h') it's activated. That's very intuitive: Acked-by: Ingo Molnar <mingo@kernel.org> Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Namhyung Kim <tipbot@zytor.com> |
|---|---|
| Date | 2015-10-29 10:50 +0100 |
| Subject | [tip:perf/core] perf tools: Setup pager when printing usage and help |
| Message-ID | <qoS0j-6Ul-45@gated-at.bofh.it> |
| In reply to | #1255216 |
Commit-ID: 01b19455c08cc37d1c3ef174524278e84c92fec1
Gitweb: http://git.kernel.org/tip/01b19455c08cc37d1c3ef174524278e84c92fec1
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Sun, 25 Oct 2015 00:49:26 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 26 Oct 2015 14:08:48 -0300
perf tools: Setup pager when printing usage and help
It's annoying to see error or help message when command has many options
like in perf record, report or top. So setup pager when print parser
error or help message - it should be OK since no UI is enabled at the
parsing time. The usage_with_options() already disables it by calling
exit_browser() anyway.
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445701767-12731-3-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/parse-options.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index b8d9822..eeeed98 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -7,6 +7,8 @@
#define OPT_SHORT 1
#define OPT_UNSET 2
+static struct strbuf error_buf = STRBUF_INIT;
+
static int opterror(const struct option *opt, const char *reason, int flags)
{
if (flags & OPT_SHORT)
@@ -540,9 +542,11 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
exit(130);
default: /* PARSE_OPT_UNKNOWN */
if (ctx.argv[0][1] == '-') {
- error("unknown option `%s'", ctx.argv[0] + 2);
+ strbuf_addf(&error_buf, "unknown option `%s'",
+ ctx.argv[0] + 2);
} else {
- error("unknown switch `%c'", *ctx.opt);
+ strbuf_addf(&error_buf, "unknown switch `%c'",
+ *ctx.opt);
}
usage_with_options(usagestr, options);
}
@@ -711,6 +715,13 @@ int usage_with_options_internal(const char * const *usagestr,
if (!usagestr)
return PARSE_OPT_HELP;
+ setup_pager();
+
+ if (strbuf_avail(&error_buf)) {
+ fprintf(stderr, " Error: %s\n", error_buf.buf);
+ strbuf_release(&error_buf);
+ }
+
fprintf(stderr, "\n Usage: %s\n", *usagestr++);
while (*usagestr && **usagestr)
fprintf(stderr, " or: %s\n", *usagestr++);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Ingo Molnar <mingo@kernel.org> |
|---|---|
| Date | 2015-10-25 09:50 +0100 |
| Message-ID | <qnpa2-8lF-11@gated-at.bofh.it> |
| In reply to | #1255213 |
* Namhyung Kim <namhyung@kernel.org> wrote: > Currently if an option name is ambiguous it only prints first two > matched option names but no help. It'd be better it could show all > possible names and help messages too. > > Before: > $ perf report --show > Error: Ambiguous option: show (could be --show-total-period or > --show-ref-call-graph) > Usage: perf report [<options>] > > After: > $ perf report --show > Error: Ambiguous option: show (could be --show-total-period or > --show-ref-call-graph) > Usage: perf report [<options>] > > -n, --show-nr-samples > Show a column with the number of samples > --showcpuutilization > Show sample percentage for different cpu modes > -I, --show-info Display extended information about perf.data file > --show-total-period > Show a column with the sum of periods > --show-ref-call-graph > Show callgraph from reference event Very nice touch! Acked-by: Ingo Molnar <mingo@kernel.org> Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Namhyung Kim <tipbot@zytor.com> |
|---|---|
| Date | 2015-10-29 10:50 +0100 |
| Subject | [tip:perf/core] perf tools: Improve ambiguous option help message |
| Message-ID | <qoS0i-6Ul-29@gated-at.bofh.it> |
| In reply to | #1255213 |
Commit-ID: a5f4a6932ec2e1a53642e97a1be64bc7b169942f
Gitweb: http://git.kernel.org/tip/a5f4a6932ec2e1a53642e97a1be64bc7b169942f
Author: Namhyung Kim <namhyung@kernel.org>
AuthorDate: Sun, 25 Oct 2015 00:49:24 +0900
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 26 Oct 2015 13:59:06 -0300
perf tools: Improve ambiguous option help message
Currently if an option name is ambiguous it only prints first two
matched option names but no help. It'd be better it could show all
possible names and help messages too.
Before:
$ perf report --show
Error: Ambiguous option: show (could be --show-total-period or
--show-ref-call-graph)
Usage: perf report [<options>]
After:
$ perf report --show
Error: Ambiguous option: show (could be --show-total-period or
--show-ref-call-graph)
Usage: perf report [<options>]
-n, --show-nr-samples
Show a column with the number of samples
--showcpuutilization
Show sample percentage for different cpu modes
-I, --show-info Display extended information about perf.data file
--show-total-period
Show a column with the sum of periods
--show-ref-call-graph
Show callgraph from reference event
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1445701767-12731-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/parse-options.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 22c2806..b8d9822 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -770,24 +770,23 @@ int parse_options_usage(const char * const *usagestr,
opt:
for ( ; opts->type != OPTION_END; opts++) {
if (short_opt) {
- if (opts->short_name == *optstr)
+ if (opts->short_name == *optstr) {
+ print_option_help(opts, 0);
break;
+ }
continue;
}
if (opts->long_name == NULL)
continue;
- if (!prefixcmp(optstr, opts->long_name))
- break;
- if (!prefixcmp(optstr, "no-") &&
- !prefixcmp(optstr + 3, opts->long_name))
- break;
+ if (!prefixcmp(opts->long_name, optstr))
+ print_option_help(opts, 0);
+ if (!prefixcmp("no-", optstr) &&
+ !prefixcmp(opts->long_name, optstr + 3))
+ print_option_help(opts, 0);
}
- if (opts->type != OPTION_END)
- print_option_help(opts, 0);
-
return PARSE_OPT_HELP;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web