1*6a50f104Stb /* $OpenBSD: agentx_log.c,v 1.2 2020/10/26 16:02:16 tb Exp $ */
281180db9Smartijn /*
381180db9Smartijn * Copyright (c) 2020 Martijn van Duren <martijn@openbsd.org>
481180db9Smartijn *
581180db9Smartijn * Permission to use, copy, modify, and distribute this software for any
681180db9Smartijn * purpose with or without fee is hereby granted, provided that the above
781180db9Smartijn * copyright notice and this permission notice appear in all copies.
881180db9Smartijn *
981180db9Smartijn * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1081180db9Smartijn * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1181180db9Smartijn * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1281180db9Smartijn * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1381180db9Smartijn * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1481180db9Smartijn * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1581180db9Smartijn * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1681180db9Smartijn */
1781180db9Smartijn
1881180db9Smartijn #include <errno.h>
1981180db9Smartijn #include <stdarg.h>
2081180db9Smartijn #include <stdio.h>
2181180db9Smartijn #include <stdlib.h>
2281180db9Smartijn #include <string.h>
2381180db9Smartijn
2481180db9Smartijn #include "agentx_internal.h"
2581180db9Smartijn
2681180db9Smartijn #define AGENTX_CONTEXT_NAME(axc) (axc->axc_name_default ? "<default>" : \
2781180db9Smartijn (char *)axc->axc_name.aos_string)
2881180db9Smartijn #define AGENTX_GET_CTXNAME(axg) (axg->axg_context_default ? "<default>" : \
2981180db9Smartijn (char *)axg->axg_context.aos_string)
3081180db9Smartijn
3181180db9Smartijn enum agentx_log_type {
3281180db9Smartijn AGENTX_LOG_TYPE_FATAL,
3381180db9Smartijn AGENTX_LOG_TYPE_WARN,
3481180db9Smartijn AGENTX_LOG_TYPE_INFO,
3581180db9Smartijn AGENTX_LOG_TYPE_DEBUG
3681180db9Smartijn };
3781180db9Smartijn
3881180db9Smartijn void (*agentx_log_fatal)(const char *, ...)
3981180db9Smartijn __attribute__((__format__ (printf, 1, 2))) = NULL;
4081180db9Smartijn void (*agentx_log_warn)(const char *, ...)
4181180db9Smartijn __attribute__((__format__ (printf, 1, 2))) = NULL;
4281180db9Smartijn void (*agentx_log_info)(const char *, ...)
4381180db9Smartijn __attribute__((__format__ (printf, 1, 2))) = NULL;
4481180db9Smartijn void (*agentx_log_debug)(const char *, ...)
4581180db9Smartijn __attribute__((__format__ (printf, 1, 2))) = NULL;
4681180db9Smartijn
4781180db9Smartijn
4881180db9Smartijn static void
4981180db9Smartijn agentx_log_do(enum agentx_log_type, const char *, va_list, int,
5081180db9Smartijn struct agentx *, struct agentx_session *, struct agentx_context *,
5181180db9Smartijn struct agentx_get *);
5281180db9Smartijn
5381180db9Smartijn void
agentx_log_ax_fatalx(struct agentx * ax,const char * fmt,...)5481180db9Smartijn agentx_log_ax_fatalx(struct agentx *ax, const char *fmt, ...)
5581180db9Smartijn {
5681180db9Smartijn va_list ap;
5781180db9Smartijn
5881180db9Smartijn va_start(ap, fmt);
5981180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_FATAL, fmt, ap, 0, ax, NULL, NULL,
6081180db9Smartijn NULL);
6181180db9Smartijn va_end(ap);
6281180db9Smartijn abort();
6381180db9Smartijn }
6481180db9Smartijn
6581180db9Smartijn void
agentx_log_ax_warn(struct agentx * ax,const char * fmt,...)6681180db9Smartijn agentx_log_ax_warn(struct agentx *ax, const char *fmt, ...)
6781180db9Smartijn {
6881180db9Smartijn va_list ap;
6981180db9Smartijn
7081180db9Smartijn va_start(ap, fmt);
7181180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_WARN, fmt, ap, 1, ax, NULL, NULL,
7281180db9Smartijn NULL);
7381180db9Smartijn va_end(ap);
7481180db9Smartijn }
7581180db9Smartijn
7681180db9Smartijn void
agentx_log_ax_warnx(struct agentx * ax,const char * fmt,...)7781180db9Smartijn agentx_log_ax_warnx(struct agentx *ax, const char *fmt, ...)
7881180db9Smartijn {
7981180db9Smartijn va_list ap;
8081180db9Smartijn
8181180db9Smartijn va_start(ap, fmt);
8281180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_WARN, fmt, ap, 0, ax, NULL, NULL,
8381180db9Smartijn NULL);
8481180db9Smartijn va_end(ap);
8581180db9Smartijn }
8681180db9Smartijn
8781180db9Smartijn void
agentx_log_ax_info(struct agentx * ax,const char * fmt,...)8881180db9Smartijn agentx_log_ax_info(struct agentx *ax, const char *fmt, ...)
8981180db9Smartijn {
9081180db9Smartijn va_list ap;
9181180db9Smartijn
9281180db9Smartijn va_start(ap, fmt);
9381180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_INFO, fmt, ap, 0, ax, NULL, NULL,
9481180db9Smartijn NULL);
9581180db9Smartijn va_end(ap);
9681180db9Smartijn }
9781180db9Smartijn
9881180db9Smartijn void
agentx_log_ax_debug(struct agentx * ax,const char * fmt,...)9981180db9Smartijn agentx_log_ax_debug(struct agentx *ax, const char *fmt, ...)
10081180db9Smartijn {
10181180db9Smartijn va_list ap;
10281180db9Smartijn
10381180db9Smartijn va_start(ap, fmt);
10481180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_DEBUG, fmt, ap, 0, ax, NULL, NULL,
10581180db9Smartijn NULL);
10681180db9Smartijn va_end(ap);
10781180db9Smartijn }
10881180db9Smartijn
10981180db9Smartijn void
agentx_log_axs_fatalx(struct agentx_session * axs,const char * fmt,...)11081180db9Smartijn agentx_log_axs_fatalx(struct agentx_session *axs, const char *fmt, ...)
11181180db9Smartijn {
11281180db9Smartijn va_list ap;
11381180db9Smartijn
11481180db9Smartijn va_start(ap, fmt);
11581180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_FATAL, fmt, ap, 0, NULL, axs, NULL,
11681180db9Smartijn NULL);
11781180db9Smartijn va_end(ap);
11881180db9Smartijn abort();
11981180db9Smartijn }
12081180db9Smartijn
12181180db9Smartijn void
agentx_log_axs_warnx(struct agentx_session * axs,const char * fmt,...)12281180db9Smartijn agentx_log_axs_warnx(struct agentx_session *axs, const char *fmt, ...)
12381180db9Smartijn {
12481180db9Smartijn va_list ap;
12581180db9Smartijn
12681180db9Smartijn va_start(ap, fmt);
12781180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_WARN, fmt, ap, 0, NULL, axs, NULL,
12881180db9Smartijn NULL);
12981180db9Smartijn va_end(ap);
13081180db9Smartijn }
13181180db9Smartijn
13281180db9Smartijn void
agentx_log_axs_warn(struct agentx_session * axs,const char * fmt,...)13381180db9Smartijn agentx_log_axs_warn(struct agentx_session *axs, const char *fmt, ...)
13481180db9Smartijn {
13581180db9Smartijn va_list ap;
13681180db9Smartijn
13781180db9Smartijn va_start(ap, fmt);
13881180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_WARN, fmt, ap, 1, NULL, axs, NULL,
13981180db9Smartijn NULL);
14081180db9Smartijn va_end(ap);
14181180db9Smartijn }
14281180db9Smartijn
14381180db9Smartijn void
agentx_log_axs_info(struct agentx_session * axs,const char * fmt,...)14481180db9Smartijn agentx_log_axs_info(struct agentx_session *axs, const char *fmt, ...)
14581180db9Smartijn {
14681180db9Smartijn va_list ap;
14781180db9Smartijn
14881180db9Smartijn va_start(ap, fmt);
14981180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_INFO, fmt, ap, 0, NULL, axs, NULL,
15081180db9Smartijn NULL);
15181180db9Smartijn va_end(ap);
15281180db9Smartijn }
15381180db9Smartijn
15481180db9Smartijn void
agentx_log_axc_fatalx(struct agentx_context * axc,const char * fmt,...)15581180db9Smartijn agentx_log_axc_fatalx(struct agentx_context *axc, const char *fmt, ...)
15681180db9Smartijn {
15781180db9Smartijn va_list ap;
15881180db9Smartijn
15981180db9Smartijn va_start(ap, fmt);
16081180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_FATAL, fmt, ap, 0, NULL, NULL, axc,
16181180db9Smartijn NULL);
16281180db9Smartijn va_end(ap);
16381180db9Smartijn abort();
16481180db9Smartijn }
16581180db9Smartijn
16681180db9Smartijn void
agentx_log_axc_warnx(struct agentx_context * axc,const char * fmt,...)16781180db9Smartijn agentx_log_axc_warnx(struct agentx_context *axc, const char *fmt, ...)
16881180db9Smartijn {
16981180db9Smartijn va_list ap;
17081180db9Smartijn
17181180db9Smartijn va_start(ap, fmt);
17281180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_WARN, fmt, ap, 0, NULL, NULL, axc,
17381180db9Smartijn NULL);
17481180db9Smartijn va_end(ap);
17581180db9Smartijn }
17681180db9Smartijn
17781180db9Smartijn void
agentx_log_axc_warn(struct agentx_context * axc,const char * fmt,...)17881180db9Smartijn agentx_log_axc_warn(struct agentx_context *axc, const char *fmt, ...)
17981180db9Smartijn {
18081180db9Smartijn va_list ap;
18181180db9Smartijn
18281180db9Smartijn va_start(ap, fmt);
18381180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_WARN, fmt, ap, 1, NULL, NULL, axc,
18481180db9Smartijn NULL);
18581180db9Smartijn va_end(ap);
18681180db9Smartijn }
18781180db9Smartijn
18881180db9Smartijn void
agentx_log_axc_info(struct agentx_context * axc,const char * fmt,...)18981180db9Smartijn agentx_log_axc_info(struct agentx_context *axc, const char *fmt, ...)
19081180db9Smartijn {
19181180db9Smartijn va_list ap;
19281180db9Smartijn
19381180db9Smartijn va_start(ap, fmt);
19481180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_INFO, fmt, ap, 0, NULL, NULL, axc,
19581180db9Smartijn NULL);
19681180db9Smartijn va_end(ap);
19781180db9Smartijn }
19881180db9Smartijn
19981180db9Smartijn void
agentx_log_axc_debug(struct agentx_context * axc,const char * fmt,...)20081180db9Smartijn agentx_log_axc_debug(struct agentx_context *axc, const char *fmt, ...)
20181180db9Smartijn {
20281180db9Smartijn va_list ap;
20381180db9Smartijn
20481180db9Smartijn va_start(ap, fmt);
20581180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_DEBUG, fmt, ap, 0, NULL, NULL, axc,
20681180db9Smartijn NULL);
20781180db9Smartijn va_end(ap);
20881180db9Smartijn }
20981180db9Smartijn
21081180db9Smartijn void
agentx_log_axg_fatalx(struct agentx_get * axg,const char * fmt,...)21181180db9Smartijn agentx_log_axg_fatalx(struct agentx_get *axg, const char *fmt, ...)
21281180db9Smartijn {
21381180db9Smartijn va_list ap;
21481180db9Smartijn
21581180db9Smartijn va_start(ap, fmt);
21681180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_FATAL, fmt, ap, 0, NULL, NULL, NULL,
21781180db9Smartijn axg);
21881180db9Smartijn va_end(ap);
21981180db9Smartijn abort();
22081180db9Smartijn }
22181180db9Smartijn
22281180db9Smartijn void
agentx_log_axg_warnx(struct agentx_get * axg,const char * fmt,...)22381180db9Smartijn agentx_log_axg_warnx(struct agentx_get *axg, const char *fmt, ...)
22481180db9Smartijn {
22581180db9Smartijn va_list ap;
22681180db9Smartijn
22781180db9Smartijn va_start(ap, fmt);
22881180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_WARN, fmt, ap, 0, NULL, NULL, NULL,
22981180db9Smartijn axg);
23081180db9Smartijn va_end(ap);
23181180db9Smartijn }
23281180db9Smartijn
23381180db9Smartijn void
agentx_log_axg_warn(struct agentx_get * axg,const char * fmt,...)23481180db9Smartijn agentx_log_axg_warn(struct agentx_get *axg, const char *fmt, ...)
23581180db9Smartijn {
23681180db9Smartijn va_list ap;
23781180db9Smartijn
23881180db9Smartijn va_start(ap, fmt);
23981180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_WARN, fmt, ap, 1, NULL, NULL, NULL,
24081180db9Smartijn axg);
24181180db9Smartijn va_end(ap);
24281180db9Smartijn }
24381180db9Smartijn
24481180db9Smartijn void
agentx_log_axg_debug(struct agentx_get * axg,const char * fmt,...)24581180db9Smartijn agentx_log_axg_debug(struct agentx_get *axg, const char *fmt, ...)
24681180db9Smartijn {
24781180db9Smartijn va_list ap;
24881180db9Smartijn
24981180db9Smartijn va_start(ap, fmt);
25081180db9Smartijn agentx_log_do(AGENTX_LOG_TYPE_DEBUG, fmt, ap, 0, NULL, NULL, NULL,
25181180db9Smartijn axg);
25281180db9Smartijn va_end(ap);
25381180db9Smartijn }
25481180db9Smartijn
25581180db9Smartijn static void
agentx_log_do(enum agentx_log_type type,const char * fmt,va_list ap,int useerrno,struct agentx * ax,struct agentx_session * axs,struct agentx_context * axc,struct agentx_get * axg)25681180db9Smartijn agentx_log_do(enum agentx_log_type type, const char *fmt, va_list ap,
25781180db9Smartijn int useerrno, struct agentx *ax, struct agentx_session *axs,
25881180db9Smartijn struct agentx_context *axc, struct agentx_get *axg)
25981180db9Smartijn {
26081180db9Smartijn void (*agentx_log)(const char *, ...);
26181180db9Smartijn char buf[1500];
26281180db9Smartijn
26381180db9Smartijn if (type == AGENTX_LOG_TYPE_FATAL)
26481180db9Smartijn agentx_log = agentx_log_fatal;
26581180db9Smartijn else if (type == AGENTX_LOG_TYPE_WARN)
26681180db9Smartijn agentx_log = agentx_log_warn;
26781180db9Smartijn else if (type == AGENTX_LOG_TYPE_INFO)
26881180db9Smartijn agentx_log = agentx_log_info;
26981180db9Smartijn else
27081180db9Smartijn agentx_log = agentx_log_debug;
27181180db9Smartijn if (agentx_log == NULL)
27281180db9Smartijn return;
27381180db9Smartijn
27481180db9Smartijn vsnprintf(buf, sizeof(buf), fmt, ap);
27581180db9Smartijn
27681180db9Smartijn if (axg != NULL) {
27781180db9Smartijn if (useerrno)
27881180db9Smartijn agentx_log("[fd:%d sess:%u ctx:%s trid:%u pid:%u]: "
27981180db9Smartijn "%s: %s", axg->axg_fd, axg->axg_sessionid,
28081180db9Smartijn AGENTX_GET_CTXNAME(axg), axg->axg_transactionid,
28181180db9Smartijn axg->axg_packetid, buf, strerror(errno));
28281180db9Smartijn else
28381180db9Smartijn agentx_log("[fd:%d sess:%u ctx:%s trid:%u pid:%u]: "
28481180db9Smartijn "%s", axg->axg_fd, axg->axg_sessionid,
28581180db9Smartijn AGENTX_GET_CTXNAME(axg), axg->axg_transactionid,
28681180db9Smartijn axg->axg_packetid, buf);
28781180db9Smartijn } else if (axc != NULL) {
28881180db9Smartijn axs = axc->axc_axs;
28981180db9Smartijn ax = axs->axs_ax;
29081180db9Smartijn if (useerrno)
29181180db9Smartijn agentx_log("[fd:%d sess:%u ctx:%s]: %s: %s",
29281180db9Smartijn ax->ax_fd, axs->axs_id, AGENTX_CONTEXT_NAME(axc),
29381180db9Smartijn buf, strerror(errno));
29481180db9Smartijn else
29581180db9Smartijn agentx_log("[fd:%d sess:%u ctx:%s]: %s", ax->ax_fd,
29681180db9Smartijn axs->axs_id, AGENTX_CONTEXT_NAME(axc), buf);
29781180db9Smartijn } else if (axs != NULL) {
29881180db9Smartijn ax = axs->axs_ax;
29981180db9Smartijn if (useerrno)
30081180db9Smartijn agentx_log("[fd:%d sess:%u]: %s: %s", ax->ax_fd,
30181180db9Smartijn axs->axs_id, buf, strerror(errno));
30281180db9Smartijn else
30381180db9Smartijn agentx_log("[fd:%d sess:%u]: %s", ax->ax_fd,
30481180db9Smartijn axs->axs_id, buf);
30581180db9Smartijn } else if (ax->ax_fd == -1) {
30681180db9Smartijn if (useerrno)
30781180db9Smartijn agentx_log("%s: %s", buf, strerror(errno));
30881180db9Smartijn else
30981180db9Smartijn agentx_log("%s", buf);
31081180db9Smartijn } else {
31181180db9Smartijn if (useerrno)
31281180db9Smartijn agentx_log("[fd:%d]: %s: %s", ax->ax_fd, buf,
31381180db9Smartijn strerror(errno));
31481180db9Smartijn else
31581180db9Smartijn agentx_log("[fd:%d]: %s", ax->ax_fd, buf);
31681180db9Smartijn }
31781180db9Smartijn }
318