2 * Copyright (c) 2000, Red Hat, Inc.
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.
9 * A copy of the GNU General Public License can be found at
12 * Written by DJ Delorie <dj@cygnus.com>
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. */
35 static int rb[] = { IDC_INSTALL_CYGWIN, IDC_INSTALL_NATIVE, 0 };
36 static int su[] = { IDC_ROOT_SYSTEM, IDC_ROOT_USER, 0 };
39 check_if_enable_next (HWND h)
41 EnableWindow (GetDlgItem (h, IDOK), install_type && root_dir && root_scope);
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);
56 install_type = rbget (h, rb);
57 root_scope = rbget (h, su);
58 char* new_root_dir = eget (h, IDC_ROOT_DIR, root_dir);
60 if (!root_dir || strcmp (new_root_dir, root_dir) != 0)
63 root_dir = new_root_dir;
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.
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)
82 // Get the process token for the current process
84 BOOL status = OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &token);
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);
97 // Create the Administrators group 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);
104 // Check to see if the user is a member of the Administrators group
106 for (UINT i=0; i<groups->GroupCount; i++) {
107 if (EqualSid(groups->Groups[i].Sid, admin_sid)) {
113 // Destroy the Administrators group SID
116 // Return whether or not the user is a member of the Administrators group
121 change_default_root (int id)
124 char* cygroot = find_cygwin_root (&issystem);
125 if (id == IDC_INSTALL_CYGWIN && cygroot)
127 root_dir = concat (cygroot, XEMACS_CYGWIN_DEFAULT_ROOT, 0);
128 install_type = IDC_INSTALL_CYGWIN;
130 else if (id == IDC_INSTALL_NATIVE)
132 char windir[_MAX_PATH];
133 GetWindowsDirectory (windir, sizeof (windir));
135 root_dir = concat (windir, XEMACS_DEFAULT_ROOT, 0);
136 install_type = IDC_INSTALL_NATIVE;
143 int isnative, issystem;
144 root_dir = find_root_location (&issystem, &isnative);
148 install_type = IDC_INSTALL_NATIVE;
150 install_type = IDC_INSTALL_CYGWIN;
153 root_scope = IDC_ROOT_SYSTEM;
155 root_scope = IDC_ROOT_USER;
156 root_dir_default = 0;
160 change_default_root (IDC_INSTALL_NATIVE);
161 root_scope = (is_admin()) ? IDC_ROOT_SYSTEM : IDC_ROOT_USER;
162 root_dir_default = 1;
167 browse_cb (HWND h, UINT m, LPARAM lp, LPARAM data)
171 case BFFM_INITIALIZED:
173 SendMessage (h, BFFM_SETSELECTION, TRUE, (LPARAM)root_dir);
185 memset (&bi, 0, sizeof (bi));
187 bi.pszDisplayName = name;
188 bi.lpszTitle = "Select an installation root directory";
189 bi.ulFlags = BIF_RETURNONLYFSDIRS;
191 pidl = SHBrowseForFolder (&bi);
194 if (SHGetPathFromIDList (pidl, name))
195 eset (h, IDC_ROOT_DIR, name);
199 #define isslash(c) ((c) == '\\' || (c) == '/')
202 directory_is_absolute ()
204 if (isalpha (root_dir[0])
205 && root_dir[1] == ':'
206 && (root_dir[2] == '\\' || root_dir[2] == '/'))
212 directory_is_rootdir ()
215 for (c = root_dir; *c; c++)
216 if (isslash (c[0]) && c[1] && !isslash (c[1]))
222 cygwin_without_cygwin ()
225 if (install_type == IDC_INSTALL_CYGWIN
226 && !find_cygwin_root (&issystem))
232 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code)
238 case IDC_ROOT_SYSTEM:
241 check_if_enable_next (h);
244 case IDC_INSTALL_NATIVE:
245 case IDC_INSTALL_CYGWIN:
246 if (root_dir_default)
248 change_default_root (id);
249 eset (h, IDC_ROOT_DIR, root_dir);
252 check_if_enable_next (h);
255 case IDC_ROOT_BROWSE:
262 if (! directory_is_absolute ())
264 note (IDS_ROOT_ABSOLUTE);
268 if (directory_is_rootdir ())
269 if (IDNO == yesno (IDS_ROOT_SLASH))
272 if (cygwin_without_cygwin ())
273 if (IDNO == yesno (IDS_ROOT_NOCYGWIN))
276 create_xemacs_root (root_dir,
277 root_scope == IDC_ROOT_SYSTEM ? 1 : 0,
278 install_type == IDC_INSTALL_NATIVE ? 1 : 0);
282 case IDC_SOURCE_NETINST:
286 NEXT (IDD_S_FROM_CWD);
289 msg ("source is default? %d\n", source);
296 NEXT (IDD_LOCAL_DIR);
307 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
315 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd);
321 do_root (HINSTANCE h)
326 rv = DialogBox (h, MAKEINTRESOURCE (IDD_ROOT), 0, dialog_proc);
328 fatal (IDS_DIALOG_FAILED);
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");