/* A very basic decoder for bind() and connect() calls */ static void decode_socketcall(pid_t pid, pink_bitness_t bitness, const char *scname) { long fd; char ip[100]; pink_socket_address_t addr; if (!pink_decode_socket_address(pid, bitness, 1, &fd, &addr)) { perror("pink_decode_socket_address"); return; } printf("%s(%ld, ", scname, fd); switch (addr.family) { case -1: /* NULL */ printf("NULL"); break; case AF_UNIX: printf("{sa_family=AF_UNIX, path=\"%s\"}", addr.u.sa_un.sun_path); break; case AF_INET: inet_ntop(AF_INET, &addr.u.sa_in.sin_addr, ip, sizeof(ip)); printf("{sa_family=AF_INET, sin_port=htons(%d), sin_addr=inet_addr(\"%s\")}", ntohs(addr.u.sa_in.sin_port), ip); break; #if PINK_HAVE_IPV6 case AF_INET6: inet_ntop(AF_INET6, &addr.u.sa6.sin6_addr, ip, sizeof(ip)); printf("{sa_family=AF_INET6, sin_port=htons(%d), sin6_addr=inet_addr(\"%s\")}", ntohs(addr.u.sa6.sin6_port), ip); break; #endif default: /* Unknown family */ printf("{sa_family=???}"); break; } printf(", %u)", addr.length); }
/* A very basic decoder for bind() and connect() calls */ static void decode_socketcall(pid_t pid, pink_bitness_t bitness, const char *scname) { long fd, subcall; const char *path, *subname; char ip[100]; pink_socket_address_t addr; subcall = -1; if (pink_has_socketcall(bitness) && !pink_decode_socket_call(pid, bitness, &subcall)) { perror("pink_decode_socket_call"); return; } if (subcall > 0) { subname = pink_name_socket_subcall(subcall); if (!(!strcmp(subname, "bind") || !strcmp(subname, "connect"))) { /* Print the name only */ printf("%s()", subname); return; } } if (!pink_decode_socket_address(pid, bitness, 1, &fd, &addr)) { perror("pink_decode_socket_address"); return; } printf("%s(%ld, ", (subcall > 0) ? subname : scname, fd); switch (addr.family) { case -1: /* NULL */ printf("NULL"); break; case AF_UNIX: printf("{sa_family=AF_UNIX, path="); path = addr.u.sa_un.sun_path; if (path[0] == '\0' && path[1] != '\0') /* Abstract UNIX socket */ printf("\"@%s\"}", ++path); else printf("\"%s\"}", path); break; case AF_INET: inet_ntop(AF_INET, &addr.u.sa_in.sin_addr, ip, sizeof(ip)); printf("{sa_family=AF_INET, sin_port=htons(%d), sin_addr=inet_addr(\"%s\")}", ntohs(addr.u.sa_in.sin_port), ip); break; #if PINKTRACE_HAVE_IPV6 case AF_INET6: inet_ntop(AF_INET6, &addr.u.sa6.sin6_addr, ip, sizeof(ip)); printf("{sa_family=AF_INET6, sin_port=htons(%d), sin6_addr=inet_addr(\"%s\")}", ntohs(addr.u.sa6.sin6_port), ip); break; #endif /* PINKTRACE_HAVE_IPV6 */ #if PINKTRACE_HAVE_NETLINK case AF_NETLINK: printf("{sa_family=AF_NETLINK, nl_pid=%d, nl_groups=%08x}", addr.u.nl.nl_pid, addr.u.nl.nl_groups); break; #endif /* PINKTRACE_HAVE_NETLINK */ default: /* Unknown family */ printf("{sa_family=???}"); break; } printf(", %u)", addr.length); }