]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/utils.c
__linux__ (already defined by compiler) not _linux_ (manually defined)
[ppp.git] / pppd / utils.c
index b176fbb4da6c6618edbbc730ba3291698da5289a..69d2a9383f0117ee05a5d017037b91e72fed6141 100644 (file)
@@ -17,7 +17,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define RCSID  "$Id: utils.c,v 1.11 2001/03/08 05:11:16 paulus Exp $"
+#define RCSID  "$Id: utils.c,v 1.19 2002/10/27 12:56:26 fcusack Exp $"
 
 #include <stdio.h>
 #include <ctype.h>
@@ -29,6 +29,7 @@
 #include <fcntl.h>
 #include <syslog.h>
 #include <netdb.h>
+#include <time.h>
 #include <utmp.h>
 #include <pwd.h>
 #include <sys/param.h>
@@ -44,6 +45,8 @@
 #endif
 
 #include "pppd.h"
+#include "fsm.h"
+#include "lcp.h"
 
 static const char rcsid[] = RCSID;
 
@@ -206,6 +209,28 @@ vslprintf(buf, buflen, fmt, args)
        neg = 0;
        ++fmt;
        switch (c) {
+       case 'l':
+           c = *fmt++;
+           switch (c) {
+           case 'd':
+               val = va_arg(args, long);
+               if (val < 0) {
+                   neg = 1;
+                   val = -val;
+               }
+               base = 10;
+               break;
+           case 'u':
+               val = va_arg(args, unsigned long);
+               base = 10;
+               break;
+           default:
+               *buf++ = '%'; --buflen;
+               *buf++ = 'l'; --buflen;
+               --fmt;          /* so %lz outputs %lz etc. */
+               continue;
+           }
+           break;
        case 'd':
            i = va_arg(args, int);
            if (i < 0) {
@@ -215,6 +240,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;
@@ -552,6 +581,7 @@ pr_log __V((void *arg, char *fmt, ...))
                *eol = 0;
                log_write(llevel, p);
                p = eol + 1;
+               eol = strchr(p, '\n');
        }
 
        /* assumes sizeof(buf) <= sizeof(line) */
@@ -756,9 +786,39 @@ 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_
+#ifdef __linux__
 #define LOCK_DIR       "/var/lock"
 #else
 #ifdef SVR4
@@ -783,7 +843,7 @@ lock(dev)
 
     result = mklock (dev, (void *) 0);
     if (result == 0) {
-       strlcpy(lock_file, sizeof(lock_file), dev);
+       strlcpy(lock_file, dev, sizeof(lock_file));
        return 0;
     }
 
@@ -814,9 +874,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