Enhance -e abbrev=set, -e raw=set, and -e verbose=set

Enhance abbrev=, raw=, and verbose= to accept the same syntax as trace=.
For example, this allows such syntax as -e verbose=file.

* syscall.c (lookup_class): Define before qual_syscall.
(qualify): Move the loop based on lookup_class ...
(qual_syscall): ... here.
* tests/qual_syscall.test: Check it.
This commit is contained in:
2016-09-30 00:35:35 +00:00
parent 55334effed
commit a606d3a74a
2 changed files with 58 additions and 32 deletions

View File

@ -418,13 +418,45 @@ qualify_one(const unsigned int n, unsigned int bitflag, const int not, const int
}
}
static int
lookup_class(const char *s)
{
if (strcmp(s, "file") == 0)
return TRACE_FILE;
if (strcmp(s, "ipc") == 0)
return TRACE_IPC;
if (strcmp(s, "network") == 0)
return TRACE_NETWORK;
if (strcmp(s, "process") == 0)
return TRACE_PROCESS;
if (strcmp(s, "signal") == 0)
return TRACE_SIGNAL;
if (strcmp(s, "desc") == 0)
return TRACE_DESC;
if (strcmp(s, "memory") == 0)
return TRACE_MEMORY;
return -1;
}
static int
qual_syscall(const char *s, const unsigned int bitflag, const int not)
{
int p;
unsigned int p;
unsigned int i;
int n;
int rc = -1;
if ((n = lookup_class(s)) >= 0) {
for (p = 0; p < SUPPORTED_PERSONALITIES; ++p) {
for (i = 0; i < nsyscall_vec[p]; ++i) {
if ((sysent_vec[p][i].sys_flags & n) == n) {
qualify_one(i, bitflag, not, p);
}
}
}
return 0;
}
if (*s >= '0' && *s <= '9') {
i = string_to_uint(s);
if (i >= MAX_NSYSCALLS)
@ -483,26 +515,6 @@ qual_desc(const char *s, const unsigned int bitflag, const int not)
return -1;
}
static int
lookup_class(const char *s)
{
if (strcmp(s, "file") == 0)
return TRACE_FILE;
if (strcmp(s, "ipc") == 0)
return TRACE_IPC;
if (strcmp(s, "network") == 0)
return TRACE_NETWORK;
if (strcmp(s, "process") == 0)
return TRACE_PROCESS;
if (strcmp(s, "signal") == 0)
return TRACE_SIGNAL;
if (strcmp(s, "desc") == 0)
return TRACE_DESC;
if (strcmp(s, "memory") == 0)
return TRACE_MEMORY;
return -1;
}
void
qualify(const char *s)
{
@ -544,16 +556,6 @@ qualify(const char *s)
}
copy = xstrdup(s);
for (p = strtok(copy, ","); p; p = strtok(NULL, ",")) {
int n;
if (opt->bitflag == QUAL_TRACE && (n = lookup_class(p)) > 0) {
unsigned pers;
for (pers = 0; pers < SUPPORTED_PERSONALITIES; pers++) {
for (i = 0; i < nsyscall_vec[pers]; i++)
if (sysent_vec[pers][i].sys_flags & n)
qualify_one(i, opt->bitflag, not, pers);
}
continue;
}
if (opt->qualify(p, opt->bitflag, not)) {
error_msg_and_die("invalid %s '%s'",
opt->argument_name, p);

View File

@ -1,11 +1,15 @@
#!/bin/sh
# Ensure that strace -e trace=set works.
# Check how strace -e abbrev=set, -e raw=set, -e trace=set,
# and -e verbose=set work.
. "${srcdir=.}/init.sh"
run_prog ./umovestr
pattern_abbrev_verbose='execve("\./umovestr", \["\./umovestr"\], \[/\* [[:digit:]]* vars \*/\]) = 0'
pattern_nonabbrev_verbose='execve("\./umovestr", \["\./umovestr"\], \[".*\"\]) = 0'
pattern_nonverbose='execve("\./umovestr", 0x[[:xdigit:]]*, 0x[[:xdigit:]]*) = 0'
pattern_raw='execve(0x[[:xdigit:]]*, 0x[[:xdigit:]]*, 0x[[:xdigit:]]*) = 0'
check_output_mismatch()
{
@ -29,4 +33,24 @@ run_strace -e 42 ./umovestr
LC_ALL=C grep '^[[:alnum:]_]*(' > /dev/null &&
dump_log_and_fail_with "$STRACE $args unexpected output"
for a in execve \!chdir all \!none \
file process \!desc \!ipc \!memory \!network \!signal; do
check_output_mismatch \
"$pattern_abbrev_verbose" -e abbrev="$a" -e execve
check_output_mismatch \
"$pattern_raw" -a22 -e raw="$a" -e execve
check_output_mismatch \
"$pattern_abbrev_verbose" -e verbose="$a" -e execve
done
for a in \!execve chdir 42 \!all none \
\!file \!process desc ipc memory network signal; do
check_output_mismatch \
"$pattern_nonabbrev_verbose" -e abbrev="$a" -e execve
check_output_mismatch \
"$pattern_abbrev_verbose" -e raw="$a" -e execve
check_output_mismatch \
"$pattern_nonverbose" -a31 -e verbose="$a" -e execve
done
exit 0