Mercurial > vim
annotate src/dosinst.h @ 20414:cbf8715299d8
Added tag v8.2.0761 for changeset 92826050c45e3db9a67bcad9c44f6d4a2a065dc5
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 15 May 2020 22:15:04 +0200 |
parents | 9800e126eaa2 |
children | faf7fcd1c8d5 |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
8212
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 /* | |
18174
1ec6539cef68
patch 8.1.2082: some files have a weird name to fit in 8.3 characters
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
10 * dosinst.h: Common code for dosinst.c and uninstall.c |
7 | 11 */ |
714 | 12 |
7 | 13 #include <stdio.h> |
14 #include <stdlib.h> | |
15 #include <string.h> | |
16 #include <sys/stat.h> | |
17 #include <fcntl.h> | |
18 | |
19 #ifndef UNIX_LINT | |
19380
1e78bf92f168
patch 8.2.0248: MS-Windows: dealing with deprecation is too complicated
Bram Moolenaar <Bram@vim.org>
parents:
18753
diff
changeset
|
20 # include <io.h> |
7 | 21 # include <ctype.h> |
22 | |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
23 # include <direct.h> |
7 | 24 |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
25 # include <windows.h> |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
26 # include <shlobj.h> |
7 | 27 #endif |
28 | |
29 #ifdef UNIX_LINT | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
30 // Running lint on Unix: Some things are missing. |
7 | 31 char *searchpath(char *name); |
32 #endif | |
33 | |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8080
diff
changeset
|
34 #if defined(UNIX_LINT) |
7 | 35 # include <unistd.h> |
36 # include <errno.h> | |
37 #endif | |
38 | |
39 #include "version.h" | |
40 | |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8080
diff
changeset
|
41 #if defined(UNIX_LINT) |
7 | 42 # define vim_mkdir(x, y) mkdir((char *)(x), y) |
43 #else | |
16606
7e733046db1d
patch 8.1.1306: Borland support is outdated and doesn't work
Bram Moolenaar <Bram@vim.org>
parents:
15941
diff
changeset
|
44 # define vim_mkdir(x, y) _mkdir((char *)(x)) |
7 | 45 #endif |
2287
573da4dac306
Make the dos installer work with more compilers.
Bram Moolenaar <bram@vim.org>
parents:
2217
diff
changeset
|
46 |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8080
diff
changeset
|
47 #define sleep(n) Sleep((n) * 1000) |
2287
573da4dac306
Make the dos installer work with more compilers.
Bram Moolenaar <bram@vim.org>
parents:
2217
diff
changeset
|
48 |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
49 // ---------------------------------------- |
7 | 50 |
51 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
52 #define BUFSIZE (MAX_PATH*2) // long enough to hold a file name path |
7 | 53 #define NUL 0 |
54 | |
55 #define FAIL 0 | |
56 #define OK 1 | |
57 | |
58 #ifndef FALSE | |
59 # define FALSE 0 | |
60 #endif | |
61 #ifndef TRUE | |
62 # define TRUE 1 | |
63 #endif | |
64 | |
2449
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
65 /* |
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
66 * Modern way of creating registry entries, also works on 64 bit windows when |
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
67 * compiled as a 32 bit program. |
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
68 */ |
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
69 # ifndef KEY_WOW64_64KEY |
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
70 # define KEY_WOW64_64KEY 0x0100 |
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
71 # endif |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
72 # ifndef KEY_WOW64_32KEY |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
73 # define KEY_WOW64_32KEY 0x0200 |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
74 # endif |
2449
943280505f72
Fix that uninstaller isn't found on 64-bit Windows.
Bram Moolenaar <bram@vim.org>
parents:
2287
diff
changeset
|
75 |
7 | 76 #define VIM_STARTMENU "Programs\\Vim " VIM_VERSION_SHORT |
77 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
78 int interactive; // non-zero when running interactively |
7 | 79 |
80 /* | |
81 * Call malloc() and exit when out of memory. | |
82 */ | |
83 static void * | |
84 alloc(int len) | |
85 { | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
86 void *p; |
7 | 87 |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
88 p = malloc(len); |
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
89 if (p == NULL) |
7 | 90 { |
91 printf("ERROR: out of memory\n"); | |
92 exit(1); | |
93 } | |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
94 return p; |
7 | 95 } |
96 | |
97 /* | |
98 * The toupper() in Bcc 5.5 doesn't work, use our own implementation. | |
99 */ | |
100 static int | |
101 mytoupper(int c) | |
102 { | |
103 if (c >= 'a' && c <= 'z') | |
104 return c - 'a' + 'A'; | |
105 return c; | |
106 } | |
107 | |
108 static void | |
109 myexit(int n) | |
110 { | |
111 if (!interactive) | |
112 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
113 // Present a prompt, otherwise error messages can't be read. |
7 | 114 printf("Press Enter to continue\n"); |
115 rewind(stdin); | |
116 (void)getchar(); | |
117 } | |
118 exit(n); | |
119 } | |
120 | |
121 | |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
122 typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL); |
7 | 123 /* |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
124 * Check if this is a 64-bit OS. |
7 | 125 */ |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
126 static BOOL |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
127 is_64bit_os(void) |
7 | 128 { |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
129 #ifdef _WIN64 |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
130 return TRUE; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
131 #else |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
132 BOOL bIsWow64 = FALSE; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
133 LPFN_ISWOW64PROCESS pIsWow64Process; |
7 | 134 |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
135 pIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
136 GetModuleHandle("kernel32"), "IsWow64Process"); |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
137 if (pIsWow64Process != NULL) |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
138 pIsWow64Process(GetCurrentProcess(), &bIsWow64); |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
139 return bIsWow64; |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
140 #endif |
7 | 141 } |
142 | |
143 static char * | |
144 searchpath(char *name) | |
145 { | |
146 static char widename[2 * BUFSIZE]; | |
147 static char location[2 * BUFSIZE + 2]; | |
148 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
149 // There appears to be a bug in FindExecutableA() on Windows NT. |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
150 // Use FindExecutableW() instead... |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
151 MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)name, -1, |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
152 (LPWSTR)widename, BUFSIZE); |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
153 if (FindExecutableW((LPCWSTR)widename, (LPCWSTR)"", |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
154 (LPWSTR)location) > (HINSTANCE)32) |
7 | 155 { |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
156 WideCharToMultiByte(CP_ACP, 0, (LPWSTR)location, -1, |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
157 (LPSTR)widename, 2 * BUFSIZE, NULL, NULL); |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
158 return widename; |
7 | 159 } |
160 return NULL; | |
161 } | |
162 | |
163 /* | |
164 * Call searchpath() and save the result in allocated memory, or return NULL. | |
165 */ | |
166 static char * | |
167 searchpath_save(char *name) | |
168 { | |
169 char *p; | |
170 char *s; | |
171 | |
172 p = searchpath(name); | |
173 if (p == NULL) | |
174 return NULL; | |
175 s = alloc(strlen(p) + 1); | |
176 strcpy(s, p); | |
177 return s; | |
178 } | |
179 | |
826 | 180 |
181 #ifndef CSIDL_COMMON_PROGRAMS | |
182 # define CSIDL_COMMON_PROGRAMS 0x0017 | |
183 #endif | |
184 #ifndef CSIDL_COMMON_DESKTOPDIRECTORY | |
185 # define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019 | |
186 #endif | |
187 | |
7 | 188 /* |
189 * Get the path to a requested Windows shell folder. | |
190 * | |
191 * Return FAIL on error, OK on success | |
192 */ | |
193 int | |
194 get_shell_folder_path( | |
195 char *shell_folder_path, | |
196 const char *shell_folder_name) | |
197 { | |
198 /* | |
199 * The following code was successfully built with make_mvc.mak. | |
200 * The resulting executable worked on Windows 95, Millennium Edition, and | |
201 * 2000 Professional. But it was changed after testing... | |
202 */ | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
203 LPITEMIDLIST pidl = 0; // Pointer to an Item ID list allocated below |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
204 LPMALLOC pMalloc; // Pointer to an IMalloc interface |
7 | 205 int csidl; |
206 int alt_csidl = -1; | |
207 static int desktop_csidl = -1; | |
208 static int programs_csidl = -1; | |
209 int *pcsidl; | |
210 int r; | |
211 | |
212 if (strcmp(shell_folder_name, "desktop") == 0) | |
213 { | |
214 pcsidl = &desktop_csidl; | |
215 csidl = CSIDL_COMMON_DESKTOPDIRECTORY; | |
216 alt_csidl = CSIDL_DESKTOP; | |
217 } | |
218 else if (strncmp(shell_folder_name, "Programs", 8) == 0) | |
219 { | |
220 pcsidl = &programs_csidl; | |
221 csidl = CSIDL_COMMON_PROGRAMS; | |
222 alt_csidl = CSIDL_PROGRAMS; | |
223 } | |
224 else | |
225 { | |
226 printf("\nERROR (internal) unrecognised shell_folder_name: \"%s\"\n\n", | |
227 shell_folder_name); | |
228 return FAIL; | |
229 } | |
230 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
231 // Did this stuff before, use the same ID again. |
7 | 232 if (*pcsidl >= 0) |
233 { | |
234 csidl = *pcsidl; | |
235 alt_csidl = -1; | |
236 } | |
237 | |
238 retry: | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
239 // Initialize pointer to IMalloc interface |
7 | 240 if (NOERROR != SHGetMalloc(&pMalloc)) |
241 { | |
242 printf("\nERROR getting interface for shell_folder_name: \"%s\"\n\n", | |
243 shell_folder_name); | |
244 return FAIL; | |
245 } | |
246 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
247 // Get an ITEMIDLIST corresponding to the folder code |
7 | 248 if (NOERROR != SHGetSpecialFolderLocation(0, csidl, &pidl)) |
249 { | |
250 if (alt_csidl < 0 || NOERROR != SHGetSpecialFolderLocation(0, | |
251 alt_csidl, &pidl)) | |
252 { | |
253 printf("\nERROR getting ITEMIDLIST for shell_folder_name: \"%s\"\n\n", | |
254 shell_folder_name); | |
255 return FAIL; | |
256 } | |
257 csidl = alt_csidl; | |
258 alt_csidl = -1; | |
259 } | |
260 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
261 // Translate that ITEMIDLIST to a string |
7 | 262 r = SHGetPathFromIDList(pidl, shell_folder_path); |
263 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
264 // Free the data associated with pidl |
7 | 265 pMalloc->lpVtbl->Free(pMalloc, pidl); |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
266 // Release the IMalloc interface |
7 | 267 pMalloc->lpVtbl->Release(pMalloc); |
268 | |
269 if (!r) | |
270 { | |
271 if (alt_csidl >= 0) | |
272 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
273 // We probably get here for Windows 95: the "all users" |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
274 // desktop/start menu entry doesn't exist. |
7 | 275 csidl = alt_csidl; |
276 alt_csidl = -1; | |
277 goto retry; | |
278 } | |
279 printf("\nERROR translating ITEMIDLIST for shell_folder_name: \"%s\"\n\n", | |
280 shell_folder_name); | |
281 return FAIL; | |
282 } | |
283 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
284 // If there is an alternative: verify we can write in this directory. |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
285 // This should cause a retry when the "all users" directory exists but we |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
286 // are a normal user and can't write there. |
7 | 287 if (alt_csidl >= 0) |
288 { | |
289 char tbuf[BUFSIZE]; | |
290 FILE *fd; | |
291 | |
292 strcpy(tbuf, shell_folder_path); | |
293 strcat(tbuf, "\\vim write test"); | |
294 fd = fopen(tbuf, "w"); | |
295 if (fd == NULL) | |
296 { | |
297 csidl = alt_csidl; | |
298 alt_csidl = -1; | |
299 goto retry; | |
300 } | |
301 fclose(fd); | |
302 unlink(tbuf); | |
303 } | |
304 | |
305 /* | |
306 * Keep the found csidl for next time, so that we don't have to do the | |
307 * write test every time. | |
308 */ | |
309 if (*pcsidl < 0) | |
310 *pcsidl = csidl; | |
311 | |
312 if (strncmp(shell_folder_name, "Programs\\", 9) == 0) | |
313 strcat(shell_folder_path, shell_folder_name + 8); | |
314 | |
315 return OK; | |
316 } | |
317 | |
318 /* | |
319 * List of targets. The first one (index zero) is used for the default path | |
320 * for the batch files. | |
321 */ | |
782 | 322 #define TARGET_COUNT 9 |
7 | 323 |
324 struct | |
325 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
326 char *name; // Vim exe name (without .exe) |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
327 char *batname; // batch file name |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
328 char *lnkname; // shortcut file name |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
329 char *exename; // exe file name |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
330 char *exenamearg; // exe file name when using exearg |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
331 char *exearg; // argument for vim.exe or gvim.exe |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
332 char *oldbat; // path to existing xxx.bat or NULL |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
333 char *oldexe; // path to existing xxx.exe or NULL |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
334 char batpath[BUFSIZE]; // path of batch file to create; not |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
335 // created when it's empty |
7 | 336 } targets[TARGET_COUNT] = |
337 { | |
338 {"all", "batch files"}, | |
339 {"vim", "vim.bat", "Vim.lnk", | |
340 "vim.exe", "vim.exe", ""}, | |
341 {"gvim", "gvim.bat", "gVim.lnk", | |
342 "gvim.exe", "gvim.exe", ""}, | |
343 {"evim", "evim.bat", "gVim Easy.lnk", | |
344 "evim.exe", "gvim.exe", "-y"}, | |
345 {"view", "view.bat", "Vim Read-only.lnk", | |
346 "view.exe", "vim.exe", "-R"}, | |
347 {"gview", "gview.bat", "gVim Read-only.lnk", | |
348 "gview.exe", "gvim.exe", "-R"}, | |
349 {"vimdiff", "vimdiff.bat", "Vim Diff.lnk", | |
350 "vimdiff.exe","vim.exe", "-d"}, | |
351 {"gvimdiff","gvimdiff.bat", "gVim Diff.lnk", | |
352 "gvimdiff.exe","gvim.exe", "-d"}, | |
782 | 353 {"vimtutor","vimtutor.bat", "Vim tutor.lnk", |
354 "vimtutor.bat", "vimtutor.bat", ""}, | |
7 | 355 }; |
356 | |
19431
9800e126eaa2
patch 8.2.0273: MS-Windows uninstall may delete wrong batch file
Bram Moolenaar <Bram@vim.org>
parents:
19380
diff
changeset
|
357 /* Uninstall key for vim.bat, etc. */ |
9800e126eaa2
patch 8.2.0273: MS-Windows uninstall may delete wrong batch file
Bram Moolenaar <Bram@vim.org>
parents:
19380
diff
changeset
|
358 #define VIMBAT_UNINSTKEY "rem # uninstall key: " VIM_VERSION_NODOT " #" |
9800e126eaa2
patch 8.2.0273: MS-Windows uninstall may delete wrong batch file
Bram Moolenaar <Bram@vim.org>
parents:
19380
diff
changeset
|
359 |
7 | 360 #define ICON_COUNT 3 |
361 char *(icon_names[ICON_COUNT]) = | |
362 {"gVim " VIM_VERSION_SHORT, | |
363 "gVim Easy " VIM_VERSION_SHORT, | |
364 "gVim Read only " VIM_VERSION_SHORT}; | |
365 char *(icon_link_names[ICON_COUNT]) = | |
366 {"gVim " VIM_VERSION_SHORT ".lnk", | |
367 "gVim Easy " VIM_VERSION_SHORT ".lnk", | |
368 "gVim Read only " VIM_VERSION_SHORT ".lnk"}; | |
369 | |
12626
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
370 /* This is only used for dosinst.c. */ |
aca41efd888c
patch 8.0.1191: MS-Windows: missing 32 and 64 bit files in installer
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
371 #if defined(DOSINST) |
7 | 372 /* |
373 * Run an external command and wait for it to finish. | |
374 */ | |
375 static void | |
376 run_command(char *cmd) | |
377 { | |
378 char *cmd_path; | |
15892
e43b5e6d9190
patch 8.1.0952: compilation warnings when building the MS-Windows installer
Bram Moolenaar <Bram@vim.org>
parents:
12626
diff
changeset
|
379 char cmd_buf[BUFSIZE * 2 + 35]; |
7 | 380 char *p; |
381 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
382 // On WinNT, 'start' is a shell built-in for cmd.exe rather than an |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
383 // executable (start.exe) like in Win9x. |
7 | 384 cmd_path = searchpath_save("cmd.exe"); |
385 if (cmd_path != NULL) | |
386 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
387 // There is a cmd.exe, so this might be Windows NT. If it is, |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
388 // we need to call cmd.exe explicitly. If it is a later OS, |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
389 // calling cmd.exe won't hurt if it is present. |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
390 // Also, "start" on NT expects a window title argument. |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
391 // Replace the slashes with backslashes. |
7 | 392 while ((p = strchr(cmd_path, '/')) != NULL) |
393 *p = '\\'; | |
2217
120502692d82
Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents:
1222
diff
changeset
|
394 sprintf(cmd_buf, "%s /c start \"vimcmd\" /wait %s", cmd_path, cmd); |
7 | 395 free(cmd_path); |
396 } | |
397 else | |
398 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
399 // No cmd.exe, just make the call and let the system handle it. |
7 | 400 sprintf(cmd_buf, "start /w %s", cmd); |
401 } | |
402 system(cmd_buf); | |
403 } | |
404 #endif | |
405 | |
406 /* | |
407 * Append a backslash to "name" if there isn't one yet. | |
408 */ | |
8080
b6cb94ad97a4
commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents:
2475
diff
changeset
|
409 void |
7 | 410 add_pathsep(char *name) |
411 { | |
412 int len = strlen(name); | |
413 | |
414 if (len > 0 && name[len - 1] != '\\' && name[len - 1] != '/') | |
415 strcat(name, "\\"); | |
416 } | |
417 | |
418 /* | |
419 * The normal chdir() does not change the default drive. This one does. | |
420 */ | |
421 int | |
422 change_drive(int drive) | |
423 { | |
424 char temp[3] = "-:"; | |
425 temp[0] = (char)(drive + 'A' - 1); | |
426 return !SetCurrentDirectory(temp); | |
427 } | |
428 | |
429 /* | |
430 * Change directory to "path". | |
431 * Return 0 for success, -1 for failure. | |
432 */ | |
433 int | |
434 mch_chdir(char *path) | |
435 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
436 if (path[0] == NUL) // just checking... |
7 | 437 return 0; |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
438 if (path[1] == ':') // has a drive name |
7 | 439 { |
440 if (change_drive(mytoupper(path[0]) - 'A' + 1)) | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
441 return -1; // invalid drive name |
7 | 442 path += 2; |
443 } | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
444 if (*path == NUL) // drive name only |
7 | 445 return 0; |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
446 return chdir(path); // let the normal chdir() do the rest |
7 | 447 } |
448 | |
449 /* | |
450 * Expand the executable name into a full path name. | |
451 */ | |
452 static char * | |
453 my_fullpath(char *buf, char *fname, int len) | |
454 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
455 // Only GetModuleFileName() will get the long file name path. |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
456 // GetFullPathName() may still use the short (FAT) name. |
7 | 457 DWORD len_read = GetModuleFileName(NULL, buf, (size_t)len); |
458 | |
459 return (len_read > 0 && len_read < (DWORD)len) ? buf : NULL; | |
460 } | |
461 | |
462 /* | |
463 * Remove the tail from a file or directory name. | |
464 * Puts a NUL on the last '/' or '\'. | |
465 */ | |
466 static void | |
467 remove_tail(char *path) | |
468 { | |
469 int i; | |
470 | |
471 for (i = strlen(path) - 1; i > 0; --i) | |
472 if (path[i] == '/' || path[i] == '\\') | |
473 { | |
474 path[i] = NUL; | |
475 break; | |
476 } | |
477 } | |
478 | |
479 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
480 char installdir[MAX_PATH-9]; // top of the installation dir, where the |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
481 // install.exe is located, E.g.: |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
482 // "c:\vim\vim60" |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
483 int runtimeidx; // index in installdir[] where "vim60" starts |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
484 char *sysdrive; // system drive or "c:\" |
7 | 485 |
486 /* | |
487 * Setup for using this program. | |
488 * Sets "installdir[]". | |
489 */ | |
490 static void | |
491 do_inits(char **argv) | |
492 { | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
493 // Find out the full path of our executable. |
15941
b9098585d945
patch 8.1.0976: dosinstall still has buffer overflow problems
Bram Moolenaar <Bram@vim.org>
parents:
15892
diff
changeset
|
494 if (my_fullpath(installdir, argv[0], sizeof(installdir)) == NULL) |
7 | 495 { |
496 printf("ERROR: Cannot get name of executable\n"); | |
497 myexit(1); | |
498 } | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
499 // remove the tail, the executable name "install.exe" |
7 | 500 remove_tail(installdir); |
501 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
502 // change to the installdir |
7 | 503 mch_chdir(installdir); |
504 | |
18753
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
505 // Find the system drive. Only used for searching the Vim executable, not |
6e3dc2d630c2
patch 8.1.2366: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18174
diff
changeset
|
506 // very important. |
7 | 507 sysdrive = getenv("SYSTEMDRIVE"); |
508 if (sysdrive == NULL || *sysdrive == NUL) | |
509 sysdrive = "C:\\"; | |
510 } |