-fix compiler warning
[oweals/gnunet.git] / src / util / test_resolver_api.c
index 5802370e3fc529d2c07679daa55baadacada0fb7..f968b6b49b0fed44fea15d0e9a96c8c9a057fb5b 100644 (file)
@@ -1,10 +1,10 @@
 /*
  This file is part of GNUnet.
 /*
  This file is part of GNUnet.
- (C) 2009 Christian Grothoff (and other contributing authors)
Copyright (C) 2009 Christian Grothoff (and other contributing authors)
 
  GNUnet is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published
 
  GNUnet is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
+ by the Free Software Foundation; either version 3, or (at your
  option) any later version.
 
  GNUnet is distributed in the hope that it will be useful, but
  option) any later version.
 
  GNUnet is distributed in the hope that it will be useful, but
 
  You should have received a copy of the GNU General Public License
  along with GNUnet; see the file COPYING.  If not, write to the
 
  You should have received a copy of the GNU General Public License
  along with GNUnet; see the file COPYING.  If not, write to the
- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
  */
 /**
  * @file resolver/test_resolver_api.c
  * @brief testcase for resolver_api.c
  */
 #include "platform.h"
  */
 /**
  * @file resolver/test_resolver_api.c
  * @brief testcase for resolver_api.c
  */
 #include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_getopt_lib.h"
-#include "gnunet_os_lib.h"
-#include "gnunet_program_lib.h"
-#include "gnunet_scheduler_lib.h"
+#include "gnunet_util_lib.h"
 #include "gnunet_resolver_service.h"
 #include "resolver.h"
 
 #include "gnunet_resolver_service.h"
 #include "resolver.h"
 
-#define VERBOSE GNUNET_NO
 
 
-/** 
+static int disable_rootserver_check;
+
+
+/**
  * Using DNS root servers to check gnunet's resolver service
  * a.root-servers.net <-> 198.41.0.4 is a fix 1:1 mapping that should not change over years
  * For more information have a look at IANA's website http://www.root-servers.org/
  * Using DNS root servers to check gnunet's resolver service
  * a.root-servers.net <-> 198.41.0.4 is a fix 1:1 mapping that should not change over years
  * For more information have a look at IANA's website http://www.root-servers.org/
 #define ROOTSERVER_NAME "a.root-servers.net"
 #define ROOTSERVER_IP  "198.41.0.4"
 
 #define ROOTSERVER_NAME "a.root-servers.net"
 #define ROOTSERVER_IP  "198.41.0.4"
 
+
 static void
 static void
-check_hostname(void *cls, const struct sockaddr *sa, socklen_t salen)
+check_hostname (void *cls,
+                const struct sockaddr *sa,
+                socklen_t salen)
 {
   int *ok = cls;
 
 {
   int *ok = cls;
 
-  if (salen == 0)
-    {
-      (*ok) &= ~8;
-      return;
-    }
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO, _("Got IP address `%s' for our host.\n"),
-      GNUNET_a2s(sa, salen));
+  if (0 == salen)
+  {
+    (*ok) &= ~8;
+    return;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Got IP address `%s' for our host.\n",
+              GNUNET_a2s (sa, salen));
 }
 
 }
 
+
 static void
 static void
-check_localhost_num(void *cls, const char *hostname)
+check_localhost_num (void *cls,
+                     const char *hostname)
 {
   int *ok = cls;
 {
   int *ok = cls;
+
   if (hostname == NULL)
     return;
   if (hostname == NULL)
     return;
-  if (0 == strcmp(hostname, "127.0.0.1"))
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-          "Received correct hostname `%s'.\n", hostname);
-#endif
-      (*ok) &= ~4;
-    }
+  if (0 == strcmp (hostname, "127.0.0.1"))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Received correct hostname `%s'.\n",
+                hostname);
+    (*ok) &= ~4;
+  }
   else
   else
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-          "Received invalid hostname `%s'.\n", hostname);
-#endif
-      GNUNET_break(0);
-    }
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Received invalid hostname `%s'.\n",
+                hostname);
+    GNUNET_break (0);
+  }
 }
 
 }
 
+
 static void
 static void
-check_localhost(void *cls, const char *hostname)
+check_localhost (void *cls,
+                 const char *hostname)
 {
   int *ok = cls;
 {
   int *ok = cls;
-  if (hostname == NULL)
+
+  if (NULL == hostname)
     return;
     return;
-  if (0 == strcmp(hostname, "localhost"))
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-          "Received correct hostname `%s'.\n", hostname);
-#endif
-      (*ok) &= ~2;
-    }
+  if (0 == strcmp (hostname, "localhost"))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Received correct hostname `%s'.\n",
+                hostname);
+    (*ok) &= ~2;
+  }
   else
   else
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-          "Received invalid hostname `%s'.\n", hostname);
-#endif
-      GNUNET_break(0);
-    }
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Received unexpected hostname `%s', expected `localhost' (this could be OK).\n",
+                hostname);
+  }
 }
 
 }
 
+
 static void
 static void
-check_127(void *cls, const struct sockaddr *sa, socklen_t salen)
+check_127 (void *cls, const struct sockaddr *sa, socklen_t salen)
 {
   int *ok = cls;
   const struct sockaddr_in *sai = (const struct sockaddr_in *) sa;
 
 {
   int *ok = cls;
   const struct sockaddr_in *sai = (const struct sockaddr_in *) sa;
 
-  if (sa == NULL)
+  if (NULL == sa)
     return;
     return;
-  GNUNET_assert(sizeof(struct sockaddr_in) == salen);
-  if (sai->sin_addr.s_addr == htonl(INADDR_LOOPBACK))
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received correct address.\n");
-#endif
-      (*ok) &= ~1;
-    }
+  GNUNET_assert (sizeof (struct sockaddr_in) == salen);
+  if (sai->sin_addr.s_addr == htonl (INADDR_LOOPBACK))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Received correct address.\n");
+    (*ok) &= ~1;
+  }
   else
   else
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received incorrect address.\n");
-#endif
-      GNUNET_break(0);
-    }
+  {
+    char buf[INET_ADDRSTRLEN];
+
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Received incorrect address `%s'.\n",
+               inet_ntop (AF_INET,
+                           &sai->sin_addr,
+                           buf,
+                           sizeof (buf)));
+    GNUNET_break (0);
+  }
 }
 
 }
 
+
 static void
 static void
-check_rootserver_ip(void *cls, const struct sockaddr *sa, socklen_t salen)
+check_rootserver_ip (void *cls, const struct sockaddr *sa, socklen_t salen)
 {
   int *ok = cls;
   const struct sockaddr_in *sai = (const struct sockaddr_in *) sa;
 
 {
   int *ok = cls;
   const struct sockaddr_in *sai = (const struct sockaddr_in *) sa;
 
-  if (sa == NULL)
+  if (NULL == sa)
     return;
     return;
-  GNUNET_assert(sizeof(struct sockaddr_in) == salen);
-
-  if (0 == strcmp(inet_ntoa(sai->sin_addr), ROOTSERVER_IP))
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received correct rootserver ip address.\n");
-#endif
-      (*ok) &= ~1;
-    }
+  GNUNET_assert (sizeof (struct sockaddr_in) == salen);
+
+  if (0 == strcmp (inet_ntoa (sai->sin_addr), ROOTSERVER_IP))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Received correct rootserver ip address.\n");
+    (*ok) &= ~1;
+  }
   else
   else
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received incorrect rootserver ip address.\n");
-#endif
-      GNUNET_break(0);
-    }
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Received incorrect rootserver ip address.\n");
+    GNUNET_break (0);
+  }
 }
 
 }
 
+
 static void
 static void
-check_rootserver_name(void *cls, const char *hostname)
+check_rootserver_name (void *cls,
+                       const char *hostname)
 {
   int *ok = cls;
 {
   int *ok = cls;
-  if (hostname == NULL)
+
+  if (NULL == hostname)
     return;
 
     return;
 
-  if (0 == strcmp(hostname, ROOTSERVER_NAME))
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-          "Received correct rootserver hostname `%s'.\n", hostname);
-#endif
-      (*ok) &= ~2;
-    }
+  if (0 == strcmp (hostname, ROOTSERVER_NAME))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Received correct rootserver hostname `%s'.\n",
+                hostname);
+    (*ok) &= ~2;
+  }
   else
   else
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-          "Received invalid rootserver hostname `%s'.\n", hostname);
-#endif
-      GNUNET_break(0);
-    }
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Received invalid rootserver hostname `%s', expected `%s'\n",
+                hostname,
+                ROOTSERVER_NAME);
+    GNUNET_break (disable_rootserver_check);
+  }
 }
 
 }
 
+
 static void
 static void
-run(void *cls, struct GNUNET_SCHEDULER_Handle *sched, char * const *args,
-    const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
+run (void *cls, char *const *args, const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
 {
+  int *ok = cls;
   struct sockaddr_in sa;
   struct sockaddr_in sa;
-  struct GNUNET_TIME_Relative timeout = GNUNET_TIME_relative_multiply(
-      GNUNET_TIME_UNIT_MILLISECONDS, 2500);
+  struct GNUNET_TIME_Relative timeout =
+      GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30);
   int count_ips = 0;
   int count_ips = 0;
+  char *own_fqdn;
+  const char *rootserver_name = ROOTSERVER_NAME;
+  struct hostent *rootserver;
+  struct in_addr rootserver_addr;
 
 
-  memset(&sa, 0, sizeof(sa));
+  memset (&sa, 0, sizeof (sa));
   sa.sin_family = AF_INET;
   sa.sin_family = AF_INET;
-  sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-  GNUNET_RESOLVER_ip_get(sched, cfg, "localhost", AF_INET, timeout, &check_127,
-      cls);
-  GNUNET_RESOLVER_hostname_get(sched, cfg, (const struct sockaddr *) &sa,
-      sizeof(struct sockaddr), GNUNET_YES, timeout, &check_localhost, cls);
-  GNUNET_RESOLVER_hostname_get(sched, cfg, (const struct sockaddr *) &sa,
-      sizeof(struct sockaddr), GNUNET_NO, timeout, &check_localhost_num, cls);
-  GNUNET_RESOLVER_hostname_resolve(sched, cfg, AF_UNSPEC, timeout,
-      &check_hostname, cls);
+#if HAVE_SOCKADDR_IN_SIN_LEN
+  sa.sin_len = (u_char) sizeof (sa);
+#endif
+  sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+  /*
+   * Looking up our own fqdn
+   */
+  own_fqdn = GNUNET_RESOLVER_local_fqdn_get ();
+  /* can't really check, only thing we can safely
+     compare against is our own identical logic... */
+  GNUNET_free_non_null (own_fqdn);
+
   /*
    * Testing non-local DNS resolution
    * DNS rootserver to test: a.root-servers.net - 198.41.0.4
    */
 
   /*
    * Testing non-local DNS resolution
    * DNS rootserver to test: a.root-servers.net - 198.41.0.4
    */
 
-  char const * rootserver_name = ROOTSERVER_NAME;
-  struct hostent *rootserver;
-
-  rootserver = gethostbyname(rootserver_name);
-  if (rootserver == NULL)
-    {
-      /* Error: resolving ip addresses does not work */
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-          _("gethostbyname() could not lookup IP address: %s\n"),
-          hstrerror (h_errno));
-#endif
-      GNUNET_break(0);
-      return;
-    }
+  rootserver = gethostbyname (rootserver_name);
+  if (NULL == rootserver)
+  {
+    /* Error: resolving ip addresses does not work */
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("gethostbyname() could not lookup IP address: %s\n"),
+                hstrerror (h_errno));
+    FPRINTF (stderr,
+             "%s",
+             "System seems to be off-line, will not run all DNS tests\n");
+    *ok = 0;                    /* mark test as passing anyway */
+    return;
+  }
 
   /* Counting returned IP addresses */
 
   /* Counting returned IP addresses */
-  while (rootserver->h_addr_list[count_ips] != NULL)
+  while (NULL != rootserver->h_addr_list[count_ips])
     count_ips++;
   if (count_ips > 1)
     count_ips++;
   if (count_ips > 1)
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "IP received range for root name server, but a root name server has only 1 IP\n");
-#endif
-      GNUNET_break(0);
-    }
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "IP received range for root name server, but a root name server has only 1 IP\n");
+    GNUNET_break (0);
+  }
 
   /* Comparing to resolved address to the address the root name server should have */
 
   /* Comparing to resolved address to the address the root name server should have */
-  if (strcmp(inet_ntoa(*(struct in_addr *) rootserver->h_addr_list[0]),
-      ROOTSERVER_IP) != 0)
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "IP received and IP for root name server differ\n");
-#endif
-      GNUNET_break(0);
-    }
-#if DEBUG_RESOLVER
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "System's own forward name resolution is working\n");
-#endif
-
+  if (0 !=
+      strcmp (inet_ntoa (*(struct in_addr *) rootserver->h_addr_list[0]),
+              ROOTSERVER_IP))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "IP received and IP for root name server differ\n");
+    GNUNET_break (0);
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "System's own forward name resolution is working\n");
   /* Resolve the same using GNUNET */
   /* Resolve the same using GNUNET */
-  GNUNET_RESOLVER_ip_get(sched, cfg, ROOTSERVER_NAME, AF_INET, timeout,
-      &check_rootserver_ip, cls);
+  GNUNET_RESOLVER_ip_get (ROOTSERVER_NAME, AF_INET, timeout,
+                          &check_rootserver_ip, cls);
 
   /*
    * Success: forward lookups work as expected
    * Next step: reverse lookups
    */
 
   /*
    * Success: forward lookups work as expected
    * Next step: reverse lookups
    */
-
-  struct in_addr rootserver_addr;
-  rootserver->h_name = "";
-  if (1 != inet_pton(AF_INET, ROOTSERVER_IP, &rootserver_addr))
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Could not transform root name server IP address\n");
-#endif
-      GNUNET_break(0);
-    }
-
-  rootserver
-      = gethostbyaddr(&rootserver_addr, sizeof(rootserver_addr), AF_INET);
-  if (rootserver == NULL)
+  if (1 != inet_pton (AF_INET,
+                      ROOTSERVER_IP,
+                      &rootserver_addr))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Could not transform root name server IP address\n");
+    GNUNET_break (0);
+  }
+
+  rootserver =
+      gethostbyaddr ((const void *) &rootserver_addr,
+                     sizeof (rootserver_addr),
+                     AF_INET);
+  if (NULL == rootserver)
+  {
+    /* Error: resolving IP addresses does not work */
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "gethostbyaddr() could not lookup hostname: %s\n",
+                hstrerror (h_errno));
+    disable_rootserver_check = GNUNET_YES;
+  }
+  else
+  {
+    if (0 != strcmp (rootserver->h_name,
+                     ROOTSERVER_NAME))
     {
     {
-      /* Error: resolving ip addresses does not work */
-#if DEBUG_RESOLVER
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-          _("gethostbyaddr() could not lookup hostname: %s\n"),
-          hstrerror (h_errno));
-#endif
-      GNUNET_break(0);
+                  "Received hostname and hostname for root name server differ\n");
+      disable_rootserver_check = GNUNET_YES;
     }
     }
+  }
 
 
-  if (0 != strcmp(rootserver->h_name, ROOTSERVER_NAME))
-    {
-#if DEBUG_RESOLVER
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received hostname and hostname for root name server differ\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "System's own reverse name resolution is working\n");
+  /* Resolve the same using GNUNET */
+  memset (&sa, 0, sizeof (sa));
+  sa.sin_family = AF_INET;
+#if HAVE_SOCKADDR_IN_SIN_LEN
+  sa.sin_len = (u_char) sizeof (sa);
 #endif
 #endif
-      GNUNET_break(0);
-    }
-
-#if DEBUG_RESOLVER
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "System's own reverse name resolution is working\n");
+#ifndef MINGW
+  inet_aton (ROOTSERVER_IP, &sa.sin_addr);
+#else
+  sa.sin_addr.S_un.S_addr = inet_addr (ROOTSERVER_IP);
 #endif
 #endif
-  /* Resolve the same using GNUNET */
+  GNUNET_RESOLVER_hostname_get ((const struct sockaddr *) &sa,
+                                sizeof (struct sockaddr), GNUNET_YES, timeout,
+                                &check_rootserver_name, cls);
 
 
-  memset(&sa, 0, sizeof(sa));
+  memset (&sa, 0, sizeof (sa));
   sa.sin_family = AF_INET;
   sa.sin_family = AF_INET;
-  inet_aton(ROOTSERVER_IP, &sa.sin_addr);
+#if HAVE_SOCKADDR_IN_SIN_LEN
+  sa.sin_len = (u_char) sizeof (sa);
+#endif
+  sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+  GNUNET_RESOLVER_ip_get ("localhost", AF_INET, timeout, &check_127, cls);
+  GNUNET_RESOLVER_hostname_get ((const struct sockaddr *) &sa,
+                                sizeof (struct sockaddr), GNUNET_YES, timeout,
+                                &check_localhost, cls);
+
+  GNUNET_RESOLVER_hostname_get ((const struct sockaddr *) &sa,
+                                sizeof (struct sockaddr), GNUNET_NO, timeout,
+                                &check_localhost_num, cls);
+  GNUNET_RESOLVER_hostname_resolve (AF_UNSPEC, timeout, &check_hostname, cls);
 
 
-  GNUNET_RESOLVER_hostname_get(sched, cfg, (const struct sockaddr *) &sa,
-      sizeof(struct sockaddr), GNUNET_YES, timeout, &check_rootserver_name, cls);
 }
 
 }
 
-static int
-check()
+
+int
+main (int argc, char *argv[])
 {
   int ok = 1 + 2 + 4 + 8;
   char *fn;
 {
   int ok = 1 + 2 + 4 + 8;
   char *fn;
-  char *pfx;
-  pid_t pid;
-  char * const argv[] =
-    { "test-resolver-api", "-c", "test_resolver_api_data.conf",
-#if VERBOSE
-        "-L", "DEBUG",
-#endif
-        NULL };
+  struct GNUNET_OS_Process *proc;
+  char *const argvx[] = {
+    "test-resolver-api", "-c", "test_resolver_api_data.conf", NULL
+  };
   struct GNUNET_GETOPT_CommandLineOption options[] =
   struct GNUNET_GETOPT_CommandLineOption options[] =
-    { GNUNET_GETOPT_OPTION_END };
-  pfx = GNUNET_OS_installation_get_path(GNUNET_OS_IPK_BINDIR);
-  GNUNET_asprintf(&fn, "%s%cgnunet-service-resolver", pfx, DIR_SEPARATOR);
-  GNUNET_free(pfx);
-  pid = GNUNET_OS_start_process(NULL, NULL, fn, "gnunet-service-resolver",
-#if VERBOSE
-      "-L", "DEBUG",
-#endif
-      "-c", "test_resolver_api_data.conf", NULL);
-  GNUNET_free(fn);
-  GNUNET_assert(GNUNET_OK == GNUNET_PROGRAM_run((sizeof(argv) / sizeof(char *))
-      - 1, argv, "test-resolver-api", "nohelp", options, &run, &ok));
-  if (0 != PLIBC_KILL(pid, SIGTERM))
-    {
-      GNUNET_log_strerror(GNUNET_ERROR_TYPE_WARNING, "kill");
-      ok = 1;
-    }
-  GNUNET_OS_process_wait(pid);
-  if (ok != 0)
-    fprintf(stderr, "Missed some resolutions: %u\n", ok);
+      { GNUNET_GETOPT_OPTION_END };
+
+  GNUNET_log_setup ("test-resolver-api",
+                    "WARNING",
+                    NULL);
+  fn = GNUNET_OS_get_libexec_binary_path ("gnunet-service-resolver");
+  proc = GNUNET_OS_start_process (GNUNET_YES,
+                                 GNUNET_OS_INHERIT_STD_OUT_AND_ERR,
+                                 NULL, NULL, NULL,
+                                  fn,
+                                 "gnunet-service-resolver",
+                                  "-c", "test_resolver_api_data.conf", NULL);
+  GNUNET_assert (NULL != proc);
+  GNUNET_free (fn);
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_PROGRAM_run ((sizeof (argvx) / sizeof (char *)) - 1,
+                                     argvx, "test-resolver-api", "nohelp",
+                                     options, &run, &ok));
+  if (0 != GNUNET_OS_process_kill (proc, GNUNET_TERM_SIG))
+  {
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
+    ok = 1;
+  }
+  GNUNET_OS_process_wait (proc);
+  GNUNET_OS_process_destroy (proc);
+  proc = NULL;
+  if (0 != ok)
+    FPRINTF (stderr, "Missed some resolutions: %u\n", ok);
   return ok;
 }
 
   return ok;
 }
 
-int
-main(int argc, char *argv[])
-{
-  int ret;
-
-  GNUNET_log_setup("test-resolver-api",
-#if VERBOSE
-      "DEBUG",
-#else
-      "WARNING",
-#endif
-      NULL);
-  ret = check();
-
-  return ret;
-}
 
 /* end of test_resolver_api.c */
 
 /* end of test_resolver_api.c */