示例#1
0
文件: ipp.c 项目: andreiw/polaris
/*ARGSUSED*/
static int
action_format(
	uintptr_t	addr,
	const void	*data,
	void		*arg)
{
	afdata_t	*afp = (afdata_t *)arg;
	ipp_action_t	*ap;
	int		rc;

	ap = mdb_alloc(sizeof (ipp_action_t), UM_SLEEP);
	if (mdb_vread(ap, sizeof (ipp_action_t), addr) == -1) {
		mdb_warn("failed to read ipp_action_t at %p", addr);
		rc = WALK_ERR;
		goto done;
	}

	if (afp->af_flags & AF_VERBOSE)
		rc = action_dump(addr, ap, afp->af_banner);
	else
		rc = action_summary(addr, ap, afp->af_banner);

	afp->af_banner = B_FALSE;
done:
	mdb_free(ap, sizeof (ipp_action_t));
	return (rc);
}
示例#2
0
文件: trace_tree.c 项目: hchunhui/pop
/* json printer */
static int json_printer(char *buf, int pos,
			struct trace_tree *tree, char *el, struct header *h)
{
	struct trace_tree_V *tv;
	struct trace_tree_T *tt;
	struct trace_tree_D *td;
	struct trace_tree_G *tg;
	struct trace_tree_L *tl;
	int offset, length;
	char ebuf[64];
	int j, k;

	switch(tree->type) {
	case TT_E:
		sprintf(ebuf, "To Controller");
		break;
	case TT_V:
		tv = (struct trace_tree_V *) tree;
		sprintf(ebuf, "V %s", tv->name);
		break;
	case TT_T:
		tt = (struct trace_tree_T *) tree;
		sprintf(ebuf, "T %s", tt->name);
		break;
	case TT_D:
		td = (struct trace_tree_D *) tree;
		return json_printer(buf, pos, td->t, el, h);
	case TT_G:
		tg = (struct trace_tree_G *) tree;
		sprintf(ebuf, "G %s", header_get_name(tg->new_spec));
		break;
	case TT_L:
		tl = (struct trace_tree_L *) tree;
		action_summary(tl->ac, ebuf, 64);
		break;
	}

	pos += sprintf(buf+pos,
		       "{\"v\":%lu, \"el\":\"%s\", \"l\":\"%s\", \"p\":{\"x\":650, \"y\":30}, \"c\":[",
		       (long) tree, el, ebuf);

	switch(tree->type) {
	case TT_E:
		break;
	case TT_V:
		tv = (struct trace_tree_V *) tree;
		if(strcmp(tv->name, "in_port"))
			header_get_field(h, tv->name, &offset, &length);
		else
			length = 8;
		length = (length + 7) / 8;
		for(j = 0; j < tv->num_branches; j++) {
			for(k = 0; k < length; k++) {
				sprintf(ebuf + 2*k,
					"%02x",
					tv->branches[j].value.v[k]);
			}
			pos = json_printer(buf, pos, tv->branches[j].tree, ebuf, h);
			if(j < tv->num_branches - 1)
				pos += sprintf(buf+pos, ",");
		}
		break;
	case TT_T:
		tt = (struct trace_tree_T *) tree;
		if(strcmp(tt->name, "in_port"))
			header_get_field(h, tt->name, &offset, &length);
		else
			length = 8;
		length = (length + 7) / 8;
		sprintf(ebuf, " = ");
		for(k = 0; k < length; k++) {
			sprintf(ebuf + 3 + 2*k,
				"%02x",
				tt->value.v[k]);
		}
		pos = json_printer(buf, pos, tt->t, ebuf, h);
		pos += sprintf(buf+pos, ",");
		ebuf[0] = '!';
		pos = json_printer(buf, pos, tt->f, ebuf, h);
		break;
	case TT_D:
		td = (struct trace_tree_D *) tree;
		pos = json_printer(buf, pos, td->t, "", h);
		break;
	case TT_G:
		tg = (struct trace_tree_G *) tree;
		pos = json_printer(buf, pos, tg->t, "", tg->new_spec);
		break;
	case TT_L:
		break;
	}

	pos += sprintf(buf+pos, "]}");
	return pos;
}