]> Pileus Git - ~andy/fetchmail/blobdiff - unmime.c
Merge branch 'legacy_63'
[~andy/fetchmail] / unmime.c
index 936ca459570200578742d7011d802f845579d3ee..070d7945aee16f0c4cad27e53e3cd66fb6dfb02f 100644 (file)
--- a/unmime.c
+++ b/unmime.c
@@ -19,7 +19,7 @@
 #include <stdio.h>
 #include <ctype.h>
 #include "fetchmail.h"
-#include "i18n.h"
+#include "gettext.h"
 
 static unsigned char unhex(unsigned char c)
 {
@@ -33,7 +33,7 @@ static unsigned char unhex(unsigned char c)
       return 16;       /* invalid hex character */
 }
 
-static int qp_char(unsigned char c1, unsigned char c2, unsigned char *c_out)
+static int qp_char(unsigned char c1, unsigned char c2, char *c_out)
 {
   c1 = unhex(c1);
   c2 = unhex(c2);
@@ -59,7 +59,7 @@ static int qp_char(unsigned char c1, unsigned char c2, unsigned char *c_out)
 static const char MIMEHDR_INIT[]  = "=?";      /* Start of coded sequence */
 static const char MIMEHDR_END[]   = "?=";      /* End of coded sequence */
 
-void UnMimeHeader(unsigned char *hdr)
+void UnMimeHeader(char *hdr)
 {
   /* Decode a buffer containing data encoded according to RFC
    * 2047. This only handles content-transfer-encoding; conversion
@@ -75,8 +75,8 @@ void UnMimeHeader(unsigned char *hdr)
    */
 
   int  state = S_COPY_PLAIN;
-  unsigned char *p_in, *p_out, *p;
-  unsigned char enc = '\0';            /* initialization pacifies -Wall */
+  char *p_in, *p_out, *p;
+  char enc = '\0';             /* initialization pacifies -Wall */
   int  i;
 
   /* Speed up in case this is not a MIME-encoded header */
@@ -123,7 +123,7 @@ void UnMimeHeader(unsigned char *hdr)
 
        /* *(p+1) is the transfer encoding, *(p+2) must be a '?' */
        if (*(p+2) == '?') {
-         enc = tolower(*(p+1));
+         enc = tolower((unsigned char)*(p+1));
          p_in = p+3;
          state = S_COPY_MIME;
        }
@@ -200,11 +200,11 @@ void UnMimeHeader(unsigned char *hdr)
         * There is more MIME data later on. Is there
          * whitespace  only before the delimiter? 
         */
-        unsigned char *q;
+        char *q;
         int  wsp_only = 1;
 
         for (q=p_in; (wsp_only && (q < p)); q++)
-          wsp_only = isspace(*q);
+          wsp_only = isspace((unsigned char)*q);
 
         if (wsp_only) {
          /* 
@@ -259,7 +259,7 @@ static int  CurrTypeNeedsDecode = 0;
  * at the beginning, and a terminating null.
  */
 #define MAX_DELIM_LEN 70
-static unsigned char MultipartDelimiter[MAX_DELIM_LEN+3];
+static char MultipartDelimiter[MAX_DELIM_LEN+3];
 
 
 /* This string replaces the "Content-Transfer-Encoding: quoted-printable"
@@ -267,15 +267,16 @@ static unsigned char MultipartDelimiter[MAX_DELIM_LEN+3];
  * must be no longer than the original string.
  */
 static const char ENC8BIT[] = "Content-Transfer-Encoding: 8bit";
-static void SetEncoding8bit(unsigned char *XferEncOfs)
+static void SetEncoding8bit(char *XferEncOfs)
 {
-  unsigned char *p;
+  char *p;
 
   if (XferEncOfs != NULL) {
      memcpy(XferEncOfs, ENC8BIT, sizeof(ENC8BIT) - 1);
 
      /* If anything left, in this header, replace with whitespace */
-     for (p=XferEncOfs+sizeof(ENC8BIT)-1; (*p >= ' '); p++) *p=' ';
+     for (p=XferEncOfs+sizeof(ENC8BIT)-1; ((unsigned char)*p >= ' '); p++)
+       *p=' ';
   }
 }
 
@@ -291,7 +292,7 @@ static char *GetBoundary(char *CntType)
   do {
     p2 = strchr(p1, ';'); 
     if (p2)
-      for (p2++; isspace((unsigned char)*p2); p2++);
+      for (p2++; isspace((unsigned char)*p2); p2++) { }
 
     p1 = p2;
   } while ((p1) && (strncasecmp(p1, "boundary", 8) != 0));
@@ -336,7 +337,7 @@ static int CheckContentType(char *CntType)
    * be really careful if you change this.
    */
 
-  static char *DecodedTypes[] = {
+  static const char *DecodedTypes[] = {
     "text/",        /* Will match ALL content-type's starting with 'text/' */
     "message/rfc822", 
     NULL
@@ -377,10 +378,10 @@ static int CheckContentType(char *CntType)
  *
  * The return value is a bitmask.
  */
-int MimeBodyType(unsigned char *hdrs, int WantDecode)
+int MimeBodyType(char *hdrs, int WantDecode)
 {
-    unsigned char *NxtHdr = hdrs;
-    unsigned char *XferEnc, *XferEncOfs, *CntType, *MimeVer, *p;
+    char *NxtHdr = hdrs;
+    char *XferEnc, *XferEncOfs, *CntType, *MimeVer, *p;
     int  HdrsFound = 0;     /* We only look for three headers */
     int  BodyType;          /* Return value */ 
 
@@ -417,7 +418,7 @@ int MimeBodyType(unsigned char *hdrs, int WantDecode)
             */
 
            /* Skip the "Content-Type:" part and whitespace after it */
-           for (NxtHdr += 13; ((*NxtHdr == ' ') || (*NxtHdr == '\t')); NxtHdr++);
+           for (NxtHdr += 13; ((*NxtHdr == ' ') || (*NxtHdr == '\t')); NxtHdr++) { }
 
            /* 
             * Get the full value of the Content-Type header;
@@ -433,7 +434,7 @@ int MimeBodyType(unsigned char *hdrs, int WantDecode)
            if (p == NULL) p = NxtHdr + strlen(NxtHdr);
 
            xfree(CntType);
-           CntType = xmalloc(p-NxtHdr+1);
+           CntType = (char *)xmalloc(p-NxtHdr+1);
            strlcpy(CntType, NxtHdr, p-NxtHdr+1);
            HdrsFound++;
        }
@@ -458,7 +459,7 @@ int MimeBodyType(unsigned char *hdrs, int WantDecode)
 
        /* Check Content-Type to see if this is a multipart message */
        if ( (CntType != NULL) &&
-               ((strncasecmp(CntType, "multipart/mixed", 16) == 0) ||
+               ((strncasecmp(CntType, "multipart/mixed", 15) == 0) ||
                 (strncasecmp(CntType, "message/", 8) == 0)) ) {
 
            char *p1 = GetBoundary(CntType);
@@ -468,7 +469,6 @@ int MimeBodyType(unsigned char *hdrs, int WantDecode)
                   the boundary string */
                strcpy(MultipartDelimiter, "--");
                strlcat(MultipartDelimiter, p1, sizeof(MultipartDelimiter));
-               MultipartDelimiter[sizeof(MultipartDelimiter)-1] = '\0';
                BodyType = (MSG_IS_8BIT | MSG_NEEDS_DECODE);
            }
        }
@@ -510,10 +510,10 @@ int MimeBodyType(unsigned char *hdrs, int WantDecode)
  * Return flag set if this line ends with a soft line-break.
  * 'bufp' is modified to point to the end of the output buffer.
  */
-static int DoOneQPLine(unsigned char **bufp, flag delimited, flag issoftline)
+static int DoOneQPLine(char **bufp, flag delimited, flag issoftline)
 {
-  unsigned char *buf = *bufp;
-  unsigned char *p_in, *p_out, *p;
+  char *buf = *bufp;
+  char *p_in, *p_out, *p;
   int n;
   int ret = 0;
 
@@ -592,9 +592,9 @@ static int DoOneQPLine(unsigned char **bufp, flag delimited, flag issoftline)
  * 'bufp' is modified to point to the end of the output buffer.
  */
 
-int UnMimeBodyline(unsigned char **bufp, flag delimited, flag softline)
+int UnMimeBodyline(char **bufp, flag delimited, flag softline)
 {
-  unsigned char *buf = *bufp;
+  char *buf = *bufp;
   int ret = 0;
 
   switch (BodyState) {
@@ -650,13 +650,13 @@ int UnMimeBodyline(unsigned char **bufp, flag delimited, flag softline)
 #include <stdio.h>
 #include <unistd.h>
 
-char *program_name = "unmime";
+const char *program_name = "unmime";
 int outlevel = 0;
 
 #define BUFSIZE_INCREMENT 4096
 
 #ifdef DEBUG
-#define DBG_FWRITE(B,L,BS,FD) fwrite(B, L, BS, FD)
+#define DBG_FWRITE(B,L,BS,FD) do { if (fwrite((B), (L), (BS), (FD))) { } } while(0)
 #else
 #define DBG_FWRITE(B,L,BS,FD)
 #endif
@@ -664,9 +664,13 @@ int outlevel = 0;
 int main(int argc, char *argv[])
 {
   unsigned int BufSize;
-  unsigned char *buffer, *buf_p;
+  char *buffer, *buf_p;
   int nl_count, i, bodytype;
 
+  /* quench warnings about unused arguments */
+  (void)argc;
+  (void)argv;
+
 #ifdef DEBUG
   pid_t pid;
   FILE *fd_orig, *fd_conv;
@@ -681,7 +685,7 @@ int main(int argc, char *argv[])
 #endif
 
   BufSize = BUFSIZE_INCREMENT;    /* Initial size of buffer */
-  buf_p = buffer = (unsigned char *) xmalloc(BufSize);
+  buf_p = buffer = (char *) xmalloc(BufSize);
   nl_count = 0;
 
   do {
@@ -700,9 +704,9 @@ int main(int argc, char *argv[])
     }
 
     buf_p++;
-    if ((buf_p - buffer) == BufSize) {
+    if ((unsigned)(buf_p - buffer) == BufSize) {
        /* Buffer is full! Get more room. */
-       buffer = xrealloc(buffer, BufSize+BUFSIZE_INCREMENT);
+       buffer = (char *)xrealloc(buffer, BufSize+BUFSIZE_INCREMENT);
        buf_p = buffer + BufSize;
        BufSize += BUFSIZE_INCREMENT;
     }
@@ -715,8 +719,11 @@ int main(int argc, char *argv[])
   bodytype = MimeBodyType(buffer, 1);
 
   i = strlen(buffer);
-  fwrite(buffer, i, 1, stdout);
   DBG_FWRITE(buffer, i, 1, fd_conv);
+  if (fwrite(buffer, i, 1, stdout) < 1) {
+      perror("fwrite");
+      goto barf;
+  }
   
   do {
      buf_p = (buffer - 1);
@@ -733,13 +740,17 @@ int main(int argc, char *argv[])
            buf_p = buffer;
            UnMimeBodyline(&buf_p, 0, 0);
         }
-        fwrite(buffer, (buf_p - buffer), 1, stdout);
         DBG_FWRITE(buffer, (buf_p - buffer), 1, fd_conv);
+        if (fwrite(buffer, (buf_p - buffer), 1, stdout) < 1) {
+           perror("fwrite");
+           goto barf;
+       }
      }
   } while (buf_p > buffer);
 
+barf:
   free(buffer);
-  fflush(stdout);
+  if (EOF == fflush(stdout)) perror("fflush");
 
 #ifdef DEBUG
   fclose(fd_orig);
@@ -749,4 +760,3 @@ int main(int argc, char *argv[])
   return 0;
 }
 #endif
-