}
}
+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)
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)
{
}
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);
#!/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()
{
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