* - vbuf handling
*/
/*
- * This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
+ * This file is
+ * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ *
+ * It is part of adns, which is
+ * Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ * Copyright (C) 1999 Tony Finch <dot@dotat.at>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*/
#include <stdlib.h>
-#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
return st;
}
+
#define SINFO(n,s) { adns_s_##n, #n, s }
static const struct sinfo {
SINFO( nomemory, "Out of memory" ),
SINFO( unknownrrtype, "Query not implemented in DNS library" ),
+ SINFO( systemfail, "General resolver or system failure" ),
SINFO( timeout, "DNS query timed out" ),
SINFO( allservfail, "All nameservers failed" ),
SINFO( rcodeunknown, "Nameserver sent unknown response code" ),
SINFO( inconsistent, "Inconsistent resource records in DNS" ),
- SINFO( prohibitedcname, "DNS data refers to an alias" ),
+ SINFO( prohibitedcname, "DNS alias found where canonical name wanted" ),
SINFO( answerdomaininvalid, "Found syntactically invalid domain name" ),
SINFO( answerdomaintoolong, "Found overly-long domain name" ),
SINFO( invaliddata, "Found invalid DNS data" ),
SINFO( querydomaintoolong, "Domain name is too long" ),
SINFO( nxdomain, "No such domain" ),
- SINFO( nodata, "No such data" ),
+ SINFO( nodata, "No such data" )
};
static int si_compar(const void *key, const void *elem) {
return si->abbrev;
}
+
+#define STINFO(max) { adns_s_max_##max, #max }
+
+static const struct stinfo {
+ adns_status stmax;
+ const char *abbrev;
+} stinfos[]= {
+ { adns_s_ok, "ok" },
+ STINFO( localfail ),
+ STINFO( remotefail ),
+ STINFO( tempfail ),
+ STINFO( misconfig ),
+ STINFO( misquery ),
+ STINFO( permfail )
+};
+
+static int sti_compar(const void *key, const void *elem) {
+ const adns_status *st= key;
+ const struct stinfo *sti= elem;
+
+ adns_status here, min, max;
+
+ here= *st;
+ min= (sti==stinfos) ? 0 : sti[-1].stmax+1;
+ max= sti->stmax;
+
+ return here < min ? -1 : here > max ? 1 : 0;
+}
+
+const char *adns_errtypeabbrev(adns_status st) {
+ const struct stinfo *sti;
+
+ sti= bsearch(&st,stinfos,sizeof(stinfos)/sizeof(*stinfos),sizeof(*stinfos),sti_compar);
+ return sti->abbrev;
+}
+
+
void adns__isort(void *array, int nobjs, int sz, void *tempbuf,
int (*needswap)(void *context, const void *a, const void *b),
void *context) {