summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authorWichert Akkerman <wichert@deephackmode.org>2000-09-01 21:03:06 +0000
committerWichert Akkerman <wichert@deephackmode.org>2000-09-01 21:03:06 +0000
commitbf79f2e16b090ffe59cd1e1820935680a2da7b78 (patch)
tree7cca3bc2da9b0505a7f7bd2e3f68fd569389e94d /io.c
parentd077c451cd94c49ca508e1082a85cd042c0e7398 (diff)
downloadstrace-bf79f2e16b090ffe59cd1e1820935680a2da7b78.tar.gz
strace-bf79f2e16b090ffe59cd1e1820935680a2da7b78.tar.bz2
strace-bf79f2e16b090ffe59cd1e1820935680a2da7b78.tar.xz
Add FreeBSD support
Diffstat (limited to 'io.c')
-rw-r--r--io.c144
1 files changed, 93 insertions, 51 deletions
diff --git a/io.c b/io.c
index 45c3413..a819c11 100644
--- a/io.c
+++ b/io.c
@@ -63,13 +63,47 @@ struct tcb *tcp;
return 0;
}
+void
+tprint_iov(tcp, len, addr)
+struct tcb * tcp;
+int len;
+char * addr;
+{
+ struct iovec *iov;
+ int i;
+
+
+ if (!len) {
+ tprintf("[]");
+ return;
+ }
+
+ if ((iov = (struct iovec *) malloc(len * sizeof *iov)) == NULL) {
+ fprintf(stderr, "No memory");
+ return;
+ }
+ if (umoven(tcp, (int) addr,
+ len * sizeof *iov, (char *) iov) < 0) {
+ tprintf("%#lx", tcp->u_arg[1]);
+ } else {
+ tprintf("[");
+ for (i = 0; i < len; i++) {
+ if (i)
+ tprintf(", ");
+ tprintf("{");
+ printstr(tcp, (long) iov[i].iov_base,
+ iov[i].iov_len);
+ tprintf(", %lu}", (unsigned long)iov[i].iov_len);
+ }
+ tprintf("]");
+ }
+ free((char *) iov);
+}
+
int
sys_readv(tcp)
struct tcb *tcp;
{
- struct iovec *iov;
- int i, len;
-
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
} else {
@@ -78,27 +112,7 @@ struct tcb *tcp;
tcp->u_arg[1], tcp->u_arg[2]);
return 0;
}
- len = tcp->u_arg[2];
- if ((iov = (struct iovec *) malloc(len * sizeof *iov)) == NULL) {
- fprintf(stderr, "No memory");
- return 0;
- }
- if (umoven(tcp, tcp->u_arg[1],
- len * sizeof *iov, (char *) iov) < 0) {
- tprintf("%#lx", tcp->u_arg[1]);
- } else {
- tprintf("[");
- for (i = 0; i < len; i++) {
- if (i)
- tprintf(", ");
- tprintf("{");
- printstr(tcp, (long) iov[i].iov_base,
- iov[i].iov_len);
- tprintf(", %lu}", (unsigned long)iov[i].iov_len);
- }
- tprintf("]");
- }
- free((char *) iov);
+ tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
tprintf(", %lu", tcp->u_arg[2]);
}
return 0;
@@ -108,39 +122,15 @@ int
sys_writev(tcp)
struct tcb *tcp;
{
- struct iovec *iov;
- int i, len;
-
if (entering(tcp)) {
tprintf("%ld, ", tcp->u_arg[0]);
- len = tcp->u_arg[2];
- iov = (struct iovec *) malloc(len * sizeof *iov);
- if (iov == NULL) {
- fprintf(stderr, "No memory");
- return 0;
- }
- if (umoven(tcp, tcp->u_arg[1],
- len * sizeof *iov, (char *) iov) < 0) {
- tprintf("%#lx", tcp->u_arg[1]);
- } else {
- tprintf("[");
- for (i = 0; i < len; i++) {
- if (i)
- tprintf(", ");
- tprintf("{");
- printstr(tcp, (long) iov[i].iov_base,
- iov[i].iov_len);
- tprintf(", %lu}", (unsigned long)iov[i].iov_len);
- }
- tprintf("]");
- }
- free((char *) iov);
+ tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1]);
tprintf(", %lu", tcp->u_arg[2]);
}
return 0;
}
-#ifdef SVR4
+#if defined(SVR4) || defined(FREEBSD)
int
sys_pread(tcp)
@@ -157,9 +147,14 @@ struct tcb *tcp;
/* off_t is signed int */
tprintf(", %lu, %ld", tcp->u_arg[2], tcp->u_arg[3]);
#else
+#ifndef FREEBSD
tprintf(", %lu, %llu", tcp->u_arg[2],
(((unsigned long long) tcp->u_arg[4]) << 32
| tcp->u_arg[3]));
+#else
+ tprintf(", %lu, %llu", tcp->u_arg[2],
+ (((off_t) tcp->u_arg[3]) << 32) + tcp->u_arg[4]);
+#endif
#endif
}
return 0;
@@ -176,14 +171,61 @@ struct tcb *tcp;
/* off_t is signed int */
tprintf(", %lu, %ld", tcp->u_arg[2], tcp->u_arg[3]);
#else
+#ifndef FREEBSD
tprintf(", %lu, %llu", tcp->u_arg[2],
(((unsigned long long) tcp->u_arg[4]) << 32
| tcp->u_arg[3]));
+#else
+ tprintf(", %lu, %llu", tcp->u_arg[2],
+ (((off_t) tcp->u_arg[3]) << 32) + tcp->u_arg[4]);
+#endif
#endif
}
return 0;
}
-#endif /* SVR4 */
+#endif /* SVR4 || FREEBSD */
+
+#ifdef FREEBSD
+#include <sys/types.h>
+#include <sys/socket.h>
+
+int
+sys_sendfile(tcp)
+struct tcb *tcp;
+{
+ if (entering(tcp)) {
+ tprintf("%ld, %ld, %llu, %lu", tcp->u_arg[0], tcp->u_arg[1],
+ (((unsigned long long) tcp->u_arg[3]) << 32 |
+ tcp->u_arg[2]), tcp->u_arg[4]);
+ } else {
+ off_t offset;
+
+ if (!tcp->u_arg[5])
+ tprintf(", NULL");
+ else {
+ struct sf_hdtr hdtr;
+
+ if (umove(tcp, tcp->u_arg[5], &hdtr) < 0)
+ tprintf(", %#lx", tcp->u_arg[5]);
+ else {
+ tprintf(", { ");
+ tprint_iov(tcp, hdtr.hdr_cnt, hdtr.headers);
+ tprintf(", %u, ", hdtr.hdr_cnt);
+ tprint_iov(tcp, hdtr.trl_cnt, hdtr.trailers);
+ tprintf(", %u }", hdtr.hdr_cnt);
+ }
+ }
+ if (!tcp->u_arg[6])
+ tprintf(", NULL");
+ else if (umove(tcp, tcp->u_arg[6], &offset) < 0)
+ tprintf(", %#lx", tcp->u_arg[6]);
+ else
+ tprintf(", [%llu]", offset);
+ tprintf(", %lu", tcp->u_arg[7]);
+ }
+ return 0;
+}
+#endif /* FREEBSD */
#ifdef LINUX
int