1 /* $OpenBSD: util.c,v 1.6 2026/03/02 19:28:01 rsadowski Exp $ */
4 * Copyright (c) 2006 - 2015 Reyk Floeter <reyk@openbsd.org>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
20 #include <sys/socket.h>
33 host_error(enum host_error he)
42 case HCE_INTERVAL_TIMEOUT:
43 return ("interval timeout");
48 case HCE_ICMP_READ_TIMEOUT:
49 return ("icmp read timeout");
51 case HCE_ICMP_WRITE_TIMEOUT:
52 return ("icmp write timeout");
54 case HCE_TCP_SOCKET_ERROR:
55 return ("tcp socket error");
57 case HCE_TCP_SOCKET_LIMIT:
58 return ("tcp socket limit");
60 case HCE_TCP_SOCKET_OPTION:
61 return ("tcp socket option");
63 case HCE_TCP_CONNECT_FAIL:
64 return ("tcp connect failed");
66 case HCE_TCP_CONNECT_TIMEOUT:
67 return ("tcp connect timeout");
69 case HCE_TCP_CONNECT_OK:
70 return ("tcp connect ok");
72 case HCE_TCP_WRITE_TIMEOUT:
73 return ("tcp write timeout");
75 case HCE_TCP_WRITE_FAIL:
76 return ("tcp write failed");
78 case HCE_TCP_READ_TIMEOUT:
79 return ("tcp read timeout");
81 case HCE_TCP_READ_FAIL:
82 return ("tcp read failed");
88 return ("script failed");
90 case HCE_TLS_CONNECT_OK:
91 return ("tls connect ok");
93 case HCE_TLS_CONNECT_FAIL:
94 return ("tls connect failed");
96 case HCE_TLS_CONNECT_TIMEOUT:
97 return ("tls connect timeout");
99 case HCE_TLS_CONNECT_ERROR:
100 return ("tls connect error");
102 case HCE_TLS_READ_TIMEOUT:
103 return ("tls read timeout");
105 case HCE_TLS_WRITE_TIMEOUT:
106 return ("tls write timeout");
108 case HCE_TLS_READ_ERROR:
109 return ("tls read error");
111 case HCE_TLS_WRITE_ERROR:
112 return ("tls write error");
114 case HCE_SEND_EXPECT_FAIL:
115 return ("send/expect failed");
117 case HCE_SEND_EXPECT_OK:
118 return ("send/expect ok");
120 case HCE_HTTP_CODE_ERROR:
121 return ("http code malformed");
123 case HCE_HTTP_CODE_FAIL:
124 return ("http code mismatch");
126 case HCE_HTTP_CODE_OK:
127 return ("http code ok");
129 case HCE_HTTP_DIGEST_ERROR:
130 return ("http digest malformed");
132 case HCE_HTTP_DIGEST_FAIL:
133 return ("http digest mismatch");
135 case HCE_HTTP_DIGEST_OK:
136 return ("http digest ok");
144 host_status(enum host_status status)
159 table_check(enum table_check check)
168 case CHECK_HTTP_CODE:
169 return ("http code");
170 case CHECK_HTTP_DIGEST:
171 return ("http digest");
172 case CHECK_BINSEND_EXPECT:
173 case CHECK_SEND_EXPECT:
174 return ("send expect");
184 relay_state(enum relay_state state)
191 case STATE_PRECONNECT:
192 return ("preconnect");
193 case STATE_CONNECTED:
194 return ("connected");
206 print_availability(u_long cnt, u_long up)
208 static char buf[BUFSIZ];
212 bzero(buf, sizeof(buf));
213 snprintf(buf, sizeof(buf), "%.2f%%", (double)up / cnt * 100);
218 print_host(struct sockaddr_storage *ss, char *buf, size_t len)
220 if (getnameinfo((struct sockaddr *)ss, ss->ss_len,
221 buf, len, NULL, 0, NI_NUMERICHOST) != 0) {
229 print_time(struct timeval *a, struct timeval *b, char *buf, size_t len)
236 sec = tv.tv_sec % 60;
237 min = tv.tv_sec / 60 % 60;
238 h = tv.tv_sec / 60 / 60;
240 snprintf(buf, len, "%.2lu:%.2lu:%.2lu", h, min, sec);
245 printb_flags(const u_int32_t v, const char *bits)
247 static char buf[2][BUFSIZ];
252 p = r = buf[++idx % 2];
257 while ((i = *bits++)) {
258 if (v & (1 << (i - 1))) {
264 for (; (c = *bits) > 32; bits++) {
268 *p++ = tolower((u_char)c);
271 for (; *bits > 32; bits++)
280 getmonotime(struct timeval *tv)
284 if (clock_gettime(CLOCK_MONOTONIC, &ts))
285 fatal("clock_gettime");
287 TIMESPEC_TO_TIMEVAL(tv, &ts);
291 string2binary(const char *string)
293 struct ibuf *ibuf = NULL;
297 len = strlen(string);
300 if ((ibuf = ibuf_open(len / 2)) == NULL)
305 for (i = 0; i < 2; i++) {
309 else if (islower(ch))
311 else if (isupper(ch))
319 if (ibuf_add_n8(ibuf, r) == -1)
332 print_hex(uint8_t *buf, off_t offset, size_t length)
336 if (log_getverbose() < 3 || !length)
339 for (i = 0; i < length; i++) {
340 if (i && (i % 4) == 0) {
346 print_debug("%02x", buf[offset + i]);
352 print_debug(const char *emsg, ...)
356 if (log_getverbose() > 2) {
358 vfprintf(stderr, emsg, ap);