diff options
author | Achim Gottinger <achim@gentoo.org> | 2000-11-15 16:49:06 +0000 |
---|---|---|
committer | Achim Gottinger <achim@gentoo.org> | 2000-11-15 16:49:06 +0000 |
commit | 0d8c7ca818e93f30e0fe2974f2d274f5f16df8b5 (patch) | |
tree | 687021db7c1f68da06efc95dda3965c683bd5307 /dev-util/strace | |
parent | binutils downgrade (diff) | |
download | gentoo-2-0d8c7ca818e93f30e0fe2974f2d274f5f16df8b5.tar.gz gentoo-2-0d8c7ca818e93f30e0fe2974f2d274f5f16df8b5.tar.bz2 gentoo-2-0d8c7ca818e93f30e0fe2974f2d274f5f16df8b5.zip |
*** empty log message ***
Diffstat (limited to 'dev-util/strace')
-rw-r--r-- | dev-util/strace/files/stream.c | 810 |
1 files changed, 810 insertions, 0 deletions
diff --git a/dev-util/strace/files/stream.c b/dev-util/strace/files/stream.c new file mode 100644 index 000000000000..dd9b63397984 --- /dev/null +++ b/dev-util/strace/files/stream.c @@ -0,0 +1,810 @@ +/* + * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com> + * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $Id: stream.c,v 1.1 2000/11/15 16:46:05 achim Exp $ + */ + +#include "defs.h" + +#if defined(HAVE_SYS_STREAM_H) || defined(linux) + +#if defined(linux) +#include <sys/poll.h> +#include <stropts.h> +#define MORECTL 1 +#define MOREDATA 2 + +#else /* linux */ + +#include <stropts.h> + +#include <poll.h> +#include <sys/conf.h> +#include <sys/stream.h> +#include <sys/tihdr.h> + +#endif /* linux */ + +#ifdef HAVE_SYS_TIUSER_H +#include <sys/tiuser.h> +#include <sys/sockmod.h> +#include <sys/timod.h> +#endif /* HAVE_SYS_TIUSER_H */ + +static struct xlat msgflags[] = { + { RS_HIPRI, "RS_HIPRI" }, + { 0, NULL }, +}; + + +static void +printstrbuf(tcp, sbp, getting) +struct tcb *tcp; +struct strbuf *sbp; +int getting; +{ + if (sbp->maxlen == -1 && getting) + tprintf("{maxlen=-1}"); + else { + tprintf("{"); + if (getting) + tprintf("maxlen=%d, ", sbp->maxlen); + tprintf("len=%d, buf=", sbp->len); + printstr(tcp, (unsigned long) sbp->buf, sbp->len); + tprintf("}"); + } +} + +static void +printstrbufarg(tcp, arg, getting) +struct tcb *tcp; +int arg; +int getting; +{ + struct strbuf buf; + + if (arg == 0) + tprintf("NULL"); + else if (umove(tcp, arg, &buf) < 0) + tprintf("{...}"); + else + printstrbuf(tcp, &buf, getting); + tprintf(", "); +} + +int +sys_putmsg(tcp) +struct tcb *tcp; +{ + int i; + + if (entering(tcp)) { + /* fd */ + tprintf("%ld, ", tcp->u_arg[0]); + /* control and data */ + for (i = 1; i < 3; i++) + printstrbufarg(tcp, tcp->u_arg[i], 0); + /* flags */ + if (!printflags(msgflags, tcp->u_arg[3])) + tprintf("0"); + } + return 0; +} + +int +sys_getmsg(tcp) +struct tcb *tcp; +{ + int i, flags; + + if (entering(tcp)) { + /* fd */ + tprintf("%lu, ", tcp->u_arg[0]); + } else { + if (syserror(tcp)) { + tprintf("%#lx, %#lx, %#lx", + tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3]); + return 0; + } + /* control and data */ + for (i = 1; i < 3; i++) + printstrbufarg(tcp, tcp->u_arg[i], 1); + /* pointer to flags */ + if (tcp->u_arg[3] == 0) + tprintf("NULL"); + else if (umove(tcp, tcp->u_arg[3], &flags) < 0) + tprintf("[?]"); + else { + tprintf("["); + if (!printflags(msgflags, flags)) + tprintf("0"); + tprintf("]"); + } + /* decode return value */ + switch (tcp->u_rval) { + case MORECTL: + tcp->auxstr = "MORECTL"; + break; + case MORECTL|MOREDATA: + tcp->auxstr = "MORECTL|MOREDATA"; + break; + case MOREDATA: + tcp->auxstr = "MORECTL"; + break; + default: + tcp->auxstr = NULL; + break; + } + } + return RVAL_HEX | RVAL_STR; +} + +#ifdef HAVE_PUTPMSG + +static struct xlat pmsgflags[] = { + { MSG_HIPRI, "MSG_HIPRI" }, + { MSG_ANY, "MSG_ANY" }, + { MSG_BAND, "MSG_BAND" }, + { 0, NULL }, +}; + +int +sys_putpmsg(tcp) +struct tcb *tcp; +{ + int i; + + if (entering(tcp)) { + /* fd */ + tprintf("%ld, ", tcp->u_arg[0]); + /* control and data */ + for (i = 1; i < 3; i++) + printstrbufarg(tcp, tcp->u_arg[i], 0); + /* band */ + tprintf("%ld, ", tcp->u_arg[3]); + /* flags */ + if (!printflags(pmsgflags, tcp->u_arg[4])) + tprintf("0"); + } + return 0; +} + +int +sys_getpmsg(tcp) +struct tcb *tcp; +{ + int i, flags; + + if (entering(tcp)) { + /* fd */ + tprintf("%lu, ", tcp->u_arg[0]); + } else { + if (syserror(tcp)) { + tprintf("%#lx, %#lx, %#lx, %#lx", tcp->u_arg[1], + tcp->u_arg[2], tcp->u_arg[3], tcp->u_arg[4]); + return 0; + } + /* control and data */ + for (i = 1; i < 3; i++) + printstrbufarg(tcp, tcp->u_arg[i], 1); + /* pointer to band */ + printnum(tcp, tcp->u_arg[3], "%d"); + tprintf(", "); + /* pointer to flags */ + if (tcp->u_arg[4] == 0) + tprintf("NULL"); + else if (umove(tcp, tcp->u_arg[4], &flags) < 0) + tprintf("[?]"); + else { + tprintf("["); + if (!printflags(pmsgflags, flags)) + tprintf("0"); + tprintf("]"); + } + /* decode return value */ + switch (tcp->u_rval) { + case MORECTL: + tcp->auxstr = "MORECTL"; + break; + case MORECTL|MOREDATA: + tcp->auxstr = "MORECTL|MOREDATA"; + break; + case MOREDATA: + tcp->auxstr = "MORECTL"; + break; + default: + tcp->auxstr = NULL; + break; + } + } + return RVAL_HEX | RVAL_STR; +} + +#endif /* HAVE_PUTPMSG */ + + +static struct xlat pollflags[] = { + { POLLIN, "POLLIN" }, + { POLLPRI, "POLLPRI" }, + { POLLOUT, "POLLOUT" }, +#ifdef POLLRDNORM + { POLLRDNORM, "POLLRDNORM" }, +#endif +#ifdef POLLWRNORM + { POLLWRNORM, "POLLWRNORM" }, +#endif +#ifdef POLLRDBAND + { POLLRDBAND, "POLLRDBAND" }, +#endif +#ifdef POLLWRBAND + { POLLWRBAND, "POLLWRBAND" }, +#endif + { POLLERR, "POLLERR" }, + { POLLHUP, "POLLHUP" }, + { POLLNVAL, "POLLNVAL" }, + { 0, NULL }, +}; + +int +sys_poll(tcp) +struct tcb *tcp; +{ + struct pollfd *pollp; + + if (exiting(tcp)) { + int i; + int nfds = tcp->u_arg[1]; + + if (nfds <= 0) { + tprintf("%#lx, %d, %ld\n", + tcp->u_arg[0], nfds, tcp->u_arg[2]); + return 0; + } + pollp = (struct pollfd *) malloc(nfds * sizeof(*pollp)); + if (pollp == NULL) { + fprintf(stderr, "sys_poll: no memory\n"); + tprintf("%#lx, %d, %ld", + tcp->u_arg[0], nfds, tcp->u_arg[2]); + return 0; + } + if (umoven(tcp, tcp->u_arg[0], + (nfds * sizeof(*pollp)), (char *) pollp) < 0) { + tprintf("%#lx", tcp->u_arg[0]); + } + else { + tprintf("["); + for (i = 0; i < nfds; i++) { + if (i) + tprintf(", "); + if (pollp[i].fd < 0) { + tprintf("{fd=%d}", pollp[i].fd); + continue; + } + tprintf("{fd=%d, events=", pollp[i].fd); + if (!printflags(pollflags, pollp[i].events)) + tprintf("0"); + if (!syserror(tcp) && pollp[i].revents) { + tprintf(", revents="); + if (!printflags(pollflags, + pollp[i].revents)) + tprintf("0"); + } + tprintf("}"); + } + tprintf("]"); + } + tprintf(", %d, ", nfds); +#ifdef INFTIM + if (tcp->u_arg[2] == INFTIM) + tprintf("INFTIM"); + else +#endif + tprintf("%ld", tcp->u_arg[2]); + free(pollp); + } + return 0; +} + +#ifndef linux + +static struct xlat stream_flush_options[] = { + { FLUSHR, "FLUSHR" }, + { FLUSHW, "FLUSHW" }, + { FLUSHRW, "FLUSHRW" }, +#ifdef FLUSHBAND + { FLUSHBAND, "FLUSHBAND" }, +#endif + { 0, NULL }, +}; + +static struct xlat stream_setsig_flags[] = { + { S_INPUT, "S_INPUT" }, + { S_HIPRI, "S_HIPRI" }, + { S_OUTPUT, "S_OUTPUT" }, + { S_MSG, "S_MSG" }, +#ifdef S_ERROR + { S_ERROR, "S_ERROR" }, +#endif +#ifdef S_HANGUP + { S_HANGUP, "S_HANGUP" }, +#endif +#ifdef S_RDNORM + { S_RDNORM, "S_RDNORM" }, +#endif +#ifdef S_WRNORM + { S_WRNORM, "S_WRNORM" }, +#endif +#ifdef S_RDBAND + { S_RDBAND, "S_RDBAND" }, +#endif +#ifdef S_WRBAND + { S_WRBAND, "S_WRBAND" }, +#endif +#ifdef S_BANDURG + { S_BANDURG, "S_BANDURG" }, +#endif + { 0, NULL }, +}; + +static struct xlat stream_read_options[] = { + { RNORM, "RNORM" }, + { RMSGD, "RMSGD" }, + { RMSGN, "RMSGN" }, + { 0, NULL }, +}; + +static struct xlat stream_read_flags[] = { +#ifdef RPROTDAT + { RPROTDAT, "RPROTDAT" }, +#endif +#ifdef RPROTDIS + { RPROTDIS, "RPROTDIS" }, +#endif +#ifdef RPROTNORM + { RPROTNORM, "RPROTNORM" }, +#endif + { 0, NULL }, +}; + +#ifndef RMODEMASK +#define RMODEMASK (~0) +#endif + +#ifdef I_SWROPT +static struct xlat stream_write_flags[] = { + { SNDZERO, "SNDZERO" }, + { SNDPIPE, "SNDPIPE" }, + { 0, NULL }, +}; +#endif /* I_SWROPT */ + +#ifdef I_ATMARK +static struct xlat stream_atmark_options[] = { + { ANYMARK, "ANYMARK" }, + { LASTMARK, "LASTMARK" }, + { 0, NULL }, +}; +#endif /* I_ATMARK */ + +#ifdef TI_BIND +static struct xlat transport_user_options[] = { + { T_CONN_REQ, "T_CONN_REQ" }, + { T_CONN_RES, "T_CONN_RES" }, + { T_DISCON_REQ, "T_DISCON_REQ" }, + { T_DATA_REQ, "T_DATA_REQ" }, + { T_EXDATA_REQ, "T_EXDATA_REQ" }, + { T_INFO_REQ, "T_INFO_REQ" }, + { T_BIND_REQ, "T_BIND_REQ" }, + { T_UNBIND_REQ, "T_UNBIND_REQ" }, + { T_UNITDATA_REQ,"T_UNITDATA_REQ"}, + { T_OPTMGMT_REQ,"T_OPTMGMT_REQ" }, + { T_ORDREL_REQ, "T_ORDREL_REQ" }, + { 0, NULL }, +}; + +static struct xlat transport_provider_options[] = { + { T_CONN_IND, "T_CONN_IND" }, + { T_CONN_CON, "T_CONN_CON" }, + { T_DISCON_IND, "T_DISCON_IND" }, + { T_DATA_IND, "T_DATA_IND" }, + { T_EXDATA_IND, "T_EXDATA_IND" }, + { T_INFO_ACK, "T_INFO_ACK" }, + { T_BIND_ACK, "T_BIND_ACK" }, + { T_ERROR_ACK, "T_ERROR_ACK" }, + { T_OK_ACK, "T_OK_ACK" }, + { T_UNITDATA_IND,"T_UNITDATA_IND"}, + { T_UDERROR_IND,"T_UDERROR_IND" }, + { T_OPTMGMT_ACK,"T_OPTMGMT_ACK" }, + { T_ORDREL_IND, "T_ORDREL_IND" }, + { 0, NULL }, +}; +#endif /* TI_BIND */ + +static int +internal_stream_ioctl(tcp, arg) +struct tcb *tcp; +int arg; +{ + struct strioctl si; + char *name; + int in_and_out; +#ifdef SI_GETUDATA + struct si_udata udata; +#endif /* SI_GETUDATA */ + + if (!arg) + return 0; + if (umove(tcp, arg, &si) < 0) { + if (entering(tcp)) + tprintf(", {...}"); + return 1; + } + if (entering(tcp)) { + name = ioctl_lookup(si.ic_cmd); + if (name) + tprintf(", {ic_cmd=%s", name); + else + tprintf(", {ic_cmd=%#x", si.ic_cmd); + if (si.ic_timout == INFTIM) + tprintf(", ic_timout=INFTIM, "); + else + tprintf(" ic_timout=%d, ", si.ic_timout); + } + in_and_out = 1; + switch (si.ic_cmd) { +#ifdef SI_GETUDATA + case SI_GETUDATA: + in_and_out = 0; + break; +#endif /* SI_GETUDATA */ + } + if (in_and_out) { + if (entering(tcp)) + tprintf("/* in */ "); + else + tprintf(", /* out */ "); + } + if (in_and_out || entering(tcp)) + tprintf("ic_len=%d, ic_dp=", si.ic_len); + switch (si.ic_cmd) { +#ifdef TI_BIND + case TI_BIND: + /* in T_BIND_REQ, out T_BIND_ACK */ + if (entering(tcp)) { + struct T_bind_req data; + +#if 0 + tprintf("struct T_bind_req "); +#endif + if (umove(tcp, (int) si.ic_dp, &data) < 0) + tprintf("{...}"); + else { + tprintf("{PRIM_type="); + printxval(transport_user_options, + data.PRIM_type, "T_???"); + tprintf(", ADDR_length=%ld, ADDR_offset=%ld", + data.ADDR_length, data.ADDR_offset); + tprintf(", CONIND_number=%ld}", + data.CONIND_number); + } + } + else { + struct T_bind_ack data; + +#if 0 + tprintf("struct T_bind_ack "); +#endif + if (umove(tcp, (int) si.ic_dp, &data) < 0) + tprintf("{...}"); + else { + tprintf("["); + tprintf("{PRIM_type="); + printxval(transport_provider_options, + data.PRIM_type, "T_???"); + tprintf(", ADDR_length=%ld, ADDR_offset=%ld", + data.ADDR_length, data.ADDR_offset); + tprintf(", CONIND_number=%ld}", + data.CONIND_number); + tprintf(", "); + printstr(tcp, + (int) si.ic_dp + data.ADDR_offset, + data.ADDR_length); + tprintf("]"); + } + } + break; +#endif /* TI_BIND */ +#if 0 +#ifdef TI_UNBIND + case TI_UNBIND: + /* in T_UNBIND_REQ, out T_OK_ACK */ + break; +#endif /* TI_UNBIND */ +#ifdef TI_GETINFO + case TI_GETINFO: + /* in T_INFO_REQ, out T_INFO_ACK */ + break; +#endif /* TI_GETINFO */ +#ifdef TI_OPTMGMT + case TI_OPTMGMT: + /* in T_OPTMGMT_REQ, out T_OPTMGMT_ACK */ + break; +#endif /* TI_OPTMGMT */ +#endif +#ifdef SI_GETUDATA + case SI_GETUDATA: + if (entering(tcp)) + break; +#if 0 + tprintf("struct si_udata "); +#endif + if (umove(tcp, (int) si.ic_dp, &udata) < 0) + tprintf("{...}"); + else { + tprintf("{tidusize=%d, addrsize=%d, ", + udata.tidusize, udata.addrsize); + tprintf("optsize=%d, etsdusize=%d, ", + udata.optsize, udata.etsdusize); + tprintf("servtype=%d, so_state=%d, ", + udata.servtype, udata.so_state); + tprintf("so_options=%d", udata.so_options); +#if 0 + tprintf(", tsdusize=%d", udata.tsdusize); +#endif + tprintf("}"); + } + break; +#endif /* SI_GETUDATA */ + default: + printstr(tcp, (int) si.ic_dp, si.ic_len); + break; + } + if (exiting(tcp)) + tprintf("}"); + return 1; +} + +int +stream_ioctl(tcp, code, arg) +struct tcb *tcp; +int code, arg; +{ +#ifdef I_LIST + int i; +#endif + int val; +#ifdef I_FLUSHBAND + struct bandinfo bi; +#endif + struct strpeek sp; + struct strfdinsert sfi; + struct strrecvfd srf; +#ifdef I_LIST + struct str_list sl; +#endif + + /* I_STR is a special case because the data is read & written. */ + if (code == I_STR) + return internal_stream_ioctl(tcp, arg); + if (entering(tcp)) + return 0; + + switch (code) { + case I_PUSH: + case I_LOOK: + case I_FIND: + /* arg is a string */ + tprintf(", "); + printpath(tcp, arg); + return 1; + case I_POP: + /* doesn't take an argument */ + return 1; + case I_FLUSH: + /* argument is an option */ + tprintf(", "); + printxval(stream_flush_options, arg, "FLUSH???"); + return 1; +#ifdef I_FLUSHBAND + case I_FLUSHBAND: + /* argument is a pointer to a bandinfo struct */ + if (umove(tcp, arg, &bi) < 0) + tprintf(", {...}"); + else { + tprintf(", {bi_pri=%d, bi_flag=", bi.bi_pri); + if (!printflags(stream_flush_options, bi.bi_flag)) + tprintf("0"); + tprintf("}"); + } + return 1; +#endif /* I_FLUSHBAND */ + case I_SETSIG: + /* argument is a set of flags */ + tprintf(", "); + if (!printflags(stream_setsig_flags, arg)) + tprintf("0"); + return 1; + case I_GETSIG: + /* argument is a pointer to a set of flags */ + if (syserror(tcp)) + return 0; + tprintf(", ["); + if (umove(tcp, arg, &val) < 0) + tprintf("?"); + else if (!printflags(stream_setsig_flags, val)) + tprintf("0"); + tprintf("]"); + return 1; + case I_PEEK: + /* argument is a pointer to a strpeek structure */ + if (syserror(tcp) || !arg) + return 0; + if (umove(tcp, arg, &sp) < 0) { + tprintf(", {...}"); + return 1; + } + tprintf(", {ctlbuf="); + printstrbuf(tcp, &sp.ctlbuf, 1); + tprintf(", databuf="); + printstrbuf(tcp, &sp.databuf, 1); + if (!printflags(msgflags, sp.flags)) + tprintf("0"); + return 1; + case I_SRDOPT: + /* argument is an option with flags */ + tprintf(", "); + printxval(stream_read_options, arg & RMODEMASK, "R???"); + addflags(stream_read_flags, arg & ~RMODEMASK); + return 1; + case I_GRDOPT: + /* argument is an pointer to an option with flags */ + if (syserror(tcp)) + return 0; + tprintf(", ["); + if (umove(tcp, arg, &val) < 0) + tprintf("?"); + else { + printxval(stream_read_options, + arg & RMODEMASK, "R???"); + addflags(stream_read_flags, arg & ~RMODEMASK); + } + tprintf("]"); + return 1; + case I_NREAD: +#ifdef I_GETBAND + case I_GETBAND: +#endif +#ifdef I_SETCLTIME + case I_SETCLTIME: +#endif +#ifdef I_GETCLTIME + case I_GETCLTIME: +#endif + /* argument is a pointer to a decimal integer */ + if (syserror(tcp)) + return 0; + tprintf(", "); + printnum(tcp, arg, "%d"); + return 1; + case I_FDINSERT: + /* argument is a pointer to a strfdinsert structure */ + if (syserror(tcp) || !arg) + return 0; + if (umove(tcp, arg, &sfi) < 0) { + tprintf(", {...}"); + return 1; + } + tprintf(", {ctlbuf="); + printstrbuf(tcp, &sfi.ctlbuf, 1); + tprintf(", databuf="); + printstrbuf(tcp, &sfi.databuf, 1); + if (!printflags(msgflags, sfi.flags)) + tprintf("0"); + tprintf(", filedes=%d, offset=%d}", sfi.fildes, sfi.offset); + return 1; +#ifdef I_SWROPT + case I_SWROPT: + /* argument is a set of flags */ + tprintf(", "); + if (!printflags(stream_write_flags, arg)) + tprintf("0"); + return 1; +#endif /* I_SWROPT */ +#ifdef I_GWROPT + case I_GWROPT: + /* argument is an pointer to an option with flags */ + if (syserror(tcp)) + return 0; + tprintf(", ["); + if (umove(tcp, arg, &val) < 0) + tprintf("?"); + else if (!printflags(stream_write_flags, arg)) + tprintf("0"); + tprintf("]"); + return 1; +#endif /* I_GWROPT */ + case I_SENDFD: +#ifdef I_CKBAND + case I_CKBAND: +#endif +#ifdef I_CANPUT + case I_CANPUT: +#endif + case I_LINK: + case I_UNLINK: + case I_PLINK: + case I_PUNLINK: + /* argument is a decimal integer */ + tprintf(", %d", arg); + return 1; + case I_RECVFD: + /* argument is a pointer to a strrecvfd structure */ + if (syserror(tcp) || !arg) + return 0; + if (umove(tcp, arg, &srf) < 0) { + tprintf(", {...}"); + return 1; + } + tprintf(", {fd=%d, uid=%lu, gid=%lu}", srf.fd, + (unsigned long) srf.uid, (unsigned long) srf.gid); + return 1; +#ifdef I_LIST + case I_LIST: + if (syserror(tcp)) + return 0; + if (arg == 0) { + tprintf(", NULL"); + return 1; + } + if (umove(tcp, arg, &sl) < 0) { + tprintf(", {...}"); + return 1; + } + tprintf(", {sl_nmods=%d, sl_modlist=[", sl.sl_nmods); + for (i = 0; i < tcp->u_rval; i++) { + if (i) + tprintf(", "); + printpath(tcp, (int) sl.sl_modlist[i].l_name); + } + tprintf("]}"); + return 1; +#endif /* I_LIST */ +#ifdef I_ATMARK + case I_ATMARK: + tprintf(", "); + printxval(stream_atmark_options, arg, "???MARK"); + return 1; +#endif /* I_ATMARK */ + default: + return 0; + } +} + +#endif /* linux */ + +#endif /* LINUXSPARC && linux */ + |