]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/utils.c
pppd: Handle SIGINT and SIGTERM during interrupted syscalls (#148)
[ppp.git] / pppd / utils.c
index 062b17e4a8db64cc11e42c43ffe184219f313f51..23189d0ad105bd49f9c00c274ab6340cfd6ffb09 100644 (file)
@@ -59,7 +59,6 @@
 #include "fsm.h"
 #include "lcp.h"
 
-static const char rcsid[] = RCSID;
 
 #if defined(SUNOS4)
 extern char *strerror();
@@ -68,8 +67,7 @@ extern char *strerror();
 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 *));
+static void format_packet __P((u_char *, int, printer_func, void *));
 
 struct buffer_info {
     char *ptr;
@@ -168,6 +166,7 @@ vslprintf(buf, buflen, fmt, args)
     u_int32_t ip;
     static char hexchars[] = "0123456789abcdef";
     struct buffer_info bufinfo;
+    int termch;
 
     buf0 = buf;
     --buflen;
@@ -287,19 +286,6 @@ vslprintf(buf, buflen, fmt, args)
                     (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
            str = num;
            break;
-#if 0  /* not used, and breaks on S/390, apparently */
-       case 'r':
-           f = va_arg(args, char *);
-#ifndef __powerpc__
-           n = vslprintf(buf, buflen + 1, f, va_arg(args, va_list));
-#else
-           /* On the powerpc, a va_list is an array of 1 structure */
-           n = vslprintf(buf, buflen + 1, f, va_arg(args, void *));
-#endif
-           buf += n;
-           buflen -= n;
-           continue;
-#endif
        case 't':
            time(&t);
            str = ctime(&t);
@@ -310,15 +296,21 @@ vslprintf(buf, buflen, fmt, args)
        case 'q':               /* quoted string */
            quoted = c == 'q';
            p = va_arg(args, unsigned char *);
+           if (p == NULL)
+                   p = (unsigned char *)"<NULL>";
            if (fillch == '0' && prec >= 0) {
                n = prec;
+               termch = -1;    /* matches no unsigned char value */
            } else {
-               n = strlen((char *)p);
-               if (prec >= 0 && n > prec)
+               n = buflen;
+               if (prec != -1 && n > prec)
                    n = prec;
+               termch = 0;     /* stop on null byte */
            }
            while (n > 0 && buflen > 0) {
                c = *p++;
+               if (c == termch)
+                   break;
                --n;
                if (!quoted && c >= 0x80) {
                    OUTCHAR('M');
@@ -398,9 +390,9 @@ vslprintf(buf, buflen, fmt, args)
            }
            len = num + sizeof(num) - 1 - str;
        } else {
-           len = strlen(str);
-           if (prec >= 0 && len > prec)
-               len = prec;
+           for (len = 0; len < buflen && (prec == -1 || len < prec); ++len)
+               if (str[len] == 0)
+                   break;
        }
        if (width > 0) {
            if (width > buflen)
@@ -475,7 +467,7 @@ static void
 format_packet(p, len, printer, arg)
     u_char *p;
     int len;
-    void (*printer) __P((void *, char *, ...));
+    printer_func printer;
     void *arg;
 {
     int i, n;
@@ -613,7 +605,7 @@ void
 print_string(p, len, printer, arg)
     char *p;
     int len;
-    void (*printer) __P((void *, char *, ...));
+    printer_func printer;
     void *arg;
 {
     int c;
@@ -637,7 +629,7 @@ print_string(p, len, printer, arg)
                printer(arg, "\\t");
                break;
            default:
-               printer(arg, "\\%.3o", c);
+               printer(arg, "\\%.3o", (unsigned char) c);
            }
        }
     }
@@ -653,10 +645,9 @@ logit(level, fmt, args)
     char *fmt;
     va_list args;
 {
-    int n;
     char buf[1024];
 
-    n = vslprintf(buf, sizeof(buf), fmt, args);
+    vslprintf(buf, sizeof(buf), fmt, args);
     log_write(level, buf);
 }
 
@@ -844,7 +835,7 @@ complete_read(int fd, void *buf, size_t count)
        for (done = 0; done < count; ) {
                nb = read(fd, ptr, count - done);
                if (nb < 0) {
-                       if (errno == EINTR)
+                       if (errno == EINTR && !got_sigterm)
                                continue;
                        return -1;
                }