2006-12-10  Dmitry V. Levin <ldv@altlinux.org>

	Add biarch support for "struct timex".
	* time.c [LINUX && SUPPORTED_PERSONALITIES > 1] (tprint_timex32):
	New function.
	[LINUX] (tprint_timex): New function.
	[LINUX] (sys_adjtimex): Use it.
diff --git a/time.c b/time.c
index 26aa76d..375c20c 100644
--- a/time.c
+++ b/time.c
@@ -460,48 +460,110 @@
   { 0,             NULL }
 };
 
-int
-sys_adjtimex(struct tcb *tcp)
+#if SUPPORTED_PERSONALITIES > 1
+static int
+tprint_timex32(struct tcb *tcp, long addr)
+{
+	struct
+	{
+		unsigned int modes;
+		int     offset;
+		int     freq;
+		int     maxerror;
+		int     esterror;
+		int     status;
+		int     constant;
+		int     precision;
+		int     tolerance;
+		struct timeval32 time;
+		int     tick;
+		int     ppsfreq;
+		int     jitter;
+		int     shift;
+		int     stabil;
+		int     jitcnt;
+		int     calcnt;
+		int     errcnt;
+		int     stbcnt;
+	} tx;
+
+	if (umove(tcp, addr, &tx) < 0)
+		return -1;
+
+	tprintf("{modes=");
+	printxval(adjtimex_modes, tx.modes, "ADJ_???");
+	tprintf(", offset=%d, freq=%d, maxerror=%d, ",
+		tx.offset, tx.freq, tx.maxerror);
+	tprintf("esterror=%u, status=", tx.esterror);
+	printflags(adjtimex_status, tx.status, "STA_???");
+	tprintf(", constant=%d, precision=%u, ",
+		tx.constant, tx.precision);
+	tprintf("tolerance=%d, time=", tx.tolerance);
+	tprint_timeval32(tcp, &tx.time);
+	tprintf(", tick=%d, ppsfreq=%d, jitter=%d",
+		tx.tick, tx.ppsfreq, tx.jitter);
+	tprintf(", shift=%d, stabil=%d, jitcnt=%d",
+		tx.shift, tx.stabil, tx.jitcnt);
+	tprintf(", calcnt=%d, errcnt=%d, stbcnt=%d",
+		tx.calcnt, tx.errcnt, tx.stbcnt);
+	tprintf("}");
+	return 0;
+}
+#endif /* SUPPORTED_PERSONALITIES > 1 */
+
+static int
+tprint_timex(struct tcb *tcp, long addr)
 {
 	struct timex tx;
 
+#if SUPPORTED_PERSONALITIES > 1
+	if (personality_wordsize[current_personality] == 4)
+		return tprint_timex32(tcp, addr);
+#endif
+	if (umove(tcp, addr, &tx) < 0)
+		return -1;
+
+#if LINUX_VERSION_CODE < 66332
+	tprintf("{mode=%d, offset=%ld, frequency=%ld, ",
+		tx.mode, tx.offset, tx.frequency);
+	tprintf("maxerror=%ld, esterror=%lu, status=%u, ",
+		tx.maxerror, tx.esterror, tx.status);
+	tprintf("time_constant=%ld, precision=%lu, ",
+		tx.time_constant, tx.precision);
+	tprintf("tolerance=%ld, time=", tx.tolerance);
+	tprint_timeval(tcp, &tx.time);
+#else
+	tprintf("{modes=");
+	printxval(adjtimex_modes, tx.modes, "ADJ_???");
+	tprintf(", offset=%ld, freq=%ld, maxerror=%ld, ",
+		tx.offset, tx.freq, tx.maxerror);
+	tprintf("esterror=%lu, status=", tx.esterror);
+	printflags(adjtimex_status, tx.status, "STA_???");
+	tprintf(", constant=%ld, precision=%lu, ",
+		tx.constant, tx.precision);
+	tprintf("tolerance=%ld, time=", tx.tolerance);
+	tprint_timeval(tcp, &tx.time);
+	tprintf(", tick=%ld, ppsfreq=%ld, jitter=%ld",
+		tx.tick, tx.ppsfreq, tx.jitter);
+	tprintf(", shift=%d, stabil=%ld, jitcnt=%ld",
+		tx.shift, tx.stabil, tx.jitcnt);
+	tprintf(", calcnt=%ld, errcnt=%ld, stbcnt=%ld",
+		tx.calcnt, tx.errcnt, tx.stbcnt);
+#endif
+	tprintf("}");
+	return 0;
+}
+
+int
+sys_adjtimex(struct tcb *tcp)
+{
 	if (exiting(tcp)) {
 		if (tcp->u_arg[0] == 0)
 			tprintf("NULL");
 		else if (syserror(tcp) || !verbose(tcp))
 			tprintf("%#lx", tcp->u_arg[0]);
-		else if (umove(tcp, tcp->u_arg[0], &tx) < 0)
+		else if (tprint_timex(tcp, tcp->u_arg[0]) < 0)
 			tprintf("{...}");
-		else {
-#if LINUX_VERSION_CODE < 66332
-			tprintf("{mode=%d, offset=%ld, frequency=%ld, ",
-				tx.mode, tx.offset, tx.frequency);
-			tprintf("maxerror=%ld, esterror=%lu, status=%u, ",
-				tx.maxerror, tx.esterror, tx.status);
-			tprintf("time_constant=%ld, precision=%lu, ",
-				tx.time_constant, tx.precision);
-			tprintf("tolerance=%ld, time=", tx.tolerance);
-			tprint_timeval(tcp, &tx.time);
-#else
-			tprintf("{modes=");
-			printxval(adjtimex_modes, tx.modes, "ADJ_???");
-			tprintf(", offset=%ld, freq=%ld, maxerror=%ld, ",
-				tx.offset, tx.freq, tx.maxerror);
-			tprintf("esterror=%lu, status=", tx.esterror);
-			printflags(adjtimex_status, tx.status, "STA_???");
-			tprintf(", constant=%ld, precision=%lu, ",
-				tx.constant, tx.precision);
-			tprintf("tolerance=%ld, time=", tx.tolerance);
-			tprint_timeval(tcp, &tx.time);
-			tprintf(", tick=%ld, ppsfreq=%ld, jitter=%ld",
-				tx.tick, tx.ppsfreq, tx.jitter);
-			tprintf(", shift=%d, stabil=%ld, jitcnt=%ld",
-				tx.shift, tx.stabil, tx.jitcnt);
-			tprintf(", calcnt=%ld, errcnt=%ld, stbcnt=%ld",
-				tx.calcnt, tx.errcnt, tx.stbcnt);
-#endif
-			tprintf("}");
-		}
 		tcp->auxstr = xlookup(adjtimex_state, tcp->u_rval);
 		if (tcp->auxstr)
 			return RVAL_STR;