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:
parent
d666f82888
commit
17d9a20c62
@ -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);
|
||||
|
@ -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 *);
|
||||
|
Loading…
x
Reference in New Issue
Block a user