X-Git-Url: http://git.ozlabs.org/?p=ppp.git;a=blobdiff_plain;f=pppd%2Futils.c;h=43ed3172c7e61ff564bdae0739488828735b592e;hp=714a7c0b4e769f4281371b9df055cea0cc8b0cc1;hb=58d58e6be99ed13fbfe222cb15af7db75154d6c9;hpb=302f2d3d860c5ee394c2045ab0eca9a74db049f3 diff --git a/pppd/utils.c b/pppd/utils.c index 714a7c0..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.3 1999/05/04 06:58:36 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.3 1999/05/04 06:58:36 paulus Exp $"; #include #include #include +#include #include #include #include @@ -41,13 +41,21 @@ static char rcsid[] = "$Id: utils.c,v 1.3 1999/05/04 06:58:36 paulus Exp $"; #include #include #ifdef SVR4 -#include +#include #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 *)); @@ -110,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; @@ -167,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'; @@ -188,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; @@ -208,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; @@ -261,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) { @@ -350,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) { @@ -382,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; @@ -400,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; @@ -414,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, @@ -471,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; + } } /* @@ -548,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; } } @@ -568,7 +650,7 @@ fatal __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -590,7 +672,7 @@ error __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -610,7 +692,7 @@ warn __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -630,7 +712,7 @@ notice __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -650,7 +732,7 @@ info __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -670,7 +752,7 @@ dbglog __V((char *fmt, ...)) { va_list pvar; -#if __STDC__ +#if defined(__STDC__) va_start(pvar, fmt); #else char *fmt; @@ -682,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_ @@ -701,7 +813,8 @@ static char lock_file[MAXPATHLEN]; * lock - create a lock file for the named device */ int -lock(char *dev) +lock(dev) + char *dev; { #ifdef LOCKLIB int result; @@ -739,9 +852,20 @@ lock(char *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 @@ -818,7 +942,8 @@ lock(char *dev) * between when the parent died and the child rewrote the lockfile). */ int -relock(int pid) +relock(pid) + int pid; { #ifdef LOCKLIB /* XXX is there a way to do this? */