]>
Commit | Line | Data |
---|---|---|
e5420ad7 JPT |
1 | diff -up unzip60/extract.c.close unzip60/extract.c |
2 | --- unzip60/extract.c.close 2009-03-14 02:32:52.000000000 +0100 | |
3 | +++ unzip60/extract.c 2009-11-19 08:17:23.481263496 +0100 | |
4 | @@ -1924,24 +1924,21 @@ static int extract_or_test_member(__G) | |
5 | ||
6 | #ifdef VMS /* VMS: required even for stdout! (final flush) */ | |
7 | if (!uO.tflag) /* don't close NULL file */ | |
8 | - close_outfile(__G); | |
9 | + error = close_outfile(__G); | |
10 | #else | |
11 | #ifdef DLL | |
12 | if (!uO.tflag && (!uO.cflag || G.redirect_data)) { | |
13 | if (G.redirect_data) | |
14 | FINISH_REDIRECT(); | |
15 | else | |
16 | - close_outfile(__G); | |
17 | + error = close_outfile(__G); | |
18 | } | |
19 | #else | |
20 | if (!uO.tflag && !uO.cflag) /* don't close NULL file or stdout */ | |
21 | - close_outfile(__G); | |
22 | + error = close_outfile(__G); | |
23 | #endif | |
24 | #endif /* VMS */ | |
25 | ||
26 | - /* GRR: CONVERT close_outfile() TO NON-VOID: CHECK FOR ERRORS! */ | |
27 | - | |
28 | - | |
29 | if (G.disk_full) { /* set by flush() */ | |
30 | if (G.disk_full > 1) { | |
31 | #if (defined(DELETE_IF_FULL) && defined(HAVE_UNLINK)) | |
32 | diff -up unzip60/unix/unix.c.close unzip60/unix/unix.c | |
33 | --- unzip60/unix/unix.c.close 2009-01-24 00:31:26.000000000 +0100 | |
34 | +++ unzip60/unix/unix.c 2009-11-19 08:33:25.568389171 +0100 | |
35 | @@ -1096,10 +1096,41 @@ static int get_extattribs(__G__ pzt, z_u | |
36 | #ifndef MTS | |
37 | ||
38 | /****************************/ | |
39 | +/* Function CloseError() */ | |
40 | +/***************************/ | |
41 | + | |
42 | +int CloseError(__G) | |
43 | + __GDEF | |
44 | +{ | |
45 | + int errval = PK_OK; | |
46 | + | |
47 | + if (fclose(G.outfile) < 0) { | |
48 | + switch (errno) { | |
49 | + case ENOSPC: | |
50 | + /* Do we need this on fileio.c? */ | |
51 | + Info(slide, 0x4a1, ((char *)slide, "%s: write error (disk full?). Continue? (y/n/^C) ", | |
52 | + FnFilter1(G.filename))); | |
53 | + fgets(G.answerbuf, 9, stdin); | |
54 | + if (*G.answerbuf == 'y') /* stop writing to this file */ | |
55 | + G.disk_full = 1; /* pass to next */ | |
56 | + else | |
57 | + G.disk_full = 2; /* no: exit program */ | |
58 | + | |
59 | + errval = PK_DISK; | |
60 | + break; | |
61 | + | |
62 | + default: | |
63 | + errval = PK_WARN; | |
64 | + } | |
65 | + } | |
66 | + return errval; | |
67 | +} /* End of CloseError() */ | |
68 | + | |
69 | +/****************************/ | |
70 | /* Function close_outfile() */ | |
71 | /****************************/ | |
72 | ||
73 | -void close_outfile(__G) /* GRR: change to return PK-style warning level */ | |
74 | +int close_outfile(__G) | |
75 | __GDEF | |
76 | { | |
77 | union { | |
78 | @@ -1108,6 +1139,7 @@ void close_outfile(__G) /* GRR: chang | |
79 | } zt; | |
80 | ulg z_uidgid[2]; | |
81 | int have_uidgid_flg; | |
82 | + int errval = PK_OK; | |
83 | ||
84 | have_uidgid_flg = get_extattribs(__G__ &(zt.t3), z_uidgid); | |
85 | ||
86 | @@ -1141,16 +1173,16 @@ void close_outfile(__G) /* GRR: chang | |
87 | Info(slide, 0x201, ((char *)slide, | |
88 | "warning: symbolic link (%s) failed: mem alloc overflow\n", | |
89 | FnFilter1(G.filename))); | |
90 | - fclose(G.outfile); | |
91 | - return; | |
92 | + errval = CloseError(G.outfile, G.filename); | |
93 | + return errval ? errval : PK_WARN; | |
94 | } | |
95 | ||
96 | if ((slnk_entry = (slinkentry *)malloc(slnk_entrysize)) == NULL) { | |
97 | Info(slide, 0x201, ((char *)slide, | |
98 | "warning: symbolic link (%s) failed: no mem\n", | |
99 | FnFilter1(G.filename))); | |
100 | - fclose(G.outfile); | |
101 | - return; | |
102 | + errval = CloseError(G.outfile, G.filename); | |
103 | + return errval ? errval : PK_WARN; | |
104 | } | |
105 | slnk_entry->next = NULL; | |
106 | slnk_entry->targetlen = ucsize; | |
107 | @@ -1174,10 +1206,10 @@ void close_outfile(__G) /* GRR: chang | |
108 | "warning: symbolic link (%s) failed\n", | |
109 | FnFilter1(G.filename))); | |
110 | free(slnk_entry); | |
111 | - fclose(G.outfile); | |
112 | - return; | |
113 | + errval = CloseError(G.outfile, G.filename); | |
114 | + return errval ? errval : PK_WARN; | |
115 | } | |
116 | - fclose(G.outfile); /* close "link" file for good... */ | |
117 | + errval = CloseError(G.outfile, G.filename); /* close "link" file for good... */ | |
118 | slnk_entry->target[ucsize] = '\0'; | |
119 | if (QCOND2) | |
120 | Info(slide, 0, ((char *)slide, "-> %s ", | |
121 | @@ -1188,7 +1220,7 @@ void close_outfile(__G) /* GRR: chang | |
122 | else | |
123 | G.slink_head = slnk_entry; | |
124 | G.slink_last = slnk_entry; | |
125 | - return; | |
126 | + return errval; | |
127 | } | |
128 | #endif /* SYMLINKS */ | |
129 | ||
130 | @@ -1201,7 +1233,7 @@ void close_outfile(__G) /* GRR: chang | |
131 | #endif | |
132 | ||
133 | #if (defined(NO_FCHOWN)) | |
134 | - fclose(G.outfile); | |
135 | + errval = CloseError(G.outfile, G.filename); | |
136 | #endif | |
137 | ||
138 | /* if -X option was specified and we have UID/GID info, restore it */ | |
139 | @@ -1227,7 +1259,7 @@ void close_outfile(__G) /* GRR: chang | |
140 | } | |
141 | ||
142 | #if (!defined(NO_FCHOWN) && defined(NO_FCHMOD)) | |
143 | - fclose(G.outfile); | |
144 | + errval = CloseError(G.outfile, G.filename); | |
145 | #endif | |
146 | ||
147 | #if (!defined(NO_FCHOWN) && !defined(NO_FCHMOD)) | |
148 | @@ -1239,7 +1271,7 @@ void close_outfile(__G) /* GRR: chang | |
149 | if (fchmod(fileno(G.outfile), filtattr(__G__ G.pInfo->file_attr))) | |
150 | perror("fchmod (file attributes) error"); | |
151 | ||
152 | - fclose(G.outfile); | |
153 | + errval = CloseError(G.outfile, G.filename); | |
154 | #endif /* !NO_FCHOWN && !NO_FCHMOD */ | |
155 | ||
156 | /* skip restoring time stamps on user's request */ | |
157 | @@ -1267,6 +1299,7 @@ void close_outfile(__G) /* GRR: chang | |
158 | #endif | |
159 | #endif /* NO_FCHOWN || NO_FCHMOD */ | |
160 | ||
161 | + return errval; | |
162 | } /* end function close_outfile() */ | |
163 | ||
164 | #endif /* !MTS */ | |
165 | diff -up unzip60/unzpriv.h.close unzip60/unzpriv.h | |
166 | --- unzip60/unzpriv.h.close 2009-04-20 01:59:26.000000000 +0200 | |
167 | +++ unzip60/unzpriv.h 2009-11-19 08:19:08.610388618 +0100 | |
168 | @@ -2604,7 +2604,7 @@ char *GetLoadPath OF((__GPRO)); | |
169 | int SetFileSize OF((FILE *file, zusz_t filesize)); /* local */ | |
170 | #endif | |
171 | #ifndef MTS /* macro in MTS */ | |
172 | - void close_outfile OF((__GPRO)); /* local */ | |
173 | + int close_outfile OF((__GPRO)); /* local */ | |
174 | #endif | |
175 | #ifdef SET_SYMLINK_ATTRIBS | |
176 | int set_symlnk_attribs OF((__GPRO__ slinkentry *slnk_entry)); /* local */ |