⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io.c

📁 linux进程跟踪的工具和源代码
💻 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 + -