annotate netinstall/root.cc @ 452:3d3049ae1304 r21-2-41

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