📄 stream.c
字号:
};#ifndef RMODEMASK#define RMODEMASK (~0)#endif#ifdef I_SWROPTstatic struct xlat stream_write_flags[] = { { SNDZERO, "SNDZERO" }, { SNDPIPE, "SNDPIPE" }, { 0, NULL },};#endif /* I_SWROPT */#ifdef I_ATMARKstatic struct xlat stream_atmark_options[] = { { ANYMARK, "ANYMARK" }, { LASTMARK, "LASTMARK" }, { 0, NULL },};#endif /* I_ATMARK */#ifdef TI_BINDstatic 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 intinternal_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;}intstream_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 && !FREEBSD */ #endif /* HAVE_SYS_STREAM_H || linux || FREEBSD */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -