📄 io.c
字号:
/* * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl> * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl> * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com> * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $Id: io.c,v 1.9 2001/03/08 14:40:06 hughesj Exp $ */#include "defs.h"#include <fcntl.h>#include <sys/uio.h>#ifdef HAVE_LONG_LONG_OFF_T/* * Hacks for systems that have a long long off_t */#define sys_pread64 sys_pread#define sys_pwrite64 sys_pwrite#endifintsys_read(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); } else { if (syserror(tcp)) tprintf("%#lx", tcp->u_arg[1]); else printstr(tcp, tcp->u_arg[1], tcp->u_rval); tprintf(", %lu", tcp->u_arg[2]); } return 0;}intsys_write(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); tprintf(", %lu", tcp->u_arg[2]); } return 0;}voidtprint_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);}intsys_readv(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); } else { if (syserror(tcp)) { tprintf("%#lx, %lu", tcp->u_arg[1], tcp->u_arg[2]); return 0; } tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1]); tprintf(", %lu", tcp->u_arg[2]); } return 0;}intsys_writev(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1]); tprintf(", %lu", tcp->u_arg[2]); } return 0;}#if defined(SVR4)intsys_pread(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); } else { if (syserror(tcp)) tprintf("%#lx", tcp->u_arg[1]); else printstr(tcp, tcp->u_arg[1], tcp->u_rval);#if UNIXWARE /* off_t is signed int */ tprintf(", %lu, %ld", tcp->u_arg[2], tcp->u_arg[3]);#else tprintf(", %lu, %llu", tcp->u_arg[2], (((unsigned long long) tcp->u_arg[4]) << 32 | tcp->u_arg[3]));#endif } return 0;}intsys_pwrite(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);#if UNIXWARE /* off_t is signed int */ tprintf(", %lu, %ld", tcp->u_arg[2], tcp->u_arg[3]);#else tprintf(", %lu, %llu", tcp->u_arg[2], (((unsigned long long) tcp->u_arg[4]) << 32 | tcp->u_arg[3]));#endif } return 0;}#endif /* SVR4 */#ifdef FREEBSD#include <sys/types.h>#include <sys/socket.h>intsys_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 LINUXintsys_pread(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); } else { if (syserror(tcp)) tprintf("%#lx", tcp->u_arg[1]); else printstr(tcp, tcp->u_arg[1], tcp->u_rval); tprintf(", %lu, %llu", tcp->u_arg[2], *(unsigned long long *)&tcp->u_arg[3]); } return 0;}intsys_pwrite(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); tprintf(", %lu, %llu", tcp->u_arg[2], *(unsigned long long *)&tcp->u_arg[3]); } return 0;}intsys_sendfile(tcp)struct tcb *tcp;{ if (entering(tcp)) { off_t offset; tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]); if (!tcp->u_arg[2]) tprintf("NULL"); else if (umove(tcp, tcp->u_arg[2], &offset) < 0) tprintf("%#lx", tcp->u_arg[2]); else tprintf("[%lu]", offset); tprintf(", %lu", tcp->u_arg[3]); } return 0;}#endif /* LINUX */#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_Tintsys_pread64(tcp)struct tcb *tcp;{ if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); } else { ALIGN64 (tcp, 3); if (syserror(tcp)) tprintf("%#lx", tcp->u_arg[1]); else printstr(tcp, tcp->u_arg[1], tcp->u_rval); tprintf(", %lu, %#llx", tcp->u_arg[2], LONG_LONG(tcp->u_arg[3], tcp->u_arg[4])); } return 0;}intsys_pwrite64(tcp)struct tcb *tcp;{ if (entering(tcp)) { ALIGN64 (tcp, 3); tprintf("%ld, ", tcp->u_arg[0]); printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); tprintf(", %lu, %#llx", tcp->u_arg[2], LONG_LONG(tcp->u_arg[3], tcp->u_arg[4])); } return 0;}#endif intsys_ioctl(tcp)struct tcb *tcp;{ char *symbol; if (entering(tcp)) { tprintf("%ld, ", tcp->u_arg[0]); symbol = ioctl_lookup(tcp->u_arg[1]); if (symbol) tprintf("%s", symbol); else tprintf("%#lx", tcp->u_arg[1]); ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]); } else { if (ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]) == 0) tprintf(", %#lx", tcp->u_arg[2]); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -