diff options
author | brian <brian@FreeBSD.org> | 1998-05-21 21:49:08 +0000 |
---|---|---|
committer | brian <brian@FreeBSD.org> | 1998-05-21 21:49:08 +0000 |
commit | 56df88b778aee0e60678672b107a48a8ea05cb48 (patch) | |
tree | 13b88ca17b38e787c84b0cd242677b3c3c0b93c3 /usr.sbin/ppp/log.c | |
parent | e077fa331b8a428923ded3a95d0b8d47084cf670 (diff) | |
download | FreeBSD-src-56df88b778aee0e60678672b107a48a8ea05cb48.zip FreeBSD-src-56df88b778aee0e60678672b107a48a8ea05cb48.tar.gz |
MFMP: Make ppp multilink capable.
See the file README.changes, and re-read the man page.
Diffstat (limited to 'usr.sbin/ppp/log.c')
-rw-r--r-- | usr.sbin/ppp/log.c | 239 |
1 files changed, 193 insertions, 46 deletions
diff --git a/usr.sbin/ppp/log.c b/usr.sbin/ppp/log.c index 77729dd..0522059 100644 --- a/usr.sbin/ppp/log.c +++ b/usr.sbin/ppp/log.c @@ -23,27 +23,25 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: log.c,v 1.25 1998/01/21 02:15:18 brian Exp $ + * $Id: log.c,v 1.25.2.14 1998/05/01 22:39:35 brian Exp $ */ -#include <sys/param.h> -#include <netinet/in.h> +#include <sys/types.h> #include <stdarg.h> #include <stdio.h> #include <string.h> #include <syslog.h> +#include <termios.h> #include "command.h" #include "mbuf.h" #include "log.h" -#include "loadalias.h" -#include "defs.h" -#include "vars.h" +#include "descriptor.h" +#include "prompt.h" static const char *LogNames[] = { "Async", - "Carrier", "CCP", "Chat", "Command", @@ -53,10 +51,10 @@ static const char *LogNames[] = { "ID0", "IPCP", "LCP", - "Link", "LQM", "Phase", "TCP/IP", + "Timer", "Tun", "Warning", "Error", @@ -65,15 +63,54 @@ static const char *LogNames[] = { #define MSK(n) (1<<((n)-1)) -static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); +static u_long LogMask = MSK(LogPHASE); static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); static int LogTunno = -1; +static struct prompt *logprompt; /* Where to log local stuff */ + +void +log_RegisterPrompt(struct prompt *prompt) +{ + if (prompt) { + prompt->lognext = logprompt; + logprompt = prompt; + LogMaskLocal |= prompt->logmask; + } +} + +static void +LogSetMaskLocal(void) +{ + struct prompt *p; + + LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); + for (p = logprompt; p; p = p->lognext) + LogMaskLocal |= p->logmask; +} + +void +log_UnRegisterPrompt(struct prompt *prompt) +{ + if (prompt) { + struct prompt **p; + + for (p = &logprompt; *p; p = &(*p)->lognext) + if (*p == prompt) { + *p = prompt->lognext; + prompt->lognext = NULL; + break; + } + LogSetMaskLocal(); + } +} static int syslogLevel(int lev) { switch (lev) { - case LogDEBUG:return LOG_DEBUG; + case LogDEBUG: + case LogTIMER: + return LOG_DEBUG; case LogWARN: return LOG_WARNING; case LogERROR: @@ -85,53 +122,58 @@ syslogLevel(int lev) } const char * -LogName(int id) +log_Name(int id) { return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1]; } void -LogKeep(int id) +log_Keep(int id) { if (id >= LogMIN && id <= LogMAXCONF) LogMask |= MSK(id); } void -LogKeepLocal(int id) +log_KeepLocal(int id, u_long *mask) { - if (id >= LogMIN && id <= LogMAXCONF) + if (id >= LogMIN && id <= LogMAXCONF) { LogMaskLocal |= MSK(id); + *mask |= MSK(id); + } } void -LogDiscard(int id) +log_Discard(int id) { if (id >= LogMIN && id <= LogMAXCONF) LogMask &= ~MSK(id); } void -LogDiscardLocal(int id) +log_DiscardLocal(int id, u_long *mask) { - if (id >= LogMIN && id <= LogMAXCONF) - LogMaskLocal &= ~MSK(id); + if (id >= LogMIN && id <= LogMAXCONF) { + *mask &= ~MSK(id); + LogSetMaskLocal(); + } } void -LogDiscardAll() +log_DiscardAll() { LogMask = 0; } void -LogDiscardAllLocal() +log_DiscardAllLocal(u_long *mask) { - LogMaskLocal = 0; + *mask = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); + LogSetMaskLocal(); } int -LogIsKept(int id) +log_IsKept(int id) { if (id < LogMIN || id > LogMAX) return 0; @@ -142,50 +184,65 @@ LogIsKept(int id) ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); } +int +log_IsKeptLocal(int id, u_long mask) +{ + if (id < LogMIN || id > LogMAX) + return 0; + if (id > LogMAXCONF) + return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; + + return ((mask & MSK(id)) ? LOG_KEPT_LOCAL : 0) | + ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); +} + void -LogOpen(const char *Name) +log_Open(const char *Name) { openlog(Name, LOG_PID, LOG_DAEMON); } void -LogSetTun(int tunno) +log_SetTun(int tunno) { LogTunno = tunno; } void -LogClose() +log_Close() { closelog(); LogTunno = -1; } void -LogPrintf(int lev, const char *fmt,...) +log_Printf(int lev, const char *fmt,...) { va_list ap; + struct prompt *prompt; va_start(ap, fmt); - if (LogIsKept(lev)) { + if (log_IsKept(lev)) { static char nfmt[200]; - if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) { - if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) + if ((log_IsKept(lev) & LOG_KEPT_LOCAL) && logprompt) { + if ((log_IsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", - LogTunno, LogName(lev), fmt); + LogTunno, log_Name(lev), fmt); else - snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); - vfprintf(VarTerm, nfmt, ap); - fflush(VarTerm); + snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt); + + for (prompt = logprompt; prompt; prompt = prompt->lognext) + if (lev > LogMAXCONF || (prompt->logmask & MSK(lev))) + prompt_vPrintf(prompt, nfmt, ap); } - if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) { - if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) + if ((log_IsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !logprompt)) { + if ((log_IsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", - LogTunno, LogName(lev), fmt); + LogTunno, log_Name(lev), fmt); else - snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); + snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt); vsyslog(syslogLevel(lev), nfmt, ap); } } @@ -193,16 +250,16 @@ LogPrintf(int lev, const char *fmt,...) } void -LogDumpBp(int lev, const char *hdr, const struct mbuf * bp) +log_DumpBp(int lev, const char *hdr, const struct mbuf * bp) { - if (LogIsKept(lev)) { + if (log_IsKept(lev)) { char buf[50]; char *b; u_char *ptr; int f; if (hdr && *hdr) - LogPrintf(lev, "%s\n", hdr); + log_Printf(lev, "%s\n", hdr); b = buf; do { @@ -213,7 +270,7 @@ LogDumpBp(int lev, const char *hdr, const struct mbuf * bp) b += 3; if (b == buf + sizeof buf - 2) { strcpy(b, "\n"); - LogPrintf(lev, buf); + log_Printf(lev, buf); b = buf; } } @@ -221,26 +278,116 @@ LogDumpBp(int lev, const char *hdr, const struct mbuf * bp) if (b > buf) { strcpy(b, "\n"); - LogPrintf(lev, buf); + log_Printf(lev, buf); } } } void -LogDumpBuff(int lev, const char *hdr, const u_char * ptr, int n) +log_DumpBuff(int lev, const char *hdr, const u_char * ptr, int n) { - if (LogIsKept(lev)) { + if (log_IsKept(lev)) { char buf[50]; char *b; if (hdr && *hdr) - LogPrintf(lev, "%s\n", hdr); + log_Printf(lev, "%s\n", hdr); while (n > 0) { b = buf; for (b = buf; b != buf + sizeof buf - 2 && n--; b += 3) sprintf(b, " %02x", (int) *ptr++); strcpy(b, "\n"); - LogPrintf(lev, buf); + log_Printf(lev, buf); } } } + +int +log_ShowLevel(struct cmdargs const *arg) +{ + int i; + + prompt_Printf(arg->prompt, "Log: "); + for (i = LogMIN; i <= LogMAX; i++) + if (log_IsKept(i) & LOG_KEPT_SYSLOG) + prompt_Printf(arg->prompt, " %s", log_Name(i)); + + prompt_Printf(arg->prompt, "\nLocal:"); + for (i = LogMIN; i <= LogMAX; i++) + if (log_IsKeptLocal(i, arg->prompt->logmask) & LOG_KEPT_LOCAL) + prompt_Printf(arg->prompt, " %s", log_Name(i)); + + prompt_Printf(arg->prompt, "\n"); + + return 0; +} + +int +log_SetLevel(struct cmdargs const *arg) +{ + int i, res, argc, local; + char const *const *argv, *argp; + + argc = arg->argc - arg->argn; + argv = arg->argv + arg->argn; + res = 0; + + if (argc == 0 || strcasecmp(argv[0], "local")) + local = 0; + else { + if (arg->prompt == NULL) { + log_Printf(LogWARN, "set log local: Only available on the command line\n"); + return 1; + } + argc--; + argv++; + local = 1; + } + + if (argc == 0 || (argv[0][0] != '+' && argv[0][0] != '-')) { + if (local) + log_DiscardAllLocal(&arg->prompt->logmask); + else + log_DiscardAll(); + } + + while (argc--) { + argp = **argv == '+' || **argv == '-' ? *argv + 1 : *argv; + for (i = LogMIN; i <= LogMAX; i++) + if (strcasecmp(argp, log_Name(i)) == 0) { + if (**argv == '-') { + if (local) + log_DiscardLocal(i, &arg->prompt->logmask); + else + log_Discard(i); + } else if (local) + log_KeepLocal(i, &arg->prompt->logmask); + else + log_Keep(i); + break; + } + if (i > LogMAX) { + log_Printf(LogWARN, "%s: Invalid log value\n", argp); + res = -1; + } + argv++; + } + return res; +} + +int +log_ShowWho(struct cmdargs const *arg) +{ + struct prompt *p; + + for (p = logprompt; p; p = p->lognext) { + prompt_Printf(arg->prompt, "%s (%s)", p->src.type, p->src.from); + if (p == arg->prompt) + prompt_Printf(arg->prompt, " *"); + if (!p->active) + prompt_Printf(arg->prompt, " ^Z"); + prompt_Printf(arg->prompt, "\n"); + } + + return 0; +} |