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

📄 desc.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: desc.c,v 1.9 2001/03/08 13:59:00 hughesj Exp $ */#include "defs.h"#include <fcntl.h>#include <sys/file.h>#if HAVE_LONG_LONG_OFF_T/* * Hacks for systems that have a long long off_t */#define flock64	flock		/* Horrid hack */#define printflock printflock64	/* Horrider hack */#endifstatic struct xlat fcntlcmds[] = {	{ F_DUPFD,	"F_DUPFD"	},	{ F_GETFD,	"F_GETFD"	},	{ F_SETFD,	"F_SETFD"	},	{ F_GETFL,	"F_GETFL"	},	{ F_SETFL,	"F_SETFL"	},	{ F_GETLK,	"F_GETLK"	},	{ F_SETLK,	"F_SETLK"	},	{ F_SETLKW,	"F_SETLKW"	},	{ F_GETOWN,	"F_GETOWN"	},	{ F_SETOWN,	"F_SETOWN"	},#ifdef F_RSETLK	{ F_RSETLK,	"F_RSETLK"	},#endif#ifdef F_RSETLKW	{ F_RSETLKW,	"F_RSETLKW"	},#endif#ifdef F_RGETLK	{ F_RGETLK,	"F_RGETLK"	},#endif#ifdef F_CNVT	{ F_CNVT,	"F_CNVT"	},#endif#ifdef F_SETSIG	{ F_SETSIG,	"F_SETSIG"	},#endif#ifdef F_GETSIG	{ F_GETSIG,	"F_GETSIG"	},#endif#ifdef F_CHKFL	{ F_CHKFL,	"F_CHKFL"	},#endif#ifdef F_DUP2FD	{ F_DUP2FD,	"F_DUP2FD"	},#endif#ifdef F_ALLOCSP	{ F_ALLOCSP,	"F_ALLOCSP"	},#endif#ifdef F_ISSTREAM	{ F_ISSTREAM,	"F_ISSTREAM"	},#endif#ifdef F_PRIV	{ F_PRIV,	"F_PRIV"	},#endif#ifdef F_NPRIV	{ F_NPRIV,	"F_NPRIV"	},#endif#ifdef F_QUOTACL	{ F_QUOTACL,	"F_QUOTACL"	},#endif#ifdef F_BLOCKS	{ F_BLOCKS,	"F_BLOCKS"	},#endif#ifdef F_BLKSIZE	{ F_BLKSIZE,	"F_BLKSIZE"	},#endif#ifdef F_GETOWN	{ F_GETOWN,	"F_GETOWN"	},#endif#ifdef F_SETOWN	{ F_SETOWN,	"F_SETOWN"	},#endif#ifdef F_REVOKE	{ F_REVOKE,	"F_REVOKE"	},#endif#ifdef F_SETLK	{ F_SETLK,	"F_SETLK"	},#endif#ifdef F_SETLKW	{ F_SETLKW,	"F_SETLKW"	},#endif#ifdef F_FREESP	{ F_FREESP,	"F_FREESP"	},#endif#ifdef F_GETLK	{ F_GETLK,	"F_GETLK"	},#endif#ifdef F_SETLK64	{ F_SETLK64,	"F_SETLK64"	},#endif#ifdef F_SETLKW64	{ F_SETLKW64,	"F_SETLKW64"	},#endif#ifdef F_FREESP64	{ F_FREESP64,	"F_FREESP64"	},#endif#ifdef F_GETLK64	{ F_GETLK64,	"F_GETLK64"	},#endif#ifdef F_SHARE	{ F_SHARE,	"F_SHARE"	},#endif#ifdef F_UNSHARE	{ F_UNSHARE,	"F_UNSHARE"	},#endif	{ 0,		NULL		},};static struct xlat fdflags[] = {#ifdef FD_CLOEXEC	{ FD_CLOEXEC,	"FD_CLOEXEC"	},#endif	{ 0,		NULL		},};#ifdef LOCK_SHstatic struct xlat flockcmds[] = {	{ LOCK_SH,	"LOCK_SH"	},	{ LOCK_EX,	"LOCK_EX"	},	{ LOCK_NB,	"LOCK_NB"	},	{ LOCK_UN,	"LOCK_UN"	},	{ 0,		NULL		},};#endif /* LOCK_SH */static struct xlat lockfcmds[] = {	{ F_RDLCK,	"F_RDLCK"	},	{ F_WRLCK,	"F_WRLCK"	},	{ F_UNLCK,	"F_UNLCK"	},#ifdef F_EXLCK	{ F_EXLCK,	"F_EXLCK"	},#endif#ifdef F_SHLCK	{ F_SHLCK,	"F_SHLCK"	},#endif	{ 0,		NULL		},};static struct xlat whence[] = {	{ SEEK_SET,	"SEEK_SET"	},	{ SEEK_CUR,	"SEEK_CUR"	},	{ SEEK_END,	"SEEK_END"	},	{ 0,		NULL		},};#ifndef HAVE_LONG_LONG_OFF_T/* fcntl/lockf */static voidprintflock(tcp, addr, getlk)struct tcb *tcp;long addr;int getlk;{	struct flock fl;	if (umove(tcp, addr, &fl) < 0) {		tprintf("{...}");		return;	}	tprintf("{type=");	printxval(lockfcmds, fl.l_type, "F_???");	tprintf(", whence=");	printxval(whence, fl.l_whence, "SEEK_???");	tprintf(", start=%ld, len=%ld", fl.l_start, fl.l_len);	if (getlk)		tprintf(", pid=%lu}", (unsigned long) fl.l_pid);	else		tprintf("}");}#endif#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T/* fcntl/lockf */static voidprintflock64(tcp, addr, getlk)struct tcb *tcp;int addr;int getlk;{	struct flock64 fl;	if (umove(tcp, addr, &fl) < 0) {		tprintf("{...}");		return;	}	tprintf("{type=");	printxval(lockfcmds, fl.l_type, "F_???");	tprintf(", whence=");	printxval(whence, fl.l_whence, "SEEK_???");	tprintf(", start=%lld, len=%lld", fl.l_start, fl.l_len);	if (getlk)		tprintf(", pid=%lu}", (unsigned long) fl.l_pid);	else		tprintf("}");}#endifstatic char *sprintflags(xlat, flags)struct xlat *xlat;int flags;{	static char outstr[1024];	char *sep;	strcpy(outstr, "flags ");	sep = "";	for (; xlat->str; xlat++) {		if ((flags & xlat->val) == xlat->val) {			sprintf(outstr + strlen(outstr),				"%s%s", sep, xlat->str);			sep = "|";			flags &= ~xlat->val;		}	}	if (flags)		sprintf(outstr + strlen(outstr),			"%s%#x", sep, flags);	return outstr;}intsys_fcntl(tcp)struct tcb *tcp;{	extern struct xlat openmodes[];	if (entering(tcp)) {		tprintf("%ld, ", tcp->u_arg[0]);		printxval(fcntlcmds, tcp->u_arg[1], "F_???");		switch (tcp->u_arg[1]) {		case F_SETFD:			tprintf(", ");			if (printflags(fdflags, tcp->u_arg[2]) == 0)				tprintf("0");			break;		case F_SETOWN: case F_DUPFD:			tprintf(", %ld", tcp->u_arg[2]);			break;		case F_SETFL:			tprintf(", ");			if (printflags(openmodes, tcp->u_arg[2] + 1) == 0)				tprintf("0");			break;		case F_SETLK: case F_SETLKW:#ifdef F_FREESP		case F_FREESP:#endif			tprintf(", ");			printflock(tcp, tcp->u_arg[2], 0);			break;#if _LFS64_LARGEFILE#ifdef F_FREESP64		case F_FREESP64:#endif		/* Linux glibc defines SETLK64 as SETLK, 		   even though the kernel has different values - as does Solaris. */#if defined(F_SETLK64) && F_SETLK64+0!=F_SETLK		case F_SETLK64:#endif#if defined(F_SETLKW64) && F_SETLKW64+0!=F_SETLKW		case F_SETLKW64:#endif			tprintf(", ");			printflock64(tcp, tcp->u_arg[2], 0);			break;#endif 		}	}	else {		switch (tcp->u_arg[1]) {		case F_DUPFD:		case F_SETFD: case F_SETFL:		case F_SETLK: case F_SETLKW:		case F_SETOWN: case F_GETOWN:			break;		case F_GETFD:			if (tcp->u_rval == 0)				return 0;			tcp->auxstr = sprintflags(fdflags, tcp->u_rval);			return RVAL_HEX|RVAL_STR;		case F_GETFL:			tcp->auxstr = sprintflags(openmodes, tcp->u_rval + 1);			return RVAL_HEX|RVAL_STR;		case F_GETLK:			tprintf(", ");			printflock(tcp, tcp->u_arg[2], 1);			break;#if _LFS64_LARGEFILE#if defined(F_GETLK64) && F_GETLK64+0!=F_GETLK		case F_GETLK64:#endif			tprintf(", ");			printflock64(tcp, tcp->u_arg[2], 1);			break;#endif 		default:			tprintf(", %#lx", tcp->u_arg[2]);			break;		}	}	return 0;}#ifdef LOCK_SHintsys_flock(tcp)struct tcb *tcp;{	if (entering(tcp)) {		tprintf("%ld, ", tcp->u_arg[0]);		if (!printflags(flockcmds, tcp->u_arg[1]))			tprintf("LOCK_???");	}	return 0;}#endif /* LOCK_SH */intsys_close(tcp)struct tcb *tcp;{	if (entering(tcp)) {		tprintf("%ld", tcp->u_arg[0]);	}	return 0;}intsys_dup(tcp)struct tcb *tcp;{	if (entering(tcp)) {		tprintf("%ld", tcp->u_arg[0]);	}	return 0;}intsys_dup2(tcp)struct tcb *tcp;{	if (entering(tcp)) {		tprintf("%ld, %ld", tcp->u_arg[0], tcp->u_arg[1]);	}	return 0;}intsys_getdtablesize(tcp)struct tcb *tcp;{	return 0;}static intdecode_select(tcp, args, bitness)struct tcb *tcp;long *args;int bitness;{	int i, j, nfds;	fd_set fds;	struct timeval tv;#ifdef ALPHA	struct timeval32 {		unsigned tv_sec;		unsigned tv_usec;	} *tv32;#endif	static char outstr[1024];	char *sep;	long arg;	if (entering(tcp)) {		nfds = args[0];		tprintf("%d", nfds);		for (i = 0; i < 3; i++) {			arg = args[i+1];			if (arg == 0) {				tprintf(", NULL");				continue;			}			if (!verbose(tcp)) {				tprintf(", %#lx", arg);				continue;			}			if (umove(tcp, arg, &fds) < 0) {				tprintf(", [?]");				continue;			}			tprintf(", [");			for (j = 0, sep = ""; j < nfds; j++) {				if (FD_ISSET(j, &fds)) {					tprintf("%s%u", sep, j);					sep = " ";				}			}			tprintf("]");		}		if (!args[4])			tprintf(", NULL");		else if (!verbose(tcp))			tprintf(", %#lx", args[4]);		else if (umove(tcp, args[4], &tv) < 0)			tprintf(", {...}");		else {#ifdef ALPHA			if (bitness) {				tv32=(struct timeval32*)&tv;				tprintf(", {%u, %u}", tv32->tv_sec, tv32->tv_usec);			} else#endif				tprintf(", {%lu, %lu}",					(long) tv.tv_sec, (long) tv.tv_usec);		}	}	else	{		unsigned int cumlen = 0;		char *sep = "";		if (syserror(tcp))			return 0;		if ((nfds = tcp->u_rval) == 0) {			tcp->auxstr = "Timeout";			return RVAL_STR;		}		outstr[0] = '\0';		for (i = 0; i < 3; i++) {			int first = 1;			char str[20];			tcp->auxstr = outstr;			arg = args[i+1];			if (!arg || umove(tcp, arg, &fds) < 0)				continue;			for (j = 0; j < args[0]; j++) {				if (FD_ISSET(j, &fds)) {					if (first) {						sprintf(str, "%s%s [%u", sep,							i == 0 ? "in" :							i == 1 ? "out" :							"except", j);						first = 0;						sep = ", ";					}					else						sprintf(str, " %u", j);					cumlen += strlen(str);					if (cumlen < sizeof(outstr))						strcat(outstr, str);					nfds--;				}			}			if (cumlen)				strcat(outstr, "]");			if (nfds == 0)				break;		}#ifdef LINUX		/* This contains no useful information on SunOS.  */		if (args[4]) {			char str[20];			if (umove(tcp, args[4], &tv) >= 0) {#ifdef ALPHA				if (bitness) {					tv32=(struct timeval32*)&tv;					sprintf(str, "%sleft {%u, %u}", sep,						tv32->tv_sec, tv32->tv_usec);				} else#endif					sprintf(str, "%sleft {%lu, %lu}", sep,						(long) tv.tv_sec, (long) tv.tv_usec);				if ((cumlen += strlen(str)) < sizeof(outstr))					strcat(outstr, str);			}		}#endif /* LINUX */		return RVAL_STR;	}	return 0;}#ifdef LINUXintsys_oldselect(tcp)struct tcb *tcp;{	long args[5];	if (umoven(tcp, tcp->u_arg[0], sizeof args, (char *) args) < 0) {		tprintf("[...]");		return 0;	}	return decode_select(tcp, args, 0);}#ifdef ALPHAsys_osf_select(tcp)struct tcb *tcp;{	long *args = tcp->u_arg;	return decode_select(tcp, args, 1);}#endif#endif /* LINUX */intsys_select(tcp)struct tcb *tcp;{	long *args = tcp->u_arg;	return decode_select(tcp, args, 0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -