# include "xlat/bt_protocols.h"
#endif
-void
-print_ifindex(unsigned int ifindex)
-{
-#ifdef HAVE_IF_INDEXTONAME
- char buf[IFNAMSIZ + 1];
-
- if (if_indextoname(ifindex, buf)) {
- tprints("if_nametoindex(");
- print_quoted_string(buf, sizeof(buf), QUOTE_0_TERMINATED);
- tprints(")");
- return;
- }
-#endif
- tprintf("%u", ifindex);
-}
-
static void
decode_sockbuf(struct tcb *const tcp, const int fd, const kernel_ulong_t addr,
const kernel_ulong_t addrlen)
return RVAL_DECODED | RVAL_FD;
}
-SYS_FUNC(bind)
-{
- printfd(tcp, tcp->u_arg[0]);
- tprints(", ");
- const int addrlen = tcp->u_arg[2];
- decode_sockaddr(tcp, tcp->u_arg[1], addrlen);
- tprintf(", %d", addrlen);
-
- return RVAL_DECODED;
-}
-
-SYS_FUNC(listen)
-{
- printfd(tcp, tcp->u_arg[0]);
- tprints(", ");
- tprintf("%" PRI_klu, tcp->u_arg[1]);
-
- return RVAL_DECODED;
-}
-
static bool
fetch_socklen(struct tcb *const tcp, int *const plen,
const kernel_ulong_t sockaddr, const kernel_ulong_t socklen)
return 0;
}
-#include "xlat/shutdown_modes.h"
-
-SYS_FUNC(shutdown)
-{
- printfd(tcp, tcp->u_arg[0]);
- tprints(", ");
- printxval(shutdown_modes, tcp->u_arg[1], "SHUT_???");
-
- return RVAL_DECODED;
-}
-
SYS_FUNC(getsockname)
{
return decode_sockname(tcp);
static void
print_set_linger(struct tcb *const tcp, const kernel_ulong_t addr,
- const unsigned int len)
+ const int len)
{
struct linger linger;
- if (len < sizeof(linger) ||
- umove(tcp, addr, &linger) < 0) {
+ if (len < (int) sizeof(linger)) {
printaddr(addr);
- return;
+ } else if (!umove_or_printaddr(tcp, addr, &linger)) {
+ PRINT_FIELD_D("{", linger, l_onoff);
+ PRINT_FIELD_D(", ", linger, l_linger);
+ tprints("}");
}
-
- PRINT_FIELD_D("{", linger, l_onoff);
- PRINT_FIELD_D(", ", linger, l_linger);
- tprints("}");
}
static void
#ifdef SO_PEERCRED
static void
-print_ucred(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
+print_ucred(struct tcb *const tcp, const kernel_ulong_t addr, unsigned int len)
{
struct ucred uc;
- if (len != sizeof(uc) ||
- umove(tcp, addr, &uc) < 0) {
- printaddr(addr);
+ if (len < sizeof(uc)) {
+ if (len != sizeof(uc.pid)
+ && len != offsetofend(struct ucred, uid)) {
+ printstr_ex(tcp, addr, len, QUOTE_FORCE_HEX);
+ return;
+ }
} else {
- tprintf("{pid=%u, uid=%u, gid=%u}",
- (unsigned) uc.pid,
- (unsigned) uc.uid,
- (unsigned) uc.gid);
+ len = sizeof(uc);
+ }
+
+ if (umoven(tcp, addr, len, &uc) < 0) {
+ printaddr(addr);
+ return;
}
+
+ PRINT_FIELD_D("{", uc, pid);
+ if (len > sizeof(uc.pid))
+ PRINT_FIELD_UID(", ", uc, uid);
+ if (len == sizeof(uc))
+ PRINT_FIELD_UID(", ", uc, gid);
+ tprints("}");
}
#endif /* SO_PEERCRED */
umove(tcp, addr, &stats) < 0) {
printaddr(addr);
} else {
- tprintf("{packets=%u, drops=%u}",
- stats.tp_packets,
- stats.tp_drops);
+ PRINT_FIELD_U("{", stats, tp_packets);
+ PRINT_FIELD_U("{", stats, tp_drops);
+ tprints("}");
}
}
#endif /* PACKET_STATISTICS */
#ifdef IP_ADD_MEMBERSHIP
static void
print_mreq(struct tcb *const tcp, const kernel_ulong_t addr,
- const unsigned int len)
+ const int len)
{
struct ip_mreq mreq;
- if (len < sizeof(mreq)) {
- printstrn(tcp, addr, len);
- return;
+ if (len < (int) sizeof(mreq)) {
+ printaddr(addr);
+ } else if (!umove_or_printaddr(tcp, addr, &mreq)) {
+ PRINT_FIELD_INET4_ADDR("{", mreq, imr_multiaddr);
+ PRINT_FIELD_INET4_ADDR(", ", mreq, imr_interface);
+ tprints("}");
}
- if (umove_or_printaddr(tcp, addr, &mreq))
- return;
-
- tprintf("{imr_multiaddr=inet_addr(\"%s\")",
- inet_ntoa(mreq.imr_multiaddr));
- tprintf(", imr_interface=inet_addr(\"%s\")}",
- inet_ntoa(mreq.imr_interface));
}
#endif /* IP_ADD_MEMBERSHIP */
#ifdef IPV6_ADD_MEMBERSHIP
static void
print_mreq6(struct tcb *const tcp, const kernel_ulong_t addr,
- const unsigned int len)
+ const int len)
{
struct ipv6_mreq mreq;
- if (len < sizeof(mreq)) {
- printstrn(tcp, addr, len);
- return;
- }
- if (umove_or_printaddr(tcp, addr, &mreq))
- return;
-
- tprints("{");
- print_inet_addr(AF_INET6, &mreq.ipv6mr_multiaddr,
- sizeof(mreq.ipv6mr_multiaddr), "ipv6mr_multiaddr");
-
- tprints(", ipv6mr_interface=");
- print_ifindex(mreq.ipv6mr_interface);
- tprints("}");
-}
-#endif /* IPV6_ADD_MEMBERSHIP */
-
-#ifdef MCAST_JOIN_GROUP
-static void
-print_group_req(struct tcb *const tcp, const kernel_ulong_t addr, const int len)
-{
- struct group_req greq;
-
- if (len != sizeof(greq) ||
- umove(tcp, addr, &greq) < 0) {
+ if (len < (int) sizeof(mreq)) {
printaddr(addr);
- return;
+ } else if (!umove_or_printaddr(tcp, addr, &mreq)) {
+ PRINT_FIELD_INET_ADDR("{", mreq, ipv6mr_multiaddr, AF_INET6);
+ PRINT_FIELD_IFINDEX(", ", mreq, ipv6mr_interface);
+ tprints("}");
}
-
- tprintf("{gr_interface=%u, gr_group=", greq.gr_interface);
- print_sockaddr(tcp, &greq.gr_group, sizeof(greq.gr_group));
- tprints("}");
-
}
-#endif /* MCAST_JOIN_GROUP */
+#endif /* IPV6_ADD_MEMBERSHIP */
#ifdef PACKET_RX_RING
static void
umove(tcp, addr, &req) < 0) {
printaddr(addr);
} else {
- tprintf("{block_size=%u, block_nr=%u, "
- "frame_size=%u, frame_nr=%u}",
- req.tp_block_size,
- req.tp_block_nr,
- req.tp_frame_size,
- req.tp_frame_nr);
+ PRINT_FIELD_U("{", req, tp_block_size);
+ PRINT_FIELD_U(", ", req, tp_block_nr);
+ PRINT_FIELD_U(", ", req, tp_frame_size);
+ PRINT_FIELD_U(", ", req, tp_frame_nr);
+ tprints("}");
}
}
#endif /* PACKET_RX_RING */
} else {
unsigned int i;
- tprintf("{mr_ifindex=%u, mr_type=", mreq.mr_ifindex);
- printxval(packet_mreq_type, mreq.mr_type, "PACKET_MR_???");
- tprintf(", mr_alen=%u, mr_address=", mreq.mr_alen);
+ PRINT_FIELD_IFINDEX("{", mreq, mr_ifindex);
+ PRINT_FIELD_XVAL(", ", mreq, mr_type, packet_mreq_type,
+ "PACKET_MR_???");
+ PRINT_FIELD_U(", ", mreq, mr_alen);
+ tprints(", mr_address=");
if (mreq.mr_alen > ARRAY_SIZE(mreq.mr_address))
mreq.mr_alen = ARRAY_SIZE(mreq.mr_address);
for (i = 0; i < mreq.mr_alen; ++i)
print_mreq6(tcp, addr, len);
return;
#endif /* IPV6_ADD_MEMBERSHIP */
+#ifdef MCAST_JOIN_GROUP
+ case MCAST_JOIN_GROUP:
+ case MCAST_LEAVE_GROUP:
+ print_group_req(tcp, addr, len);
+ return;
+#endif /* MCAST_JOIN_GROUP */
}
break;