X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Futils.c;h=580363a950dec0ee7f77afb1681c60f2880217b3;hp=f6aa28740c5ad38178ab651df72cd63b7effcd07;hb=cdbb124cea5feeb4468ad3f2e5b5d17de583da6d;hpb=a95c8a6bd20ed07722b8cef75f547c6e5550e68b diff --git a/pppd/utils.c b/pppd/utils.c index f6aa287..580363a 100644 --- a/pppd/utils.c +++ b/pppd/utils.c @@ -17,7 +17,7 @@ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#define RCSID "$Id: utils.c,v 1.10 2000/03/27 01:36:48 paulus Exp $" +#define RCSID "$Id: utils.c,v 1.14 2001/05/23 03:39:14 paulus Exp $" #include #include @@ -44,6 +44,8 @@ #endif #include "pppd.h" +#include "fsm.h" +#include "lcp.h" static const char rcsid[] = RCSID; @@ -51,8 +53,8 @@ static const char rcsid[] = RCSID; extern char *strerror(); #endif -static void pr_log __P((void *, char *, ...)); static void logit __P((int, char *, va_list)); +static void log_write __P((int, char *)); static void vslp_printer __P((void *, char *, ...)); static void format_packet __P((u_char *, int, void (*) (void *, char *, ...), void *)); @@ -215,6 +217,10 @@ vslprintf(buf, buflen, fmt, args) val = i; base = 10; break; + case 'u': + val = va_arg(args, unsigned int); + base = 10; + break; case 'o': val = va_arg(args, unsigned int); base = 8; @@ -407,13 +413,11 @@ vslp_printer __V((void *arg, char *fmt, ...)) bi->len -= n; } +#ifdef unused /* * log_packet - format a packet and log it. */ -char line[256]; /* line to be logged accumulated here */ -char *linep; - void log_packet(p, len, prefix, level) u_char *p; @@ -421,12 +425,11 @@ log_packet(p, len, prefix, level) char *prefix; int level; { - strlcpy(line, prefix, sizeof(line)); - linep = line + strlen(line); - format_packet(p, len, pr_log, NULL); - if (linep != line) - syslog(level, "%s", line); + init_pr_log(prefix, level); + format_packet(p, len, pr_log, &level); + end_pr_log(); } +#endif /* unused */ /* * format_packet - make a readable representation of a packet, @@ -478,32 +481,92 @@ format_packet(p, len, printer, arg) printer(arg, "%.*B", len, p); } -static void +/* + * init_pr_log, end_pr_log - initialize and finish use of pr_log. + */ + +static char line[256]; /* line to be logged accumulated here */ +static char *linep; /* current pointer within line */ +static int llevel; /* level for logging */ + +void +init_pr_log(prefix, level) + char *prefix; + int level; +{ + linep = line; + if (prefix != NULL) { + strlcpy(line, prefix, sizeof(line)); + linep = line + strlen(line); + } + llevel = level; +} + +void +end_pr_log() +{ + if (linep != line) { + *linep = 0; + log_write(llevel, line); + } +} + +/* + * pr_log - printer routine for outputting to syslog + */ +void pr_log __V((void *arg, char *fmt, ...)) { - int n; - va_list pvar; - char buf[256]; + int l, n; + va_list pvar; + char *p, *eol; + char buf[256]; #if defined(__STDC__) - va_start(pvar, fmt); + va_start(pvar, fmt); #else - void *arg; - char *fmt; - va_start(pvar); - arg = va_arg(pvar, void *); - fmt = va_arg(pvar, char *); + void *arg; + char *fmt; + va_start(pvar); + arg = va_arg(pvar, void *); + fmt = va_arg(pvar, char *); #endif - n = vslprintf(buf, sizeof(buf), fmt, pvar); - va_end(pvar); + n = vslprintf(buf, sizeof(buf), fmt, pvar); + va_end(pvar); + + p = buf; + eol = strchr(buf, '\n'); + if (linep != line) { + l = (eol == NULL)? n: eol - buf; + if (linep + l < line + sizeof(line)) { + if (l > 0) { + memcpy(linep, buf, l); + linep += l; + } + if (eol == NULL) + return; + p = eol + 1; + eol = strchr(p, '\n'); + } + *linep = 0; + log_write(llevel, line); + linep = line; + } - if (linep + n + 1 > line + sizeof(line)) { - syslog(LOG_DEBUG, "%s", line); - linep = line; - } - strlcpy(linep, buf, line + sizeof(line) - linep); - linep += n; + while (eol != NULL) { + *eol = 0; + log_write(llevel, p); + p = eol + 1; + eol = strchr(p, '\n'); + } + + /* assumes sizeof(buf) <= sizeof(line) */ + l = buf + n - p; + if (l > 0) { + memcpy(line, p, n); + linep = line + l; + } } /* @@ -558,11 +621,22 @@ logit(level, fmt, args) char buf[1024]; n = vslprintf(buf, sizeof(buf), fmt, args); + log_write(level, buf); +} + +static void +log_write(level, buf) + int level; + char *buf; +{ syslog(level, "%s", buf); if (log_to_fd >= 0 && (level != LOG_DEBUG || debug)) { - if (buf[n-1] != '\n') - buf[n++] = '\n'; - if (write(log_to_fd, buf, n) != n) + int n = strlen(buf); + + if (n > 0 && buf[n-1] == '\n') + --n; + if (write(log_to_fd, buf, n) != n + || write(log_to_fd, "\n", 1) != 1) log_to_fd = -1; } } @@ -689,6 +763,36 @@ dbglog __V((char *fmt, ...)) va_end(pvar); } +/* + * dump_packet - print out a packet in readable form if it is interesting. + * Assumes len >= PPP_HDRLEN. + */ +void +dump_packet(const char *tag, unsigned char *p, int len) +{ + int proto; + + if (!debug) + return; + + /* + * don't print LCP echo request/reply packets if debug <= 1 + * and the link is up. + */ + proto = (p[2] << 8) + p[3]; + if (debug <= 1 && unsuccess == 0 && proto == PPP_LCP + && len >= PPP_HDRLEN + HEADERLEN) { + unsigned char *lcp = p + PPP_HDRLEN; + int l = (lcp[2] << 8) + lcp[3]; + + if ((lcp[0] == ECHOREQ || lcp[0] == ECHOREP) + && l >= HEADERLEN && l <= len - PPP_HDRLEN) + return; + } + + dbglog("%s %P", tag, p - PPP_HDRLEN, len + PPP_HDRLEN); +} + /* Procedures for locking the serial device using a lock file. */ #ifndef LOCK_DIR #ifdef _linux_