Mercurial > hg > xemacs-beta
comparison netinstall/root.cc @ 448:3078fd1074e8 r21-2-39
Import from CVS: tag r21-2-39
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:38:25 +0200 |
parents | |
children | 3d3049ae1304 |
comparison
equal
deleted
inserted
replaced
447:4fc5f13f3bd3 | 448:3078fd1074e8 |
---|---|
1 /* | |
2 * Copyright (c) 2000, Red Hat, Inc. | |
3 * | |
4 * This program is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * A copy of the GNU General Public License can be found at | |
10 * http://www.gnu.org/ | |
11 * | |
12 * Written by DJ Delorie <dj@cygnus.com> | |
13 * | |
14 */ | |
15 | |
16 /* The purpose of this file is to ask the user where they want the | |
17 root of the installation to be, and to ask whether the user prefers | |
18 text or binary mounts. */ | |
19 | |
20 #include "win32.h" | |
21 #include <shlobj.h> | |
22 #include <stdio.h> | |
23 #include <stdlib.h> | |
24 #include <ctype.h> | |
25 | |
26 #include "dialog.h" | |
27 #include "resource.h" | |
28 #include "state.h" | |
29 #include "msg.h" | |
30 #include "regedit.h" | |
31 #include "reginfo.h" | |
32 #include "concat.h" | |
33 #include "log.h" | |
34 | |
35 static int rb[] = { IDC_INSTALL_CYGWIN, IDC_INSTALL_NATIVE, 0 }; | |
36 static int su[] = { IDC_ROOT_SYSTEM, IDC_ROOT_USER, 0 }; | |
37 | |
38 static void | |
39 check_if_enable_next (HWND h) | |
40 { | |
41 EnableWindow (GetDlgItem (h, IDOK), install_type && root_dir && root_scope); | |
42 } | |
43 | |
44 static void | |
45 load_dialog (HWND h) | |
46 { | |
47 rbset (h, rb, install_type); | |
48 rbset (h, su, root_scope); | |
49 eset (h, IDC_ROOT_DIR, root_dir); | |
50 check_if_enable_next (h); | |
51 } | |
52 | |
53 static void | |
54 save_dialog (HWND h) | |
55 { | |
56 install_type = rbget (h, rb); | |
57 root_scope = rbget (h, su); | |
58 char* new_root_dir = eget (h, IDC_ROOT_DIR, root_dir); | |
59 | |
60 if (!root_dir || strcmp (new_root_dir, root_dir) != 0) | |
61 root_dir_default = 0; | |
62 | |
63 root_dir = new_root_dir; | |
64 } | |
65 | |
66 /* | |
67 * is_admin () determines whether or not the current user is a member of the | |
68 * Administrators group. On Windows 9X, the current user is considered an | |
69 * Administrator by definition. | |
70 */ | |
71 | |
72 static int | |
73 is_admin () | |
74 { | |
75 // Windows 9X users are considered Administrators by definition | |
76 OSVERSIONINFO verinfo; | |
77 verinfo.dwOSVersionInfoSize = sizeof (verinfo); | |
78 GetVersionEx (&verinfo); | |
79 if (verinfo.dwPlatformId != VER_PLATFORM_WIN32_NT) | |
80 return 1; | |
81 | |
82 // Get the process token for the current process | |
83 HANDLE token; | |
84 BOOL status = OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &token); | |
85 if (!status) | |
86 return 0; | |
87 | |
88 // Get the group token information | |
89 UCHAR token_info[1024]; | |
90 PTOKEN_GROUPS groups = (PTOKEN_GROUPS) token_info; | |
91 DWORD token_info_len = sizeof (token_info); | |
92 status = GetTokenInformation (token, TokenGroups, token_info, token_info_len, &token_info_len); | |
93 CloseHandle(token); | |
94 if (!status) | |
95 return 0; | |
96 | |
97 // Create the Administrators group SID | |
98 PSID admin_sid; | |
99 SID_IDENTIFIER_AUTHORITY authority = SECURITY_NT_AUTHORITY; | |
100 status = AllocateAndInitializeSid (&authority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &admin_sid); | |
101 if (!status) | |
102 return 0; | |
103 | |
104 // Check to see if the user is a member of the Administrators group | |
105 status = 0; | |
106 for (UINT i=0; i<groups->GroupCount; i++) { | |
107 if (EqualSid(groups->Groups[i].Sid, admin_sid)) { | |
108 status = 1; | |
109 break; | |
110 } | |
111 } | |
112 | |
113 // Destroy the Administrators group SID | |
114 FreeSid (admin_sid); | |
115 | |
116 // Return whether or not the user is a member of the Administrators group | |
117 return status; | |
118 } | |
119 | |
120 static void | |
121 change_default_root (int id) | |
122 { | |
123 int issystem; | |
124 char* cygroot = find_cygwin_root (&issystem); | |
125 if (id == IDC_INSTALL_CYGWIN && cygroot) | |
126 { | |
127 root_dir = concat (cygroot, XEMACS_CYGWIN_DEFAULT_ROOT, 0); | |
128 install_type = IDC_INSTALL_CYGWIN; | |
129 } | |
130 else if (id == IDC_INSTALL_NATIVE) | |
131 { | |
132 char windir[_MAX_PATH]; | |
133 GetWindowsDirectory (windir, sizeof (windir)); | |
134 windir[2] = 0; | |
135 root_dir = concat (windir, XEMACS_DEFAULT_ROOT, 0); | |
136 install_type = IDC_INSTALL_NATIVE; | |
137 } | |
138 } | |
139 | |
140 static void | |
141 read_mount_table () | |
142 { | |
143 int isnative, issystem; | |
144 root_dir = find_root_location (&issystem, &isnative); | |
145 if (root_dir) | |
146 { | |
147 if (isnative) | |
148 install_type = IDC_INSTALL_NATIVE; | |
149 else | |
150 install_type = IDC_INSTALL_CYGWIN; | |
151 | |
152 if (issystem) | |
153 root_scope = IDC_ROOT_SYSTEM; | |
154 else | |
155 root_scope = IDC_ROOT_USER; | |
156 root_dir_default = 0; | |
157 } | |
158 else | |
159 { | |
160 change_default_root (IDC_INSTALL_NATIVE); | |
161 root_scope = (is_admin()) ? IDC_ROOT_SYSTEM : IDC_ROOT_USER; | |
162 root_dir_default = 1; | |
163 } | |
164 } | |
165 | |
166 static int CALLBACK | |
167 browse_cb (HWND h, UINT m, LPARAM lp, LPARAM data) | |
168 { | |
169 switch (m) | |
170 { | |
171 case BFFM_INITIALIZED: | |
172 if (root_dir) | |
173 SendMessage (h, BFFM_SETSELECTION, TRUE, (LPARAM)root_dir); | |
174 break; | |
175 } | |
176 return 0; | |
177 } | |
178 | |
179 static void | |
180 browse (HWND h) | |
181 { | |
182 BROWSEINFO bi; | |
183 CHAR name[MAX_PATH]; | |
184 LPITEMIDLIST pidl; | |
185 memset (&bi, 0, sizeof (bi)); | |
186 bi.hwndOwner = h; | |
187 bi.pszDisplayName = name; | |
188 bi.lpszTitle = "Select an installation root directory"; | |
189 bi.ulFlags = BIF_RETURNONLYFSDIRS; | |
190 bi.lpfn = browse_cb; | |
191 pidl = SHBrowseForFolder (&bi); | |
192 if (pidl) | |
193 { | |
194 if (SHGetPathFromIDList (pidl, name)) | |
195 eset (h, IDC_ROOT_DIR, name); | |
196 } | |
197 } | |
198 | |
199 #define isslash(c) ((c) == '\\' || (c) == '/') | |
200 | |
201 static int | |
202 directory_is_absolute () | |
203 { | |
204 if (isalpha (root_dir[0]) | |
205 && root_dir[1] == ':' | |
206 && (root_dir[2] == '\\' || root_dir[2] == '/')) | |
207 return 1; | |
208 return 0; | |
209 } | |
210 | |
211 static int | |
212 directory_is_rootdir () | |
213 { | |
214 char *c; | |
215 for (c = root_dir; *c; c++) | |
216 if (isslash (c[0]) && c[1] && !isslash (c[1])) | |
217 return 0; | |
218 return 1; | |
219 } | |
220 | |
221 static int | |
222 cygwin_without_cygwin () | |
223 { | |
224 int issystem; | |
225 if (install_type == IDC_INSTALL_CYGWIN | |
226 && !find_cygwin_root (&issystem)) | |
227 return 1; | |
228 return 0; | |
229 } | |
230 | |
231 static BOOL | |
232 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code) | |
233 { | |
234 switch (id) | |
235 { | |
236 | |
237 case IDC_ROOT_DIR: | |
238 case IDC_ROOT_SYSTEM: | |
239 case IDC_ROOT_USER: | |
240 save_dialog (h); | |
241 check_if_enable_next (h); | |
242 break; | |
243 | |
244 case IDC_INSTALL_NATIVE: | |
245 case IDC_INSTALL_CYGWIN: | |
246 if (root_dir_default) | |
247 { | |
248 change_default_root (id); | |
249 eset (h, IDC_ROOT_DIR, root_dir); | |
250 } | |
251 save_dialog (h); | |
252 check_if_enable_next (h); | |
253 break; | |
254 | |
255 case IDC_ROOT_BROWSE: | |
256 browse (h); | |
257 break; | |
258 | |
259 case IDOK: | |
260 save_dialog (h); | |
261 | |
262 if (! directory_is_absolute ()) | |
263 { | |
264 note (IDS_ROOT_ABSOLUTE); | |
265 break; | |
266 } | |
267 | |
268 if (directory_is_rootdir ()) | |
269 if (IDNO == yesno (IDS_ROOT_SLASH)) | |
270 break; | |
271 | |
272 if (cygwin_without_cygwin ()) | |
273 if (IDNO == yesno (IDS_ROOT_NOCYGWIN)) | |
274 break; | |
275 | |
276 create_xemacs_root (root_dir, | |
277 root_scope == IDC_ROOT_SYSTEM ? 1 : 0, | |
278 install_type == IDC_INSTALL_NATIVE ? 1 : 0); | |
279 | |
280 switch (source) | |
281 { | |
282 case IDC_SOURCE_NETINST: | |
283 NEXT (IDD_NET); | |
284 break; | |
285 case IDC_SOURCE_CWD: | |
286 NEXT (IDD_S_FROM_CWD); | |
287 break; | |
288 default: | |
289 msg ("source is default? %d\n", source); | |
290 NEXT (0); | |
291 } | |
292 break; | |
293 | |
294 case IDC_BACK: | |
295 save_dialog (h); | |
296 NEXT (IDD_LOCAL_DIR); | |
297 break; | |
298 | |
299 case IDCANCEL: | |
300 NEXT (0); | |
301 break; | |
302 } | |
303 return FALSE; | |
304 } | |
305 | |
306 static BOOL CALLBACK | |
307 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam) | |
308 { | |
309 switch (message) | |
310 { | |
311 case WM_INITDIALOG: | |
312 load_dialog (h); | |
313 return FALSE; | |
314 case WM_COMMAND: | |
315 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd); | |
316 } | |
317 return FALSE; | |
318 } | |
319 | |
320 void | |
321 do_root (HINSTANCE h) | |
322 { | |
323 int rv = 0; | |
324 read_mount_table (); | |
325 | |
326 rv = DialogBox (h, MAKEINTRESOURCE (IDD_ROOT), 0, dialog_proc); | |
327 if (rv == -1) | |
328 fatal (IDS_DIALOG_FAILED); | |
329 | |
330 log (0, "root: %s %s %s", root_dir, | |
331 (install_type == IDC_INSTALL_NATIVE) ? "native" : "cygwin", | |
332 (root_scope == IDC_ROOT_USER) ? "user" : "system"); | |
333 } | |
334 |