Here's an improved version of Roger Leigh's patch which fixes all the
implicit declarations and a couple other warnings (and the
uninitialized variable warning was harmless).  It also fixes a problem
which caused munpack to detect corruption on amd64 when there was none
(that's the part in md5.h).
-- 
Daniel Schepler              "Please don't disillusion me.  I
[EMAIL PROTECTED]    haven't had breakfast yet."
                                 -- Orson Scott Card
diff -urN mpack-1.6.old/codes.c mpack-1.6/codes.c
--- mpack-1.6.old/codes.c	2003-07-21 13:51:08.000000000 -0700
+++ mpack-1.6/codes.c	2005-07-19 01:28:48.000000000 -0700
@@ -128,7 +128,7 @@
     int nbytes;
     
     MD5Init(&context);
-    while (nbytes = fread(buf, 1, sizeof(buf), infile)) {
+    while ((nbytes = fread(buf, 1, sizeof(buf), infile))) {
 	length += nbytes;
 	MD5Update(&context, buf, nbytes);
     }
diff -urN mpack-1.6.old/decode.c mpack-1.6/decode.c
--- mpack-1.6.old/decode.c	2003-07-21 13:47:54.000000000 -0700
+++ mpack-1.6/decode.c	2005-07-19 01:56:57.000000000 -0700
@@ -26,8 +26,10 @@
  * SOFTWARE.  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
+#include <unistd.h>
 #include "xmalloc.h"
 #include "common.h"
 #include "part.h"
@@ -37,6 +39,19 @@
 extern FILE *os_newtypedfile(char *fname, char *contentType, int flags, params contentParams);
 extern FILE *os_createnewfile(char *fname);
 extern char *md5contextTo64(MD5_CTX *context);
+extern void warn(char *s);
+extern void os_perror(char *str);
+extern void chat(char *s);
+extern void os_donewithdir(char *dir);
+extern void os_warnMD5mismatch(void);
+extern void os_closetypedfile(FILE *outfile);
+
+extern int part_depth(struct part *part);
+extern void part_ungets(char *s, struct part *part);
+extern void part_close(struct part *part);
+extern int part_fill(struct part *part);
+extern void part_addboundary(struct part *part, char *boundary);
+extern int part_readboundary(struct part *part);
 
 /* The possible content transfer encodings */
 enum encoding { enc_none, enc_qp, enc_base64 };
@@ -49,6 +64,17 @@
 void from64(struct part *inpart, FILE *outfile, char **digestp, int suppressCR);
 void fromqp(struct part *inpart, FILE *outfile, char **digestp);
 void fromnone(struct part *inpart, FILE *outfile, char **digestp);
+int handlePartial(struct part *inpart, char *headers, params contentParams,
+		  int extractText);
+int ignoreMessage(struct part *inpart);
+int handleMultipart(struct part *inpart, char *contentType,
+		    params contentParams, int extractText);
+int handleUuencode(struct part *inpart, char *subject, int extractText);
+int handleText(struct part *inpart, enum encoding contentEncoding);
+int saveToFile(struct part *inpart, int inAppleDouble, char *contentType,
+	       params contentParams, enum encoding contentEncoding,
+	       char *contentDisposition, char *contentMD5);
+
 /*
  * Read and handle an RFC 822 message from the body-part 'inpart'.
  */
@@ -624,7 +650,7 @@
     }
     thispart = atoi(p);
 
-    if (p = getParam(contentParams, "total")) {
+    if ((p = getParam(contentParams, "total"))) {
 	nparts = atoi(p);
 	if (nparts <= 0) {
 	    warn("partial message has invalid number of parts");
@@ -643,7 +669,7 @@
     else {
 	/* Try to retrieve number of parts from reassembly directory */
 	sprintf(buf, "%sCT", dir);
-	if (partfile = fopen(buf, "r")) {
+	if ((partfile = fopen(buf, "r"))) {
 	    if (fgets(buf, sizeof(buf), partfile)) {
 		nparts = atoi(buf);
 		if (nparts < 0) nparts = 0;
diff -urN mpack-1.6.old/encode.c mpack-1.6/encode.c
--- mpack-1.6.old/encode.c	2003-07-21 13:35:31.000000000 -0700
+++ mpack-1.6/encode.c	2005-07-19 01:44:56.000000000 -0700
@@ -23,12 +23,15 @@
  * SOFTWARE.
  */
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 extern char *magic_look(FILE *infile);
 extern char *os_genid(void);
 extern FILE *os_createnewfile(char *fname);
 extern char *md5digest(FILE *infile, long int *len);
+extern void os_perror(char *str);
+extern int to64(FILE *infile, FILE *outfile, long int limit);
 
 #define NUMREFERENCES 4
 
@@ -43,7 +46,7 @@
     char *type;
     FILE *outfile;
     char *cleanfname, *p;
-    char *digest, *appledigest;
+    char *digest, *appledigest = NULL;
     long filesize, l, written;
     int thispart, numparts = 1;
     int wrotefiletype = 0;
@@ -57,12 +60,12 @@
     /* This filename-cleaning knowledge will probably
      * be moved to the os layer in a future version.
      */
-    if (p = strrchr(cleanfname, '.')) cleanfname = p+1;
+    if ((p = strrchr(cleanfname, '.'))) cleanfname = p+1;
 #else
-    if (p = strrchr(cleanfname, '/')) cleanfname = p+1;
-    if (p = strrchr(cleanfname, '\\')) cleanfname = p+1;
+    if ((p = strrchr(cleanfname, '/'))) cleanfname = p+1;
+    if ((p = strrchr(cleanfname, '\\'))) cleanfname = p+1;
 #endif
-    if (p = strrchr(cleanfname, ':')) cleanfname = p+1;
+    if ((p = strrchr(cleanfname, ':'))) cleanfname = p+1;
 
     /* Find file type */
     if (typeoverride) {
diff -urN mpack-1.6.old/magic.c mpack-1.6/magic.c
--- mpack-1.6.old/magic.c	2003-07-21 13:35:31.000000000 -0700
+++ mpack-1.6/magic.c	2005-07-19 01:28:48.000000000 -0700
@@ -23,6 +23,7 @@
  * SOFTWARE.
  */
 #include <stdio.h>
+#include <string.h>
 
 /* Description of the various file formats and their magic numbers */
 struct magic {
diff -urN mpack-1.6.old/md5.h mpack-1.6/md5.h
--- mpack-1.6.old/md5.h	2003-07-21 13:35:31.000000000 -0700
+++ mpack-1.6/md5.h	2005-07-19 02:12:48.000000000 -0700
@@ -34,14 +34,16 @@
 #define PROTOTYPES 0
 #endif
 
+#include <stdint.h>
+
 /* POINTER defines a generic pointer type */
 typedef unsigned char *POINTER;
 
 /* UINT2 defines a two byte word */
-typedef unsigned short int UINT2;
+typedef uint16_t UINT2;
 
 /* UINT4 defines a four byte word */
-typedef unsigned long int UINT4;
+typedef uint32_t UINT4;
 
 /* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
 If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
diff -urN mpack-1.6.old/part.c mpack-1.6/part.c
--- mpack-1.6.old/part.c	2005-07-19 02:15:20.000000000 -0700
+++ mpack-1.6/part.c	2005-07-19 01:28:48.000000000 -0700
@@ -27,6 +27,7 @@
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include "part.h"
diff -urN mpack-1.6.old/unixos.c mpack-1.6/unixos.c
--- mpack-1.6.old/unixos.c	2005-07-19 02:15:20.000000000 -0700
+++ mpack-1.6/unixos.c	2005-07-19 01:45:54.000000000 -0700
@@ -23,17 +23,23 @@
  * SOFTWARE.
  */
 #include <stdio.h>
+#include <stdlib.h>
 #include <ctype.h>
 #include <string.h>
 #include <errno.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <sys/param.h>
+#include <time.h>
 #include <netdb.h>
 #include <fcntl.h>
+#include <unistd.h>
 #include "xmalloc.h"
 #include "common.h"
 #include "part.h"
 
+extern void warn(char *s);
+
 #ifndef MAXHOSTNAMELEN
 #define MAXHOSTNAMELEN 64
 #endif
@@ -41,8 +47,6 @@
 #ifndef errno
 extern int errno;
 #endif
-extern char *malloc();
-extern char *getenv();
 
 int overwrite_files = 0;
 int didchat;
@@ -78,7 +82,7 @@
     }
 
     result = malloc(25+strlen(hostname));
-    sprintf(result, "[EMAIL PROTECTED]", pid, curtime++, hostname);
+    sprintf(result, "[EMAIL PROTECTED]", pid, (unsigned long) curtime++, hostname);
     return result;
 }
 
@@ -196,7 +200,7 @@
 	do {
 	    if (outfile) fclose(outfile);
 	    sprintf(buf, "part%d", ++filesuffix);
-	} while (outfile = fopen(buf, "r"));
+	} while ((outfile = fopen(buf, "r")));
 	fname = buf;
     }
     else if (!overwrite_files && (outfile = fopen(fname, "r"))) {
@@ -204,7 +208,7 @@
 	    fclose(outfile);
 	    sprintf(buf, "%s.%d", fname, ++filesuffix);
 	 
-	} while (outfile = fopen(buf, "r"));
+	} while ((outfile = fopen(buf, "r")));
 	fname = buf;
     }
 
@@ -230,7 +234,7 @@
 
     p = strchr(descfname, '/');
     if (!p) p = descfname;
-    if (p = strrchr(p, '.')) *p = '\0';
+    if ((p = strrchr(p, '.'))) *p = '\0';
 
     strcat(descfname, ".desc");
     (void) rename(TEMPFILENAME, descfname);
diff -urN mpack-1.6.old/unixpk.c mpack-1.6/unixpk.c
--- mpack-1.6.old/unixpk.c	2005-07-19 02:15:20.000000000 -0700
+++ mpack-1.6/unixpk.c	2005-07-19 01:41:59.000000000 -0700
@@ -23,22 +23,26 @@
  * SOFTWARE.
  */
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
 #include "common.h"
 #include "version.h"
 #include "xmalloc.h"
 
 #define MAXADDRESS 100
 
-extern char *getenv();
-
-extern int optind;
-extern char *optarg;
-
 void usage(void);
 void sendmail(FILE *infile, char **addr, int start);
 void inews(FILE *infile);
+void os_perror(char *str);
+int encode(FILE *infile, FILE *applefile, char *fname, FILE *descfile,
+	   char *subject, char *headers, long int maxsize,
+	   char *typeoverride, char *outfname);
 
 int main(int argc, char **argv)
 {
@@ -154,7 +158,7 @@
 	    fprintf(stderr, "A subject is required\n");
 	    usage();
 	}
-	if (p = strchr(sbuf, '\n')) *p = '\0';
+	if ((p = strchr(sbuf, '\n'))) *p = '\0';
 	subject = sbuf;
     }	
 
diff -urN mpack-1.6.old/unixunpk.c mpack-1.6/unixunpk.c
--- mpack-1.6.old/unixunpk.c	2005-07-19 02:15:20.000000000 -0700
+++ mpack-1.6/unixunpk.c	2005-07-19 01:47:35.000000000 -0700
@@ -23,17 +23,19 @@
  * SOFTWARE.
  */
 #include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <unistd.h>
 #include "version.h"
 #include "part.h"
 
-extern int optind;
-extern char *optarg;
-
 extern int overwrite_files;
 extern int didchat;
 int quiet;
 
 void usage(void);
+int handleMessage(struct part *inpart, char *defaultContentType,
+		  int inAppleDouble, int extractText);
 
 int main(int argc, char **argv)
 {
diff -urN mpack-1.6.old/uudecode.c mpack-1.6/uudecode.c
--- mpack-1.6.old/uudecode.c	2005-07-19 02:15:20.000000000 -0700
+++ mpack-1.6/uudecode.c	2005-07-19 02:03:28.000000000 -0700
@@ -23,8 +23,10 @@
  * SOFTWARE.
  */
 #include <stdio.h>
+#include <stdlib.h>
 #include <ctype.h>
 #include <string.h>
+#include <unistd.h>
 #include "xmalloc.h"
 #include "common.h"
 #include "part.h"
@@ -32,10 +34,25 @@
 extern char *os_idtodir(char *id);
 extern FILE *os_newtypedfile(char *fname, char *contentType, int flags, params contentParams);
 extern FILE *os_createnewfile(char *fname);
+extern int os_binhex(struct part *inpart, int part, int nparts);
+extern void os_closetypedfile(FILE *outfile);
+extern void os_donewithdir(char *dir);
+extern void os_perror(char *str);
+extern void chat(char *s);
+
+extern void part_ungets(char *s, struct part *part);
+extern void part_close(struct part *part);
+extern int handleMessage(struct part *inpart, char *defaultContentType,
+			 int inAppleDouble, int extractText);
 
 static FILE *startDescFile(char *fname);
 static void uudecodeline(char *line, FILE *outfile);
 
+int parseSubject(char *subject, char **fnamep, int *partp, int *npartsp);
+int saveUuFile(struct part *inpart, char *fname, int part, int nparts,
+	       char *firstline);
+int descEnd(char *line);
+int uudecodefiles(char *dir, int nparts);
 
 /* Length of a normal uuencoded line, including newline */
 #define UULENGTH 62
@@ -267,7 +284,7 @@
 	}
 	else if (part == 1 && fname && !descfile &&
 		 !strncasecmp(buf, "x-file-desc: ", 13)) {
-	    if (descfile = startDescFile(fname)) {
+	    if ((descfile = startDescFile(fname))) {
 		fputs(buf+13, descfile);
 		fclose(descfile);
 		descfile = 0;
@@ -455,7 +472,7 @@
     /* Retrieve any previously saved number of the last part */
     if (nparts == 0) {
 	sprintf(buf, "%sCT", dir);
-	if (partfile = fopen(buf, "r")) {
+	if ((partfile = fopen(buf, "r"))) {
 	    if (fgets(buf, sizeof(buf), partfile)) {
 		nparts = atoi(buf);
 		if (nparts < 0) nparts = 0;
@@ -723,7 +740,7 @@
 		if (!*fname) return 1;
 
 		/* Guess the content-type of common filename extensions */
-		if (p = strrchr(fname, '.')) {
+		if ((p = strrchr(fname, '.'))) {
 		    if (!strcasecmp(p, ".gif")) contentType = "image/gif";
 		    if (!strcasecmp(p, ".jpg")) contentType = "image/jpeg";
 		    if (!strcasecmp(p, ".jpeg")) contentType = "image/jpeg";
diff -urN mpack-1.6.old/xmalloc.c mpack-1.6/xmalloc.c
--- mpack-1.6.old/xmalloc.c	2003-07-21 13:35:31.000000000 -0700
+++ mpack-1.6/xmalloc.c	2005-07-19 01:28:48.000000000 -0700
@@ -23,14 +23,14 @@
  * SOFTWARE.
  */
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
-extern char *malloc(), *realloc();
 
 char *xmalloc (int size)
 {
     char *ret;
 
-    if (ret = malloc((unsigned) size))
+    if ((ret = malloc((unsigned) size)))
       return ret;
 
     fprintf(stderr, "Memory exhausted\n");
@@ -43,7 +43,7 @@
     char *ret;
 
     /* xrealloc (NULL, size) behaves like xmalloc (size), as in ANSI C */
-    if (ret = !ptr ? malloc ((unsigned) size) : realloc (ptr, (unsigned) size))
+    if ((ret = !ptr ? malloc ((unsigned) size) : realloc (ptr, (unsigned) size)))
       return ret;
 
     fprintf(stderr, "Memory exhausted\n");

Reply via email to