gnunet-resolver.c | gnunet-resolver.c | |||
---|---|---|---|---|
skipping to change at line 33 | skipping to change at line 33 | |||
* @brief tool to test resolver | * @brief tool to test resolver | |||
* @author Christian Grothoff | * @author Christian Grothoff | |||
*/ | */ | |||
#include "platform.h" | #include "platform.h" | |||
#include "gnunet_util_lib.h" | #include "gnunet_util_lib.h" | |||
#include "gnunet_resolver_service.h" | #include "gnunet_resolver_service.h" | |||
#define GET_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS , 1) | #define GET_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS , 1) | |||
/** | /** | |||
* Flag for reverse lookup. | ||||
*/ | ||||
static int reverse; | ||||
/** | ||||
* Prints each hostname obtained from DNS. | ||||
* | ||||
* @param cls closure (unused) | ||||
* @param hostname one of the names for the host, NULL | ||||
* on the last call to the callback | ||||
*/ | ||||
static void | ||||
print_hostname (void *cls, | ||||
const char *hostname) | ||||
{ | ||||
if (NULL == hostname) | ||||
return; | ||||
FPRINTF (stdout, "%s\n", hostname); | ||||
} | ||||
/** | ||||
* Callback function to display address. | * Callback function to display address. | |||
* | ||||
* @param cls closure (unused) | ||||
* @param addr one of the addresses of the host, NULL for the last address | ||||
* @param addrlen length of the address | ||||
*/ | */ | |||
static void | static void | |||
printer (void *cls, const struct sockaddr *addr, socklen_t addrlen) | print_sockaddr (void *cls, const struct sockaddr *addr, socklen_t addrlen) | |||
{ | { | |||
if (addr == NULL) | if (NULL == addr) | |||
return; | return; | |||
FPRINTF (stdout, "%s\n", GNUNET_a2s (addr, addrlen)); | FPRINTF (stdout, "%s\n", GNUNET_a2s (addr, addrlen)); | |||
} | } | |||
/** | /** | |||
* Main function that will be run by the scheduler. | * Main function that will be run by the scheduler. | |||
* | * | |||
* @param cls closure | * @param cls closure | |||
* @param args remaining command-line arguments | * @param args remaining command-line arguments | |||
* @param cfgfile name of the configuration file used (for saving, can be N ULL!) | * @param cfgfile name of the configuration file used (for saving, can be N ULL!) | |||
* @param cfg configuration | * @param cfg configuration | |||
*/ | */ | |||
static void | static void | |||
run (void *cls, char *const *args, const char *cfgfile, | run (void *cls, char *const *args, const char *cfgfile, | |||
const struct GNUNET_CONFIGURATION_Handle *cfg) | const struct GNUNET_CONFIGURATION_Handle *cfg) | |||
{ | { | |||
const struct sockaddr *sa; | ||||
socklen_t salen; | ||||
struct sockaddr_in v4; | ||||
struct sockaddr_in6 v6; | ||||
if (args[0] == NULL) | if (args[0] == NULL) | |||
return; | return; | |||
GNUNET_RESOLVER_ip_get (args[0], AF_UNSPEC, GET_TIMEOUT, &printer, NULL); | if (! reverse) | |||
{ | ||||
GNUNET_RESOLVER_ip_get (args[0], AF_UNSPEC, GET_TIMEOUT, &print_sockadd | ||||
r, NULL); | ||||
return; | ||||
} | ||||
sa = NULL; | ||||
memset (&v4, 0, sizeof (v4)); | ||||
v4.sin_family = AF_INET; | ||||
#if HAVE_SOCKADDR_IN_SIN_LEN | ||||
v4.sin_len = sizeof (v4); | ||||
#endif | ||||
if (1 == inet_pton (AF_INET, | ||||
args[0], | ||||
&v4.sin_addr)) | ||||
{ | ||||
sa = (struct sockaddr *) &v4; | ||||
salen = sizeof (v4); | ||||
} | ||||
memset (&v6, 0, sizeof (v6)); | ||||
v6.sin6_family = AF_INET6; | ||||
#if HAVE_SOCKADDR_IN_SIN_LEN | ||||
v6.sin6_len = sizeof (v6); | ||||
#endif | ||||
if (1 == inet_pton (AF_INET6, | ||||
args[0], | ||||
&v6.sin6_addr)) | ||||
{ | ||||
sa = (struct sockaddr *) &v6; | ||||
salen = sizeof (v6); | ||||
} | ||||
if (NULL == sa) | ||||
{ | ||||
fprintf (stderr, | ||||
"`%s' is not a valid IP: %s\n", | ||||
args[0], | ||||
strerror (errno)); | ||||
return; | ||||
} | ||||
GNUNET_RESOLVER_hostname_get (sa, salen, | ||||
GNUNET_YES, | ||||
GET_TIMEOUT, | ||||
&print_hostname, | ||||
NULL); | ||||
} | } | |||
/** | /** | |||
* The main function to obtain statistics in GNUnet. | * The main function to obtain statistics in GNUnet. | |||
* | * | |||
* @param argc number of arguments from the command line | * @param argc number of arguments from the command line | |||
* @param argv command line arguments | * @param argv command line arguments | |||
* @return 0 ok, 1 on error | * @return 0 ok, 1 on error | |||
*/ | */ | |||
int | int | |||
main (int argc, char *const *argv) | main (int argc, char *const *argv) | |||
{ | { | |||
static const struct GNUNET_GETOPT_CommandLineOption options[] = { | static const struct GNUNET_GETOPT_CommandLineOption options[] = { | |||
{ 'r', "reverse", NULL, | ||||
gettext_noop ("perform a reverse lookup"), | ||||
0, &GNUNET_GETOPT_set_one, &reverse }, | ||||
GNUNET_GETOPT_OPTION_END | GNUNET_GETOPT_OPTION_END | |||
}; | }; | |||
return (GNUNET_OK == | return (GNUNET_OK == | |||
GNUNET_PROGRAM_run (argc, argv, "gnunet-resolver [hostname]", | GNUNET_PROGRAM_run (argc, argv, "gnunet-resolver [hostname]", | |||
gettext_noop ("Test GNUnet DNS resolver code. "), | gettext_noop ("Use build-in GNUnet stub resol ver"), | |||
options, &run, NULL)) ? 0 : 1; | options, &run, NULL)) ? 0 : 1; | |||
} | } | |||
/* end of gnunet-resolver.c */ | /* end of gnunet-resolver.c */ | |||
End of changes. 8 change blocks. | ||||
4 lines changed or deleted | 81 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |