You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
6.1 KiB
176 lines
6.1 KiB
diff -up unzip60/extract.c.close unzip60/extract.c |
|
--- unzip60/extract.c.close 2009-03-14 02:32:52.000000000 +0100 |
|
+++ unzip60/extract.c 2009-11-19 08:17:23.481263496 +0100 |
|
@@ -1924,24 +1924,21 @@ static int extract_or_test_member(__G) |
|
|
|
#ifdef VMS /* VMS: required even for stdout! (final flush) */ |
|
if (!uO.tflag) /* don't close NULL file */ |
|
- close_outfile(__G); |
|
+ error = close_outfile(__G); |
|
#else |
|
#ifdef DLL |
|
if (!uO.tflag && (!uO.cflag || G.redirect_data)) { |
|
if (G.redirect_data) |
|
FINISH_REDIRECT(); |
|
else |
|
- close_outfile(__G); |
|
+ error = close_outfile(__G); |
|
} |
|
#else |
|
if (!uO.tflag && !uO.cflag) /* don't close NULL file or stdout */ |
|
- close_outfile(__G); |
|
+ error = close_outfile(__G); |
|
#endif |
|
#endif /* VMS */ |
|
|
|
- /* GRR: CONVERT close_outfile() TO NON-VOID: CHECK FOR ERRORS! */ |
|
- |
|
- |
|
if (G.disk_full) { /* set by flush() */ |
|
if (G.disk_full > 1) { |
|
#if (defined(DELETE_IF_FULL) && defined(HAVE_UNLINK)) |
|
diff -up unzip60/unix/unix.c.close unzip60/unix/unix.c |
|
--- unzip60/unix/unix.c.close 2009-01-24 00:31:26.000000000 +0100 |
|
+++ unzip60/unix/unix.c 2009-11-19 08:33:25.568389171 +0100 |
|
@@ -1096,10 +1096,41 @@ static int get_extattribs(__G__ pzt, z_u |
|
#ifndef MTS |
|
|
|
/****************************/ |
|
+/* Function CloseError() */ |
|
+/***************************/ |
|
+ |
|
+int CloseError(__G) |
|
+ __GDEF |
|
+{ |
|
+ int errval = PK_OK; |
|
+ |
|
+ if (fclose(G.outfile) < 0) { |
|
+ switch (errno) { |
|
+ case ENOSPC: |
|
+ /* Do we need this on fileio.c? */ |
|
+ Info(slide, 0x4a1, ((char *)slide, "%s: write error (disk full?). Continue? (y/n/^C) ", |
|
+ FnFilter1(G.filename))); |
|
+ fgets(G.answerbuf, 9, stdin); |
|
+ if (*G.answerbuf == 'y') /* stop writing to this file */ |
|
+ G.disk_full = 1; /* pass to next */ |
|
+ else |
|
+ G.disk_full = 2; /* no: exit program */ |
|
+ |
|
+ errval = PK_DISK; |
|
+ break; |
|
+ |
|
+ default: |
|
+ errval = PK_WARN; |
|
+ } |
|
+ } |
|
+ return errval; |
|
+} /* End of CloseError() */ |
|
+ |
|
+/****************************/ |
|
/* Function close_outfile() */ |
|
/****************************/ |
|
|
|
-void close_outfile(__G) /* GRR: change to return PK-style warning level */ |
|
+int close_outfile(__G) |
|
__GDEF |
|
{ |
|
union { |
|
@@ -1108,6 +1139,7 @@ void close_outfile(__G) /* GRR: chang |
|
} zt; |
|
ulg z_uidgid[2]; |
|
int have_uidgid_flg; |
|
+ int errval = PK_OK; |
|
|
|
have_uidgid_flg = get_extattribs(__G__ &(zt.t3), z_uidgid); |
|
|
|
@@ -1141,16 +1173,16 @@ void close_outfile(__G) /* GRR: chang |
|
Info(slide, 0x201, ((char *)slide, |
|
"warning: symbolic link (%s) failed: mem alloc overflow\n", |
|
FnFilter1(G.filename))); |
|
- fclose(G.outfile); |
|
- return; |
|
+ errval = CloseError(G.outfile, G.filename); |
|
+ return errval ? errval : PK_WARN; |
|
} |
|
|
|
if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) { |
|
Info(slide, 0x201, ((char *)slide, |
|
"warning: symbolic link (%s) failed: no mem\n", |
|
FnFilter1(G.filename))); |
|
- fclose(G.outfile); |
|
- return; |
|
+ errval = CloseError(G.outfile, G.filename); |
|
+ return errval ? errval : PK_WARN; |
|
} |
|
slnk_entry->next = NULL; |
|
slnk_entry->targetlen = ucsize; |
|
@@ -1174,10 +1206,10 @@ void close_outfile(__G) /* GRR: chang |
|
"warning: symbolic link (%s) failed\n", |
|
FnFilter1(G.filename))); |
|
free(slnk_entry); |
|
- fclose(G.outfile); |
|
- return; |
|
+ errval = CloseError(G.outfile, G.filename); |
|
+ return errval ? errval : PK_WARN; |
|
} |
|
- fclose(G.outfile); /* close "link" file for good... */ |
|
+ errval = CloseError(G.outfile, G.filename); /* close "link" file for good... */ |
|
slnk_entry->target[ucsize] = '\0'; |
|
if (QCOND2) |
|
Info(slide, 0, ((char *)slide, "-> %s ", |
|
@@ -1188,7 +1220,7 @@ void close_outfile(__G) /* GRR: chang |
|
else |
|
G.slink_head = slnk_entry; |
|
G.slink_last = slnk_entry; |
|
- return; |
|
+ return errval; |
|
} |
|
#endif /* SYMLINKS */ |
|
|
|
@@ -1201,7 +1233,7 @@ void close_outfile(__G) /* GRR: chang |
|
#endif |
|
|
|
#if (defined(NO_FCHOWN)) |
|
- fclose(G.outfile); |
|
+ errval = CloseError(G.outfile, G.filename); |
|
#endif |
|
|
|
/* if -X option was specified and we have UID/GID info, restore it */ |
|
@@ -1227,7 +1259,7 @@ void close_outfile(__G) /* GRR: chang |
|
} |
|
|
|
#if (!defined(NO_FCHOWN) && defined(NO_FCHMOD)) |
|
- fclose(G.outfile); |
|
+ errval = CloseError(G.outfile, G.filename); |
|
#endif |
|
|
|
#if (!defined(NO_FCHOWN) && !defined(NO_FCHMOD)) |
|
@@ -1239,7 +1271,7 @@ void close_outfile(__G) /* GRR: chang |
|
if (fchmod(fileno(G.outfile), filtattr(__G__ G.pInfo->file_attr))) |
|
perror("fchmod (file attributes) error"); |
|
|
|
- fclose(G.outfile); |
|
+ errval = CloseError(G.outfile, G.filename); |
|
#endif /* !NO_FCHOWN && !NO_FCHMOD */ |
|
|
|
/* skip restoring time stamps on user's request */ |
|
@@ -1267,6 +1299,7 @@ void close_outfile(__G) /* GRR: chang |
|
#endif |
|
#endif /* NO_FCHOWN || NO_FCHMOD */ |
|
|
|
+ return errval; |
|
} /* end function close_outfile() */ |
|
|
|
#endif /* !MTS */ |
|
diff -up unzip60/unzpriv.h.close unzip60/unzpriv.h |
|
--- unzip60/unzpriv.h.close 2009-04-20 01:59:26.000000000 +0200 |
|
+++ unzip60/unzpriv.h 2009-11-19 08:19:08.610388618 +0100 |
|
@@ -2604,7 +2604,7 @@ char *GetLoadPath OF((__GPRO)); |
|
int SetFileSize OF((FILE *file, zusz_t filesize)); /* local */ |
|
#endif |
|
#ifndef MTS /* macro in MTS */ |
|
- void close_outfile OF((__GPRO)); /* local */ |
|
+ int close_outfile OF((__GPRO)); /* local */ |
|
#endif |
|
#ifdef SET_SYMLINK_ATTRIBS |
|
int set_symlnk_attribs OF((__GPRO__ slinkentry *slnk_entry)); /* local */
|
|
|