Ivana Varekova 0cb543d
diff -up unzip-5.52/unzpriv.h.err unzip-5.52/unzpriv.h
Ivana Varekova 0cb543d
--- unzip-5.52/unzpriv.h.err	2008-02-08 14:51:52.000000000 +0100
Ivana Varekova 0cb543d
+++ unzip-5.52/unzpriv.h	2008-02-08 14:51:52.000000000 +0100
Ivana Varekova 0cb543d
@@ -2182,7 +2182,7 @@ char    *GetLoadPath     OF((__GPRO));  
Ivana Varekova 0cb543d
    int   SetFileSize     OF((FILE *file, ulg filesize));            /* local */
Ivana Varekova 0cb543d
 #endif
Ivana Varekova 0cb543d
 #ifndef MTS /* macro in MTS */
Ivana Varekova 0cb543d
-   void  close_outfile   OF((__GPRO));                              /* local */
Ivana Varekova 0cb543d
+   int  close_outfile   OF((__GPRO));                              /* local */
Ivana Varekova 0cb543d
 #endif
Ivana Varekova 0cb543d
 #ifdef SET_SYMLINK_ATTRIBS
Ivana Varekova 0cb543d
    int  set_symlnk_attribs  OF((__GPRO__ slinkentry *slnk_entry));  /* local */
Ivana Varekova 0cb543d
diff -up unzip-5.52/unix/unix.c.err unzip-5.52/unix/unix.c
Ivana Varekova 0cb543d
--- unzip-5.52/unix/unix.c.err	2008-02-08 14:51:52.000000000 +0100
Ivana Varekova 0cb543d
+++ unzip-5.52/unix/unix.c	2008-02-08 15:04:15.000000000 +0100
Ivana Varekova 0cb543d
@@ -1029,10 +1029,41 @@ static int get_extattribs(__G__ pzt, z_u
Ivana Varekova 0cb543d
 #ifndef MTS
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
 /****************************/
Ivana Varekova 0cb543d
+/* Function CloseError()    */
Ivana Varekova 0cb543d
+/***************************/
Ivana Varekova 0cb543d
+
Ivana Varekova 0cb543d
+int CloseError(__G)
Ivana Varekova 0cb543d
+    __GDEF
Ivana Varekova 0cb543d
+{
Ivana Varekova 0cb543d
+    int errval = PK_OK;
Ivana Varekova 0cb543d
+    
Ivana Varekova 0cb543d
+    if (fclose(G.outfile) < 0) {
Ivana Varekova 0cb543d
+          switch (errno) {
Ivana Varekova 0cb543d
+                case ENOSPC:
Ivana Varekova 0cb543d
+                    /* Do we need this on fileio.c? */
Ivana Varekova 0cb543d
+                    Info(slide, 0x4a1, ((char *)slide, "%s: write error (disk full?).   Continue? (y/n/^C) ",
Ivana Varekova 0cb543d
+                          FnFilter1(G.filename)));
Ivana Varekova 0cb543d
+                    fgets(G.answerbuf, 9, stdin);
Ivana Varekova 0cb543d
+                    if (*G.answerbuf == 'y')     /* stop writing to this file */
Ivana Varekova 0cb543d
+                        G.disk_full = 1;         /* pass to next */
Ivana Varekova 0cb543d
+                    else
Ivana Varekova 0cb543d
+                        G.disk_full = 2;         /* no: exit program */
Ivana Varekova 0cb543d
+          
Ivana Varekova 0cb543d
+                    errval = PK_DISK;
Ivana Varekova 0cb543d
+                    break;
Ivana Varekova 0cb543d
+
Ivana Varekova 0cb543d
+                default:
Ivana Varekova 0cb543d
+                    errval = PK_WARN;
Ivana Varekova 0cb543d
+          }
Ivana Varekova 0cb543d
+     }
Ivana Varekova 0cb543d
+     return errval;
Ivana Varekova 0cb543d
+} /* End of CloseError() */
Ivana Varekova 0cb543d
+
Ivana Varekova 0cb543d
+/****************************/
Ivana Varekova 0cb543d
 /* Function close_outfile() */
Ivana Varekova 0cb543d
 /****************************/
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
-void close_outfile(__G)    /* GRR: change to return PK-style warning level */
Ivana Varekova 0cb543d
+int close_outfile(__G) 
Ivana Varekova 0cb543d
     __GDEF
Ivana Varekova 0cb543d
 {
Ivana Varekova 0cb543d
     union {
Ivana Varekova 0cb543d
@@ -1041,6 +1072,7 @@ void close_outfile(__G)    /* GRR: chang
Ivana Varekova 0cb543d
     } zt;
Ivana Varekova 0cb543d
     ush z_uidgid[2];
Ivana Varekova 0cb543d
     int have_uidgid_flg;
Ivana Varekova 0cb543d
+    int errval = PK_OK;
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
     fchmod(fileno(G.outfile), 0400);
Ivana Varekova 0cb543d
     
Ivana Varekova 0cb543d
@@ -1054,7 +1086,14 @@ void close_outfile(__G)    /* GRR: chang
Ivana Varekova 0cb543d
           perror("chmod (file attributes) error");
Ivana Varekova 0cb543d
 #endif
Ivana Varekova 0cb543d
     
Ivana Varekova 0cb543d
-    fclose(G.outfile);
Ivana Varekova 0cb543d
+/*---------------------------------------------------------------------------
Ivana Varekova 0cb543d
+    Check what fclose() reports from the device, this is always safer.
Ivana Varekova 0cb543d
+    An NFS non Solaris could be full and we could be facing ENOSPC not
Ivana Varekova 0cb543d
+    seen by write() without opening with O_SYNC or writing with fsync().
Ivana Varekova 0cb543d
+    - jmp.
Ivana Varekova 0cb543d
+  ---------------------------------------------------------------------------*/
Ivana Varekova 0cb543d
+
Ivana Varekova 0cb543d
+    errval = CloseError(G.outfile, G.filename);
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
 /*---------------------------------------------------------------------------
Ivana Varekova 0cb543d
     If symbolic links are supported, allocate storage for a symlink control
Ivana Varekova 0cb543d
@@ -1075,14 +1114,14 @@ void close_outfile(__G)    /* GRR: chang
Ivana Varekova 0cb543d
             Info(slide, 0x201, ((char *)slide,
Ivana Varekova 0cb543d
               "warning:  symbolic link (%s) failed: mem alloc overflow\n",
Ivana Varekova 0cb543d
               FnFilter1(G.filename)));
Ivana Varekova 0cb543d
-            return;
Ivana Varekova 0cb543d
+            return PK_WARN;
Ivana Varekova 0cb543d
         }
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
         if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) {
Ivana Varekova 0cb543d
             Info(slide, 0x201, ((char *)slide,
Ivana Varekova 0cb543d
               "warning:  symbolic link (%s) failed: no mem\n",
Ivana Varekova 0cb543d
               FnFilter1(G.filename)));
Ivana Varekova 0cb543d
-            return;
Ivana Varekova 0cb543d
+            return PK_WARN;
Ivana Varekova 0cb543d
         }
Ivana Varekova 0cb543d
         slnk_entry->next = NULL;
Ivana Varekova 0cb543d
         slnk_entry->targetlen = ucsize;
Ivana Varekova 0cb543d
@@ -1102,12 +1141,12 @@ void close_outfile(__G)    /* GRR: chang
Ivana Varekova 0cb543d
               FnFilter1(G.filename)));
Ivana Varekova 0cb543d
             free(slnk_entry);
Ivana Varekova 0cb543d
 	    if (G.outfile)
Ivana Varekova 0cb543d
-	        fclose(G.outfile);
Ivana Varekova 0cb543d
-            return;
Ivana Varekova 0cb543d
+               errval = CloseError(G.outfile, G.filename);
Ivana Varekova 0cb543d
+            return errval;
Ivana Varekova 0cb543d
         }
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
 	if (G.outfile)
Ivana Varekova 0cb543d
-            fclose(G.outfile);         /* close "link" file for good... */
Ivana Varekova 0cb543d
+            errval = CloseError(G.outfile, G.filename); /* close "lnk" file for good*/
Ivana Varekova 0cb543d
         slnk_entry->target[ucsize] = '\0';
Ivana Varekova 0cb543d
         if (QCOND2)
Ivana Varekova 0cb543d
             Info(slide, 0, ((char *)slide, "-> %s ",
Ivana Varekova 0cb543d
@@ -1118,7 +1157,7 @@ void close_outfile(__G)    /* GRR: chang
Ivana Varekova 0cb543d
         else
Ivana Varekova 0cb543d
             G.slink_head = slnk_entry;
Ivana Varekova 0cb543d
         G.slink_last = slnk_entry;
Ivana Varekova 0cb543d
-        return;
Ivana Varekova 0cb543d
+        return errval;
Ivana Varekova 0cb543d
     }
Ivana Varekova 0cb543d
 #endif /* SYMLINKS */
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
@@ -1166,6 +1205,7 @@ void close_outfile(__G)    /* GRR: chang
Ivana Varekova 0cb543d
 #endif /* ?AOS_VS */
Ivana Varekova 0cb543d
     }
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
+    return errval;
Ivana Varekova 0cb543d
 } /* end function close_outfile() */
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
 #endif /* !MTS */
Ivana Varekova 0cb543d
diff -up unzip-5.52/extract.c.err unzip-5.52/extract.c
Ivana Varekova 0cb543d
--- unzip-5.52/extract.c.err	2008-02-08 14:51:52.000000000 +0100
Ivana Varekova 0cb543d
+++ unzip-5.52/extract.c	2008-02-08 14:51:52.000000000 +0100
Ivana Varekova 0cb543d
@@ -1676,24 +1676,21 @@ static int extract_or_test_member(__G)  
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
 #ifdef VMS                  /* VMS:  required even for stdout! (final flush) */
Ivana Varekova 0cb543d
     if (!uO.tflag)           /* don't close NULL file */
Ivana Varekova 0cb543d
-        close_outfile(__G);
Ivana Varekova 0cb543d
+        error = close_outfile(__G);
Ivana Varekova 0cb543d
 #else
Ivana Varekova 0cb543d
 #ifdef DLL
Ivana Varekova 0cb543d
     if (!uO.tflag && (!uO.cflag || G.redirect_data)) {
Ivana Varekova 0cb543d
         if (G.redirect_data)
Ivana Varekova 0cb543d
             FINISH_REDIRECT();
Ivana Varekova 0cb543d
         else
Ivana Varekova 0cb543d
-            close_outfile(__G);
Ivana Varekova 0cb543d
+            error = close_outfile(__G);
Ivana Varekova 0cb543d
     }
Ivana Varekova 0cb543d
 #else
Ivana Varekova 0cb543d
     if (!uO.tflag && !uO.cflag)   /* don't close NULL file or stdout */
Ivana Varekova 0cb543d
-        close_outfile(__G);
Ivana Varekova 0cb543d
+        error = close_outfile(__G);
Ivana Varekova 0cb543d
 #endif
Ivana Varekova 0cb543d
 #endif /* VMS */
Ivana Varekova 0cb543d
 
Ivana Varekova 0cb543d
-            /* GRR: CONVERT close_outfile() TO NON-VOID:  CHECK FOR ERRORS! */
Ivana Varekova 0cb543d
-
Ivana Varekova 0cb543d
-
Ivana Varekova 0cb543d
     if (G.disk_full) {            /* set by flush() */
Ivana Varekova 0cb543d
         if (G.disk_full > 1) {
Ivana Varekova 0cb543d
 #if (defined(DELETE_IF_FULL) && defined(HAVE_UNLINK))