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:
Roland McGrath 2006-01-12 09:50:49 +00:00
parent 7c061b2135
commit 138c6a334f
3 changed files with 70 additions and 30 deletions

2
defs.h
View File

@ -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;

View File

@ -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) {

View File

@ -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;
}