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