1/*++
2/* NAME
3/*	dns_strerror 3
4/* SUMMARY
5/*	name service lookup error code to string
6/* SYNOPSIS
7/*	#include <dhs.h>
8/*
9/*	const char *dns_strerror(code)
10/*	int	code;
11/* DESCRIPTION
12/*	dns_strerror() maps a name service lookup error to printable string.
13/*	The result is for read-only purposes, and unknown codes share a
14/*	common string buffer.
15/* LICENSE
16/* .ad
17/* .fi
18/*	The Secure Mailer license must be distributed with this software.
19/* AUTHOR(S)
20/*	Wietse Venema
21/*	IBM T.J. Watson Research
22/*	P.O. Box 704
23/*	Yorktown Heights, NY 10598, USA
24/*--*/
25
26/* System library. */
27
28#include <sys_defs.h>
29#include <netdb.h>
30
31/* Utility library. */
32
33#include <vstring.h>
34
35/* DNS library. */
36
37#include "dns.h"
38
39 /*
40  * Mapping from error code to printable string. The herror() routine does
41  * something similar, but has output only to the stderr stream.
42  */
43struct dns_error_map {
44    unsigned error;
45    const char *text;
46};
47
48static struct dns_error_map dns_error_map[] = {
49    HOST_NOT_FOUND, "Host not found",
50    TRY_AGAIN, "Host not found, try again",
51    NO_RECOVERY, "Non-recoverable error",
52    NO_DATA, "Host found but no data record of requested type",
53};
54
55/* dns_strerror - map resolver error code to printable string */
56
57const char *dns_strerror(unsigned error)
58{
59    static VSTRING *unknown = 0;
60    unsigned i;
61
62    for (i = 0; i < sizeof(dns_error_map) / sizeof(dns_error_map[0]); i++)
63	if (dns_error_map[i].error == error)
64	    return (dns_error_map[i].text);
65    if (unknown == 0)
66	unknown = vstring_alloc(sizeof("Unknown error XXXXXX"));
67    vstring_sprintf(unknown, "Unknown error %u", error);
68    return (vstring_str(unknown));
69}
70