xref: /openbsd/usr.sbin/lpd/logmsg.c (revision e5dd7070)
1 /*	$OpenBSD: logmsg.c,v 1.2 2018/09/05 17:32:56 eric 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 *
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 *
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 *
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 *
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
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 fd=%d",
151 		    log_fmt_proctype(proc_gettype(proc)),
152 		    log_fmt_imsgtype(imsg->hdr.type),
153 		    imsg->hdr.len, imsg->fd);
154 }
155 
156 void
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