log.c (70a91e4c407285c095e2eb0307b6a54ed3467681) | log.c (b6217683dc0269a53b799399522dbdfb5a4919cc) |
---|---|
1/*- 2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * |
26 * $Id: log.c,v 1.25 1998/01/21 02:15:18 brian Exp $ | 26 * $Id: log.c,v 1.25.2.1 1998/02/10 03:23:25 brian Exp $ |
27 */ 28 29#include <sys/param.h> 30#include <netinet/in.h> 31 32#include <stdarg.h> 33#include <stdio.h> 34#include <string.h> 35#include <syslog.h> | 27 */ 28 29#include <sys/param.h> 30#include <netinet/in.h> 31 32#include <stdarg.h> 33#include <stdio.h> 34#include <string.h> 35#include <syslog.h> |
36#include <termios.h> |
|
36 37#include "command.h" 38#include "mbuf.h" 39#include "log.h" 40#include "loadalias.h" 41#include "defs.h" 42#include "vars.h" | 37 38#include "command.h" 39#include "mbuf.h" 40#include "log.h" 41#include "loadalias.h" 42#include "defs.h" 43#include "vars.h" |
44#include "descriptor.h" 45#include "prompt.h" |
|
43 44static const char *LogNames[] = { 45 "Async", 46 "Carrier", 47 "CCP", 48 "Chat", 49 "Command", 50 "Connect", --- 12 unchanged lines hidden (view full) --- 63 "Alert" 64}; 65 66#define MSK(n) (1<<((n)-1)) 67 68static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); 69static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); 70static int LogTunno = -1; | 46 47static const char *LogNames[] = { 48 "Async", 49 "Carrier", 50 "CCP", 51 "Chat", 52 "Command", 53 "Connect", --- 12 unchanged lines hidden (view full) --- 66 "Alert" 67}; 68 69#define MSK(n) (1<<((n)-1)) 70 71static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); 72static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); 73static int LogTunno = -1; |
74static struct prompt *logprompt; /* Where to log local stuff */ |
|
71 | 75 |
76void 77log_RegisterPrompt(struct prompt *prompt) 78{ 79 if (prompt) { 80 prompt->lognext = logprompt; 81 logprompt = prompt; 82 LogMaskLocal |= prompt->logmask; 83 } 84} 85 86void 87log_UnRegisterPrompt(struct prompt *prompt) 88{ 89 if (prompt) { 90 struct prompt **p; 91 92 LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); 93 for (p = &logprompt; *p; p = &(*p)->lognext) { 94 if (*p == prompt) { 95 *p = (*p)->lognext; 96 prompt->lognext = NULL; 97 if (!*p) 98 break; 99 } 100 LogMaskLocal |= (*p)->logmask; 101 } 102 } 103} 104 |
|
72static int 73syslogLevel(int lev) 74{ 75 switch (lev) { 76 case LogDEBUG:return LOG_DEBUG; 77 case LogWARN: 78 return LOG_WARNING; 79 case LogERROR: --- 13 unchanged lines hidden (view full) --- 93void 94LogKeep(int id) 95{ 96 if (id >= LogMIN && id <= LogMAXCONF) 97 LogMask |= MSK(id); 98} 99 100void | 105static int 106syslogLevel(int lev) 107{ 108 switch (lev) { 109 case LogDEBUG:return LOG_DEBUG; 110 case LogWARN: 111 return LOG_WARNING; 112 case LogERROR: --- 13 unchanged lines hidden (view full) --- 126void 127LogKeep(int id) 128{ 129 if (id >= LogMIN && id <= LogMAXCONF) 130 LogMask |= MSK(id); 131} 132 133void |
101LogKeepLocal(int id) | 134LogKeepLocal(int id, u_long *mask) |
102{ | 135{ |
103 if (id >= LogMIN && id <= LogMAXCONF) | 136 if (id >= LogMIN && id <= LogMAXCONF) { |
104 LogMaskLocal |= MSK(id); | 137 LogMaskLocal |= MSK(id); |
138 *mask |= MSK(id); 139 } |
|
105} 106 107void 108LogDiscard(int id) 109{ 110 if (id >= LogMIN && id <= LogMAXCONF) 111 LogMask &= ~MSK(id); 112} 113 114void | 140} 141 142void 143LogDiscard(int id) 144{ 145 if (id >= LogMIN && id <= LogMAXCONF) 146 LogMask &= ~MSK(id); 147} 148 149void |
115LogDiscardLocal(int id) | 150LogDiscardLocal(int id, u_long *mask) |
116{ | 151{ |
117 if (id >= LogMIN && id <= LogMAXCONF) | 152 if (id >= LogMIN && id <= LogMAXCONF) { |
118 LogMaskLocal &= ~MSK(id); | 153 LogMaskLocal &= ~MSK(id); |
154 *mask &= ~MSK(id); 155 } |
|
119} 120 121void 122LogDiscardAll() 123{ 124 LogMask = 0; 125} 126 127void | 156} 157 158void 159LogDiscardAll() 160{ 161 LogMask = 0; 162} 163 164void |
128LogDiscardAllLocal() | 165LogDiscardAllLocal(u_long *mask) |
129{ | 166{ |
130 LogMaskLocal = 0; | 167 LogMaskLocal = *mask = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); |
131} 132 133int 134LogIsKept(int id) 135{ 136 if (id < LogMIN || id > LogMAX) 137 return 0; 138 if (id > LogMAXCONF) 139 return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; 140 141 return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) | 142 ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); 143} 144 | 168} 169 170int 171LogIsKept(int id) 172{ 173 if (id < LogMIN || id > LogMAX) 174 return 0; 175 if (id > LogMAXCONF) 176 return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; 177 178 return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) | 179 ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); 180} 181 |
182int 183LogIsKeptLocal(int id, u_long mask) 184{ 185 if (id < LogMIN || id > LogMAX) 186 return 0; 187 if (id > LogMAXCONF) 188 return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; 189 190 return ((mask & MSK(id)) ? LOG_KEPT_LOCAL : 0) | 191 ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); 192} 193 |
|
145void 146LogOpen(const char *Name) 147{ 148 openlog(Name, LOG_PID, LOG_DAEMON); 149} 150 151void 152LogSetTun(int tunno) --- 7 unchanged lines hidden (view full) --- 160 closelog(); 161 LogTunno = -1; 162} 163 164void 165LogPrintf(int lev, const char *fmt,...) 166{ 167 va_list ap; | 194void 195LogOpen(const char *Name) 196{ 197 openlog(Name, LOG_PID, LOG_DAEMON); 198} 199 200void 201LogSetTun(int tunno) --- 7 unchanged lines hidden (view full) --- 209 closelog(); 210 LogTunno = -1; 211} 212 213void 214LogPrintf(int lev, const char *fmt,...) 215{ 216 va_list ap; |
217 struct prompt *prompt; |
|
168 169 va_start(ap, fmt); 170 if (LogIsKept(lev)) { 171 static char nfmt[200]; 172 | 218 219 va_start(ap, fmt); 220 if (LogIsKept(lev)) { 221 static char nfmt[200]; 222 |
173 if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) { | 223 if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && logprompt) { |
174 if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) 175 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 176 LogTunno, LogName(lev), fmt); 177 else 178 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); | 224 if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) 225 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 226 LogTunno, LogName(lev), fmt); 227 else 228 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); |
179 vfprintf(VarTerm, nfmt, ap); 180 fflush(VarTerm); | 229 230 for (prompt = logprompt; prompt; prompt = prompt->lognext) 231 if (lev > LogMAXCONF || (prompt->logmask & MSK(lev))) 232 prompt_vPrintf(prompt, nfmt, ap); |
181 } 182 | 233 } 234 |
183 if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) { | 235 if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !logprompt)) { |
184 if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) 185 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 186 LogTunno, LogName(lev), fmt); 187 else 188 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 189 vsyslog(syslogLevel(lev), nfmt, ap); 190 } 191 } --- 47 unchanged lines hidden (view full) --- 239 b = buf; 240 for (b = buf; b != buf + sizeof buf - 2 && n--; b += 3) 241 sprintf(b, " %02x", (int) *ptr++); 242 strcpy(b, "\n"); 243 LogPrintf(lev, buf); 244 } 245 } 246} | 236 if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) 237 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 238 LogTunno, LogName(lev), fmt); 239 else 240 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 241 vsyslog(syslogLevel(lev), nfmt, ap); 242 } 243 } --- 47 unchanged lines hidden (view full) --- 291 b = buf; 292 for (b = buf; b != buf + sizeof buf - 2 && n--; b += 3) 293 sprintf(b, " %02x", (int) *ptr++); 294 strcpy(b, "\n"); 295 LogPrintf(lev, buf); 296 } 297 } 298} |
299 300int 301log_ShowLevel(struct cmdargs const *arg) 302{ 303 int i; 304 305 prompt_Printf(arg->prompt, "Log: "); 306 for (i = LogMIN; i <= LogMAX; i++) 307 if (LogIsKept(i) & LOG_KEPT_SYSLOG) 308 prompt_Printf(arg->prompt, " %s", LogName(i)); 309 310 prompt_Printf(arg->prompt, "\nLocal:"); 311 for (i = LogMIN; i <= LogMAX; i++) 312 if (LogIsKeptLocal(i, arg->prompt->logmask) & LOG_KEPT_LOCAL) 313 prompt_Printf(arg->prompt, " %s", LogName(i)); 314 315 prompt_Printf(arg->prompt, "\n"); 316 317 return 0; 318} 319 320int 321log_SetLevel(struct cmdargs const *arg) 322{ 323 int i, res, argc, local; 324 char const *const *argv, *argp; 325 326 argc = arg->argc; 327 argv = arg->argv; 328 res = 0; 329 330 if (argc == 0 || strcasecmp(argv[0], "local")) 331 local = 0; 332 else { 333 if (arg->prompt == NULL) { 334 LogPrintf(LogWARN, "set log local: Only available on the command line\n"); 335 return 1; 336 } 337 argc--; 338 argv++; 339 local = 1; 340 } 341 342 if (argc == 0 || (argv[0][0] != '+' && argv[0][0] != '-')) 343 if (local) 344 LogDiscardAllLocal(&arg->prompt->logmask); 345 else 346 LogDiscardAll(); 347 348 while (argc--) { 349 argp = **argv == '+' || **argv == '-' ? *argv + 1 : *argv; 350 for (i = LogMIN; i <= LogMAX; i++) 351 if (strcasecmp(argp, LogName(i)) == 0) { 352 if (**argv == '-') 353 if (local) 354 LogDiscardLocal(i, &arg->prompt->logmask); 355 else 356 LogDiscard(i); 357 else if (local) 358 LogKeepLocal(i, &arg->prompt->logmask); 359 else 360 LogKeep(i); 361 break; 362 } 363 if (i > LogMAX) { 364 LogPrintf(LogWARN, "%s: Invalid log value\n", argp); 365 res = -1; 366 } 367 argv++; 368 } 369 return res; 370} 371 372int 373log_ShowWho(struct cmdargs const *arg) 374{ 375 struct prompt *p; 376 377 for (p = logprompt; p; p = p->lognext) 378 prompt_Printf(arg->prompt, "%s%s\n", p->who, p == arg->prompt ? " *" : ""); 379 380 return 0; 381} |
|