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
2976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "defs.h"
30d64a7e4755abe2d073676741f38328aa0b83db9fDmitry V. Levin#if defined HAVE_POLL_H
31a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <poll.h>
32d64a7e4755abe2d073676741f38328aa0b83db9fDmitry V. Levin#elif defined HAVE_SYS_POLL_H
33a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <sys/poll.h>
34245a6ac0e71d7ecdbb776b12b735de58cf5a055bPavel Machek#endif
3542080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#ifdef HAVE_SYS_CONF_H
36a6d91ded3f2d5401e09a9c2fa442aabfbfe593a8Denys Vlasenko# include <sys/conf.h>
3742080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman#endif
3842080d852e2dc0ef3eb507ef561e91cc97cff515Wichert Akkerman
39cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko/* Who has STREAMS syscalls?
40cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko * Linux hasn't. Solaris has (had?).
41cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko * Just in case I miss something, retain in for Sparc...
42cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko */
43cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#if defined(SPARC) || defined(SPARC64)
44cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko
45cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# ifdef HAVE_STROPTS_H
46cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  include <stropts.h>
47cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# else
48cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  define RS_HIPRI 1
4976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanstruct strbuf {
50adedb510197209e7077310f9e9f67e3d51fb8617Denys Vlasenko	int     maxlen;                 /* no. of bytes in buffer */
51adedb510197209e7077310f9e9f67e3d51fb8617Denys Vlasenko	int     len;                    /* no. of bytes returned */
5230145dda9d7ff70df1d5ad750a183572c73e8963Dmitry V. Levin	const char *buf;                /* pointer to data */
5376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman};
54cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  define MORECTL 1
55cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  define MOREDATA 2
56cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# endif
5776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
580ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/msgflags.h"
5976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
6076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanstatic void
611201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkoprintstrbuf(struct tcb *tcp, struct strbuf *sbp, int getting)
6276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
6376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (sbp->maxlen == -1 && getting)
6460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("{maxlen=-1}");
6576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	else {
6660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("{");
6776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (getting)
6876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("maxlen=%d, ", sbp->maxlen);
6976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("len=%d, buf=", sbp->len);
702e2553a534f532a1546ea2b2f3dc3cd2276d020dWichert Akkerman		printstr(tcp, (unsigned long) sbp->buf, sbp->len);
7160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("}");
7276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
7376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
7476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
7576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanstatic void
76e7db46503d07b306056ec70a4290b022e473734bDenys Vlasenkoprintstrbufarg(struct tcb *tcp, long arg, int getting)
7776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
7876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	struct strbuf buf;
7976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
8076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (arg == 0)
8160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("NULL");
8276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	else if (umove(tcp, arg, &buf) < 0)
8360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("{...}");
8476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	else
8576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		printstrbuf(tcp, &buf, getting);
8660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints(", ");
8776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
8876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
89a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(putmsg)
9076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
9176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i;
9276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
9376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
9476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
9576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[0]);
9676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
9776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
9876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 0);
9976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
100b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msgflags, tcp->u_arg[3], "RS_???");
10176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
10276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
10376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
10476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
105a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(getmsg)
10676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
10776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i, flags;
10876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
10976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
11076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
11176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%lu, ", tcp->u_arg[0]);
11276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
11376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
11476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx, %#lx, %#lx",
11576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
11676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
11776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
11876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
11976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
12076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 1);
12176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to flags */
12276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (tcp->u_arg[3] == 0)
12360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("NULL");
12476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else if (umove(tcp, tcp->u_arg[3], &flags) < 0)
12560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[?]");
12676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
12760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[");
128b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(msgflags, flags, "RS_???");
12960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("]");
13076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
13176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* decode return value */
13276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		switch (tcp->u_rval) {
13376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL:
13476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
13576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
13676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL|MOREDATA:
13776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL|MOREDATA";
13876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
13976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MOREDATA:
14076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
14176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
14276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		default:
14376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = NULL;
14476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
14576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
14676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
14776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return RVAL_HEX | RVAL_STR;
14876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
14976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
150cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# if defined SYS_putpmsg || defined SYS_getpmsg
1510ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/pmsgflags.h"
152cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  ifdef SYS_putpmsg
153a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(putpmsg)
15476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
15576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i;
15676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
15776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
15876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
15976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[0]);
16076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
16176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
16276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 0);
16376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* band */
16476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[3]);
16576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
166b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(pmsgflags, tcp->u_arg[4], "MSG_???");
16776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
16876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
16976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
170cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  endif
171cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  ifdef SYS_getpmsg
172a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(getpmsg)
17376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
17476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i, flags;
17576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
17676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
17776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
17876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%lu, ", tcp->u_arg[0]);
17976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
18076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
18176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx, %#lx, %#lx, %#lx", tcp->u_arg[1],
18276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[4]);
18376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
18476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
18576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
18676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
18776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 1);
18876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to band */
189f55cca729fe462de76c9dffbd859c951a79e6c9dDmitry V. Levin		printnum_int(tcp, tcp->u_arg[3], "%d");
19060fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
19176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to flags */
19276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (tcp->u_arg[4] == 0)
19360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("NULL");
19476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else if (umove(tcp, tcp->u_arg[4], &flags) < 0)
19560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[?]");
19676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
19760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[");
198b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(pmsgflags, flags, "MSG_???");
19960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("]");
20076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
20176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* decode return value */
20276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		switch (tcp->u_rval) {
20376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL:
20476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
20576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
20676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL|MOREDATA:
20776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL|MOREDATA";
20876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
20976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MOREDATA:
21076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
21176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
21276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		default:
21376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = NULL;
21476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
21576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
21676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
21776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return RVAL_HEX | RVAL_STR;
21876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
219cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  endif
220cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# endif /* getpmsg/putpmsg */
221cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko
222cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#endif /* STREAMS syscalls support */
223cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko
22476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
225faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#ifdef HAVE_SYS_POLL_H
226faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman
2270ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/pollflags.h"
22876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
22995ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinstatic int
230f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrathdecode_poll(struct tcb *tcp, long pts)
23176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
232aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	struct pollfd fds;
233aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	unsigned nfds;
234aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	unsigned long size, start, cur, end, abbrev_end;
235aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	int failed = 0;
23676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
237f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
238f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		nfds = tcp->u_arg[1];
239f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		size = sizeof(fds) * nfds;
240f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		start = tcp->u_arg[0];
241f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		end = start + size;
242f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (nfds == 0 || size / sizeof(fds) != nfds || end < start) {
243f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tprintf("%#lx, %d, ",
244f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tcp->u_arg[0], nfds);
245f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
246f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
247f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (abbrev(tcp)) {
248f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = start + max_strlen * sizeof(fds);
249f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (abbrev_end < start)
250f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				abbrev_end = end;
251f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		} else {
252aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath			abbrev_end = end;
253f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
25460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("[");
255f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		for (cur = start; cur < end; cur += sizeof(fds)) {
256f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur > start)
25760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints(", ");
258f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur >= abbrev_end) {
25960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("...");
260f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
261f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
2627e69ed98cdd3c8ee0bba783927bc95b895c60160Denys Vlasenko			if (umoven(tcp, cur, sizeof fds, &fds) < 0) {
26360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("?");
264f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				failed = 1;
265f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
266f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
267f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (fds.fd < 0) {
268f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tprintf("{fd=%d}", fds.fd);
269f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				continue;
270f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
27160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("{fd=");
2723138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin			printfd(tcp, fds.fd);
27360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", events=");
274f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			printflags(pollflags, fds.events, "POLL???");
27560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("}");
276f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
27760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("]");
278f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (failed)
279f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tprintf(" %#lx", start);
280f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		tprintf(", %d, ", nfds);
281f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		return 0;
282aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	} else {
283f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		static char outstr[1024];
2842fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		char *outptr;
2852fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko#define end_outstr (outstr + sizeof(outstr))
286adedb510197209e7077310f9e9f67e3d51fb8617Denys Vlasenko		const char *flagstr;
287f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
288f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (syserror(tcp))
289f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
290f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (tcp->u_rval == 0) {
291f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tcp->auxstr = "Timeout";
292f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return RVAL_STR;
29376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
294f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
295f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		nfds = tcp->u_arg[1];
296f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		size = sizeof(fds) * nfds;
297f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		start = tcp->u_arg[0];
298f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		end = start + size;
299f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (nfds == 0 || size / sizeof(fds) != nfds || end < start)
300f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
301f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (abbrev(tcp)) {
302f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = start + max_strlen * sizeof(fds);
303f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (abbrev_end < start)
304f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				abbrev_end = end;
305f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		} else {
306f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = end;
30776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
308f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
3092fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		outptr = outstr;
310f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
311f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		for (cur = start; cur < end; cur += sizeof(fds)) {
3127e69ed98cdd3c8ee0bba783927bc95b895c60160Denys Vlasenko			if (umoven(tcp, cur, sizeof fds, &fds) < 0) {
3132fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				if (outptr < end_outstr - 2)
3142fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko					*outptr++ = '?';
315f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				failed = 1;
316f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
317f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
318f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (!fds.revents)
319f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				continue;
3202fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			if (outptr == outstr) {
3212fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				*outptr++ = '[';
322f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			} else {
3232fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				if (outptr < end_outstr - 3)
3242fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko					outptr = stpcpy(outptr, ", ");
325f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
326f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur >= abbrev_end) {
3272fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				if (outptr < end_outstr - 4)
3282fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko					outptr = stpcpy(outptr, "...");
329f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
330f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
3312fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			if (outptr < end_outstr - (sizeof("{fd=%d, revents=") + sizeof(int)*3) + 1)
3322fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				outptr += sprintf(outptr, "{fd=%d, revents=", fds.fd);
333b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			flagstr = sprintflags("", pollflags, fds.revents);
3342fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			if (outptr < end_outstr - (strlen(flagstr) + 2)) {
3352fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				outptr = stpcpy(outptr, flagstr);
3362fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				*outptr++ = '}';
337f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
33876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
339f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (failed)
340f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
341f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
3422fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		if (outptr != outstr /* && outptr < end_outstr - 1 (always true)*/)
3432fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			*outptr++ = ']';
344f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
3452fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		*outptr = '\0';
346f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (pts) {
347a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko			if (outptr < end_outstr - (10 + TIMESPEC_TEXT_BUFSIZE)) {
3482fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				outptr = stpcpy(outptr, outptr == outstr ? "left " : ", left ");
3492fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				sprint_timespec(outptr, tcp, pts);
3502fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			}
35176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
352f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
3532fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		if (outptr == outstr)
354f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
355f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
356f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		tcp->auxstr = outstr;
357f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		return RVAL_STR;
3582fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko#undef end_outstr
359aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	}
36095ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin}
36195ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin
362a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(poll)
36395ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin{
364f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	int rc = decode_poll(tcp, 0);
365f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
366cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# ifdef INFTIM
36795ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		if (tcp->u_arg[2] == INFTIM)
36860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("INFTIM");
36995ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		else
370cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# endif
37195ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin			tprintf("%ld", tcp->u_arg[2]);
37295ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	}
37395ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	return rc;
37476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
37576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
376a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(ppoll)
37795ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin{
378f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	int rc = decode_poll(tcp, tcp->u_arg[2]);
379f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
3806bc09daaf6b249b35dec4283b165b1f39e6d6a0dRoland McGrath		print_timespec(tcp, tcp->u_arg[2]);
38160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
3825e133aa68498626afdbdcf29e22300257a21bf57Denys Vlasenko		/* NB: kernel requires arg[4] == NSIG / 8 */
3835e133aa68498626afdbdcf29e22300257a21bf57Denys Vlasenko		print_sigset_addr_len(tcp, tcp->u_arg[3], tcp->u_arg[4]);
38495ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		tprintf(", %lu", tcp->u_arg[4]);
38595ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	}
38695ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	return rc;
38795ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin}
388aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath
389faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#else /* !HAVE_SYS_POLL_H */
390a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(poll)
391faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman{
3925ae2b7c601dadf79a4345e1ee21053947b9e4addDenys Vlasenko	return 0;
393faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman}
394faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#endif
395