]> granicus.if.org Git - strace/commitdiff
2005-11-17 Dmitry V. Levin <ldv@altlinux.org>
authorRoland McGrath <roland@redhat.com>
Thu, 12 Jan 2006 09:50:49 +0000 (09:50 +0000)
committerRoland McGrath <roland@redhat.com>
Thu, 12 Jan 2006 09:50:49 +0000 (09:50 +0000)
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.

defs.h
strace.c
syscall.c

diff --git a/defs.h b/defs.h
index 94b02ce05dde494284c1eaef8026006951ca5d43..a04b78f6b6c0d3b8e3aba5d47d584cf209decacc 100644 (file)
--- 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;
index f78458c3183e00c47c18c4a8465e133f82cca757..75574d5f7b4b476eab50aa5dc764166b2b0129da 100644 (file)
--- 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) {
index c84a3dee4efdcbdee501c6c19f9531e774ce3d85..f5ce8d1bd59f88dacf5d3b8c88339c072036a93d 100644 (file)
--- 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;
                }