stream.c revision 7e69ed98cdd3c8ee0bba783927bc95b895c60160
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
8976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
901201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_putmsg(struct tcb *tcp)
9176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
9276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i;
9376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
9476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
9576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
9676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[0]);
9776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
9876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
9976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 0);
10076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
101b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(msgflags, tcp->u_arg[3], "RS_???");
10276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
10376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
10476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
10576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
10676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1071201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_getmsg(struct tcb *tcp)
10876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
10976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i, flags;
11076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
11176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
11276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
11376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%lu, ", tcp->u_arg[0]);
11476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
11576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
11676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx, %#lx, %#lx",
11776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]);
11876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
11976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
12076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
12176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
12276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 1);
12376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to flags */
12476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (tcp->u_arg[3] == 0)
12560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("NULL");
12676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else if (umove(tcp, tcp->u_arg[3], &flags) < 0)
12760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[?]");
12876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
12960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[");
130b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(msgflags, flags, "RS_???");
13160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("]");
13276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
13376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* decode return value */
13476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		switch (tcp->u_rval) {
13576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL:
13676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
13776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
13876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL|MOREDATA:
13976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL|MOREDATA";
14076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
14176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MOREDATA:
14276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
14376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
14476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		default:
14576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = NULL;
14676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
14776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
14876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
14976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return RVAL_HEX | RVAL_STR;
15076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
15176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
152cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# if defined SYS_putpmsg || defined SYS_getpmsg
1530ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/pmsgflags.h"
154cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  ifdef SYS_putpmsg
15576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1561201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_putpmsg(struct tcb *tcp)
15776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
15876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i;
15976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
16076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
16176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
16276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[0]);
16376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
16476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
16576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 0);
16676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* band */
16776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%ld, ", tcp->u_arg[3]);
16876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* flags */
169b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath		printflags(pmsgflags, tcp->u_arg[4], "MSG_???");
17076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
17176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return 0;
17276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
173cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  endif
174cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  ifdef SYS_getpmsg
17576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint
1761201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_getpmsg(struct tcb *tcp)
17776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
17876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	int i, flags;
17976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
18076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	if (entering(tcp)) {
18176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* fd */
18276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		tprintf("%lu, ", tcp->u_arg[0]);
18376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	} else {
18476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (syserror(tcp)) {
18576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tprintf("%#lx, %#lx, %#lx, %#lx", tcp->u_arg[1],
18676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman				tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[4]);
18776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			return 0;
18876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
18976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* control and data */
19076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		for (i = 1; i < 3; i++)
19176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			printstrbufarg(tcp, tcp->u_arg[i], 1);
19276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to band */
193f55cca729fe462de76c9dffbd859c951a79e6c9dDmitry V. Levin		printnum_int(tcp, tcp->u_arg[3], "%d");
19460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
19576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* pointer to flags */
19676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		if (tcp->u_arg[4] == 0)
19760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("NULL");
19876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else if (umove(tcp, tcp->u_arg[4], &flags) < 0)
19960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[?]");
20076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		else {
20160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("[");
202b2dee13345a62c80a677f3342cd525d611fbc632Roland McGrath			printflags(pmsgflags, flags, "MSG_???");
20360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("]");
20476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
20576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		/* decode return value */
20676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		switch (tcp->u_rval) {
20776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL:
20876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
20976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
21076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MORECTL|MOREDATA:
21176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL|MOREDATA";
21276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
21376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		case MOREDATA:
21476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = "MORECTL";
21576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
21676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		default:
21776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			tcp->auxstr = NULL;
21876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman			break;
21976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
22076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	}
22176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman	return RVAL_HEX | RVAL_STR;
22276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
223cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#  endif
224cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# endif /* getpmsg/putpmsg */
225cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko
226cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko#endif /* STREAMS syscalls support */
227cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko
22876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
229faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#ifdef HAVE_SYS_POLL_H
230faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman
2310ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/pollflags.h"
23276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
23395ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinstatic int
234f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrathdecode_poll(struct tcb *tcp, long pts)
23576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{
236aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	struct pollfd fds;
237aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	unsigned nfds;
238aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	unsigned long size, start, cur, end, abbrev_end;
239aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	int failed = 0;
24076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
241f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
242f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		nfds = tcp->u_arg[1];
243f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		size = sizeof(fds) * nfds;
244f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		start = tcp->u_arg[0];
245f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		end = start + size;
246f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (nfds == 0 || size / sizeof(fds) != nfds || end < start) {
247f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tprintf("%#lx, %d, ",
248f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tcp->u_arg[0], nfds);
249f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
250f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
251f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (abbrev(tcp)) {
252f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = start + max_strlen * sizeof(fds);
253f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (abbrev_end < start)
254f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				abbrev_end = end;
255f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		} else {
256aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath			abbrev_end = end;
257f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
25860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("[");
259f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		for (cur = start; cur < end; cur += sizeof(fds)) {
260f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur > start)
26160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints(", ");
262f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur >= abbrev_end) {
26360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("...");
264f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
265f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
2667e69ed98cdd3c8ee0bba783927bc95b895c60160Denys Vlasenko			if (umoven(tcp, cur, sizeof fds, &fds) < 0) {
26760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("?");
268f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				failed = 1;
269f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
270f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
271f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (fds.fd < 0) {
272f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				tprintf("{fd=%d}", fds.fd);
273f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				continue;
274f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
27560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("{fd=");
2763138213bc9a827a372ad9f8009ebcc5d8797ce2dDmitry V. Levin			printfd(tcp, fds.fd);
27760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints(", events=");
278f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			printflags(pollflags, fds.events, "POLL???");
27960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("}");
280f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		}
28160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("]");
282f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (failed)
283f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tprintf(" %#lx", start);
284f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		tprintf(", %d, ", nfds);
285f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		return 0;
286aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	} else {
287f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		static char outstr[1024];
2882fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		char *outptr;
2892fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko#define end_outstr (outstr + sizeof(outstr))
290adedb510197209e7077310f9e9f67e3d51fb8617Denys Vlasenko		const char *flagstr;
291f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
292f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (syserror(tcp))
293f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
294f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (tcp->u_rval == 0) {
295f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			tcp->auxstr = "Timeout";
296f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return RVAL_STR;
29776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
298f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
299f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		nfds = tcp->u_arg[1];
300f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		size = sizeof(fds) * nfds;
301f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		start = tcp->u_arg[0];
302f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		end = start + size;
303f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (nfds == 0 || size / sizeof(fds) != nfds || end < start)
304f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
305f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (abbrev(tcp)) {
306f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = start + max_strlen * sizeof(fds);
307f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (abbrev_end < start)
308f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				abbrev_end = end;
309f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		} else {
310f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			abbrev_end = end;
31176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
312f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
3132fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		outptr = outstr;
314f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
315f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		for (cur = start; cur < end; cur += sizeof(fds)) {
3167e69ed98cdd3c8ee0bba783927bc95b895c60160Denys Vlasenko			if (umoven(tcp, cur, sizeof fds, &fds) < 0) {
3172fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				if (outptr < end_outstr - 2)
3182fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko					*outptr++ = '?';
319f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				failed = 1;
320f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
321f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
322f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (!fds.revents)
323f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				continue;
3242fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			if (outptr == outstr) {
3252fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				*outptr++ = '[';
326f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			} else {
3272fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				if (outptr < end_outstr - 3)
3282fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko					outptr = stpcpy(outptr, ", ");
329f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
330f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			if (cur >= abbrev_end) {
3312fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				if (outptr < end_outstr - 4)
3322fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko					outptr = stpcpy(outptr, "...");
333f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath				break;
334f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
3352fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			if (outptr < end_outstr - (sizeof("{fd=%d, revents=") + sizeof(int)*3) + 1)
3362fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				outptr += sprintf(outptr, "{fd=%d, revents=", fds.fd);
337b63256e69bf3f1a74aadb0e14556490bc8f4ef95Denys Vlasenko			flagstr = sprintflags("", pollflags, fds.revents);
3382fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			if (outptr < end_outstr - (strlen(flagstr) + 2)) {
3392fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				outptr = stpcpy(outptr, flagstr);
3402fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				*outptr++ = '}';
341f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			}
34276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
343f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (failed)
344f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
345f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
3462fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		if (outptr != outstr /* && outptr < end_outstr - 1 (always true)*/)
3472fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			*outptr++ = ']';
348f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
3492fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		*outptr = '\0';
350f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		if (pts) {
351a1d541ec56e2fb4716f083fcc814b1dedde63d87Denys Vlasenko			if (outptr < end_outstr - (10 + TIMESPEC_TEXT_BUFSIZE)) {
3522fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				outptr = stpcpy(outptr, outptr == outstr ? "left " : ", left ");
3532fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko				sprint_timespec(outptr, tcp, pts);
3542fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko			}
35576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman		}
356f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
3572fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko		if (outptr == outstr)
358f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath			return 0;
359f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath
360f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		tcp->auxstr = outstr;
361f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath		return RVAL_STR;
3622fb4db3e7aa1d6ac6b4b43f47597197492a846ddDenys Vlasenko#undef end_outstr
363aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath	}
36495ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin}
36595ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin
36695ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinint
36795ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinsys_poll(struct tcb *tcp)
36895ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin{
369f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	int rc = decode_poll(tcp, 0);
370f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
371cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# ifdef INFTIM
37295ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		if (tcp->u_arg[2] == INFTIM)
37360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("INFTIM");
37495ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		else
375cc90291f4b4e6b042e977e2e58fb002a61189abeDenys Vlasenko# endif
37695ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin			tprintf("%ld", tcp->u_arg[2]);
37795ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	}
37895ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	return rc;
37976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman}
38076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman
38195ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinint
38295ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levinsys_ppoll(struct tcb *tcp)
38395ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin{
384f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	int rc = decode_poll(tcp, tcp->u_arg[2]);
385f17106ee78b1c60ef3cdab3ca474bc11f1fe6923Roland McGrath	if (entering(tcp)) {
3866bc09daaf6b249b35dec4283b165b1f39e6d6a0dRoland McGrath		print_timespec(tcp, tcp->u_arg[2]);
38760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
3885e133aa68498626afdbdcf29e22300257a21bf57Denys Vlasenko		/* NB: kernel requires arg[4] == NSIG / 8 */
3895e133aa68498626afdbdcf29e22300257a21bf57Denys Vlasenko		print_sigset_addr_len(tcp, tcp->u_arg[3], tcp->u_arg[4]);
39095ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin		tprintf(", %lu", tcp->u_arg[4]);
39195ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	}
39295ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin	return rc;
39395ebf5abfc1f3ed8b451b7816aa51b93a49e3ef7Dmitry V. Levin}
394aa524c88c49814863cb7f19e5c8a8eeca6ce22feRoland McGrath
395faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#else /* !HAVE_SYS_POLL_H */
396faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkermanint
3971201426dd43f5b4e12dfe520e2a9c5027d33dc11Denys Vlasenkosys_poll(struct tcb *tcp)
398faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman{
3995ae2b7c601dadf79a4345e1ee21053947b9e4addDenys Vlasenko	return 0;
400faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman}
401faf722234dc8af97776f94fdda7e100fb60650a2Wichert Akkerman#endif
402