1238106SdesIndex: smallapp/unbound-host.c
2238106Sdes===================================================================
3238106Sdes--- smallapp/unbound-host.c	(revision 2115)
4238106Sdes+++ smallapp/unbound-host.c	(working copy)
5238106Sdes@@ -62,9 +62,18 @@
6238106Sdes #include "libunbound/unbound.h"
7238106Sdes #include <ldns/ldns.h>
8238106Sdes 
9238106Sdes+/** status variable ala nagios */
10238106Sdes+#define FINAL_STATUS_OK		0
11238106Sdes+#define FINAL_STATUS_WARNING	1
12238106Sdes+#define FINAL_STATUS_CRITICAL	2
13238106Sdes+#define FINAL_STATUS_UNKNOWN	3
14238106Sdes+
15238106Sdes /** verbosity for unbound-host app */
16238106Sdes static int verb = 0;
17238106Sdes 
18238106Sdes+/** variable to determine final output */
19238106Sdes+static int final_status = FINAL_STATUS_UNKNOWN;
20238106Sdes+
21238106Sdes /** Give unbound-host usage, and exit (1). */
22238106Sdes static void
23238106Sdes usage()
24238106Sdes@@ -93,7 +102,7 @@
25238106Sdes 	printf("Version %s\n", PACKAGE_VERSION);
26238106Sdes 	printf("BSD licensed, see LICENSE in source package for details.\n");
27238106Sdes 	printf("Report bugs to %s\n", PACKAGE_BUGREPORT);
28238106Sdes-	exit(1);
29238106Sdes+	exit(FINAL_STATUS_UNKNOWN);
30238106Sdes }
31238106Sdes 
32238106Sdes /** determine if str is ip4 and put into reverse lookup format */
33238106Sdes@@ -138,7 +147,7 @@
34238106Sdes 	*res = strdup(buf);
35238106Sdes 	if(!*res) {
36238106Sdes 		fprintf(stderr, "error: out of memory\n");
37238106Sdes-		exit(1);
38238106Sdes+		exit(FINAL_STATUS_UNKNOWN);
39238106Sdes 	}
40238106Sdes 	return 1;
41238106Sdes }
42238106Sdes@@ -158,7 +167,7 @@
43238106Sdes 	}
44238106Sdes 	if(!res) {
45238106Sdes 		fprintf(stderr, "error: out of memory\n");
46238106Sdes-		exit(1);
47238106Sdes+		exit(FINAL_STATUS_UNKNOWN);
48238106Sdes 	}
49238106Sdes 	return res;
50238106Sdes }
51238106Sdes@@ -172,7 +181,7 @@
52238106Sdes 		if(r == 0 && strcasecmp(t, "TYPE0") != 0 && 
53238106Sdes 			strcmp(t, "") != 0) {
54238106Sdes 			fprintf(stderr, "error unknown type %s\n", t);
55238106Sdes-			exit(1);
56238106Sdes+			exit(FINAL_STATUS_UNKNOWN);
57238106Sdes 		}
58238106Sdes 		return r;
59238106Sdes 	}
60238106Sdes@@ -191,7 +200,7 @@
61238106Sdes 		if(r == 0 && strcasecmp(c, "CLASS0") != 0 && 
62238106Sdes 			strcmp(c, "") != 0) {
63238106Sdes 			fprintf(stderr, "error unknown class %s\n", c);
64238106Sdes-			exit(1);
65238106Sdes+			exit(FINAL_STATUS_UNKNOWN);
66238106Sdes 		}
67238106Sdes 		return r;
68238106Sdes 	}
69238106Sdes@@ -207,6 +216,19 @@
70238106Sdes 	return "(insecure)";
71238106Sdes }
72238106Sdes 
73238106Sdes+/** update the final status for the exit code */
74238106Sdes+void
75238106Sdes+update_final_status(struct ub_result* result)
76238106Sdes+{
77238106Sdes+	if (final_status == FINAL_STATUS_UNKNOWN || final_status == FINAL_STATUS_OK) {
78238106Sdes+		if (result->secure) final_status = FINAL_STATUS_OK;
79238106Sdes+		else if (result->bogus) final_status = FINAL_STATUS_CRITICAL;
80238106Sdes+		else final_status = FINAL_STATUS_WARNING;
81238106Sdes+	}
82238106Sdes+	else if (final_status == FINAL_STATUS_WARNING && result->bogus)
83238106Sdes+		final_status = FINAL_STATUS_CRITICAL;
84238106Sdes+}
85238106Sdes+
86238106Sdes /** nice string for type */
87238106Sdes static void
88238106Sdes pretty_type(char* s, size_t len, int t)
89238106Sdes@@ -353,7 +375,7 @@
90238106Sdes 				} else {
91238106Sdes 					fprintf(stderr, "could not parse "
92238106Sdes 						"reply packet to ANY query\n");
93238106Sdes-					exit(1);
94238106Sdes+					exit(FINAL_STATUS_UNKNOWN);
95238106Sdes 				}
96238106Sdes 				ldns_pkt_free(p);
97238106Sdes 
98238106Sdes@@ -388,9 +410,10 @@
99238106Sdes 	ret = ub_resolve(ctx, q, t, c, &result);
100238106Sdes 	if(ret != 0) {
101238106Sdes 		fprintf(stderr, "resolve error: %s\n", ub_strerror(ret));
102238106Sdes-		exit(1);
103238106Sdes+		exit(FINAL_STATUS_UNKNOWN);
104238106Sdes 	}
105238106Sdes 	pretty_output(q, t, c, result, docname);
106238106Sdes+	update_final_status(result);
107238106Sdes 	ret = result->nxdomain;
108238106Sdes 	ub_resolve_free(result);
109238106Sdes 	return ret;
110238106Sdes@@ -427,7 +450,7 @@
111238106Sdes {
112238106Sdes 	if(r != 0) {
113238106Sdes 		fprintf(stderr, "error: %s\n", ub_strerror(r));
114238106Sdes-		exit(1);
115238106Sdes+		exit(FINAL_STATUS_UNKNOWN);
116238106Sdes 	}
117238106Sdes }
118238106Sdes 
119238106Sdes@@ -448,7 +471,7 @@
120238106Sdes 	ctx = ub_ctx_create();
121238106Sdes 	if(!ctx) {
122238106Sdes 		fprintf(stderr, "error: out of memory\n");
123238106Sdes-		exit(1);
124238106Sdes+		exit(FINAL_STATUS_UNKNOWN);
125238106Sdes 	}
126238106Sdes 
127238106Sdes 	/* parse the options */
128238106Sdes@@ -509,5 +532,5 @@
129238106Sdes 		usage();
130238106Sdes 
131238106Sdes 	lookup(ctx, argv[0], qtype, qclass);
132238106Sdes-	return 0;
133238106Sdes+	return final_status;
134238106Sdes }
135