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 <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
committed by
Jérôme Duval
parent
d666f82888
commit
17d9a20c62
@@ -12,6 +12,7 @@
|
|||||||
#include <sys/poll.h>
|
#include <sys/poll.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
@@ -396,17 +397,23 @@ format_pointer(Context &context, sockaddr *saddr)
|
|||||||
{
|
{
|
||||||
string r;
|
string r;
|
||||||
|
|
||||||
sockaddr_in *sin = (sockaddr_in *)saddr;
|
|
||||||
|
|
||||||
r = format_socket_family(context, saddr->sa_family) + ", ";
|
r = format_socket_family(context, saddr->sa_family) + ", ";
|
||||||
|
|
||||||
switch (saddr->sa_family) {
|
switch (saddr->sa_family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
|
{
|
||||||
|
sockaddr_in *sin = (sockaddr_in *)saddr;
|
||||||
r += get_ipv4_address(&sin->sin_addr);
|
r += get_ipv4_address(&sin->sin_addr);
|
||||||
r += "/";
|
r += "/";
|
||||||
r += format_number(ntohs(sin->sin_port));
|
r += format_number(ntohs(sin->sin_port));
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
case AF_UNIX:
|
||||||
|
{
|
||||||
|
sockaddr_un *sun = (sockaddr_un *)saddr;
|
||||||
|
r += "path = \"" + string(sun->sun_path) + "\"";
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
r += "...";
|
r += "...";
|
||||||
break;
|
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
|
#if 0
|
||||||
static string
|
static string
|
||||||
format_pointer(Context &context, sockaddr_args *args)
|
format_pointer(Context &context, sockaddr_args *args)
|
||||||
@@ -726,6 +771,7 @@ POINTER_TYPE(ifreq_ptr, ifreq);
|
|||||||
DEFINE_TYPE(pollfd_ptr, pollfd *);
|
DEFINE_TYPE(pollfd_ptr, pollfd *);
|
||||||
POINTER_TYPE(siginfo_t_ptr, siginfo_t);
|
POINTER_TYPE(siginfo_t_ptr, siginfo_t);
|
||||||
POINTER_TYPE(msghdr_ptr, msghdr);
|
POINTER_TYPE(msghdr_ptr, msghdr);
|
||||||
|
DEFINE_TYPE(sockaddr_ptr, sockaddr *);
|
||||||
#if 0
|
#if 0
|
||||||
POINTER_TYPE(message_args_ptr, message_args);
|
POINTER_TYPE(message_args_ptr, message_args);
|
||||||
POINTER_TYPE(sockaddr_args_ptr, sockaddr_args);
|
POINTER_TYPE(sockaddr_args_ptr, sockaddr_args);
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ struct ifreq;
|
|||||||
struct msghdr;
|
struct msghdr;
|
||||||
struct message_args;
|
struct message_args;
|
||||||
struct pollfd;
|
struct pollfd;
|
||||||
|
struct sockaddr;
|
||||||
struct sockaddr_args;
|
struct sockaddr_args;
|
||||||
struct socket_args;
|
struct socket_args;
|
||||||
struct sockopt_args;
|
struct sockopt_args;
|
||||||
@@ -138,6 +139,8 @@ DEFINE_FACTORY(msghdr_ptr, const msghdr *);
|
|||||||
DEFINE_FACTORY(message_args_ptr, message_args *);
|
DEFINE_FACTORY(message_args_ptr, message_args *);
|
||||||
DEFINE_FACTORY(pollfd_ptr, pollfd *);
|
DEFINE_FACTORY(pollfd_ptr, pollfd *);
|
||||||
DEFINE_FACTORY(siginfo_t_ptr, siginfo_t *);
|
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(sockaddr_args_ptr, sockaddr_args *);
|
||||||
DEFINE_FACTORY(socket_args_ptr, socket_args *);
|
DEFINE_FACTORY(socket_args_ptr, socket_args *);
|
||||||
DEFINE_FACTORY(sockopt_args_ptr, sockopt_args *);
|
DEFINE_FACTORY(sockopt_args_ptr, sockopt_args *);
|
||||||
|
|||||||
Reference in New Issue
Block a user