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