1d5a7e661SArnaldo Carvalho de Melo // SPDX-License-Identifier: GPL-2.0 2d5a7e661SArnaldo Carvalho de Melo // Copyright (C) 2018, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> 3d5a7e661SArnaldo Carvalho de Melo 4d5a7e661SArnaldo Carvalho de Melo #include "trace/beauty/beauty.h" 5d5a7e661SArnaldo Carvalho de Melo #include <sys/socket.h> 6d5a7e661SArnaldo Carvalho de Melo #include <sys/types.h> 7d5a7e661SArnaldo Carvalho de Melo #include <sys/un.h> 8d5a7e661SArnaldo Carvalho de Melo #include <arpa/inet.h> 9d5a7e661SArnaldo Carvalho de Melo 10d5a7e661SArnaldo Carvalho de Melo static const char *socket_families[] = { 11d5a7e661SArnaldo Carvalho de Melo "UNSPEC", "LOCAL", "INET", "AX25", "IPX", "APPLETALK", "NETROM", 12d5a7e661SArnaldo Carvalho de Melo "BRIDGE", "ATMPVC", "X25", "INET6", "ROSE", "DECnet", "NETBEUI", 13d5a7e661SArnaldo Carvalho de Melo "SECURITY", "KEY", "NETLINK", "PACKET", "ASH", "ECONET", "ATMSVC", 14d5a7e661SArnaldo Carvalho de Melo "RDS", "SNA", "IRDA", "PPPOX", "WANPIPE", "LLC", "IB", "CAN", "TIPC", 15d5a7e661SArnaldo Carvalho de Melo "BLUETOOTH", "IUCV", "RXRPC", "ISDN", "PHONET", "IEEE802154", "CAIF", 16d5a7e661SArnaldo Carvalho de Melo "ALG", "NFC", "VSOCK", 17d5a7e661SArnaldo Carvalho de Melo }; 18d5a7e661SArnaldo Carvalho de Melo DEFINE_STRARRAY(socket_families); 19d5a7e661SArnaldo Carvalho de Melo 20d5a7e661SArnaldo Carvalho de Melo static size_t syscall_arg__scnprintf_augmented_sockaddr(struct syscall_arg *arg, char *bf, size_t size) 21d5a7e661SArnaldo Carvalho de Melo { 22d5a7e661SArnaldo Carvalho de Melo struct sockaddr_in *sin = (struct sockaddr_in *)arg->augmented.args; 23d5a7e661SArnaldo Carvalho de Melo char family[32]; 24d5a7e661SArnaldo Carvalho de Melo size_t printed; 25d5a7e661SArnaldo Carvalho de Melo 26d5a7e661SArnaldo Carvalho de Melo strarray__scnprintf(&strarray__socket_families, family, sizeof(family), "%d", sin->sin_family); 27d5a7e661SArnaldo Carvalho de Melo printed = scnprintf(bf, size, "{ .family: %s", family); 28d5a7e661SArnaldo Carvalho de Melo 29d5a7e661SArnaldo Carvalho de Melo if (sin->sin_family == AF_INET) { 30d5a7e661SArnaldo Carvalho de Melo char tmp[512]; 31d5a7e661SArnaldo Carvalho de Melo printed += scnprintf(bf + printed, size - printed, ", port: %d, addr: %s", ntohs(sin->sin_port), 32d5a7e661SArnaldo Carvalho de Melo inet_ntop(sin->sin_family, &sin->sin_addr, tmp, sizeof(tmp))); 33d5a7e661SArnaldo Carvalho de Melo } else if (sin->sin_family == AF_INET6) { 34d5a7e661SArnaldo Carvalho de Melo struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sin; 35d5a7e661SArnaldo Carvalho de Melo u32 flowinfo = ntohl(sin6->sin6_flowinfo); 36d5a7e661SArnaldo Carvalho de Melo char tmp[512]; 37d5a7e661SArnaldo Carvalho de Melo 38d5a7e661SArnaldo Carvalho de Melo printed += scnprintf(bf + printed, size - printed, ", port: %d, addr: %s", ntohs(sin6->sin6_port), 39d5a7e661SArnaldo Carvalho de Melo inet_ntop(sin6->sin6_family, &sin6->sin6_addr, tmp, sizeof(tmp))); 40d5a7e661SArnaldo Carvalho de Melo if (flowinfo != 0) 41d5a7e661SArnaldo Carvalho de Melo printed += scnprintf(bf + printed, size - printed, ", flowinfo: %lu", flowinfo); 42d5a7e661SArnaldo Carvalho de Melo if (sin6->sin6_scope_id != 0) 43d5a7e661SArnaldo Carvalho de Melo printed += scnprintf(bf + printed, size - printed, ", scope_id: %lu", sin6->sin6_scope_id); 44d5a7e661SArnaldo Carvalho de Melo } else if (sin->sin_family == AF_LOCAL) { 45d5a7e661SArnaldo Carvalho de Melo struct sockaddr_un *sun = (struct sockaddr_un *)sin; 46d5a7e661SArnaldo Carvalho de Melo printed += scnprintf(bf + printed, size - printed, ", path: %s", sun->sun_path); 47d5a7e661SArnaldo Carvalho de Melo } 48d5a7e661SArnaldo Carvalho de Melo 49d5a7e661SArnaldo Carvalho de Melo return printed + scnprintf(bf + printed, size - printed, " }"); 50d5a7e661SArnaldo Carvalho de Melo } 51d5a7e661SArnaldo Carvalho de Melo 52d5a7e661SArnaldo Carvalho de Melo size_t syscall_arg__scnprintf_sockaddr(char *bf, size_t size, struct syscall_arg *arg) 53d5a7e661SArnaldo Carvalho de Melo { 54d5a7e661SArnaldo Carvalho de Melo if (arg->augmented.args) 55d5a7e661SArnaldo Carvalho de Melo return syscall_arg__scnprintf_augmented_sockaddr(arg, bf, size); 56d5a7e661SArnaldo Carvalho de Melo 57d5a7e661SArnaldo Carvalho de Melo return scnprintf(bf, size, "%#x", arg->val); 58d5a7e661SArnaldo Carvalho de Melo } 59