]> Pileus Git - ~andy/fetchmail/commitdiff
Revise visbuf to dynamically size its buffer.
authorMatthias Andree <matthias.andree@gmx.de>
Wed, 20 Jul 2005 15:45:59 +0000 (15:45 -0000)
committerMatthias Andree <matthias.andree@gmx.de>
Wed, 20 Jul 2005 15:45:59 +0000 (15:45 -0000)
svn path=/trunk/; revision=4147

env.c

diff --git a/env.c b/env.c
index aaddb54d00f5e8e19613e794c7dda8cbd9d43e3e..6ff2d99ae5d84e0304f48cc467e2b03eb3f80e08 100644 (file)
--- a/env.c
+++ b/env.c
@@ -149,6 +149,7 @@ char *host_fqdn(void)
     {
        struct hostent *hp;
 
+       /** XXX FIXME: use getaddrinfo instead? */
        /* if we got a basename (as we do in Linux) make a FQDN of it */
        hp = gethostbyname(tmpbuf);
        if (hp == (struct hostent *) NULL)
@@ -263,43 +264,32 @@ const char *showproto(int proto)
 char *visbuf(const char *buf)
 /* visibilize a given string */
 {
-    static char vbuf[BUFSIZ];
-    char *tp = vbuf;
+    static char *vbuf;
+    static size_t vbufs;
+    char *tp;
+    size_t needed;
+
+    needed = strlen(buf) * 5 + 1; /* worst case: HEX, plus NUL byte */
+
+    if (needed > vbufs) {
+       vbufs = needed;
+       vbuf = xrealloc(vbuf, vbufs);
+    }
+
+    tp = vbuf;
 
     while (*buf)
     {
-       if (*buf == '"')
-       {
-           *tp++ = '\\'; *tp++ = '"';
-           buf++;
-       }
-       else if (*buf == '\\')
-       {
-           *tp++ = '\\'; *tp++ = '\\';
-           buf++;
-       }
-       else if (isprint((unsigned char)*buf) || *buf == ' ')
-           *tp++ = *buf++;
-       else if (*buf == '\n')
-       {
-           *tp++ = '\\'; *tp++ = 'n';
-           buf++;
-       }
-       else if (*buf == '\r')
-       {
-           *tp++ = '\\'; *tp++ = 'r';
-           buf++;
-       }
-       else if (*buf == '\b')
-       {
-           *tp++ = '\\'; *tp++ = 'b';
-           buf++;
-       }
-       else if (*buf < ' ')
-       {
-           *tp++ = '\\'; *tp++ = '^'; *tp++ = '@' + *buf;
-           buf++;
-       }
+            if (*buf == '"')  { *tp++ = '\\'; *tp++ = '"'; buf++; }
+       else if (*buf == '\\') { *tp++ = '\\'; *tp++ = '\\'; buf++; }
+       else if (isprint((unsigned char)*buf) || *buf == ' ') *tp++ = *buf++;
+       else if (*buf == '\a') { *tp++ = '\\'; *tp++ = 'a'; buf++; }
+       else if (*buf == '\b') { *tp++ = '\\'; *tp++ = 'b'; buf++; }
+       else if (*buf == '\f') { *tp++ = '\\'; *tp++ = 'f'; buf++; }
+       else if (*buf == '\n') { *tp++ = '\\'; *tp++ = 'n'; buf++; }
+       else if (*buf == '\r') { *tp++ = '\\'; *tp++ = 'r'; buf++; }
+       else if (*buf == '\t') { *tp++ = '\\'; *tp++ = 't'; buf++; }
+       else if (*buf == '\v') { *tp++ = '\\'; *tp++ = 'v'; buf++; }
        else
        {
            const char hex[] = "0123456789abcdef";
@@ -312,5 +302,4 @@ char *visbuf(const char *buf)
     *tp++ = '\0';
     return(vbuf);
 }
-
 /* env.c ends here */