From f18d4e1e459bbd4ffddbf2e0c9f860704b2a2f30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sun, 1 Apr 2007 12:14:20 +0000 Subject: [PATCH] Traceroute: use new SIOCGETRT to obtain the source address to be used when communicating with the destination, patch by Hugo Santos. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20496 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/bin/network/traceroute/Jamfile | 2 +- src/bin/network/traceroute/findsaddr-haiku.c | 49 ++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/bin/network/traceroute/findsaddr-haiku.c diff --git a/src/bin/network/traceroute/Jamfile b/src/bin/network/traceroute/Jamfile index 2220b626a9..5ff8cc397e 100644 --- a/src/bin/network/traceroute/Jamfile +++ b/src/bin/network/traceroute/Jamfile @@ -17,7 +17,7 @@ SubDirCcFlags $(defines) ; SubDirC++Flags $(defines) ; BinCommand traceroute : - findsaddr-generic.c + findsaddr-haiku.c ifaddrlist.c traceroute.c version.c diff --git a/src/bin/network/traceroute/findsaddr-haiku.c b/src/bin/network/traceroute/findsaddr-haiku.c new file mode 100644 index 0000000000..ab2ee8bde6 --- /dev/null +++ b/src/bin/network/traceroute/findsaddr-haiku.c @@ -0,0 +1,49 @@ +/* + * Copyright 2007, Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Hugo Santos + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "findsaddr.h" + // is not self containing... + + +const char * +findsaddr(const struct sockaddr_in *to, struct sockaddr_in *from) +{ + uint8_t buffer[256]; + struct route_entry *request = (struct route_entry *)buffer; + + int sock = socket(AF_INET, SOCK_DGRAM, 0); + if (sock < 0) + return "socket() failed"; + + memset(request, 0, sizeof(struct route_entry)); + request->destination = (struct sockaddr *)to; + + if (ioctl(sock, SIOCGETRT, buffer, sizeof(buffer)) < 0) { + close(sock); + return "ioctl(SIOCGETRT) failed"; + } + + if (request->source != NULL && request->source->sa_family == AF_INET) + memcpy(from, request->source, sizeof(struct sockaddr_in)); + + close(sock); + + if (request->source == NULL || request->source->sa_family != AF_INET) + return "No address available"; + + return NULL; +}