summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2006-12-13 17:08:08 +0000
committerDmitry V. Levin <ldv@altlinux.org>2006-12-13 17:08:08 +0000
commit4ebb4e3d312bb8215f4eea9130cce6bb8bdb972f (patch)
tree7c8f9230f535868e4c3b28d1471ab5525fed618b /io.c
parentac518d10777f9dd95aad22939da6c867cf4c193e (diff)
downloadstrace-4ebb4e3d312bb8215f4eea9130cce6bb8bdb972f.tar.gz
strace-4ebb4e3d312bb8215f4eea9130cce6bb8bdb972f.tar.bz2
strace-4ebb4e3d312bb8215f4eea9130cce6bb8bdb972f.tar.xz
2006-12-10 Dmitry V. Levin <ldv@altlinux.org>
Add biarch support for "struct iovec". * defs.h (personality_wordsize): Add. * io.c [HAVE_SYS_UIO_H] (tprint_iov): [LINUX && SUPPORTED_PERSONALITIES > 1] Handle 32-bit personality. * util.c [HAVE_SYS_UIO_H] (dumpiov): [LINUX && SUPPORTED_PERSONALITIES > 1] Likewise. Patch from Jakub Jelinek. Fixes RH#218433.
Diffstat (limited to 'io.c')
-rw-r--r--io.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/io.c b/io.c
index 414fbbb..5896634 100644
--- a/io.c
+++ b/io.c
@@ -81,7 +81,26 @@ struct tcb * tcp;
unsigned long len;
unsigned long addr;
{
+#if defined(LINUX) && SUPPORTED_PERSONALITIES > 1
+ union {
+ struct { u_int32_t base; u_int32_t len; } iov32;
+ struct { u_int64_t base; u_int64_t len; } iov64;
+ } iov;
+#define sizeof_iov \
+ (personality_wordsize[current_personality] == 4 \
+ ? sizeof(iov.iov32) : sizeof(iov.iov64))
+#define iov_iov_base \
+ (personality_wordsize[current_personality] == 4 \
+ ? (u_int64_t) iov.iov32.base : iov.iov64.base)
+#define iov_iov_len \
+ (personality_wordsize[current_personality] == 4 \
+ ? (u_int64_t) iov.iov32.len : iov.iov64.len)
+#else
struct iovec iov;
+#define sizeof_iov sizeof(iov)
+#define iov_iov_base iov.iov_base
+#define iov_iov_len iov.iov_len
+#endif
unsigned long size, cur, end, abbrev_end;
int failed = 0;
@@ -89,39 +108,42 @@ unsigned long addr;
tprintf("[]");
return;
}
- size = len * sizeof(iov);
+ size = len * sizeof_iov;
end = addr + size;
- if (!verbose(tcp) || size / sizeof(iov) != len || end < addr) {
+ if (!verbose(tcp) || size / sizeof_iov != len || end < addr) {
tprintf("%#lx", addr);
return;
}
if (abbrev(tcp)) {
- abbrev_end = addr + max_strlen * sizeof(iov);
+ abbrev_end = addr + max_strlen * sizeof_iov;
if (abbrev_end < addr)
abbrev_end = end;
} else {
abbrev_end = end;
}
tprintf("[");
- for (cur = addr; cur < end; cur += sizeof(iov)) {
+ for (cur = addr; cur < end; cur += sizeof_iov) {
if (cur > addr)
tprintf(", ");
if (cur >= abbrev_end) {
tprintf("...");
break;
}
- if (umoven(tcp, cur, sizeof iov, (char *) &iov) < 0) {
+ if (umoven(tcp, cur, sizeof_iov, (char *) &iov) < 0) {
tprintf("?");
failed = 1;
break;
}
tprintf("{");
- printstr(tcp, (long) iov.iov_base, iov.iov_len);
- tprintf(", %lu}", (unsigned long)iov.iov_len);
+ printstr(tcp, (long) iov_iov_base, iov_iov_len);
+ tprintf(", %lu}", (unsigned long)iov_iov_len);
}
tprintf("]");
if (failed)
tprintf(" %#lx", addr);
+#undef sizeof_iov
+#undef iov_iov_base
+#undef iov_iov_len
}
int