stream.c revision b63256e69bf3f1a74aadb0e14556490bc8f4ef95
176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman/*
276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
34dc8a2aec63e4fb5ee2688544c4de323ed5de3efWichert Akkerman * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * All rights reserved.
576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *
676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * Redistribution and use in source and binary forms, with or without
776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * modification, are permitted provided that the following conditions
876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * are met:
976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 1. Redistributions of source code must retain the above copyright
1076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    notice, this list of conditions and the following disclaimer.
1176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 2. Redistributions in binary form must reproduce the above copyright
1276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    notice, this list of conditions and the following disclaimer in the
1376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    documentation and/or other materials provided with the distribution.
1476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * 3. The name of the author may not be used to endorse or promote products
1576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *    derived from this software without specific prior written permission.
1676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *
1776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *
2876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman *	$Id$
2976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman */
3076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
3176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "defs.h"
3234e014ac7502357e599935c62c18cba564c451beRoland McGrath#include <sys/syscall.h>
3376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
3442080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#ifdef HAVE_POLL_H
3542080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#include <poll.h>
3642080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#endif
37245a6ac0e71d7ecdbb776b12b735de58cf5a055bPavel Machek#ifdef HAVE_SYS_POLL_H
3876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <sys/poll.h>
39245a6ac0e71d7ecdbb776b12b735de58cf5a055bPavel Machek#endif
4042080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#ifdef HAVE_STROPTS_H
4142080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#include <stropts.h>
4242080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#endif
4342080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#ifdef HAVE_SYS_CONF_H
4442080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#include <sys/conf.h>
4542080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#endif
4642080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#ifdef HAVE_SYS_STREAM_H
4742080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#include <sys/stream.h>
4842080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#endif
4942080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#ifdef HAVE_SYS_TIHDR_H
5042080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#include <sys/tihdr.h>
5142080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#endif
5276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
53561c7995d7524afbf92689593b9ba5f9615d0982Roland McGrath#if defined(HAVE_SYS_STREAM_H) || defined(LINUX) || defined(FREEBSD)
5442080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman
5542080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#ifndef HAVE_STROPTS_H
5676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#define RS_HIPRI 1
5776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanstruct strbuf {
58adedb510197209e7077310f9e9f67e3d51fb8617Denys Vlasenko	int     maxlen;                 /* no. of bytes in buffer */
59adedb510197209e7077310f9e9f67e3d51fb8617Denys Vlasenko	int     len;                    /* no. of bytes returned */
6030145dda9d7ff70df1d5ad750a183572c73e8963Dmitry V. Levin	const char *buf;                /* pointer to data */
6176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
6276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#define MORECTL 1
6376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#define MOREDATA 2
6442080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#endif /* !HAVE_STROPTS_H */
6576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
6676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef HAVE_SYS_TIUSER_H
6776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <sys/tiuser.h>
6876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <sys/sockmod.h>
6976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include <sys/timod.h>
7076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* HAVE_SYS_TIUSER_H */
7176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
72bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman#ifndef FREEBSD
73d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat msgflags[] = {
7476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ RS_HIPRI,	"RS_HIPRI"	},
7576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
7676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
7776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
7876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
7976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanstatic void
801201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkoprintstrbuf(struct tcb *tcp, struct strbuf *sbp, int getting)
8176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
8276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (sbp->maxlen == -1 && getting)
8376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("{maxlen=-1}");
8476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	else {
8576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("{");
8676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (getting)
8776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("maxlen=%d, ", sbp->maxlen);
8876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("len=%d, buf=", sbp->len);
892e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman		printstr(tcp, (unsigned long) sbp->buf, sbp->len);
9076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("}");
9176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
9276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
9376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
9476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanstatic void
951201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkoprintstrbufarg(struct tcb *tcp, int arg, int getting)
9676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
9776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct strbuf buf;
9876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
9976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (arg == 0)
10076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("NULL");
10176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	else if (umove(tcp, arg, &buf) < 0)
10276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("{...}");
10376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	else
10476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstrbuf(tcp, &buf, getting);
10576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	tprintf(", ");
10676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
10776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
10876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1091201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_putmsg(struct tcb *tcp)
11076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
11176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i;
11276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
11376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
11476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
11576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[0]);
11676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
11776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
11876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 0);
11976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
120b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msgflags, tcp->u_arg[3], "RS_???");
12176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
12276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
12376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
12476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
125b9fe011cdfb0a3014e68a6e82007b6c2703a340bDmitry V. Levin#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4) || defined(SVR4)
12676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1271201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_getmsg(struct tcb *tcp)
12876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
12976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i, flags;
13076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
13176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
13276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
13376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%lu, ", tcp->u_arg[0]);
13476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
13576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
13676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx, %#lx, %#lx",
13776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
13876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
13976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
14076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
14176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
14276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 1);
14376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to flags */
14476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (tcp->u_arg[3] == 0)
14576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("NULL");
14676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else if (umove(tcp, tcp->u_arg[3], &flags) < 0)
14776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("[?]");
14876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
14976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("[");
150b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(msgflags, flags, "RS_???");
15176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("]");
15276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
15376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* decode return value */
15476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		switch (tcp->u_rval) {
15576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL:
15676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
15776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
15876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL|MOREDATA:
15976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL|MOREDATA";
16076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
16176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MOREDATA:
16276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
16376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
16476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		default:
16576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = NULL;
16676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
16776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
16876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
16976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return RVAL_HEX | RVAL_STR;
17076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
171b9fe011cdfb0a3014e68a6e82007b6c2703a340bDmitry V. Levin#endif /* SPARC || SPARC64 || SUNOS4 || SVR4 */
17276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
17334e014ac7502357e599935c62c18cba564c451beRoland McGrath#if defined SYS_putpmsg || defined SYS_getpmsg
174d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat pmsgflags[] = {
175d856b99aff36012d1c8bc72012d0ede414e17971Wichert Akkerman#ifdef MSG_HIPRI
17676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ MSG_HIPRI,	"MSG_HIPRI"	},
177d856b99aff36012d1c8bc72012d0ede414e17971Wichert Akkerman#endif
178d856b99aff36012d1c8bc72012d0ede414e17971Wichert Akkerman#ifdef MSG_AND
17976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ MSG_ANY,	"MSG_ANY"	},
180d856b99aff36012d1c8bc72012d0ede414e17971Wichert Akkerman#endif
181d856b99aff36012d1c8bc72012d0ede414e17971Wichert Akkerman#ifdef MSG_BAND
18276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ MSG_BAND,	"MSG_BAND"	},
183d856b99aff36012d1c8bc72012d0ede414e17971Wichert Akkerman#endif
18476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
18576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
18634e014ac7502357e599935c62c18cba564c451beRoland McGrath#endif
18776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
18834e014ac7502357e599935c62c18cba564c451beRoland McGrath#ifdef SYS_putpmsg
18976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1901201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_putpmsg(struct tcb *tcp)
19176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
19276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i;
19376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
19476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
19576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
19676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[0]);
19776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
19876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
19976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 0);
20076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* band */
20176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[3]);
20276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
203b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(pmsgflags, tcp->u_arg[4], "MSG_???");
20476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
20576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
20676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
20734e014ac7502357e599935c62c18cba564c451beRoland McGrath#endif /* SYS_putpmsg */
20876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
20934e014ac7502357e599935c62c18cba564c451beRoland McGrath#ifdef SYS_getpmsg
21076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
2111201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_getpmsg(struct tcb *tcp)
21276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
21376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i, flags;
21476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
21576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
21676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
21776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%lu, ", tcp->u_arg[0]);
21876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
21976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
22076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx, %#lx, %#lx, %#lx", tcp->u_arg[1],
22176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[4]);
22276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
22376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
22476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
22576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
22676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 1);
22776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to band */
22876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printnum(tcp, tcp->u_arg[3], "%d");
229906dade0ddcd670302fe8ce4e00b9a449b61999fWichert Akkerman		tprintf(", ");
23076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to flags */
23176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (tcp->u_arg[4] == 0)
23276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("NULL");
23376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else if (umove(tcp, tcp->u_arg[4], &flags) < 0)
23476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("[?]");
23576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
23676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("[");
237b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(pmsgflags, flags, "MSG_???");
23876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("]");
23976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
24076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* decode return value */
24176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		switch (tcp->u_rval) {
24276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL:
24376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
24476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
24576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL|MOREDATA:
24676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL|MOREDATA";
24776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
24876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MOREDATA:
24976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
25076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
25176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		default:
25276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = NULL;
25376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
25476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
25576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
25676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return RVAL_HEX | RVAL_STR;
25776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
25834e014ac7502357e599935c62c18cba564c451beRoland McGrath#endif /* SYS_getpmsg */
25976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
260bf79f2e16b090ffe59cd1e1820935680a2da7b78Wichert Akkerman#endif /* !FREEBSD */
26176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
26276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
263faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#ifdef HAVE_SYS_POLL_H
264faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman
265d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat pollflags[] = {
266245a6ac0e71d7ecdbb776b12b735de58cf5a055bPavel Machek#ifdef POLLIN
26776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLIN,	"POLLIN"	},
26876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLPRI,	"POLLPRI"	},
26976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLOUT,	"POLLOUT"	},
27076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef POLLRDNORM
27176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLRDNORM,	"POLLRDNORM"	},
27276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
27376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef POLLWRNORM
27476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLWRNORM,	"POLLWRNORM"	},
27576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
27676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef POLLRDBAND
27776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLRDBAND,	"POLLRDBAND"	},
27876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
27976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef POLLWRBAND
28076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLWRBAND,	"POLLWRBAND"	},
28176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
28276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLERR,	"POLLERR"	},
28376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLHUP,	"POLLHUP"	},
28476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ POLLNVAL,	"POLLNVAL"	},
285245a6ac0e71d7ecdbb776b12b735de58cf5a055bPavel Machek#endif
28676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
28776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
28876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
28995ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinstatic int
290f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrathdecode_poll(struct tcb *tcp, long pts)
29176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
292aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	struct pollfd fds;
293aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	unsigned nfds;
294aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	unsigned long size, start, cur, end, abbrev_end;
295aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	int failed = 0;
29676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
297f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
298f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		nfds = tcp->u_arg[1];
299f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		size = sizeof(fds) * nfds;
300f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		start = tcp->u_arg[0];
301f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		end = start + size;
302f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (nfds == 0 || size / sizeof(fds) != nfds || end < start) {
303f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tprintf("%#lx, %d, ",
304f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tcp->u_arg[0], nfds);
305f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
306f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
307f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (abbrev(tcp)) {
308f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = start + max_strlen * sizeof(fds);
309f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (abbrev_end < start)
310f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				abbrev_end = end;
311f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		} else {
312aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath			abbrev_end = end;
313f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
314f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		tprintf("[");
315f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		for (cur = start; cur < end; cur += sizeof(fds)) {
316f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur > start)
317f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tprintf(", ");
318f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur >= abbrev_end) {
319f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tprintf("...");
320f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
321f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
322f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (umoven(tcp, cur, sizeof fds, (char *) &fds) < 0) {
323f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tprintf("?");
324f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				failed = 1;
325f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
326f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
327f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (fds.fd < 0) {
328f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tprintf("{fd=%d}", fds.fd);
329f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				continue;
330f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
3313138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin			tprintf("{fd=");
3323138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin			printfd(tcp, fds.fd);
3333138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin			tprintf(", events=");
334f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			printflags(pollflags, fds.events, "POLL???");
335f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tprintf("}");
336f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
337f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		tprintf("]");
338f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (failed)
339f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tprintf(" %#lx", start);
340f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		tprintf(", %d, ", nfds);
341f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		return 0;
342aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	} else {
343f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		static char outstr[1024];
344f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		char str[64];
345adedb510197209e7077310f9e9f67e3d51fb8617Denys Vlasenko		const char *flagstr;
346f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		unsigned int cumlen;
347f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
348f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (syserror(tcp))
349f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
350f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (tcp->u_rval == 0) {
351f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tcp->auxstr = "Timeout";
352f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return RVAL_STR;
35376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
354f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
355f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		nfds = tcp->u_arg[1];
356f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		size = sizeof(fds) * nfds;
357f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		start = tcp->u_arg[0];
358f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		end = start + size;
359f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (nfds == 0 || size / sizeof(fds) != nfds || end < start)
360f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
361f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (abbrev(tcp)) {
362f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = start + max_strlen * sizeof(fds);
363f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (abbrev_end < start)
364f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				abbrev_end = end;
365f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		} else {
366f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = end;
36776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
368f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
369f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		outstr[0] = '\0';
370f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		cumlen = 0;
371f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
372f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		for (cur = start; cur < end; cur += sizeof(fds)) {
373f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (umoven(tcp, cur, sizeof fds, (char *) &fds) < 0) {
374f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				++cumlen;
375f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				if (cumlen < sizeof(outstr))
376f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath					strcat(outstr, "?");
377f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				failed = 1;
378f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
379f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
380f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (!fds.revents)
381f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				continue;
382f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (!cumlen) {
383f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				++cumlen;
384f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				strcat(outstr, "[");
385f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			} else {
386f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				cumlen += 2;
387f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				if (cumlen < sizeof(outstr))
388f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath					strcat(outstr, ", ");
389f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
390f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur >= abbrev_end) {
391f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				cumlen += 3;
392f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				if (cumlen < sizeof(outstr))
393f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath					strcat(outstr, "...");
394f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
395f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
396f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			sprintf(str, "{fd=%d, revents=", fds.fd);
397b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			flagstr = sprintflags("", pollflags, fds.revents);
398f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			cumlen += strlen(str) + strlen(flagstr) + 1;
399f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cumlen < sizeof(outstr)) {
400f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				strcat(outstr, str);
401f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				strcat(outstr, flagstr);
402f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				strcat(outstr, "}");
403f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
40476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
405f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (failed)
406f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
407f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
408f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (cumlen && ++cumlen < sizeof(outstr))
409f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			strcat(outstr, "]");
410f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
411f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (pts) {
412f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			char str[128];
413f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
414f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			sprintf(str, "%sleft ", cumlen ? ", " : "");
4156bc09daaf6b249b35dec4283b165b1f39e6d6a0dRoland McGrath			sprint_timespec(str + strlen(str), tcp, pts);
416f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if ((cumlen += strlen(str)) < sizeof(outstr))
417f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				strcat(outstr, str);
41876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
419f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
420f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (!outstr[0])
421f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
422f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
423f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		tcp->auxstr = outstr;
424f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		return RVAL_STR;
425aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	}
42695ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin}
42795ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin
42895ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinint
42995ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinsys_poll(struct tcb *tcp)
43095ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin{
431f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	int rc = decode_poll(tcp, 0);
432f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
43376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef INFTIM
43495ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		if (tcp->u_arg[2] == INFTIM)
43595ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin			tprintf("INFTIM");
43695ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		else
43776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
43895ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin			tprintf("%ld", tcp->u_arg[2]);
43995ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	}
44095ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	return rc;
44176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
44276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
44395ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin#ifdef LINUX
44495ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinint
44595ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinsys_ppoll(struct tcb *tcp)
44695ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin{
447f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	int rc = decode_poll(tcp, tcp->u_arg[2]);
448f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
4496bc09daaf6b249b35dec4283b165b1f39e6d6a0dRoland McGrath		print_timespec(tcp, tcp->u_arg[2]);
4506bc09daaf6b249b35dec4283b165b1f39e6d6a0dRoland McGrath		tprintf(", ");
45195ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		print_sigset(tcp, tcp->u_arg[3], 0);
45295ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		tprintf(", %lu", tcp->u_arg[4]);
45395ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	}
45495ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	return rc;
45595ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin}
45695ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin#endif
457aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath
458faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#else /* !HAVE_SYS_POLL_H */
459faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkermanint
4601201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_poll(struct tcb *tcp)
461faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman{
4625ae2b7c601dadf79a4345e1ee21053947b9e4addDenys Vlasenko	return 0;
463faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman}
464faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#endif
465faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman
466561c7995d7524afbf92689593b9ba5f9615d0982Roland McGrath#if !defined(LINUX) && !defined(FREEBSD)
46776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
468d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat stream_flush_options[] = {
46976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ FLUSHR,	"FLUSHR"	},
47076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ FLUSHW,	"FLUSHW"	},
47176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ FLUSHRW,	"FLUSHRW"	},
47276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef FLUSHBAND
47376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ FLUSHBAND,	"FLUSHBAND"	},
47476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
47576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
47676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
47776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
478d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat stream_setsig_flags[] = {
47976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_INPUT,	"S_INPUT"	},
48076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_HIPRI,	"S_HIPRI"	},
48176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_OUTPUT,	"S_OUTPUT"	},
48276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_MSG,	"S_MSG"		},
48376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef S_ERROR
48476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_ERROR,	"S_ERROR"	},
48576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
48676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef S_HANGUP
48776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_HANGUP,	"S_HANGUP"	},
48876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
48976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef S_RDNORM
49076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_RDNORM,	"S_RDNORM"	},
49176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
49276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef S_WRNORM
49376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_WRNORM,	"S_WRNORM"	},
49476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
49576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef S_RDBAND
49676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_RDBAND,	"S_RDBAND"	},
49776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
49876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef S_WRBAND
49976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_WRBAND,	"S_WRBAND"	},
50076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
50176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef S_BANDURG
50276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ S_BANDURG,	"S_BANDURG"	},
50376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
50476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
50576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
50676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
507d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat stream_read_options[] = {
50876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ RNORM,	"RNORM"		},
50976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ RMSGD,	"RMSGD"		},
51076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ RMSGN,	"RMSGN"		},
51176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
51276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
51376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
514d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat stream_read_flags[] = {
51576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef RPROTDAT
51676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ RPROTDAT,	"RPROTDAT"	},
51776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
51876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef RPROTDIS
51976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ RPROTDIS,	"RPROTDIS"	},
52076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
52176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef RPROTNORM
52276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ RPROTNORM,	"RPROTNORM"	},
52376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
52476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
52576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
52676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
52776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifndef RMODEMASK
52876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#define RMODEMASK (~0)
52976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
53076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
53176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_SWROPT
532d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat stream_write_flags[] = {
53376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ SNDZERO,	"SNDZERO"	},
53476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ SNDPIPE,	"SNDPIPE"	},
53576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
53676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
53776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* I_SWROPT */
53876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
53976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_ATMARK
540d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat stream_atmark_options[] = {
54176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ ANYMARK,	"ANYMARK"	},
54276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ LASTMARK,	"LASTMARK"	},
54376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
54476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
54576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* I_ATMARK */
54676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
54776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef TI_BIND
548d9f816f60457930af27349fac3d23b3b78338036Roland McGrathstatic const struct xlat transport_user_options[] = {
54976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_CONN_REQ,	"T_CONN_REQ"	},
55076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_CONN_RES,	"T_CONN_RES"	},
55176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_DISCON_REQ,	"T_DISCON_REQ"	},
55276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_DATA_REQ,	"T_DATA_REQ"	},
55376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_EXDATA_REQ,	"T_EXDATA_REQ"	},
55476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_INFO_REQ,	"T_INFO_REQ"	},
55576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_BIND_REQ,	"T_BIND_REQ"	},
55676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_UNBIND_REQ,	"T_UNBIND_REQ"	},
55776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_UNITDATA_REQ,"T_UNITDATA_REQ"},
55876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_OPTMGMT_REQ,"T_OPTMGMT_REQ"	},
55976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ T_ORDREL_REQ,	"T_ORDREL_REQ"	},
56076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
56176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
56276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
563b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenkostatic const struct xlat transport_user_flags[] = {
56438ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ 0,		"0"		},
56538ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_MORE,	"T_MORE"	},
56638ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_EXPEDITED,	"T_EXPEDITED"	},
56738ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_NEGOTIATE,	"T_NEGOTIATE"	},
56838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_CHECK,	"T_CHECK"	},
56938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_DEFAULT,	"T_DEFAULT"	},
57038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_SUCCESS,	"T_SUCCESS"	},
57138ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_FAILURE,	"T_FAILURE"	},
57238ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_CURRENT,	"T_CURRENT"	},
57338ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_PARTSUCCESS,"T_PARTSUCCESS"	},
57438ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_READONLY,	"T_READONLY"	},
57538ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_NOTSUPPORT,	"T_NOTSUPPORT"	},
57676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	{ 0,		NULL		},
57776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
57838ae88d332acd9f86a30d58158e306d795d98977John Hughes
57938ae88d332acd9f86a30d58158e306d795d98977John Hughes
5806d2b34971b33d379c89c36c5ad1b0c6d5d12c453Roland McGrath#ifdef HAVE_STRUCT_T_OPTHDR
58138ae88d332acd9f86a30d58158e306d795d98977John Hughes
582b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenkostatic const struct xlat xti_level[] = {
58338ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ XTI_GENERIC,	"XTI_GENERIC"	},
58438ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ 0,		NULL		},
58538ae88d332acd9f86a30d58158e306d795d98977John Hughes};
58638ae88d332acd9f86a30d58158e306d795d98977John Hughes
587b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenkostatic const struct xlat xti_generic[] = {
58838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ XTI_DEBUG,	"XTI_DEBUG"	},
58938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ XTI_LINGER,	"XTI_LINGER"	},
59038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ XTI_RCVBUF,	"XTI_RCVBUF"	},
59138ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ XTI_RCVLOWAT,	"XTI_RCVLOWAT"	},
59238ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ XTI_SNDBUF,	"XTI_SNDBUF"	},
59338ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ XTI_SNDLOWAT,	"XTI_SNDLOWAT"	},
59438ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ 0,		NULL		},
59538ae88d332acd9f86a30d58158e306d795d98977John Hughes};
59638ae88d332acd9f86a30d58158e306d795d98977John Hughes
59738ae88d332acd9f86a30d58158e306d795d98977John Hughes
59838ae88d332acd9f86a30d58158e306d795d98977John Hughes
59938ae88d332acd9f86a30d58158e306d795d98977John Hughesvoid
6001201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkoprint_xti_optmgmt(struct tcb *tcp, long addr, int len)
60138ae88d332acd9f86a30d58158e306d795d98977John Hughes{
60238ae88d332acd9f86a30d58158e306d795d98977John Hughes	int c = 0;
60338ae88d332acd9f86a30d58158e306d795d98977John Hughes	struct t_opthdr hdr;
60438ae88d332acd9f86a30d58158e306d795d98977John Hughes
6052c4e3a8061130493bd196564f096b677c5528fc1John Hughes	while (len >= (int) sizeof hdr) {
60638ae88d332acd9f86a30d58158e306d795d98977John Hughes		if (umove(tcp, addr, &hdr) < 0) break;
60738ae88d332acd9f86a30d58158e306d795d98977John Hughes		if (c++) {
608b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			tprintf(", ");
60938ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
61038ae88d332acd9f86a30d58158e306d795d98977John Hughes		else if (len > hdr.len + sizeof hdr) {
611b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			tprintf("[");
61238ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
613b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("{level=");
614b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printxval(xti_level, hdr.level, "???");
615b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf(", name=");
61638ae88d332acd9f86a30d58158e306d795d98977John Hughes		switch (hdr.level) {
61738ae88d332acd9f86a30d58158e306d795d98977John Hughes		    case XTI_GENERIC:
618b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			printxval(xti_generic, hdr.name, "XTI_???");
61938ae88d332acd9f86a30d58158e306d795d98977John Hughes			break;
62038ae88d332acd9f86a30d58158e306d795d98977John Hughes		    default:
621b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			tprintf("%ld", hdr.name);
62238ae88d332acd9f86a30d58158e306d795d98977John Hughes			break;
62338ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
624b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf(", status=");
625b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printxval(transport_user_flags, hdr.status, "T_???");
62638ae88d332acd9f86a30d58158e306d795d98977John Hughes		addr += sizeof hdr;
62738ae88d332acd9f86a30d58158e306d795d98977John Hughes		len -= sizeof hdr;
62838ae88d332acd9f86a30d58158e306d795d98977John Hughes		if ((hdr.len -= sizeof hdr) > 0) {
62938ae88d332acd9f86a30d58158e306d795d98977John Hughes			if (hdr.len > len) break;
630b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			tprintf(", val=");
631b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			if (len == sizeof(int))
632b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko				printnum(tcp, addr, "%d");
63338ae88d332acd9f86a30d58158e306d795d98977John Hughes			else
634b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko				printstr(tcp, addr, hdr.len);
63538ae88d332acd9f86a30d58158e306d795d98977John Hughes			addr += hdr.len;
63638ae88d332acd9f86a30d58158e306d795d98977John Hughes			len -= hdr.len;
63738ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
638b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("}");
63938ae88d332acd9f86a30d58158e306d795d98977John Hughes	}
64038ae88d332acd9f86a30d58158e306d795d98977John Hughes	if (len > 0) {
641b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		if (c++) tprintf(", ");
642b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printstr(tcp, addr, len);
64338ae88d332acd9f86a30d58158e306d795d98977John Hughes	}
644b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko	if (c > 1) tprintf("]");
64538ae88d332acd9f86a30d58158e306d795d98977John Hughes}
64638ae88d332acd9f86a30d58158e306d795d98977John Hughes
64738ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
64838ae88d332acd9f86a30d58158e306d795d98977John Hughes
64938ae88d332acd9f86a30d58158e306d795d98977John Hughes
65038ae88d332acd9f86a30d58158e306d795d98977John Hughesstatic void
6511201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkoprint_optmgmt(struct tcb *tcp, long addr, int len)
65238ae88d332acd9f86a30d58158e306d795d98977John Hughes{
65334e014ac7502357e599935c62c18cba564c451beRoland McGrath	/* We don't know how to tell if TLI (socket) or XTI
65438ae88d332acd9f86a30d58158e306d795d98977John Hughes	   optmgmt is being used yet, assume TLI. */
6556d2b34971b33d379c89c36c5ad1b0c6d5d12c453Roland McGrath#if defined (HAVE_STRUCT_OPTHDR)
656b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko	print_sock_optmgmt(tcp, addr, len);
6576d2b34971b33d379c89c36c5ad1b0c6d5d12c453Roland McGrath#elif defined (HAVE_STRUCT_T_OPTHDR)
658b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko	print_xti_optmgmt(tcp, addr, len);
65938ae88d332acd9f86a30d58158e306d795d98977John Hughes#else
660b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko	printstr(tcp, addr, len);
66138ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
66238ae88d332acd9f86a30d58158e306d795d98977John Hughes}
66338ae88d332acd9f86a30d58158e306d795d98977John Hughes
66438ae88d332acd9f86a30d58158e306d795d98977John Hughes
66538ae88d332acd9f86a30d58158e306d795d98977John Hughes
66638ae88d332acd9f86a30d58158e306d795d98977John Hughes
667b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenkostatic const struct xlat service_type[] = {
66838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_COTS,	"T_COTS"	},
66938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_COTS_ORD,	"T_COTS_ORD"	},
67038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ T_CLTS,	"T_CLTS"	},
67138ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ 0,		NULL		},
67238ae88d332acd9f86a30d58158e306d795d98977John Hughes};
67338ae88d332acd9f86a30d58158e306d795d98977John Hughes
674b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenkostatic const struct xlat ts_state[] = {
67538ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_UNBND,	"TS_UNBND"	},
67638ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_BREQ,	"TS_WACK_BREQ"	},
67738ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_UREQ,	"TS_WACK_UREQ"	},
67838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_IDLE,	"TS_IDLE"	},
67938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_OPTREQ,"TS_WACK_OPTREQ"},
68038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_CREQ,	"TS_WACK_CREQ"	},
68138ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WCON_CREQ,	"TS_WCON_CREQ"	},
68238ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WRES_CIND,	"TS_WRES_CIND"	},
68338ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_CRES,	"TS_WACK_CRES"	},
68438ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_DATA_XFER,	"TS_DATA_XFER"	},
68538ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WIND_ORDREL,"TS_WIND_ORDREL"},
68638ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WREQ_ORDREL,"TS_WREQ_ORDREL"},
68738ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_DREQ6,"TS_WACK_DREQ6"	},
68838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_DREQ7,"TS_WACK_DREQ7"	},
68938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_DREQ9,"TS_WACK_DREQ9"	},
69038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_DREQ10,"TS_WACK_DREQ10"},
69138ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TS_WACK_DREQ11,"TS_WACK_DREQ11"},
69238ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ 0,		NULL		},
69338ae88d332acd9f86a30d58158e306d795d98977John Hughes};
69438ae88d332acd9f86a30d58158e306d795d98977John Hughes
695b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenkostatic const struct xlat provider_flags[] = {
69638ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ 0,		"0"		},
69738ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ SENDZERO,	"SENDZERO"	},
69838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ EXPINLINE,	"EXPINLINE"	},
69938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ XPG4_1,	"XPG4_1"	},
70038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ 0,		NULL		},
70138ae88d332acd9f86a30d58158e306d795d98977John Hughes};
70238ae88d332acd9f86a30d58158e306d795d98977John Hughes
70338ae88d332acd9f86a30d58158e306d795d98977John Hughes
704b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenkostatic const struct xlat tli_errors[] = {
70538ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBADADDR,	"TBADADDR"	},
70638ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBADOPT,	"TBADOPT"	},
70738ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TACCES,	"TACCES"	},
70838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBADF,	"TBADF"		},
70938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TNOADDR,	"TNOADDR"	},
71038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TOUTSTATE,	"TOUTSTATE"	},
71138ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBADSEQ,	"TBADSEQ"	},
71238ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TSYSERR,	"TSYSERR"	},
71338ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TLOOK,	"TLOOK"		},
71438ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBADDATA,	"TBADDATA"	},
71538ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBUFOVFLW,	"TBUFOVFLW"	},
71638ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TFLOW,	"TFLOW"		},
71738ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TNODATA,	"TNODATA"	},
71838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TNODIS,	"TNODIS"	},
71938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TNOUDERR,	"TNOUDERR"	},
72038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBADFLAG,	"TBADFLAG"	},
72138ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TNOREL,	"TNOREL"	},
72238ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TNOTSUPPORT,	"TNOTSUPPORT"	},
72338ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TSTATECHNG,	"TSTATECHNG"	},
72438ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TNOSTRUCTYPE,	"TNOSTRUCTYPE"	},
72538ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBADNAME,	"TBADNAME"	},
72638ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TBADQLEN,	"TBADQLEN"	},
72738ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TADDRBUSY,	"TADDRBUSY"	},
72838ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TINDOUT,	"TINDOUT"	},
72938ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TPROVMISMATCH,"TPROVMISMATCH"	},
73038ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TRESQLEN,	"TRESQLEN"	},
73138ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TRESADDR,	"TRESADDR"	},
73238ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TQFULL,	"TQFULL"	},
73338ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ TPROTO,	"TPROTO"	},
73438ae88d332acd9f86a30d58158e306d795d98977John Hughes	{ 0,		NULL		},
73538ae88d332acd9f86a30d58158e306d795d98977John Hughes};
73638ae88d332acd9f86a30d58158e306d795d98977John Hughes
73738ae88d332acd9f86a30d58158e306d795d98977John Hughes
73838ae88d332acd9f86a30d58158e306d795d98977John Hughesstatic int
7391201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkoprint_transport_message(struct tcb *tcp, int expect, long addr, int len)
74038ae88d332acd9f86a30d58158e306d795d98977John Hughes{
74138ae88d332acd9f86a30d58158e306d795d98977John Hughes	union T_primitives m;
74238ae88d332acd9f86a30d58158e306d795d98977John Hughes	int c = 0;
74338ae88d332acd9f86a30d58158e306d795d98977John Hughes
74438ae88d332acd9f86a30d58158e306d795d98977John Hughes	if (len < sizeof m.type) goto dump;
74538ae88d332acd9f86a30d58158e306d795d98977John Hughes
746b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko	if (umove(tcp, addr, &m.type) < 0) goto dump;
74738ae88d332acd9f86a30d58158e306d795d98977John Hughes
74838ae88d332acd9f86a30d58158e306d795d98977John Hughes#define GET(type, struct)	\
74938ae88d332acd9f86a30d58158e306d795d98977John Hughes	do {							\
75038ae88d332acd9f86a30d58158e306d795d98977John Hughes		if (len < sizeof m.struct) goto dump;		\
751b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		if (umove(tcp, addr, &m.struct) < 0) goto dump;\
752b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("{");					\
75338ae88d332acd9f86a30d58158e306d795d98977John Hughes		if (expect != type) {				\
75438ae88d332acd9f86a30d58158e306d795d98977John Hughes			++c;					\
755b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			tprintf(#type);			\
75638ae88d332acd9f86a30d58158e306d795d98977John Hughes		}						\
75738ae88d332acd9f86a30d58158e306d795d98977John Hughes	}							\
75838ae88d332acd9f86a30d58158e306d795d98977John Hughes	while (0)
75938ae88d332acd9f86a30d58158e306d795d98977John Hughes
76038ae88d332acd9f86a30d58158e306d795d98977John Hughes#define COMMA() \
761b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko	do { if (c++) tprintf(", "); } while (0)
76234e014ac7502357e599935c62c18cba564c451beRoland McGrath
76338ae88d332acd9f86a30d58158e306d795d98977John Hughes
76438ae88d332acd9f86a30d58158e306d795d98977John Hughes#define STRUCT(struct, elem, print)					\
76538ae88d332acd9f86a30d58158e306d795d98977John Hughes	do {								\
766b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();						\
76738ae88d332acd9f86a30d58158e306d795d98977John Hughes		if (m.struct.elem##_length < 0 ||			\
76838ae88d332acd9f86a30d58158e306d795d98977John Hughes		    m.struct.elem##_offset < sizeof m.struct ||		\
76938ae88d332acd9f86a30d58158e306d795d98977John Hughes		    m.struct.elem##_offset + m.struct.elem##_length > len) \
77038ae88d332acd9f86a30d58158e306d795d98977John Hughes		{							\
771b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			tprintf(#elem "_length=%ld, " #elem "_offset=%ld",\
77238ae88d332acd9f86a30d58158e306d795d98977John Hughes				m.struct.elem##_length,			\
77338ae88d332acd9f86a30d58158e306d795d98977John Hughes				m.struct.elem##_offset);		\
77438ae88d332acd9f86a30d58158e306d795d98977John Hughes		}							\
77538ae88d332acd9f86a30d58158e306d795d98977John Hughes		else {							\
776b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			tprintf(#elem "=");				\
777b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print(tcp,					\
77838ae88d332acd9f86a30d58158e306d795d98977John Hughes				 addr + m.struct.elem##_offset,		\
77938ae88d332acd9f86a30d58158e306d795d98977John Hughes				 m.struct.elem##_length);		\
78038ae88d332acd9f86a30d58158e306d795d98977John Hughes		}							\
78138ae88d332acd9f86a30d58158e306d795d98977John Hughes	}								\
78238ae88d332acd9f86a30d58158e306d795d98977John Hughes	while (0)
78338ae88d332acd9f86a30d58158e306d795d98977John Hughes
784b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko#define ADDR(struct, elem) STRUCT(struct, elem, printstr)
78534e014ac7502357e599935c62c18cba564c451beRoland McGrath
78638ae88d332acd9f86a30d58158e306d795d98977John Hughes	switch (m.type) {
78738ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_CONN_REQ
78838ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_CONN_REQ:	/* connect request   */
789b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_CONN_REQ, conn_req);
790b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(conn_req, DEST);
791b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(conn_req, OPT);
79238ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
79338ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
79438ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_CONN_RES
79538ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_CONN_RES:	/* connect response   */
796b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_CONN_RES, conn_res);
79738dc6bb84fefe9e310177afe09cf37f88a2abb67Roland McGrath#ifdef HAVE_STRUCT_T_CONN_RES_QUEUE_PTR
798b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
799b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("QUEUE=%p", m.conn_res.QUEUE_ptr);
80038dc6bb84fefe9e310177afe09cf37f88a2abb67Roland McGrath#elif defined HAVE_STRUCT_T_CONN_RES_ACCEPTOR_ID
801b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
802b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("ACCEPTOR=%#lx", m.conn_res.ACCEPTOR_id);
80338dc6bb84fefe9e310177afe09cf37f88a2abb67Roland McGrath#endif
804b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(conn_res, OPT);
805b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
806b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("SEQ=%ld", m.conn_res.SEQ_number);
80738ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
80838ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
80938ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_DISCON_REQ
81038ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_DISCON_REQ:	/* disconnect request */
811b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_DISCON_REQ, discon_req);
812b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
813b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("SEQ=%ld", m.discon_req.SEQ_number);
81438ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
81538ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
81638ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_DATA_REQ
81738ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_DATA_REQ:	/* data request       */
818b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_DATA_REQ, data_req);
819b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
820b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("MORE=%ld", m.data_req.MORE_flag);
82138ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
82238ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
82338ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_EXDATA_REQ
82438ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_EXDATA_REQ:	/* expedited data req */
825b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_EXDATA_REQ, exdata_req);
826b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
827b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("MORE=%ld", m.exdata_req.MORE_flag);
82838ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
82938ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
83038ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_INFO_REQ
83138ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_INFO_REQ:	/* information req    */
832b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_INFO_REQ, info_req);
83338ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
83438ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
83538ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_BIND_REQ
83638ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_BIND_REQ:	/* bind request       */
83738ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef O_T_BIND_REQ
83838ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case O_T_BIND_REQ:	/* Ugly xti/tli hack */
83938ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
840b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_BIND_REQ, bind_req);
841b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(bind_req, ADDR);
842b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
843b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("CONIND=%ld", m.bind_req.CONIND_number);
84438ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
84538ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
84638ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_UNBIND_REQ
84738ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_UNBIND_REQ:	/* unbind request     */
848b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_UNBIND_REQ, unbind_req);
84938ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
85038ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
85138ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_UNITDATA_REQ
85238ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_UNITDATA_REQ:	/* unitdata requset   */
853b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_UNITDATA_REQ, unitdata_req);
854b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(unitdata_req, DEST);
855b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(unitdata_req, OPT);
85638ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
85738ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
85838ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_OPTMGMT_REQ
85938ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_OPTMGMT_REQ:	/* manage opt req     */
860b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_OPTMGMT_REQ, optmgmt_req);
861b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
862b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("MGMT=");
863b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printflags(transport_user_flags, m.optmgmt_req.MGMT_flags,
864b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			    "T_???");
865b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		STRUCT(optmgmt_req, OPT, print_optmgmt);
86638ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
86738ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
86838ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_ORDREL_REQ
86938ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_ORDREL_REQ:	/* orderly rel req    */
870b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_ORDREL_REQ, ordrel_req);
87138ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
87238ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
87338ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_CONN_IND
87438ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_CONN_IND:	/* connect indication */
875b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_CONN_IND, conn_ind);
876b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(conn_ind, SRC);
877b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(conn_ind, OPT);
878b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf(", SEQ=%ld", m.conn_ind.SEQ_number);
87938ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
88038ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
88138ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_CONN_CON
88238ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_CONN_CON:	/* connect corfirm    */
883b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_CONN_CON, conn_con);
884b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(conn_con, RES);
885b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(conn_con, OPT);
88638ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
88738ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
88838ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_DISCON_IND
88938ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_DISCON_IND:	/* discon indication  */
890b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_DISCON_IND, discon_ind);
891b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
892b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("DISCON=%ld, SEQ=%ld",
89338ae88d332acd9f86a30d58158e306d795d98977John Hughes			 m.discon_ind.DISCON_reason, m.discon_ind.SEQ_number);
89438ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
89538ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
89638ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_DATA_IND
89738ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_DATA_IND:	/* data indication    */
898b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_DATA_IND, data_ind);
899b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
900b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("MORE=%ld", m.data_ind.MORE_flag);
90138ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
90238ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
90338ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_EXDATA_IND
90438ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_EXDATA_IND:	/* expedited data ind */
905b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_EXDATA_IND, exdata_ind);
906b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
907b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("MORE=%ld", m.exdata_ind.MORE_flag);
90838ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
90938ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
91038ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_INFO_ACK
91138ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_INFO_ACK:	/* info ack           */
912b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_INFO_ACK, info_ack);
913b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
914b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("TSDU=%ld, ETSDU=%ld, CDATA=%ld, DDATA=%ld, "
91538ae88d332acd9f86a30d58158e306d795d98977John Hughes			 "ADDR=%ld, OPT=%ld, TIDU=%ld, SERV=",
91638ae88d332acd9f86a30d58158e306d795d98977John Hughes			 m.info_ack.TSDU_size, m.info_ack.ETSDU_size,
91738ae88d332acd9f86a30d58158e306d795d98977John Hughes			 m.info_ack.CDATA_size, m.info_ack.DDATA_size,
91838ae88d332acd9f86a30d58158e306d795d98977John Hughes			 m.info_ack.ADDR_size, m.info_ack.OPT_size,
91938ae88d332acd9f86a30d58158e306d795d98977John Hughes			 m.info_ack.TIDU_size);
920b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printxval(service_type, m.info_ack.SERV_type, "T_???");
921b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf(", CURRENT=");
922b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printxval(ts_state, m.info_ack.CURRENT_state, "TS_???");
923b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf(", PROVIDER=");
924b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printflags(provider_flags, m.info_ack.PROVIDER_flag, "???");
92538ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
92638ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
92738ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_BIND_ACK
92838ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_BIND_ACK:	/* bind ack           */
929b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_BIND_ACK, bind_ack);
930b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(bind_ack, ADDR);
931b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf(", CONIND=%ld", m.bind_ack.CONIND_number);
93238ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
93338ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
93438ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_ERROR_ACK
93538ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_ERROR_ACK:	/* error ack          */
936b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_ERROR_ACK, error_ack);
937b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
938b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("ERROR=");
939b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printxval(transport_user_options,
94038ae88d332acd9f86a30d58158e306d795d98977John Hughes			   m.error_ack.ERROR_prim, "TI_???");
941b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf(", TLI=");
942b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printxval(tli_errors, m.error_ack.TLI_error, "T???");
943b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("UNIX=%s", strerror(m.error_ack.UNIX_error));
94438ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
94538ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
94638ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_OK_ACK
94738ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_OK_ACK:	/* ok ack             */
948b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_OK_ACK, ok_ack);
949b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
950b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("CORRECT=");
951b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printxval(transport_user_options,
95238ae88d332acd9f86a30d58158e306d795d98977John Hughes			   m.ok_ack.CORRECT_prim, "TI_???");
95338ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
95438ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
95538ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_UNITDATA_IND
95638ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_UNITDATA_IND:	/* unitdata ind       */
957b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_UNITDATA_IND, unitdata_ind);
958b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(unitdata_ind, SRC);
959b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(unitdata_ind, OPT);
96038ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
96138ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
96238ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_UDERROR_IND
96338ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_UDERROR_IND:	/* unitdata error ind */
964b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_UDERROR_IND, uderror_ind);
965b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(uderror_ind, DEST);
966b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(uderror_ind, OPT);
967b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf(", ERROR=%ld", m.uderror_ind.ERROR_type);
96838ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
96938ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
97038ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_OPTMGMT_ACK
97138ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_OPTMGMT_ACK:	/* manage opt ack     */
972b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_OPTMGMT_ACK, optmgmt_ack);
973b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		COMMA();
974b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		tprintf("MGMT=");
975b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		printflags(transport_user_flags, m.optmgmt_ack.MGMT_flags,
976b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			    "T_???");
977b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		STRUCT(optmgmt_ack, OPT, print_optmgmt);
97838ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
97938ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
98038ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_ORDREL_IND
98138ae88d332acd9f86a30d58158e306d795d98977John Hughes	case T_ORDREL_IND:	/* orderly rel ind    */
982b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_ORDREL_IND, ordrel_ind);
98338ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
98438ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
98538ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_ADDR_REQ
98638ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_ADDR_REQ:	/* address req        */
987b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_ADDR_REQ, addr_req);
98838ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
98938ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
99038ae88d332acd9f86a30d58158e306d795d98977John Hughes#ifdef T_ADDR_ACK
99138ae88d332acd9f86a30d58158e306d795d98977John Hughes	    case T_ADDR_ACK:	/* address response   */
992b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		GET(T_ADDR_ACK, addr_ack);
993b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(addr_ack, LOCADDR);
994b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko		ADDR(addr_ack, REMADDR);
99538ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
99638ae88d332acd9f86a30d58158e306d795d98977John Hughes#endif
99738ae88d332acd9f86a30d58158e306d795d98977John Hughes	    default:
99838ae88d332acd9f86a30d58158e306d795d98977John Hughes	    dump:
99938ae88d332acd9f86a30d58158e306d795d98977John Hughes		c = -1;
100038ae88d332acd9f86a30d58158e306d795d98977John Hughes		printstr(tcp, addr, len);
100138ae88d332acd9f86a30d58158e306d795d98977John Hughes		break;
100238ae88d332acd9f86a30d58158e306d795d98977John Hughes	}
100338ae88d332acd9f86a30d58158e306d795d98977John Hughes
1004b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko	if (c >= 0) tprintf("}");
100538ae88d332acd9f86a30d58158e306d795d98977John Hughes
100638ae88d332acd9f86a30d58158e306d795d98977John Hughes#undef ADDR
100738ae88d332acd9f86a30d58158e306d795d98977John Hughes#undef COMMA
100838ae88d332acd9f86a30d58158e306d795d98977John Hughes#undef STRUCT
100934e014ac7502357e599935c62c18cba564c451beRoland McGrath
101038ae88d332acd9f86a30d58158e306d795d98977John Hughes	return 0;
101138ae88d332acd9f86a30d58158e306d795d98977John Hughes}
101238ae88d332acd9f86a30d58158e306d795d98977John Hughes
101338ae88d332acd9f86a30d58158e306d795d98977John Hughes
101476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* TI_BIND */
101576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
101638ae88d332acd9f86a30d58158e306d795d98977John Hughes
1017e5e60858063f214fcd7860f50f8bcb46f951f9abDmitry V. Levinstatic int internal_stream_ioctl(struct tcb *tcp, int arg)
101876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
101976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct strioctl si;
10201c04b0b000a93eef43fb2633a082d3f18da69f47Roland McGrath	struct ioctlent *iop;
102176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int in_and_out;
102238ae88d332acd9f86a30d58158e306d795d98977John Hughes	int timod = 0;
102376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef SI_GETUDATA
102476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct si_udata udata;
102576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* SI_GETUDATA */
102676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
102776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (!arg)
102876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 0;
102976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (umove(tcp, arg, &si) < 0) {
103076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (entering(tcp))
103176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", {...}");
103276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
103376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
103476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
10352843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath		iop = ioctl_lookup(si.ic_cmd);
10362843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath		if (iop) {
10372843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath			tprintf(", {ic_cmd=%s", iop->symbol);
10382843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath			while ((iop = ioctl_next_match(iop)))
10392843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath				tprintf(" or %s", iop->symbol);
10402843a4e1d2fca851be6e47e7ff2413b45903ac9aRoland McGrath		} else
104176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", {ic_cmd=%#x", si.ic_cmd);
104276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (si.ic_timout == INFTIM)
104376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", ic_timout=INFTIM, ");
104476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
104576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(" ic_timout=%d, ", si.ic_timout);
104676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
104776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	in_and_out = 1;
104876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	switch (si.ic_cmd) {
104976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef SI_GETUDATA
105076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case SI_GETUDATA:
105176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		in_and_out = 0;
105276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
105376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* SI_GETUDATA */
105476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
105576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (in_and_out) {
105676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (entering(tcp))
105776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("/* in */ ");
105876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else
105976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", /* out */ ");
106076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
106176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (in_and_out || entering(tcp))
106276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("ic_len=%d, ic_dp=", si.ic_len);
106376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	switch (si.ic_cmd) {
106476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef TI_BIND
106576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case TI_BIND:
106676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* in T_BIND_REQ, out T_BIND_ACK */
106738ae88d332acd9f86a30d58158e306d795d98977John Hughes		++timod;
106876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (entering(tcp)) {
1069b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print_transport_message(tcp,
107038ae88d332acd9f86a30d58158e306d795d98977John Hughes						 T_BIND_REQ,
107138ae88d332acd9f86a30d58158e306d795d98977John Hughes						 si.ic_dp, si.ic_len);
107276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
107376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
1074b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print_transport_message(tcp,
107538ae88d332acd9f86a30d58158e306d795d98977John Hughes						 T_BIND_ACK,
107638ae88d332acd9f86a30d58158e306d795d98977John Hughes						 si.ic_dp, si.ic_len);
107776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
107876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
107976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* TI_BIND */
108076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef TI_UNBIND
108176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case TI_UNBIND:
108276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* in T_UNBIND_REQ, out T_OK_ACK */
108338ae88d332acd9f86a30d58158e306d795d98977John Hughes		++timod;
108438ae88d332acd9f86a30d58158e306d795d98977John Hughes		if (entering(tcp)) {
1085b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print_transport_message(tcp,
108638ae88d332acd9f86a30d58158e306d795d98977John Hughes						 T_UNBIND_REQ,
108738ae88d332acd9f86a30d58158e306d795d98977John Hughes						 si.ic_dp, si.ic_len);
108838ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
108938ae88d332acd9f86a30d58158e306d795d98977John Hughes		else {
1090b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print_transport_message(tcp,
109138ae88d332acd9f86a30d58158e306d795d98977John Hughes						 T_OK_ACK,
109238ae88d332acd9f86a30d58158e306d795d98977John Hughes						 si.ic_dp, si.ic_len);
109338ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
109476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
109576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* TI_UNBIND */
109676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef TI_GETINFO
109776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case TI_GETINFO:
109876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* in T_INFO_REQ, out T_INFO_ACK */
109938ae88d332acd9f86a30d58158e306d795d98977John Hughes		++timod;
110038ae88d332acd9f86a30d58158e306d795d98977John Hughes		if (entering(tcp)) {
1101b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print_transport_message(tcp,
110238ae88d332acd9f86a30d58158e306d795d98977John Hughes						 T_INFO_REQ,
110338ae88d332acd9f86a30d58158e306d795d98977John Hughes						 si.ic_dp, si.ic_len);
110438ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
110538ae88d332acd9f86a30d58158e306d795d98977John Hughes		else {
1106b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print_transport_message(tcp,
110738ae88d332acd9f86a30d58158e306d795d98977John Hughes						 T_INFO_ACK,
110838ae88d332acd9f86a30d58158e306d795d98977John Hughes						 si.ic_dp, si.ic_len);
110938ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
111076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
111176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* TI_GETINFO */
111276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef TI_OPTMGMT
111376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case TI_OPTMGMT:
111476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* in T_OPTMGMT_REQ, out T_OPTMGMT_ACK */
111538ae88d332acd9f86a30d58158e306d795d98977John Hughes		++timod;
111638ae88d332acd9f86a30d58158e306d795d98977John Hughes		if (entering(tcp)) {
1117b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print_transport_message(tcp,
111838ae88d332acd9f86a30d58158e306d795d98977John Hughes						 T_OPTMGMT_REQ,
111938ae88d332acd9f86a30d58158e306d795d98977John Hughes						 si.ic_dp, si.ic_len);
112038ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
112138ae88d332acd9f86a30d58158e306d795d98977John Hughes		else {
1122b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			print_transport_message(tcp,
112338ae88d332acd9f86a30d58158e306d795d98977John Hughes						 T_OPTMGMT_ACK,
112438ae88d332acd9f86a30d58158e306d795d98977John Hughes						 si.ic_dp, si.ic_len);
112538ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
112676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
112776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* TI_OPTMGMT */
112876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef SI_GETUDATA
112976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case SI_GETUDATA:
113076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (entering(tcp))
113176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
113276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, (int) si.ic_dp, &udata) < 0)
113376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("{...}");
113476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
113576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("{tidusize=%d, addrsize=%d, ",
113676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				udata.tidusize, udata.addrsize);
113776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("optsize=%d, etsdusize=%d, ",
113876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				udata.optsize, udata.etsdusize);
113976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("servtype=%d, so_state=%d, ",
114076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				udata.servtype, udata.so_state);
114176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("so_options=%d", udata.so_options);
114276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("}");
114376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
114476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
114576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* SI_GETUDATA */
114676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	default:
114710a88d09ebe283d0dd2ba5deccfe50dc20ea5821Michal Ludvig		printstr(tcp, (long) si.ic_dp, si.ic_len);
114876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		break;
114976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
115038ae88d332acd9f86a30d58158e306d795d98977John Hughes	if (exiting(tcp)) {
115176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("}");
115221a75347451b5178a0eb85a48042b8db0e45b318Dmitry V. Levin		if (timod && tcp->u_rval && !syserror(tcp)) {
1153b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			tcp->auxstr = xlookup(tli_errors, tcp->u_rval);
115438ae88d332acd9f86a30d58158e306d795d98977John Hughes			return RVAL_STR + 1;
115538ae88d332acd9f86a30d58158e306d795d98977John Hughes		}
115638ae88d332acd9f86a30d58158e306d795d98977John Hughes	}
115734e014ac7502357e599935c62c18cba564c451beRoland McGrath
115876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 1;
115976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
116076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
116176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
11621201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkostream_ioctl(struct tcb *tcp, int code, int arg)
116376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
116476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_LIST
116576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i;
116676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
116776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int val;
116876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_FLUSHBAND
116976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct bandinfo bi;
117076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
117176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct strpeek sp;
117276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct strfdinsert sfi;
117376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct strrecvfd srf;
117476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_LIST
117576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct str_list sl;
117676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
117776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
117876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	/* I_STR is a special case because the data is read & written. */
117976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (code == I_STR)
118076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return internal_stream_ioctl(tcp, arg);
118176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp))
118276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 0;
118376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
118476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	switch (code) {
118576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_PUSH:
118676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_LOOK:
118776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_FIND:
118876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* arg is a string */
118976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", ");
119076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printpath(tcp, arg);
119176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
119276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_POP:
119376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* doesn't take an argument */
119476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
119576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_FLUSH:
119676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is an option */
119776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", ");
119876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printxval(stream_flush_options, arg, "FLUSH???");
119976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
120076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_FLUSHBAND
120176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_FLUSHBAND:
120276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a pointer to a bandinfo struct */
120376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, arg, &bi) < 0)
120476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", {...}");
120576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
120676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", {bi_pri=%d, bi_flag=", bi.bi_pri);
1207b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(stream_flush_options, bi.bi_flag, "FLUSH???");
120876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("}");
120976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
121076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
121176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* I_FLUSHBAND */
121276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_SETSIG:
121376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a set of flags */
121476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", ");
1215b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(stream_setsig_flags, arg, "S_???");
121676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
121776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_GETSIG:
121876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a pointer to a set of flags */
121976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
122076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
122176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", [");
122276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, arg, &val) < 0)
122376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("?");
1224b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		else
1225b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(stream_setsig_flags, val, "S_???");
122676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("]");
122776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
122876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_PEEK:
122976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a pointer to a strpeek structure */
123076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp) || !arg)
123176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
123276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, arg, &sp) < 0) {
123376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", {...}");
123476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 1;
123576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
123676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", {ctlbuf=");
123776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstrbuf(tcp, &sp.ctlbuf, 1);
123876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", databuf=");
123976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstrbuf(tcp, &sp.databuf, 1);
1240fd15cb31adf1c38c2b5524253a50e5646c7b08ceJohn Hughes		tprintf(", flags=");
1241b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msgflags, sp.flags, "RS_???");
1242fd15cb31adf1c38c2b5524253a50e5646c7b08ceJohn Hughes		tprintf("}");
124376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
124476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_SRDOPT:
124576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is an option with flags */
124676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", ");
124776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printxval(stream_read_options, arg & RMODEMASK, "R???");
124876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		addflags(stream_read_flags, arg & ~RMODEMASK);
124976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
125076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_GRDOPT:
125176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is an pointer to an option with flags */
125276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
125376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
125476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", [");
125576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, arg, &val) < 0)
125676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("?");
125776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
125876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printxval(stream_read_options,
125976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				  arg & RMODEMASK, "R???");
126076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			addflags(stream_read_flags, arg & ~RMODEMASK);
126176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
126276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("]");
126376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
126476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_NREAD:
126576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_GETBAND
126676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_GETBAND:
126776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
126876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_SETCLTIME
126976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_SETCLTIME:
127076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
127176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_GETCLTIME
127276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_GETCLTIME:
127376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
127476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a pointer to a decimal integer */
127576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
127676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
127776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", ");
127876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printnum(tcp, arg, "%d");
127976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
128076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_FDINSERT:
128176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a pointer to a strfdinsert structure */
128276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp) || !arg)
128376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
128476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, arg, &sfi) < 0) {
128576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", {...}");
128676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 1;
128776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
128876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", {ctlbuf=");
128976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstrbuf(tcp, &sfi.ctlbuf, 1);
129076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", databuf=");
129176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstrbuf(tcp, &sfi.databuf, 1);
1292fd15cb31adf1c38c2b5524253a50e5646c7b08ceJohn Hughes		tprintf(", flags=");
1293b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msgflags, sfi.flags, "RS_???");
129476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", filedes=%d, offset=%d}", sfi.fildes, sfi.offset);
129576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
129676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_SWROPT
129776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_SWROPT:
129876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a set of flags */
129976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", ");
1300b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(stream_write_flags, arg, "SND???");
130176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
130276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* I_SWROPT */
130376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_GWROPT
130476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_GWROPT:
130576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is an pointer to an option with flags */
130676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
130776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
130876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", [");
130976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, arg, &val) < 0)
131076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("?");
1311b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		else
1312b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(stream_write_flags, arg, "SND???");
131376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("]");
131476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
131576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* I_GWROPT */
131676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_SENDFD:
131776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_CKBAND
131876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_CKBAND:
131976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
132076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_CANPUT
132176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_CANPUT:
132276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif
132376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_LINK:
132476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_UNLINK:
132576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_PLINK:
132676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_PUNLINK:
132776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a decimal integer */
132876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", %d", arg);
132976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
133076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_RECVFD:
133176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* argument is a pointer to a strrecvfd structure */
133276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp) || !arg)
133376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
133476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, arg, &srf) < 0) {
133576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", {...}");
133676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 1;
133776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
133876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", {fd=%d, uid=%lu, gid=%lu}", srf.fd,
133976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			(unsigned long) srf.uid, (unsigned long) srf.gid);
134076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
134176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_LIST
134276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_LIST:
134376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp))
134476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
134576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (arg == 0) {
134676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", NULL");
134776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 1;
134876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
134976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (umove(tcp, arg, &sl) < 0) {
135076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf(", {...}");
135176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 1;
135276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
135376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", {sl_nmods=%d, sl_modlist=[", sl.sl_nmods);
135476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 0; i < tcp->u_rval; i++) {
135576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			if (i)
135676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tprintf(", ");
135776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printpath(tcp, (int) sl.sl_modlist[i].l_name);
135876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
135976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("]}");
136076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
136176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* I_LIST */
136276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#ifdef I_ATMARK
136376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	case I_ATMARK:
136476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf(", ");
136576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printxval(stream_atmark_options, arg, "???MARK");
136676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 1;
136776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#endif /* I_ATMARK */
136876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	default:
136976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		return 0;
137076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
137176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
137276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
1373561c7995d7524afbf92689593b9ba5f9615d0982Roland McGrath#endif /* !LINUX && !FREEBSD */
137476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
1375561c7995d7524afbf92689593b9ba5f9615d0982Roland McGrath#endif /* HAVE_SYS_STREAM_H || LINUX || FREEBSD */
1376