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;
141 browse_cb (HWND h, UINT m, LPARAM lp, LPARAM data)
145 case BFFM_INITIALIZED:
147 SendMessage (h, BFFM_SETSELECTION, TRUE, (LPARAM)root_dir);
159 memset (&bi, 0, sizeof (bi));
161 bi.pszDisplayName = name;
162 bi.lpszTitle = "Select an installation root directory";
163 bi.ulFlags = BIF_RETURNONLYFSDIRS;
165 pidl = SHBrowseForFolder (&bi);
168 if (SHGetPathFromIDList (pidl, name))
169 eset (h, IDC_ROOT_DIR, name);
173 #define isslash(c) ((c) == '\\' || (c) == '/')
176 directory_is_absolute ()
178 if (isalpha (root_dir[0])
179 && root_dir[1] == ':'
180 && (root_dir[2] == '\\' || root_dir[2] == '/'))
186 directory_is_rootdir ()
189 for (c = root_dir; *c; c++)
190 if (isslash (c[0]) && c[1] && !isslash (c[1]))
196 cygwin_without_cygwin ()
199 if (install_type == IDC_INSTALL_CYGWIN
200 && !find_cygwin_root (&issystem))
206 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code)
212 case IDC_ROOT_SYSTEM:
215 check_if_enable_next (h);
218 case IDC_INSTALL_NATIVE:
219 case IDC_INSTALL_CYGWIN:
220 if (root_dir_default)
222 change_default_root (id);
223 eset (h, IDC_ROOT_DIR, root_dir);
226 check_if_enable_next (h);
229 case IDC_ROOT_BROWSE:
236 if (! directory_is_absolute ())
238 note (IDS_ROOT_ABSOLUTE);
242 if (directory_is_rootdir ())
243 if (IDNO == yesno (IDS_ROOT_SLASH))
246 if (cygwin_without_cygwin ())
247 if (IDNO == yesno (IDS_ROOT_NOCYGWIN))
250 create_xemacs_root (backslash (root_dir),
251 root_scope == IDC_ROOT_SYSTEM ? 1 : 0,
252 install_type == IDC_INSTALL_NATIVE ? 1 : 0);
256 case IDC_SOURCE_NETINST:
260 NEXT (IDD_S_FROM_CWD);
263 msg ("source is default? %d\n", source);
270 NEXT (IDD_LOCAL_DIR);
281 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
289 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd);
297 change_default_root (IDC_INSTALL_NATIVE);
298 root_scope = (is_admin()) ? IDC_ROOT_SYSTEM : IDC_ROOT_USER;
299 root_dir_default = 1;
303 do_root (HINSTANCE h)
306 // init will have read a previous root
310 rv = DialogBox (h, MAKEINTRESOURCE (IDD_ROOT), 0, dialog_proc);
312 fatal (IDS_DIALOG_FAILED);
314 log (0, "root: %s %s %s", root_dir,
315 (install_type == IDC_INSTALL_NATIVE) ? "native" : "cygwin",
316 (root_scope == IDC_ROOT_USER) ? "user" : "system");