]> granicus.if.org Git - strace/commitdiff
2006-12-10 Dmitry V. Levin <ldv@altlinux.org>
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 13 Dec 2006 17:14:36 +0000 (17:14 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 13 Dec 2006 17:14:36 +0000 (17:14 +0000)
Add biarch support for "struct itimerval".
* time.c (printitv): Rename to printitv_bitness().
Add printitv() macro wrapper around printitv_bitness().
(printitv_bitness): Handle 32-bit personality.
[ALPHA] (sys_osf_getitimer, sys_osf_setitimer):
Use printitv_bitness().
(tprint_timeval, tprint_timeval32): New functions.
(printtv_bitness, printitv_bitness, sys_adjtimex): Use them.
(printitv32): Remove.

ChangeLog
time.c

index 582599f7824b148e157c38c8ac85fe4b6bd993b8..466a56b2380430960610b9eb270574b8059617ae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,30 @@
 2006-12-10  Dmitry V. Levin <ldv@altlinux.org>
 
+       Add biarch support for "struct itimerval".
+       * time.c (printitv): Rename to printitv_bitness().
+       Add printitv() macro wrapper around printitv_bitness().
+       (printitv_bitness): Handle 32-bit personality.
+       [ALPHA] (sys_osf_getitimer, sys_osf_setitimer):
+       Use printitv_bitness().
+       (tprint_timeval, tprint_timeval32): New functions.
+       (printtv_bitness, printitv_bitness, sys_adjtimex): Use them.
+       (printitv32): Remove.
+
+       Add biarch support for "struct timeval".
+       * defs.h (bitness_t): New enum type.
+       (printtv_bitness, sprinttv): New function prototypes.
+       (printtv): Convert to macro wrapper around printtv_bitness().
+       (printtv32): Remove.
+       * desc.c (decode_select): Use printtv_bitness() and sprinttv().
+       (sys_oldselect, sys_osf_select, sys_select, sys_pselect6):
+       Update decode_select() use.
+       * file.c [ALPHA] (sys_osf_utimes): Use printtv_bitness().
+       * time.c (printtv_bitness, sprinttv): New functions.
+       (printtv, printtv32): Remove.
+       [ALPHA] (sys_osf_settimeofday, sys_osf_settimeofday):
+       Use printtv_bitness().
+       Fixes RH#171626, RH#173050.
+
        Add biarch support for "struct iovec".
        * defs.h (personality_wordsize): Add.
        * io.c [HAVE_SYS_UIO_H] (tprint_iov): [LINUX &&
diff --git a/time.c b/time.c
index cbfa5568fa5a200ae3df455a98820d33b5be6ee8..139af0f4b4d567634b6a7dfcdf1bc84b5dbf326e 100644 (file)
--- a/time.c
+++ b/time.c
@@ -43,6 +43,19 @@ struct timeval32
        u_int32_t tv_sec, tv_usec;
 };
 
+static void
+tprint_timeval32(struct tcb *tcp, const struct timeval32 *tv)
+{
+       tprintf("{%u, %u}", tv->tv_sec, tv->tv_usec);
+}
+
+static void
+tprint_timeval(struct tcb *tcp, const struct timeval *tv)
+{
+       tprintf("{%lu, %lu}",
+               (unsigned long) tv->tv_sec, (unsigned long) tv->tv_usec);
+}
+
 void
 printtv_bitness(struct tcb *tcp, long addr, enum bitness_t bitness)
 {
@@ -63,16 +76,13 @@ printtv_bitness(struct tcb *tcp, long addr, enum bitness_t bitness)
                        struct timeval32 tv;
 
                        if ((rc = umove(tcp, addr, &tv)) >= 0)
-                               tprintf("{%u, %u}",
-                                       tv.tv_sec, tv.tv_usec);
+                               tprint_timeval32(tcp, &tv);
                } else
                {
                        struct timeval tv;
 
                        if ((rc = umove(tcp, addr, &tv)) >= 0)
-                               tprintf("{%lu, %lu}",
-                                       (unsigned long) tv.tv_sec,
-                                       (unsigned long) tv.tv_usec);
+                               tprint_timeval(tcp, &tv);
                }
 
                if (rc < 0)
@@ -234,51 +244,52 @@ static const struct xlat which[] = {
 };
 
 static void
-printitv(tcp, addr)
-struct tcb *tcp;
-long addr;
+printitv_bitness(struct tcb *tcp, long addr, enum bitness_t bitness)
 {
-       struct itimerval itv;
-
        if (addr == 0)
                tprintf("NULL");
        else if (!verbose(tcp))
                tprintf("%#lx", addr);
-       else if (umove(tcp, addr, &itv) < 0)
-               tprintf("{...}");
-       else {
-               tprintf("{it_interval={%lu, %lu}, it_value={%lu, %lu}}",
-               (long) itv.it_interval.tv_sec, (long) itv.it_interval.tv_usec,
-               (long) itv.it_value.tv_sec, (long) itv.it_value.tv_usec);
-       }
-}
+       else
+       {
+               int     rc;
+
+               if (bitness == BITNESS_32
+#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
+                   || personality_wordsize[current_personality] == 4
+#endif
+                       )
+               {
+                       struct
+                       {
+                               struct timeval32 it_interval, it_value;
+                       } itv;
+
+                       if ((rc = umove(tcp, addr, &itv)) >= 0)
+                               tprintf("{it_interval=");
+                               tprint_timeval32(tcp, &itv.it_interval);
+                               tprintf(", it_value=");
+                               tprint_timeval32(tcp, &itv.it_value);
+                               tprintf("}");
+               } else
+               {
+                       struct itimerval itv;
 
+                       if ((rc = umove(tcp, addr, &itv)) >= 0)
+                               tprintf("{it_interval=");
+                               tprint_timeval(tcp, &itv.it_interval);
+                               tprintf(", it_value=");
+                               tprint_timeval(tcp, &itv.it_value);
+                               tprintf("}");
+               }
 
-#ifdef ALPHA
-static void
-printitv32(tcp, addr)
-struct tcb *tcp;
-long addr;
-{
-    struct itimerval32
-    {
-       struct timeval32 it_interval;
-       struct timeval32 it_value;
-    } itv;
-
-    if (addr == 0)
-       tprintf("NULL");
-    else if (!verbose(tcp))
-       tprintf("%#lx", addr);
-    else if (umove(tcp, addr, &itv) < 0)
-       tprintf("{...}");
-    else {
-       tprintf("{it_interval={%u, %u}, it_value={%u, %u}}",
-               itv.it_interval.tv_sec, itv.it_interval.tv_usec,
-               itv.it_value.tv_sec, itv.it_value.tv_usec);
-    }
+               if (rc < 0)
+                       tprintf("{...}");
+       }
 }
-#endif
+
+#define printitv(tcp, addr)    \
+       printitv_bitness((tcp), (addr), BITNESS_CURRENT)
 
 int
 sys_getitimer(tcp)
@@ -309,7 +320,7 @@ struct tcb *tcp;
        if (syserror(tcp))
            tprintf("%#lx", tcp->u_arg[1]);
        else
-           printitv32(tcp, tcp->u_arg[1]);
+           printitv_bitness(tcp, tcp->u_arg[1], BITNESS_32);
     }
     return 0;
 }
@@ -341,13 +352,13 @@ struct tcb *tcp;
     if (entering(tcp)) {
        printxval(which, tcp->u_arg[0], "ITIMER_???");
        tprintf(", ");
-       printitv32(tcp, tcp->u_arg[1]);
+       printitv_bitness(tcp, tcp->u_arg[1], BITNESS_32);
        tprintf(", ");
     } else {
        if (syserror(tcp))
            tprintf("%#lx", tcp->u_arg[2]);
        else
-           printitv32(tcp, tcp->u_arg[2]);
+           printitv_bitness(tcp, tcp->u_arg[2], BITNESS_32);
     }
     return 0;
 }
@@ -376,9 +387,8 @@ struct tcb *tcp;
                                txc.maxerror, txc.esterror, txc.status);
                        tprintf("time_constant=%ld, precision=%lu, ",
                                txc.time_constant, txc.precision);
-                       tprintf("tolerance=%ld, time={%lu, %lu}}",
-                               txc.tolerance, (long) txc.time.tv_sec,
-                               (long) txc.time.tv_usec);
+                       tprintf("tolerance=%ld, time=", txc.tolerance);
+                       tprint_timeval(tcp, &txc.time);
 #else
                        tprintf("{modes=%d, offset=%ld, freq=%ld, ",
                                txc.modes, txc.offset, txc.freq);
@@ -386,12 +396,12 @@ struct tcb *tcp;
                                txc.maxerror, txc.esterror, txc.status);
                        tprintf("constant=%ld, precision=%lu, ",
                                txc.constant, txc.precision);
-                       tprintf("tolerance=%ld, time={%lu, %lu}}",
-                               txc.tolerance, (long) txc.time.tv_sec,
-                               (long) txc.time.tv_usec);
+                       tprintf("tolerance=%ld, time=", txc.tolerance);
+                       tprint_timeval(tcp, &txc.time);
                        /* there's a bunch of other stuff, but it's not
                         * worth the time or the trouble to include */
 #endif
+                       tprintf("}");
                }
        }
        return 0;