2005-11-17 Dmitry V. Levin <ldv@altlinux.org>
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.
This commit is contained in:
parent
7c061b2135
commit
138c6a334f
2
defs.h
2
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;
|
||||
|
4
strace.c
4
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) {
|
||||
|
94
syscall.c
94
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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user