X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Futils.c;h=43ed3172c7e61ff564bdae0739488828735b592e;hp=8c818965406e7b2a3e4ec1a7bc3f4739eb1a92b5;hb=58d58e6be99ed13fbfe222cb15af7db75154d6c9;hpb=f35f3211790dfdd63ea1bf36af08e83f82d43c84 diff --git a/pppd/utils.c b/pppd/utils.c index 8c81896..43ed317 100644 --- a/pppd/utils.c +++ b/pppd/utils.c @@ -16,9 +16,8 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#ifndef lint -static char rcsid[] = "$Id: utils.c,v 1.5 1999/06/01 01:43:34 paulus Exp $"; -#endif + +#define RCSID "$Id: utils.c,v 1.16 2002/01/11 18:27:17 etbe Exp $" #include #include @@ -30,6 +29,7 @@ static char rcsid[] = "$Id: utils.c,v 1.5 1999/06/01 01:43:34 paulus Exp $"; #include #include #include +#include #include #include #include @@ -45,13 +45,17 @@ static char rcsid[] = "$Id: utils.c,v 1.5 1999/06/01 01:43:34 paulus Exp $"; #endif #include "pppd.h" +#include "fsm.h" +#include "lcp.h" + +static const char rcsid[] = RCSID; #if defined(SUNOS4) 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 *)); @@ -114,7 +118,7 @@ slprintf __V((char *buf, int buflen, char *fmt, ...)) va_list args; int n; -#if __STDC__ +#if defined(__STDC__) va_start(args, fmt); #else char *buf; @@ -171,7 +175,8 @@ vslprintf(buf, buflen, fmt, args) if (*fmt == 0) break; c = *++fmt; - width = prec = 0; + width = 0; + prec = -1; fillch = ' '; if (c == '0') { fillch = '0'; @@ -192,6 +197,7 @@ vslprintf(buf, buflen, fmt, args) prec = va_arg(args, int); c = *++fmt; } else { + prec = 0; while (isdigit(c)) { prec = prec * 10 + c - '0'; c = *++fmt; @@ -212,6 +218,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; @@ -265,11 +275,11 @@ vslprintf(buf, buflen, fmt, args) case 'q': /* quoted string */ quoted = c == 'q'; p = va_arg(args, unsigned char *); - if (fillch == '0' && prec > 0) { + if (fillch == '0' && prec >= 0) { n = prec; } else { n = strlen((char *)p); - if (prec > 0 && prec < n) + if (prec >= 0 && n > prec) n = prec; } while (n > 0 && buflen > 0) { @@ -354,7 +364,7 @@ vslprintf(buf, buflen, fmt, args) len = num + sizeof(num) - 1 - str; } else { len = strlen(str); - if (prec > 0 && len > prec) + if (prec >= 0 && len > prec) len = prec; } if (width > 0) { @@ -386,7 +396,7 @@ vslp_printer __V((void *arg, char *fmt, ...)) va_list pvar; struct buffer_info *bi; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else void *arg; @@ -404,13 +414,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; @@ -418,12 +426,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, @@ -475,32 +482,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 __STDC__ - va_start(pvar, fmt); +#if defined(__STDC__) + 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; + } } /* @@ -552,14 +619,25 @@ logit(level, fmt, args) va_list args; { int n; - char buf[256]; + 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; } } @@ -572,7 +650,7 @@ fatal __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -594,7 +672,7 @@ error __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -614,7 +692,7 @@ warn __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -634,7 +712,7 @@ notice __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -654,7 +732,7 @@ info __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -674,7 +752,7 @@ dbglog __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -686,6 +764,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, len); +} + /* Procedures for locking the serial device using a lock file. */ #ifndef LOCK_DIR #ifdef _linux_ @@ -744,9 +852,20 @@ lock(dev) major(sbuf.st_rdev), minor(sbuf.st_rdev)); #else char *p; + char lockdev[MAXPATHLEN]; + + if ((p = strstr(dev, "dev/")) != NULL) { + dev = p + 4; + strncpy(lockdev, dev, MAXPATHLEN-1); + lockdev[MAXPATHLEN-1] = 0; + while ((p = strrchr(lockdev, '/')) != NULL) { + *p = '_'; + } + dev = lockdev; + } else + if ((p = strrchr(dev, '/')) != NULL) + dev = p + 1; - if ((p = strrchr(dev, '/')) != NULL) - dev = p + 1; slprintf(lock_file, sizeof(lock_file), "%s/LCK..%s", LOCK_DIR, dev); #endif