]> git.saurik.com Git - wxWidgets.git/blob - utils/Install/packace/uac_crt.c
merged 2.2 branch
[wxWidgets.git] / utils / Install / packace / uac_crt.c
1 /* ------------------------------------------------------------------------ */
2 /* */
3 /* Creates/Replaces files or directories. */
4 /* */
5 /* ------------------------------------------------------------------------ */
6
7 #include "os.h"
8
9 #include <stdlib.h>
10 #include <fcntl.h> // AMIGA: open()
11 #include <stdio.h> // pipeit() remove()
12 #include <string.h> // strncpy()
13 #include <sys/types.h>
14 #include <sys/stat.h> // struct stat
15 #include <string.h>
16
17
18 #if defined(DOS) || defined(WINNT) || defined(WIN16)
19 #include <io.h> // access()
20 #endif
21 #if defined(__IBMC__)
22 #include <direct.h>
23 #endif
24
25 #define DIRSEP '\\'
26
27 #include "attribs.h"
28 #include "globals.h"
29 #include "uac_crt.h"
30 #include "uac_sys.h"
31
32 /* gets file name from header
33 */
34 CHAR *ace_fname(CHAR * s, thead * head, INT nopath)
35 {
36 INT i;
37 char *cp;
38
39 strncpy(s, (CHAR *)(*(tfhead *) head).FNAME, i = (*(tfhead *) head).FNAME_SIZE);
40 s[i] = 0;
41
42 if (nopath)
43 {
44 cp=strrchr(s, '\\');
45 if (cp)
46 memmove(s, cp+1, strlen(cp));
47 }
48
49 return s;
50 }
51
52 void check_ext_dir(CHAR * f) // checks/creates path of file
53 {
54 CHAR *cp,
55 d[PATH_MAX];
56 INT i;
57
58 d[0] = 0;
59
60 for (;;)
61 {
62 if ((cp = (CHAR *) strchr(&f[strlen(d) + 1], DIRSEP))!=NULL)
63 {
64 i = cp - f;
65 strncpy(d, f, i);
66 d[i] = 0;
67 }
68 else
69 return;
70
71 if (!fileexists(d))
72 #if (defined(__OS2__) && !defined(__EMX__)) || (defined(WINNT) && !defined(__CYGWIN__))
73 if (mkdir(d))
74 #else
75 if (mkdir(d, 0))
76 #endif
77 {
78 f_err = ERR_WRITE;
79 pipeit("\n Error while creating directory.\n");
80 }
81 }
82 }
83
84 INT ovr_delete(CHAR * n) // deletes directory or file
85 {
86 if (remove(n) && rmdir(n))
87 {
88 pipeit("\n Could not delete file or directory. Access denied.\n");
89 return (1);
90 }
91 return (0);
92 }
93
94 INT create_dest_file(CHAR * file, INT a) // creates file or directory
95 {
96 INT han,
97 i = 0,
98 ex = fileexists(file);
99 struct stat st;
100
101 check_ext_dir(file);
102 if (f_err)
103 return (-1);
104 if (a & _A_SUBDIR)
105 { // create dir or file?
106 if (ex)
107 stat(file, &st);
108 #if (defined(__OS2__) && !defined(__EMX__)) || (!defined(__CYGWIN__) && defined(WINNT))
109 if ((!ex && mkdir(file)) || (ex && (st.st_mode & S_IFDIR)))
110 #else
111 if ((!ex && mkdir(file, 0)) || (ex && (st.st_mode & S_IFDIR)))
112 #endif
113 {
114 pipeit("\n Could not create directory.\n");
115 return (-1);
116 }
117 #ifdef DOS
118 _dos_setfileattr(file, a); // set directory attributes
119 #endif
120 return (-1);
121 }
122 else
123 {
124 if (ex)
125 { // does the file already exist
126 if (!f_ovrall)
127 {
128 i = wrask("Overwrite existing file?"); // prompt for overwrite
129 f_ovrall = (i == 1);
130 if (i == 3)
131 f_err = ERR_USER;
132 }
133 if ((i && !f_ovrall) || ovr_delete(file))
134 return (-1); // delete?
135 }
136 #if defined(__OS2_) || defined(__EMX__) || defined(WIN32)
137 if ((han = open(file, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY,
138 S_IREAD | S_IWRITE | S_IEXEC | S_IDELETE |
139 S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH )) < 0)
140 #else
141 if ((han = open(file, O_WRONLY | O_TRUNC | O_CREAT,
142 S_IREAD | S_IWRITE | S_IEXEC | S_IDELETE |
143 S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH )) < 0)
144 #endif
145 pipeit("\n Could not create destination file.\n");
146 return (han);
147 }
148 }
149