strace: Add support for struct sockaddr

- Updated old `sockaddr *` formatting code to work with current
`strace` structure.
- Add support for `AF_UNIX` family address.

Change-Id: I13f7b0a3eb913ab188bea68f8ea84e928b753154
Reviewed-on: https://review.haiku-os.org/c/haiku/+/6497
Reviewed-by: Jérôme Duval <jerome.duval@gmail.com>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
This commit is contained in:
Trung Nguyen 2023-06-05 20:13:54 +10:00 committed by Jérôme Duval
parent d666f82888
commit 17d9a20c62
2 changed files with 52 additions and 3 deletions

View File

@ -12,6 +12,7 @@
#include <sys/poll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <map>
#include <utility>
@ -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<socklen_t>(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<sockaddr *>::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<sockaddr *>::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);

View File

@ -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 *);