-typedef union {
- char pad[128];
- struct sockaddr sa;
- struct sockaddr_in sin;
- struct sockaddr_un sau;
-#ifdef HAVE_INET_NTOP
- struct sockaddr_in6 sa6;
-#endif
-#if defined(AF_IPX)
- struct sockaddr_ipx sipx;
-#endif
-#ifdef AF_PACKET
- struct sockaddr_ll ll;
-#endif
-#ifdef AF_NETLINK
- struct sockaddr_nl nl;
-#endif
-#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
- struct sockaddr_hci hci;
- struct sockaddr_l2 l2;
- struct sockaddr_rc rc;
- struct sockaddr_sco sco;
-#endif
-} sockaddr_buf_t;
-
-static void
-print_sockaddr(struct tcb *tcp, const sockaddr_buf_t *addr, const int addrlen)
-{
- tprints("{sa_family=");
- printxval(addrfams, addr->sa.sa_family, "AF_???");
- tprints(", ");
-
- switch (addr->sa.sa_family) {
- case AF_UNIX:
- if (addrlen == 2) {
- tprints("NULL");
- } else if (addr->sau.sun_path[0]) {
- tprints("sun_path=");
- print_quoted_string(addr->sau.sun_path,
- sizeof(addr->sau.sun_path) + 1,
- QUOTE_0_TERMINATED);
- } else {
- tprints("sun_path=@");
- print_quoted_string(addr->sau.sun_path + 1,
- sizeof(addr->sau.sun_path),
- QUOTE_0_TERMINATED);
- }
- break;
- case AF_INET:
- tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")",
- ntohs(addr->sin.sin_port), inet_ntoa(addr->sin.sin_addr));
- break;
-#ifdef HAVE_INET_NTOP
- case AF_INET6:
- {
- char string_addr[100];
- inet_ntop(AF_INET6, &addr->sa6.sin6_addr,
- string_addr, sizeof(string_addr));
- tprintf("sin6_port=htons(%u), inet_pton(AF_INET6"
- ", \"%s\", &sin6_addr), sin6_flowinfo=%u",
- ntohs(addr->sa6.sin6_port), string_addr,
- addr->sa6.sin6_flowinfo);
-# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
- tprints(", sin6_scope_id=");
-# if defined IN6_IS_ADDR_LINKLOCAL && defined IN6_IS_ADDR_MC_LINKLOCAL
- if (IN6_IS_ADDR_LINKLOCAL(&addr->sa6.sin6_addr)
- || IN6_IS_ADDR_MC_LINKLOCAL(&addr->sa6.sin6_addr))
- print_ifindex(addr->sa6.sin6_scope_id);
- else
-# endif
- tprintf("%u", addr->sa6.sin6_scope_id);
-# endif /* HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID */
- }
- break;
-#endif
-#if defined(AF_IPX)
- case AF_IPX:
- {
- int i;
- tprintf("sipx_port=htons(%u), ",
- ntohs(addr->sipx.sipx_port));
- /* Yes, I know, this does not look too
- * strace-ish, but otherwise the IPX
- * addresses just look monstrous...
- * Anyways, feel free if you don't like
- * this way.. :)
- */
- tprintf("%08lx:", (unsigned long)ntohl(addr->sipx.sipx_network));
- for (i = 0; i < IPX_NODE_LEN; i++)
- tprintf("%02x", addr->sipx.sipx_node[i]);
- tprintf("/[%02x]", addr->sipx.sipx_type);
- }
- break;
-#endif /* AF_IPX */
-#ifdef AF_PACKET
- case AF_PACKET:
- {
- int i;
- tprintf("proto=%#04x, if%d, pkttype=",
- ntohs(addr->ll.sll_protocol),
- addr->ll.sll_ifindex);
- printxval(af_packet_types, addr->ll.sll_pkttype, "PACKET_???");
- tprintf(", addr(%d)={%d, ",
- addr->ll.sll_halen,
- addr->ll.sll_hatype);
- for (i = 0; i < addr->ll.sll_halen; i++)
- tprintf("%02x", addr->ll.sll_addr[i]);
- }
- break;
-
-#endif /* AF_PACKET */
-#ifdef AF_NETLINK
- case AF_NETLINK:
- tprintf("pid=%d, groups=%08x", addr->nl.nl_pid, addr->nl.nl_groups);
- break;
-#endif /* AF_NETLINK */
-#if defined(AF_BLUETOOTH) && defined(HAVE_BLUETOOTH_BLUETOOTH_H)
- case AF_BLUETOOTH:
- tprintf("{sco_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X} or "
- "{rc_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, rc_channel=%d} or "
- "{l2_psm=htobs(%d), l2_bdaddr=%02X:%02X:%02X:%02X:%02X:%02X, l2_cid=htobs(%d)} or "
- "{hci_dev=htobs(%d)}",
- addr->sco.sco_bdaddr.b[0], addr->sco.sco_bdaddr.b[1],
- addr->sco.sco_bdaddr.b[2], addr->sco.sco_bdaddr.b[3],
- addr->sco.sco_bdaddr.b[4], addr->sco.sco_bdaddr.b[5],
- addr->rc.rc_bdaddr.b[0], addr->rc.rc_bdaddr.b[1],
- addr->rc.rc_bdaddr.b[2], addr->rc.rc_bdaddr.b[3],
- addr->rc.rc_bdaddr.b[4], addr->rc.rc_bdaddr.b[5],
- addr->rc.rc_channel,
- btohs(addr->l2.l2_psm), addr->l2.l2_bdaddr.b[0],
- addr->l2.l2_bdaddr.b[1], addr->l2.l2_bdaddr.b[2],
- addr->l2.l2_bdaddr.b[3], addr->l2.l2_bdaddr.b[4],
- addr->l2.l2_bdaddr.b[5], btohs(addr->l2.l2_cid),
- btohs(addr->hci.hci_dev));
- break;
-#endif /* AF_BLUETOOTH && HAVE_BLUETOOTH_BLUETOOTH_H */
- /* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5
- AF_X25 AF_ROSE etc. still need to be done */
-
- default:
- tprints("sa_data=");
- print_quoted_string(addr->sa.sa_data,
- sizeof(addr->sa.sa_data), 0);
- break;
- }
- tprints("}");
-}
-
-void
-printsock(struct tcb *tcp, long addr, int addrlen)
-{
- sockaddr_buf_t addrbuf;
-
- if (addrlen < 2) {
- printaddr(addr);
- return;
- }
-
- if (addrlen > (int) sizeof(addrbuf))
- addrlen = sizeof(addrbuf);
-
- memset(&addrbuf, 0, sizeof(addrbuf));
- if (umoven_or_printaddr(tcp, addr, addrlen, addrbuf.pad))
- return;
- addrbuf.pad[sizeof(addrbuf.pad) - 1] = '\0';
-
- print_sockaddr(tcp, &addrbuf, addrlen);
-}
-
-#include "xlat/scmvals.h"
-#include "xlat/ip_cmsg_types.h"
-
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-struct cmsghdr32 {
- uint32_t cmsg_len;
- int cmsg_level;
- int cmsg_type;
-};
-#endif
-
-typedef union {
- char *ptr;
- struct cmsghdr *cmsg;
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
- struct cmsghdr32 *cmsg32;
-#endif
-} union_cmsghdr;
-
-static void
-print_scm_rights(struct tcb *tcp, const void *cmsg_data,
- const size_t data_len)
-{
- const int *fds = cmsg_data;
- const char *end = (const char *) cmsg_data + data_len;
- bool seen = false;
-
- if (sizeof(*fds) > data_len)
- return;
-
- tprints(", [");
- while ((const char *) fds < end) {
- if (seen)
- tprints(", ");
- else
- seen = true;
- printfd(tcp, *fds++);
- }
- tprints("]");
-}
-
-static void
-print_scm_creds(struct tcb *tcp, const void *cmsg_data,
- const size_t data_len)
-{
- const struct ucred *uc = cmsg_data;
-
- if (sizeof(*uc) > data_len)
- return;
-
- tprintf(", {pid=%u, uid=%u, gid=%u}",
- (unsigned) uc->pid, (unsigned) uc->uid, (unsigned) uc->gid);
-}
-
-static void
-print_scm_security(struct tcb *tcp, const void *cmsg_data,
- const size_t data_len)
-{
- if (!data_len)
- return;
-
- tprints(", ");
- print_quoted_string(cmsg_data, data_len, 0);
-}
-
-static void
-print_cmsg_ip_pktinfo(struct tcb *tcp, const void *cmsg_data,
- const size_t data_len)
-{
- const struct in_pktinfo *info = cmsg_data;
-
- if (sizeof(*info) > data_len)
- return;
-
- tprints(", {ipi_ifindex=");
- print_ifindex(info->ipi_ifindex);
- tprintf(", ipi_spec_dst=inet_addr(\"%s\"), ipi_addr=inet_addr(\"%s\")}",
- inet_ntoa(info->ipi_spec_dst), inet_ntoa(info->ipi_addr));
-}
-
-static void
-print_cmsg_ip_ttl(struct tcb *tcp, const void *cmsg_data,
- const size_t data_len)
-{
- const unsigned int *ttl = cmsg_data;
-
- if (sizeof(*ttl) > data_len)
- return;
-
- tprintf(", {ttl=%u}", *ttl);
-}
-
-static void
-print_cmsg_ip_tos(struct tcb *tcp, const void *cmsg_data,
- const size_t data_len)
-{
- const uint8_t *tos = cmsg_data;
-
- if (sizeof(*tos) > data_len)
- return;
-
- tprintf(", {tos=%x}", *tos);
-}
-
-static void
-print_cmsg_ip_checksum(struct tcb *tcp, const void *cmsg_data,
- const size_t data_len)
-{
- const uint32_t *csum = cmsg_data;
-
- if (sizeof(*csum) > data_len)
- return;
-
- tprintf(", {csum=%u}", *csum);
-}
-
-static void
-print_cmsg_ip_opts(struct tcb *tcp, const void *cmsg_data,
- const size_t data_len)
-{
- const unsigned char *opts = cmsg_data;
- size_t i;
-
- if (!data_len)
- return;
-
- tprints(", {opts=0x");
- for (i = 0; i < data_len; ++i)
- tprintf("%02x", opts[i]);
- tprints("}");
-}
-