Fix compress support and prevent a segfault
diff --git a/archival/libunarchive/uncompress.c b/archival/libunarchive/uncompress.c
index 903e6aa..949e27d 100644
--- a/archival/libunarchive/uncompress.c
+++ b/archival/libunarchive/uncompress.c
@@ -28,8 +28,9 @@
  * [... History snipped ...]
  *
  */
-#include	<stdio.h>
-
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
 
 #define	IBUFSIZ	2048	/* Defailt input buffer size							*/
 #define	OBUFSIZ	2048	/* Default output buffer size							*/
@@ -95,9 +96,6 @@
 #define	clear_tab_prefixof()	memset(codetab, 0, 256);
 
 
-extern int uncompress ( FILE *, FILE * );
-
-
 /*
  * Decompress stdin to stdout.  This routine adapts to the codes in the
  * file building the "string" table on-the-fly; requiring no table to
@@ -105,7 +103,7 @@
  * with those of the compress() routine.  See the definitions above.
  */
 
-int uncompress ( FILE * fdin, FILE * fdout )
+extern int uncompress(int fd_in, int fd_out)
 {
     char_type 		*stackp;
     code_int		 code;
@@ -125,7 +123,7 @@
 
 	insize = 0;
 
-	inbuf [0] = fgetc(fdin);
+	inbuf [0] = xread_char(fd_in);
 
 	maxbits = inbuf[0] & BIT_MASK;
 	block_mode = inbuf[0] & BLOCK_MODE;
@@ -173,11 +171,7 @@
 
 		if (insize < (int) sizeof(inbuf)-IBUFSIZ)
 		{
-			rsize = fread(inbuf+insize, 1,IBUFSIZ,fdin);
-			
-			if ( !rsize && ferror(fdin))
-				return -1;
-
+			xread_all(fd_in, inbuf+insize, IBUFSIZ);
 			insize += rsize;
 		}
 
@@ -275,8 +269,7 @@
 
 						if (outpos >= OBUFSIZ)
 						{
-							fwrite(outbuf, 1,outpos,fdout);
-
+							write(fd_out, outbuf, outpos);
 							outpos = 0;
 						}
 						stackp+= i;
@@ -303,8 +296,9 @@
     }
 	while (rsize > 0);
 
-	if (outpos > 0)
-		fwrite(outbuf, outpos,1, fdout);
+	if (outpos > 0) {
+		write(fd_out, outbuf, outpos);
+	}
 
 	return 0;
 }