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

📄 stream.c

📁 linux进程跟踪的工具和源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
};#ifndef RMODEMASK#define RMODEMASK (~0)#endif#ifdef I_SWROPTstatic struct xlat stream_write_flags[] = {	{ SNDZERO,	"SNDZERO"	},	{ SNDPIPE,	"SNDPIPE"	},	{ 0,		NULL		},};#endif /* I_SWROPT */#ifdef I_ATMARKstatic struct xlat stream_atmark_options[] = {	{ ANYMARK,	"ANYMARK"	},	{ LASTMARK,	"LASTMARK"	},	{ 0,		NULL		},};#endif /* I_ATMARK */#ifdef TI_BINDstatic struct xlat transport_user_options[] = {	{ T_CONN_REQ,	"T_CONN_REQ"	},	{ T_CONN_RES,	"T_CONN_RES"	},	{ T_DISCON_REQ,	"T_DISCON_REQ"	},	{ T_DATA_REQ,	"T_DATA_REQ"	},	{ T_EXDATA_REQ,	"T_EXDATA_REQ"	},	{ T_INFO_REQ,	"T_INFO_REQ"	},	{ T_BIND_REQ,	"T_BIND_REQ"	},	{ T_UNBIND_REQ,	"T_UNBIND_REQ"	},	{ T_UNITDATA_REQ,"T_UNITDATA_REQ"},	{ T_OPTMGMT_REQ,"T_OPTMGMT_REQ"	},	{ T_ORDREL_REQ,	"T_ORDREL_REQ"	},	{ 0,		NULL		},};static struct xlat transport_provider_options[] = {	{ T_CONN_IND,	"T_CONN_IND"	},	{ T_CONN_CON,	"T_CONN_CON"	},	{ T_DISCON_IND,	"T_DISCON_IND"	},	{ T_DATA_IND,	"T_DATA_IND"	},	{ T_EXDATA_IND,	"T_EXDATA_IND"	},	{ T_INFO_ACK,	"T_INFO_ACK"	},	{ T_BIND_ACK,	"T_BIND_ACK"	},	{ T_ERROR_ACK,	"T_ERROR_ACK"	},	{ T_OK_ACK,	"T_OK_ACK"	},	{ T_UNITDATA_IND,"T_UNITDATA_IND"},	{ T_UDERROR_IND,"T_UDERROR_IND"	},	{ T_OPTMGMT_ACK,"T_OPTMGMT_ACK"	},	{ T_ORDREL_IND,	"T_ORDREL_IND"	},	{ 0,		NULL		},};#endif /* TI_BIND */static intinternal_stream_ioctl(tcp, arg)struct tcb *tcp;int arg;{	struct strioctl si;	char *name;	int in_and_out;#ifdef SI_GETUDATA	struct si_udata udata;#endif /* SI_GETUDATA */	if (!arg)		return 0;	if (umove(tcp, arg, &si) < 0) {		if (entering(tcp))			tprintf(", {...}");		return 1;	}	if (entering(tcp)) {		name = ioctl_lookup(si.ic_cmd);		if (name)			tprintf(", {ic_cmd=%s", name);		else			tprintf(", {ic_cmd=%#x", si.ic_cmd);		if (si.ic_timout == INFTIM)			tprintf(", ic_timout=INFTIM, ");		else			tprintf(" ic_timout=%d, ", si.ic_timout);	}	in_and_out = 1;	switch (si.ic_cmd) {#ifdef SI_GETUDATA	case SI_GETUDATA:		in_and_out = 0;		break;#endif /* SI_GETUDATA */	}	if (in_and_out) {		if (entering(tcp))			tprintf("/* in */ ");		else			tprintf(", /* out */ ");	}	if (in_and_out || entering(tcp))		tprintf("ic_len=%d, ic_dp=", si.ic_len);	switch (si.ic_cmd) {#ifdef TI_BIND	case TI_BIND:		/* in T_BIND_REQ, out T_BIND_ACK */		if (entering(tcp)) {			struct T_bind_req data;#if 0			tprintf("struct T_bind_req ");#endif			if (umove(tcp, (int) si.ic_dp, &data) < 0)				tprintf("{...}");			else {				tprintf("{PRIM_type=");				printxval(transport_user_options,					  data.PRIM_type, "T_???");				tprintf(", ADDR_length=%ld, ADDR_offset=%ld",					data.ADDR_length, data.ADDR_offset);				tprintf(", CONIND_number=%ld}",					data.CONIND_number);			}		}		else {			struct T_bind_ack data;#if 0			tprintf("struct T_bind_ack ");#endif			if (umove(tcp, (int) si.ic_dp, &data) < 0)				tprintf("{...}");			else {				tprintf("[");				tprintf("{PRIM_type=");				printxval(transport_provider_options,					  data.PRIM_type, "T_???");				tprintf(", ADDR_length=%ld, ADDR_offset=%ld",					data.ADDR_length, data.ADDR_offset);				tprintf(", CONIND_number=%ld}",					data.CONIND_number);				tprintf(", ");				printstr(tcp,					 (int) si.ic_dp + data.ADDR_offset,					 data.ADDR_length);				tprintf("]");			}		}		break;#endif /* TI_BIND */#if 0#ifdef TI_UNBIND	case TI_UNBIND:		/* in T_UNBIND_REQ, out T_OK_ACK */		break;#endif /* TI_UNBIND */#ifdef TI_GETINFO	case TI_GETINFO:		/* in T_INFO_REQ, out T_INFO_ACK */		break;#endif /* TI_GETINFO */#ifdef TI_OPTMGMT	case TI_OPTMGMT:		/* in T_OPTMGMT_REQ, out T_OPTMGMT_ACK */		break;#endif /* TI_OPTMGMT */#endif#ifdef SI_GETUDATA	case SI_GETUDATA:		if (entering(tcp))			break;#if 0		tprintf("struct si_udata ");#endif		if (umove(tcp, (int) si.ic_dp, &udata) < 0)			tprintf("{...}");		else {			tprintf("{tidusize=%d, addrsize=%d, ",				udata.tidusize, udata.addrsize);			tprintf("optsize=%d, etsdusize=%d, ",				udata.optsize, udata.etsdusize);			tprintf("servtype=%d, so_state=%d, ",				udata.servtype, udata.so_state);			tprintf("so_options=%d", udata.so_options);#if 0			tprintf(", tsdusize=%d", udata.tsdusize);#endif			tprintf("}");		}		break;#endif /* SI_GETUDATA */	default:		printstr(tcp, (int) si.ic_dp, si.ic_len);		break;	}	if (exiting(tcp))		tprintf("}");	return 1;}intstream_ioctl(tcp, code, arg)struct tcb *tcp;int code, arg;{#ifdef I_LIST	int i;#endif	int val;#ifdef I_FLUSHBAND	struct bandinfo bi;#endif	struct strpeek sp;	struct strfdinsert sfi;	struct strrecvfd srf;#ifdef I_LIST	struct str_list sl;#endif	/* I_STR is a special case because the data is read & written. */	if (code == I_STR)		return internal_stream_ioctl(tcp, arg);	if (entering(tcp))		return 0;	switch (code) {	case I_PUSH:	case I_LOOK:	case I_FIND:		/* arg is a string */		tprintf(", ");		printpath(tcp, arg);		return 1;	case I_POP:		/* doesn't take an argument */		return 1;	case I_FLUSH:		/* argument is an option */		tprintf(", ");		printxval(stream_flush_options, arg, "FLUSH???");		return 1;#ifdef I_FLUSHBAND	case I_FLUSHBAND:		/* argument is a pointer to a bandinfo struct */		if (umove(tcp, arg, &bi) < 0)			tprintf(", {...}");		else {			tprintf(", {bi_pri=%d, bi_flag=", bi.bi_pri);			if (!printflags(stream_flush_options, bi.bi_flag))				tprintf("0");			tprintf("}");		}		return 1;#endif /* I_FLUSHBAND */	case I_SETSIG:		/* argument is a set of flags */		tprintf(", ");		if (!printflags(stream_setsig_flags, arg))			tprintf("0");		return 1;	case I_GETSIG:		/* argument is a pointer to a set of flags */		if (syserror(tcp))			return 0;		tprintf(", [");		if (umove(tcp, arg, &val) < 0)			tprintf("?");		else if (!printflags(stream_setsig_flags, val))			tprintf("0");		tprintf("]");		return 1;	case I_PEEK:		/* argument is a pointer to a strpeek structure */		if (syserror(tcp) || !arg)			return 0;		if (umove(tcp, arg, &sp) < 0) {			tprintf(", {...}");			return 1;		}		tprintf(", {ctlbuf=");		printstrbuf(tcp, &sp.ctlbuf, 1);		tprintf(", databuf=");		printstrbuf(tcp, &sp.databuf, 1);		if (!printflags(msgflags, sp.flags))			tprintf("0");		return 1;	case I_SRDOPT:		/* argument is an option with flags */		tprintf(", ");		printxval(stream_read_options, arg & RMODEMASK, "R???");		addflags(stream_read_flags, arg & ~RMODEMASK);		return 1;	case I_GRDOPT:		/* argument is an pointer to an option with flags */		if (syserror(tcp))			return 0;		tprintf(", [");		if (umove(tcp, arg, &val) < 0)			tprintf("?");		else {			printxval(stream_read_options,				  arg & RMODEMASK, "R???");			addflags(stream_read_flags, arg & ~RMODEMASK);		}		tprintf("]");		return 1;	case I_NREAD:#ifdef I_GETBAND	case I_GETBAND:#endif#ifdef I_SETCLTIME	case I_SETCLTIME:#endif#ifdef I_GETCLTIME	case I_GETCLTIME:#endif		/* argument is a pointer to a decimal integer */		if (syserror(tcp))			return 0;		tprintf(", ");		printnum(tcp, arg, "%d");		return 1;	case I_FDINSERT:		/* argument is a pointer to a strfdinsert structure */		if (syserror(tcp) || !arg)			return 0;		if (umove(tcp, arg, &sfi) < 0) {			tprintf(", {...}");			return 1;		}		tprintf(", {ctlbuf=");		printstrbuf(tcp, &sfi.ctlbuf, 1);		tprintf(", databuf=");		printstrbuf(tcp, &sfi.databuf, 1);		if (!printflags(msgflags, sfi.flags))			tprintf("0");		tprintf(", filedes=%d, offset=%d}", sfi.fildes, sfi.offset);		return 1;#ifdef I_SWROPT	case I_SWROPT:		/* argument is a set of flags */		tprintf(", ");		if (!printflags(stream_write_flags, arg))			tprintf("0");		return 1;#endif /* I_SWROPT */#ifdef I_GWROPT	case I_GWROPT:		/* argument is an pointer to an option with flags */		if (syserror(tcp))			return 0;		tprintf(", [");		if (umove(tcp, arg, &val) < 0)			tprintf("?");		else if (!printflags(stream_write_flags, arg))			tprintf("0");		tprintf("]");		return 1;#endif /* I_GWROPT */	case I_SENDFD:#ifdef I_CKBAND	case I_CKBAND:#endif#ifdef I_CANPUT	case I_CANPUT:#endif	case I_LINK:	case I_UNLINK:	case I_PLINK:	case I_PUNLINK:		/* argument is a decimal integer */		tprintf(", %d", arg);		return 1;	case I_RECVFD:		/* argument is a pointer to a strrecvfd structure */		if (syserror(tcp) || !arg)			return 0;		if (umove(tcp, arg, &srf) < 0) {			tprintf(", {...}");			return 1;		}		tprintf(", {fd=%d, uid=%lu, gid=%lu}", srf.fd,			(unsigned long) srf.uid, (unsigned long) srf.gid);		return 1;#ifdef I_LIST	case I_LIST:		if (syserror(tcp))			return 0;		if (arg == 0) {			tprintf(", NULL");			return 1;		}		if (umove(tcp, arg, &sl) < 0) {			tprintf(", {...}");			return 1;		}		tprintf(", {sl_nmods=%d, sl_modlist=[", sl.sl_nmods);		for (i = 0; i < tcp->u_rval; i++) {			if (i)				tprintf(", ");			printpath(tcp, (int) sl.sl_modlist[i].l_name);		}		tprintf("]}");		return 1;#endif /* I_LIST */#ifdef I_ATMARK	case I_ATMARK:		tprintf(", ");		printxval(stream_atmark_options, arg, "???MARK");		return 1;#endif /* I_ATMARK */	default:		return 0;	}}#endif /* !linux && !FREEBSD */ #endif /* HAVE_SYS_STREAM_H || linux || FREEBSD */

⌨️ 快捷键说明

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