1 /* $OpenBSD: logmsg.c,v 1.3 2024/11/21 13:34:51 claudio Exp $ */
2
3 /*
4 * Copyright (c) 2017 Eric Faurot <eric@openbsd.org>
5 *
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.
9 *
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.
17 */
18
19 #include <sys/un.h>
20
21 #include <limits.h>
22 #include <stdio.h>
23 #include <string.h>
24
25 #include "lpd.h"
26
27 #include "io.h"
28 #include "log.h"
29 #include "proc.h"
30
31 const char *
log_fmt_proto(int p)32 log_fmt_proto(int p)
33 {
34 switch (p) {
35 case PROTO_LPR:
36 return "lpr";
37 default:
38 return NULL;
39 }
40 };
41
42 const char *
log_fmt_imsgtype(int type)43 log_fmt_imsgtype(int type)
44 {
45 static char buf[16];
46
47 switch (type) {
48 case IMSG_NONE:
49 return "IMSG_NONE";
50 case IMSG_SOCK_ENGINE:
51 return "IMSG_SOCK_ENGINE";
52 case IMSG_SOCK_FRONTEND:
53 return "IMSG_SOCK_FRONTEND";
54 case IMSG_CONF_START:
55 return "IMSG_CONF_START";
56 case IMSG_CONF_LISTENER:
57 return "IMSG_CONF_LISTENER";
58 case IMSG_CONF_END:
59 return "IMSG_CONF_END";
60 case IMSG_GETADDRINFO:
61 return "IMSG_GETADDRINFO";
62 case IMSG_GETADDRINFO_END:
63 return "IMSG_GETADDRINFO_END";
64 case IMSG_GETNAMEINFO:
65 return "IMSG_GETNAMEINFO";
66 case IMSG_LPR_ALLOWEDHOST:
67 return "IMSG_LPR_ALLOWEDHOST";
68 case IMSG_LPR_DISPLAYQ:
69 return "IMSG_LPR_DISPLAYQ";
70 case IMSG_LPR_PRINTJOB:
71 return "IMSG_LPR_PRINTJOB";
72 case IMSG_LPR_RECVJOB:
73 return "IMSG_LPR_RECVJOB";
74 case IMSG_LPR_RECVJOB_CLEAR:
75 return "IMSG_LPR_RECVJOB_CLEAR";
76 case IMSG_LPR_RECVJOB_CF:
77 return "IMSG_LPR_RECVJOB_CF";
78 case IMSG_LPR_RECVJOB_DF:
79 return "IMSG_LPR_RECVJOB_DF";
80 case IMSG_LPR_RECVJOB_COMMIT:
81 return "IMSG_LPR_RECVJOB_COMMIT";
82 case IMSG_LPR_RECVJOB_ROLLBACK:
83 return "IMSG_LPR_RECVJOB_ROLLBACK";
84 case IMSG_LPR_RMJOB:
85 return "IMSG_LPR_RMJOB";
86 default:
87 snprintf(buf, sizeof(buf), "?%d", type);
88 return buf;
89 }
90 }
91
92 const char *
log_fmt_proctype(int proctype)93 log_fmt_proctype(int proctype)
94 {
95 switch (proctype) {
96 case PROC_CLIENT:
97 return "client";
98 case PROC_CONTROL:
99 return "control";
100 case PROC_ENGINE:
101 return "engine";
102 case PROC_FRONTEND:
103 return "frontend";
104 case PROC_PRINTER:
105 return "printer";
106 case PROC_PRIV:
107 return "priv";
108 default:
109 return NULL;
110 }
111 };
112
113 const char *
log_fmt_sockaddr(const struct sockaddr * sa)114 log_fmt_sockaddr(const struct sockaddr *sa)
115 {
116 static char buf[PATH_MAX];
117 char host[NI_MAXHOST], serv[NI_MAXSERV];
118
119 switch (sa->sa_family) {
120 case AF_LOCAL:
121 (void)strlcpy(buf, ((const struct sockaddr_un*)sa)->sun_path,
122 sizeof(buf));
123 return buf;
124
125 case AF_INET:
126 case AF_INET6:
127 if (getnameinfo(sa, sa->sa_len, host, sizeof(host),
128 serv, sizeof(serv), NI_NUMERICHOST | NI_NUMERICSERV)) {
129 log_warnx("%s: getnameinfo", __func__);
130 return NULL;
131 }
132 if (sa->sa_family == AF_INET6)
133 snprintf(buf, sizeof(buf), "[%s]:%s", host, serv);
134 else
135 snprintf(buf, sizeof(buf), "%s:%s", host, serv);
136 return buf;
137
138 default:
139 return NULL;
140 }
141 }
142
143 void
log_imsg(struct imsgproc * proc,struct imsg * imsg)144 log_imsg(struct imsgproc *proc, struct imsg *imsg)
145 {
146 if (imsg == NULL)
147 log_debug("imsg src=%s closed",
148 log_fmt_proctype(proc_gettype(proc)));
149 else
150 log_debug("imsg src=%s type=%s len=%d",
151 log_fmt_proctype(proc_gettype(proc)),
152 log_fmt_imsgtype(imsg->hdr.type),
153 imsg->hdr.len);
154 }
155
156 void
log_io(const char * name,struct io * io,int ev)157 log_io(const char *name, struct io *io, int ev)
158 {
159 log_debug("io %s evt=%s io=%s", name, io_strevent(ev),
160 io_strio(io));
161 }
162