+
+# if TEST_ASYNC_NETDB
+ /*
+ For extremely mysterious reasons, setuid apparently causes
+ pthread_join(3) to deadlock.
+ A rough guess at the sequence of events:
+ 1. Worker thread is created.
+ 2. Worker thread exits.
+ 3. setuid(getuid()) is called.
+ 4. pthread_join is called slightly later.
+
+ This may have something to do with glibc's use of SIGSETXID.
+ */
+
+ putc ('\n', stderr);
+
+# if !ASYNC_NETDB_USE_GAI
+ fputs ("Warning: getaddrinfo() was not available at compile time.\n", stderr);
+# endif
+
+ {
+ static const unsigned long addresses[] =
+ {
+ INADDR_LOOPBACK,
+ 0x00010203,
+ 0x08080808
+ };
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = 0;
+ addr.sin_addr.s_addr = htonl (addresses[random () % 3]);
+
+ sp->query0 = async_name_from_addr_start (MI_DISPLAY (mi), (void *)&addr,
+ sizeof(addr));
+ assert (sp->query0);
+ if (sp->query0)
+ {
+ fputs ("Looking up hostname from address: ", stderr);
+ _print_sockaddr (&addr, sizeof(addr), stderr);
+# if ASYNC_NETDB_USE_GAI
+ fputs (" @ ", stderr);
+ _print_thread (sp->query0->io.thread, stderr);
+# endif
+ putc ('\n', stderr);
+ }
+
+ if (!(random () & 3))
+ {
+ fputs ("Aborted hostname lookup (early)\n", stderr);
+ async_name_from_addr_cancel (sp->query0);
+ sp->query0 = NULL;
+ }
+ }
+
+ {
+ static const char *const hosts[] =
+ {
+ "example.com",
+ "invalid",
+ "ip6-localhost"
+ };
+ const char *host = hosts[random () % 3];
+
+ sp->query1 = async_addr_from_name_start (MI_DISPLAY(mi), host);
+
+ assert (sp->query1);
+
+ fprintf (stderr, "Looking up address from hostname: %s", host);
+# if ASYNC_NETDB_USE_GAI
+ fputs (" @ ", stderr);
+ _print_thread (sp->query1->io.thread, stderr);
+# endif
+ putc ('\n', stderr);
+
+ if (!(random () & 3))
+ {
+ fputs ("Aborted address lookup (early)\n", stderr);
+ async_addr_from_name_cancel (sp->query1);
+ sp->query1 = NULL;
+ }
+ }
+
+ fflush (stderr);
+# endif