diff --git a/src/bin/debug/strace/NetworkTypes.cpp b/src/bin/debug/strace/NetworkTypes.cpp index cb6268ab73..9257525ae4 100644 --- a/src/bin/debug/strace/NetworkTypes.cpp +++ b/src/bin/debug/strace/NetworkTypes.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -396,17 +397,23 @@ format_pointer(Context &context, sockaddr *saddr) { string r; - sockaddr_in *sin = (sockaddr_in *)saddr; - r = format_socket_family(context, saddr->sa_family) + ", "; switch (saddr->sa_family) { case AF_INET: + { + sockaddr_in *sin = (sockaddr_in *)saddr; r += get_ipv4_address(&sin->sin_addr); r += "/"; r += format_number(ntohs(sin->sin_port)); break; - + } + case AF_UNIX: + { + sockaddr_un *sun = (sockaddr_un *)saddr; + r += "path = \"" + string(sun->sun_path) + "\""; + break; + } default: r += "..."; break; @@ -416,6 +423,44 @@ format_pointer(Context &context, sockaddr *saddr) } +static string +read_sockaddr(Context &context, void *address) +{ + sockaddr_storage data; + socklen_t addrlen = get_value(context.GetValue(context.GetSibling(2))); + + if (addrlen > sizeof(data)) + return context.FormatPointer(address); + + int32 bytesRead; + status_t err = context.Reader().Read(address, &data, addrlen, bytesRead); + if (err != B_OK) + return context.FormatPointer(address); + + return "{" + format_pointer(context, (sockaddr *)&data) + "}"; +} + + +template<> +string +TypeHandlerImpl::GetParameterValue(Context &context, Parameter *, + const void *address) +{ + void *data = *(void **)address; + if (data != NULL && context.GetContents(Context::SIMPLE_STRUCTS)) + return read_sockaddr(context, data); + return context.FormatPointer(data); +} + + +template<> +string +TypeHandlerImpl::GetReturnValue(Context &context, uint64 value) +{ + return context.FormatPointer((void *)value); +} + + #if 0 static string format_pointer(Context &context, sockaddr_args *args) @@ -726,6 +771,7 @@ POINTER_TYPE(ifreq_ptr, ifreq); DEFINE_TYPE(pollfd_ptr, pollfd *); POINTER_TYPE(siginfo_t_ptr, siginfo_t); POINTER_TYPE(msghdr_ptr, msghdr); +DEFINE_TYPE(sockaddr_ptr, sockaddr *); #if 0 POINTER_TYPE(message_args_ptr, message_args); POINTER_TYPE(sockaddr_args_ptr, sockaddr_args); diff --git a/src/bin/debug/strace/TypeHandler.h b/src/bin/debug/strace/TypeHandler.h index b4d7ed752b..6e803e8db0 100644 --- a/src/bin/debug/strace/TypeHandler.h +++ b/src/bin/debug/strace/TypeHandler.h @@ -125,6 +125,7 @@ struct ifreq; struct msghdr; struct message_args; struct pollfd; +struct sockaddr; struct sockaddr_args; struct socket_args; struct sockopt_args; @@ -138,6 +139,8 @@ DEFINE_FACTORY(msghdr_ptr, const msghdr *); DEFINE_FACTORY(message_args_ptr, message_args *); DEFINE_FACTORY(pollfd_ptr, pollfd *); DEFINE_FACTORY(siginfo_t_ptr, siginfo_t *); +DEFINE_FACTORY(sockaddr_ptr, sockaddr *); +DEFINE_FACTORY(sockaddr_ptr, const sockaddr *); DEFINE_FACTORY(sockaddr_args_ptr, sockaddr_args *); DEFINE_FACTORY(socket_args_ptr, socket_args *); DEFINE_FACTORY(sockopt_args_ptr, sockopt_args *);