X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=unmime.c;h=070d7945aee16f0c4cad27e53e3cd66fb6dfb02f;hb=87bcf29364c4640edb87cc2186b965d1a564d70c;hp=936ca459570200578742d7011d802f845579d3ee;hpb=197edbdb8f93b9ccf5a8da0239f320b770a2bd50;p=~andy%2Ffetchmail diff --git a/unmime.c b/unmime.c index 936ca459..070d7945 100644 --- a/unmime.c +++ b/unmime.c @@ -19,7 +19,7 @@ #include #include #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 #include -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 -