]> git.saurik.com Git - wxWidgets.git/blame - utils/Install/sfxace/uac_crt.c
reduce flicker in header window when deleting items and let space select items even...
[wxWidgets.git] / utils / Install / sfxace / uac_crt.c
CommitLineData
f6bcfd97
BP
1/* ------------------------------------------------------------------------ */
2/* */
3/* Creates/Replaces files or directories. */
4/* */
5/* ------------------------------------------------------------------------ */
6
7#include "os.h"
8
9#ifdef __EMX__
10#include <sys/types.h>
11#include <sys/dirent.h>
12#include <stdlib.h>
13#endif
14#include <fcntl.h>
15#include <stdio.h> // printf() remove()
16#include <string.h> // strncpy()
17#include <sys/types.h>
18#include <sys/stat.h> // struct stat
19#include <time.h>
20#include "install.h"
21
22#if defined(DOS) || defined(WINNT) || defined(WIN16)
23 #include <io.h> // access()
24#endif
25#if defined(__CYGWIN__)
26#include <Windows32/Base.h>
27#endif
28
29#include "attribs.h"
30#include "globals.h"
31#include "uac_crt.h"
32#include "uac_sys.h"
33
34#ifdef ENABLE_LOGGING
35extern FILE *logfile;
36#endif
37extern char installdir[400];
38
39/* Undocumented functions */
40#if defined(__OS2__) || defined(__EMX__)
41APIRET APIENTRY DosReplaceModule(PSZ pszOldModule,PSZ pszNewModule,PSZ pszBackupModule);
42#endif
43
44
45/* gets file name from header
46 */
47CHAR *ace_fname(CHAR * s, thead * head, INT nopath)
48{
49 INT i;
50 char *cp;
51
52 strncpy(s, (CHAR*)(*(tfhead *) head).FNAME, i = (*(tfhead *) head).FNAME_SIZE);
53 s[i] = 0;
54
55 if (nopath)
56 {
57 cp=strrchr(s, '\\');
58 if (cp)
59 memmove(s, cp+1, strlen(cp));
60 }
61#ifdef __UNIX__
62 else
63 { // by current OS seperator
64 cp=s;
65 while ((cp=strchr(cp, '\\'))!=NULL)
66 *cp++='/';
67 }
68#endif
69
70 return s;
71}
72
73void check_ext_dir(CHAR * f) // checks/creates path of file
74{
75 char d[1024];
76 char buffer[1024];
77 int z, flag = 0, len = strlen(f);
78
79 strcpy(buffer, f);
80 for(z=len;z>-1;z--)
81 {
82 if(buffer[z] == '\\')
83 {
84 buffer[z+1] = 0;
85 flag = 1;
86 z = -1;
87 }
88 }
89 if(!flag)
90 return;
91 for(z=0;z<strlen(buffer);z++)
92 {
93 if(buffer[z] == '\\')
94 {
95 if(!(z == 2 && buffer[1] == ':'))
96 {
97 strcpy(d, buffer);
98 d[z] = 0;
99 if (!fileexists(d))
100 {
101#if (defined(__OS2__) && !defined(__EMX__)) || (defined(WINNT) && !defined(__CYGWIN__))
102 if (mkdir(d))
103#else
104 if (mkdir(d, 0))
105#endif
106
107 {
108#if 0
109 f_err = ERR_WRITE;
110 error("Error while creating directory \"%s\".", d);
111 }
112 else
113#else
114 }
115#endif
116 {
117#ifdef ENABLE_LOGGING
118 if(logfile)
119 {
120 if(strlen(d) > 1 && d[1] == ':')
121 fprintf(logfile, "<NewDir>,%s\r\n", d);
122 else
123 {
124 if(installdir[strlen(installdir)-1] == '\\')
125 fprintf(logfile, "<NewDir>,%s%s\r\n", installdir, d);
126 else
127 fprintf(logfile, "<NewDir>,%s\\%s\r\n", installdir, d);
128 }
129 }
130#endif
131 }
132 }
133 }
134 }
135
136 }
137}
138
139INT ovr_delete(CHAR * n) // deletes directory or file
140{
141 if (remove(n) && rmdir(n))
142 {
143#if defined(__OS2__) || defined(__EMX__)
144 DosReplaceModule(n, NULL, NULL);
145#endif
146 if (remove(n) && rmdir(n))
147 {
148 error("Could not delete file or directory: \"%s\" Access denied.", n);
149 return (1);
150 }
151 }
152 return (0);
153}
154
155INT create_dest_file(CHAR * file, INT a) // creates file or directory
156{
157 INT han,
158 i = 0,
159 ex = fileexists(file);
160 struct stat st;
161 extern int no_update;
162
163 check_ext_dir(file);
164 if (f_err)
165 return (-1);
166 if (a & _A_SUBDIR)
167 { // create dir or file?
168 if (ex)
169 {
170 stat(file, &st);
171 }
172
173#if (defined(__OS2__) && !defined(__EMX__)) || (!defined(__CYGWIN__) && defined(WINNT))
174 if ((!ex && mkdir(file)) || (ex && (st.st_mode & S_IFDIR)))
175#else
176 if ((!ex && mkdir(file, 0)) || (ex && (st.st_mode & S_IFDIR)))
177#endif
178 {
179 error("Could not create directory %s.");
180 return (-1);
181 }
182 else
183 { /* I wonder why it never gets here... :/ BS */
184#ifdef ENABLE_LOGGIN
185 if(logfile)
186 fprintf(logfile, "<NewDir>,%s\\%s\r\n", installdir, file);
187#endif
188 }
189
190#ifdef DOS
191 _dos_setfileattr(file, a); // set directory attributes
192#endif
193 return (-1);
194 }
195 else
196 {
197 if (ex)
198 { // does the file already exist
199#if defined(__OS2_) || defined(__EMX__)
200 static int sddall = 0;
201 FILESTATUS3 fileinfo;
202
203 f_ovrall = 1;
204
205 DosQueryPathInfo(file, FIL_STANDARD, &fileinfo, sizeof(FILESTATUS3));
206 if(!sddall)
207 {
208 FDATE fdate;
209 FTIME ftime;
210 struct tm tc, tc2;
211 time_t tt, tt2;
212
213 *((USHORT*)&fdate) = (USHORT)(fhead.FTIME >> 16);
214 *((USHORT*)&ftime) = (USHORT)fhead.FTIME;
215
216 tc.tm_year = fileinfo.fdateLastWrite.year + 80;
217 tc.tm_mon = fileinfo.fdateLastWrite.month - 1;
218 tc.tm_mday = fileinfo.fdateLastWrite.day;
219 tc.tm_hour = fileinfo.ftimeLastWrite.hours;
220 tc.tm_min = fileinfo.ftimeLastWrite.minutes;
221 tc.tm_sec = fileinfo.ftimeLastWrite.twosecs * 2;
222
223 tc2.tm_year = fdate.year + 80;
224 tc2.tm_mon = fdate.month - 1;
225 tc2.tm_mday = fdate.day;
226 tc2.tm_hour = ftime.hours;
227 tc2.tm_min = ftime.minutes;
228 tc2.tm_sec = ftime.twosecs * 2;
229
230 if((tt = mktime(&tc)) == -1 || (tt2 = mktime(&tc2)) == -1 || tt > tt2)
231 {
232
233 if(file[1] == ':')
234 i = confirm("File \"%s\" has a newer modification time. Overwrite?", file); // prompt for overwrite
235 else
236 {
237 if(installdir[strlen(installdir)-1] == '\\')
238 i = confirm("File \"%s%s\" has a newer modification time. Overwrite?", installdir, file); // prompt for overwrite
239 else
240 i = confirm("File \"%s\\%s\" has a newer modification time. Overwrite?", installdir, file); // prompt for overwrite
241 }
242 if(i == 1)
243 {
244 sddall = 1;
245 i = 0;
246 }
247 if (i == 3)
248 f_err = ERR_USER;
249 if(i)
250 return -1;
251 }
252 }
253 fileinfo.attrFile = FILE_NORMAL;
254 DosSetPathInfo(file, FIL_STANDARD, (PVOID)&fileinfo, sizeof(FILESTATUS3), 0);
255#endif
256 if (!f_ovrall)
257 {
258 if(installdir[strlen(installdir)-1] == '\\')
259 i = confirm("Overwrite file \"%s%s\"?", installdir, file); // prompt for overwrite
260 else
261 i = confirm("Overwrite file \"%s\\%s\"?", installdir, file); // prompt for overwrite
262 f_ovrall = (i == 1);
263 if (i == 3)
264 f_err = ERR_USER;
265 }
266 if ((i && !f_ovrall) || ovr_delete(file))
267 return (-1); // delete?
268 }
269#if defined(__OS2_) || defined(__EMX__) || defined(WIN32)
270 if ((han = open(file, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY,
271 S_IREAD | S_IWRITE | S_IEXEC | S_IDELETE |
272 S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH )) < 0)
273#else
274 if ((han = open(file, O_WRONLY | O_TRUNC | O_CREAT,
275 S_IREAD | S_IWRITE | S_IEXEC | S_IDELETE |
276 S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH )) < 0)
277#endif
278 error("Could not create destination file \"%s\".", file);
279 else
280 {
281#ifdef ENABLE_LOGGING
282 if(logfile)
283 {
284 if(!no_update)
285 {
286 if(strlen(file) > 1 && file[1] == ':')
287 fprintf(logfile, "<FileInst>,%s\r\n", file);
288 else
289 {
290 if(installdir[strlen(installdir)-1] == '\\')
291 fprintf(logfile, "<FileInst>,%s%s\r\n", installdir, file);
292 else
293 fprintf(logfile, "<FileInst>,%s\\%s\r\n", installdir, file);
294 }
295 }
296 }
297#endif
298 }
299
300 return (han);
301 }
302}
303