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