- client_freelist(ap);
- strncpy (response, "no servers available", len_response);
- return NOTOK;
-}
-
-
-/*
- * Free a list of strings
- */
-
-static void
-client_freelist(char **list)
-{
- while (*list++ != NULL)
- free(*list);
-}
-
-
-/*
- * static copies of three nmh subroutines
- */
-
-static char *broken[MAXARGS + 1];
-
-static char **
-client_brkstring (char *strg, char *brksep, char *brkterm)
-{
- register int bi;
- register char c, *sp;
-
- sp = strg;
-
- for (bi = 0; bi < MAXARGS; bi++) {
- while (client_brkany (c = *sp, brksep))
- *sp++ = 0;
- if (!c || client_brkany (c, brkterm)) {
- *sp = 0;
- broken[bi] = 0;
- return broken;
+ /*
+ * Improve error handling a bit. If we were given multiple IP addresses
+ * then return the old "no servers available" error, but point the user
+ * to -snoop (hopefully that's universal). Otherwise report a specific
+ * error.
+ */
+
+ if (res->ai_next)
+ snprintf(response, len_response, "no servers available (use -snoop "
+ "for details)");
+ else {
+ char port[NI_MAXSERV];
+
+ if (getnameinfo(res->ai_addr, res->ai_addrlen, NULL, 0, port,
+ sizeof port, NI_NUMERICSERV)) {
+ strncpy(port, "unknown", sizeof port);
+ port[sizeof(port) - 1] = '\0';