From: Roland McGrath Date: Thu, 12 Jan 2006 09:50:49 +0000 (+0000) Subject: 2005-11-17 Dmitry V. Levin X-Git-Tag: v4.5.18~307 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=138c6a334fd9949d6147c63ada02cf55472e02c0;p=strace 2005-11-17 Dmitry V. Levin Implement qual_flags support for each personality. * strace.c (main): Move qualify calls after set_personality call. * syscall.c (qual_flags0): New variable.. [SUPPORTED_PERSONALITIES >= 2] (qual_flags1): New variable. [SUPPORTED_PERSONALITIES >= 3] (qual_flags2): New variable. (qual_flags): Change variable definition from array to pointer. (set_personality): Initialize qual_flags variable. (qualify_one): Add "pers" argument to specify personality. [SUPPORTED_PERSONALITIES >= 2]: Set qual_flags1 if requested. [SUPPORTED_PERSONALITIES >= 3]: Set qual_flags2 if requested. (qual_syscall): Pass personality to qualify_one. [SUPPORTED_PERSONALITIES >= 2]: Look for syscall also in sysent1 table. [SUPPORTED_PERSONALITIES >= 3]: Look for syscall also in sysent2 table. (qual_signal): Pass personality to qualify_one. (qual_desc): Likewise. (qualify): Use qualify_one instead of manual qual_flags manipulations. [SUPPORTED_PERSONALITIES >= 2]: Look for syscall also in sysent1 table. [SUPPORTED_PERSONALITIES >= 3]: Look for syscall also in sysent2 table. * defs.h: Update qual_flags declaration. Fixes RH#173986. --- diff --git a/defs.h b/defs.h index 94b02ce0..a04b78f6 100644 --- a/defs.h +++ b/defs.h @@ -400,7 +400,7 @@ struct xlat { #define TRACE_DESC 040 /* Trace file descriptor-related syscalls. */ extern struct tcb **tcbtab; -extern int qual_flags[]; +extern int *qual_flags; extern int debug, followfork, followvfork; extern int rflag, tflag, dtime, cflag, xflag, qflag; extern int acolumn; diff --git a/strace.c b/strace.c index f78458c3..75574d5f 100644 --- a/strace.c +++ b/strace.c @@ -199,12 +199,12 @@ char *argv[]; progname = argv[0]; outf = stderr; interactive = 1; + set_sortby(DEFAULT_SORTBY); + set_personality(DEFAULT_PERSONALITY); qualify("trace=all"); qualify("abbrev=all"); qualify("verbose=all"); qualify("signal=all"); - set_sortby(DEFAULT_SORTBY); - set_personality(DEFAULT_PERSONALITY); while ((c = getopt(argc, argv, "+cdfFhiqrtTvVxza:e:o:O:p:s:S:u:E:")) != EOF) { switch (c) { diff --git a/syscall.c b/syscall.c index c84a3dee..f5ce8d1b 100644 --- a/syscall.c +++ b/syscall.c @@ -129,12 +129,14 @@ static const struct sysent sysent0[] = { #include "syscallent.h" }; static const int nsyscalls0 = sizeof sysent0 / sizeof sysent0[0]; +int qual_flags0[MAX_QUALS]; #if SUPPORTED_PERSONALITIES >= 2 static const struct sysent sysent1[] = { #include "syscallent1.h" }; static const int nsyscalls1 = sizeof sysent1 / sizeof sysent1[0]; +int qual_flags1[MAX_QUALS]; #endif /* SUPPORTED_PERSONALITIES >= 2 */ #if SUPPORTED_PERSONALITIES >= 3 @@ -142,9 +144,11 @@ static const struct sysent sysent2[] = { #include "syscallent2.h" }; static const int nsyscalls2 = sizeof sysent2 / sizeof sysent2[0]; +int qual_flags2[MAX_QUALS]; #endif /* SUPPORTED_PERSONALITIES >= 3 */ const struct sysent *sysent; +int *qual_flags; int nsyscalls; /* Now undef them since short defines cause wicked namespace pollution. */ @@ -193,6 +197,7 @@ int personality; nioctlents = nioctlents0; signalent = signalent0; nsignals = nsignals0; + qual_flags = qual_flags0; break; #if SUPPORTED_PERSONALITIES >= 2 @@ -205,6 +210,7 @@ int personality; nioctlents = nioctlents1; signalent = signalent1; nsignals = nsignals1; + qual_flags = qual_flags1; break; #endif /* SUPPORTED_PERSONALITIES >= 2 */ @@ -218,6 +224,7 @@ int personality; nioctlents = nioctlents2; signalent = signalent2; nsignals = nsignals2; + qual_flags = qual_flags2; break; #endif /* SUPPORTED_PERSONALITIES >= 3 */ @@ -229,8 +236,6 @@ int personality; return 0; } -int qual_flags[MAX_QUALS]; - struct call_counts { struct timeval time; @@ -273,15 +278,36 @@ static const struct qual_options { }; static void -qualify_one(n, opt, not) +qualify_one(n, opt, not, pers) int n; const struct qual_options *opt; int not; + int pers; { - if (not) - qual_flags[n] &= ~opt->bitflag; - else - qual_flags[n] |= opt->bitflag; + if (pers == 0 || pers < 0) { + if (not) + qual_flags0[n] &= ~opt->bitflag; + else + qual_flags0[n] |= opt->bitflag; + } + +#if SUPPORTED_PERSONALITIES >= 2 + if (pers == 1 || pers < 0) { + if (not) + qual_flags1[n] &= ~opt->bitflag; + else + qual_flags1[n] |= opt->bitflag; + } +#endif /* SUPPORTED_PERSONALITIES >= 2 */ + +#if SUPPORTED_PERSONALITIES >= 3 + if (pers == 2 || pers < 0) { + if (not) + qual_flags2[n] &= ~opt->bitflag; + else + qual_flags2[n] |= opt->bitflag; + } +#endif /* SUPPORTED_PERSONALITIES >= 3 */ } static int @@ -297,14 +323,28 @@ qual_syscall(s, opt, not) int i = atoi(s); if (i < 0 || i >= nsyscalls) return -1; - qualify_one(i, opt, not); + qualify_one(i, opt, not, -1); return 0; } for (i = 0; i < nsyscalls; i++) { - if (strcmp(s, sysent[i].sys_name) == 0) { - qualify_one(i, opt, not); + if (strcmp(s, sysent0[i].sys_name) == 0) { + qualify_one(i, opt, not, 0); + rc = 0; + } + +#if SUPPORTED_PERSONALITIES >= 2 + if (strcmp(s, sysent1[i].sys_name) == 0) { + qualify_one(i, opt, not, 1); + rc = 0; + } +#endif /* SUPPORTED_PERSONALITIES >= 2 */ + +#if SUPPORTED_PERSONALITIES >= 3 + if (strcmp(s, sysent2[i].sys_name) == 0) { + qualify_one(i, opt, not, 2); rc = 0; } +#endif /* SUPPORTED_PERSONALITIES >= 3 */ } return rc; } @@ -322,7 +362,7 @@ qual_signal(s, opt, not) int signo = atoi(s); if (signo < 0 || signo >= MAX_QUALS) return -1; - qualify_one(signo, opt, not); + qualify_one(signo, opt, not, -1); return 0; } if (strlen(s) >= sizeof buf) @@ -335,7 +375,7 @@ qual_signal(s, opt, not) s += 3; for (i = 0; i <= NSIG; i++) if (strcmp(s, signame(i) + 3) == 0) { - qualify_one(i, opt, not); + qualify_one(i, opt, not, -1); return 0; } return -1; @@ -360,7 +400,7 @@ qual_desc(s, opt, not) int desc = atoi(s); if (desc < 0 || desc >= MAX_QUALS) return -1; - qualify_one(desc, opt, not); + qualify_one(desc, opt, not, -1); return 0; } return -1; @@ -414,28 +454,28 @@ char *s; } if (strcmp(s, "all") == 0) { for (i = 0; i < MAX_QUALS; i++) { - if (not) - qual_flags[i] &= ~opt->bitflag; - else - qual_flags[i] |= opt->bitflag; + qualify_one(i, opt, not, -1); } return; } for (i = 0; i < MAX_QUALS; i++) { - if (not) - qual_flags[i] |= opt->bitflag; - else - qual_flags[i] &= ~opt->bitflag; + qualify_one(i, opt, !not, -1); } for (p = strtok(s, ","); p; p = strtok(NULL, ",")) { if (opt->bitflag == QUAL_TRACE && (n = lookup_class(p)) > 0) { for (i = 0; i < MAX_QUALS; i++) { - if (sysent[i].sys_flags & n) { - if (not) - qual_flags[i] &= ~opt->bitflag; - else - qual_flags[i] |= opt->bitflag; - } + if (sysent0[i].sys_flags & n) + qualify_one(i, opt, not, 0); + +#if SUPPORTED_PERSONALITIES >= 2 + if (sysent1[i].sys_flags & n) + qualify_one(i, opt, not, 1); +#endif /* SUPPORTED_PERSONALITIES >= 2 */ + +#if SUPPORTED_PERSONALITIES >= 3 + if (sysent2[i].sys_flags & n) + qualify_one(i, opt, not, 2); +#endif /* SUPPORTED_PERSONALITIES >= 3 */ } continue; }