]> cygwin.com Git - cygwin-apps/setup.git/blob - main.cc
2002-05-19 Robert Collins <rbtcollins@hotmail.com>
[cygwin-apps/setup.git] / main.cc
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 /* OK, here's how this works. Each of the steps needed for install -
17 dialogs, downloads, installs - are in their own files and have some
18 "do_*" function (prototype in dialog.h) and a resource id (IDD_* or
19 IDD_S_* in resource.h) for that step. Each step is responsible for
20 selecting the next step! See the NEXT macro in dialog.h. Note
21 that the IDD_S_* ids are fake; those are for steps that don't
22 really have a controlling dialog (some have progress dialogs, but
23 those don't count, although they could). Replace the IDD_S_* with
24 IDD_* if you create a real dialog for those steps. */
25
26 #if 0
27 static const char *cvsid =
28 "\n%%% $Id$\n";
29 #endif
30
31 #include "win32.h"
32 #include <commctrl.h>
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include "resource.h"
37 #include "dialog.h"
38 #include "state.h"
39 #include "msg.h"
40 #include "find.h"
41 #include "mount.h"
42 #include "LogFile.h"
43 #include "version.h"
44
45 #include "port.h"
46 #include "proppage.h"
47 #include "propsheet.h"
48
49 // Page class headers
50 #include "splash.h"
51 #include "source.h"
52 #include "root.h"
53 #include "localdir.h"
54 #include "net.h"
55 #include "site.h"
56 #include "choose.h"
57 #include "threebar.h"
58 #include "desktop.h"
59
60 #include "getopt++/GetOption.h"
61
62 int next_dialog;
63
64 HINSTANCE hinstance;
65
66 /* Maximum size of a SID on NT/W2K. */
67 #define MAX_SID_LEN 40
68
69 /* Computes the size of an ACL in relation to the number of ACEs it
70 should contain. */
71 #define TOKEN_ACL_SIZE(cnt) (sizeof(ACL) + \
72 (cnt) * (sizeof(ACCESS_ALLOWED_ACE) + MAX_SID_LEN))
73
74 #define iswinnt (GetVersion() < 0x80000000)
75
76 void
77 set_default_dacl ()
78 {
79 /* To assure that the created files have a useful ACL, the
80 default DACL in the process token is set to full access to
81 everyone. This applies to files and subdirectories created
82 in directories which don't propagate permissions to child
83 objects. */
84
85 /* Create a buffer which has enough room to contain the TOKEN_DEFAULT_DACL
86 structure plus an ACL with one ACE. */
87 char buf[sizeof (TOKEN_DEFAULT_DACL) + TOKEN_ACL_SIZE (1)];
88
89 /* First initialize the TOKEN_DEFAULT_DACL structure. */
90 PTOKEN_DEFAULT_DACL dacl = (PTOKEN_DEFAULT_DACL) buf;
91 dacl->DefaultDacl = (PACL) (buf + sizeof *dacl);
92
93 /* Initialize the ACL for containing one ACE. */
94 if (!InitializeAcl (dacl->DefaultDacl, TOKEN_ACL_SIZE (1), ACL_REVISION))
95 {
96 log (LOG_TIMESTAMP) << "InitializeAcl() failed: " << GetLastError ()
97 << endLog;
98 return;
99 }
100
101 /* Get the SID for "Everyone". */
102 PSID sid;
103 SID_IDENTIFIER_AUTHORITY sid_auth = { SECURITY_WORLD_SID_AUTHORITY };
104 if (!AllocateAndInitializeSid (&sid_auth, 1, 0, 0, 0, 0, 0, 0, 0, 0, &sid))
105 {
106 log (LOG_TIMESTAMP) << "AllocateAndInitializeSid() failed: " <<
107 GetLastError () << endLog;
108 return;
109 }
110
111 /* Create the ACE which grants full access to "Everyone" and store it
112 in dacl->DefaultDacl. */
113 if (!AddAccessAllowedAce
114 (dacl->DefaultDacl, ACL_REVISION, GENERIC_ALL, sid))
115 {
116 log (LOG_TIMESTAMP) << "AddAccessAllowedAce() failed: %lu" <<
117 GetLastError () << endLog;
118 goto out;
119 }
120
121 /* Get the processes access token. */
122 HANDLE token;
123 if (!OpenProcessToken (GetCurrentProcess (),
124 TOKEN_READ | TOKEN_ADJUST_DEFAULT, &token))
125 {
126 log (LOG_TIMESTAMP) << "OpenProcessToken() failed: "
127 << GetLastError () << endLog;
128 goto out;
129 }
130
131 /* Set the default DACL to the above computed ACL. */
132 if (!SetTokenInformation (token, TokenDefaultDacl, dacl, sizeof buf))
133 log (LOG_TIMESTAMP) << "OpenProcessToken() failed: " << GetLastError ()
134 << endLog;
135
136 /* Close token handle. */
137 CloseHandle (token);
138
139 out:
140 /* Free memory occupied by the "Everyone" SID. */
141 FreeSid (sid);
142 }
143
144 // Other threads talk to this page, so we need to have it externable.
145 ThreeBarProgressPage Progress;
146
147 // This is a little ugly, but the decision about where to log occurs
148 // after the source is set AND the root mount obtained
149 // so we make the actual logger available to the appropriate routine(s).
150 LogFile theLog;
151
152 #ifndef __CYGWIN__
153 int WINAPI
154 WinMain (HINSTANCE h,
155 HINSTANCE hPrevInstance, LPSTR command_line, int cmd_show)
156 {
157
158 hinstance = h;
159 #else
160 int
161 main (int argc, char **argv)
162 {
163 hinstance = GetModuleHandle (NULL);
164 #endif
165
166 char *cwd=new char[_MAX_PATH];
167 GetCurrentDirectory (_MAX_PATH, cwd);
168 local_dir = String (cwd);
169 delete cwd;
170
171 LogSingleton::SetInstance (theLog);
172 theLog.setFile (LOG_BABBLE, local_dir + "/setup.log.full", false);
173 theLog.setFile (0, local_dir + "/setup.log", true);
174
175 next_dialog = IDD_SPLASH;
176
177 log (LOG_PLAIN) << "Starting cygwin install, version " << version << endLog;
178
179 SplashPage Splash;
180 SourcePage Source;
181 RootPage Root;
182 LocalDirPage LocalDir;
183 NetPage Net;
184 SitePage Site;
185 ChooserPage Chooser;
186 DesktopSetupPage Desktop;
187 PropSheet MainWindow;
188
189 log (LOG_TIMESTAMP) << "Current Directory: " << local_dir << endLog;
190
191 // TODO: make an equivalent for __argv under cygwin.
192 char **_argv;
193 #ifndef __CYGWIN__
194 int argc;
195 // char **_argv;
196 #ifndef __CYGWIN__
197 for (argc = 0, _argv = __argv; *_argv; _argv++)++argc;
198 _argv = __argv;
199 #else
200 // for (argc = 0, _argv = argv; *_argv; _argv++)++argc;
201 _argv = argv;
202 #endif
203 #else
204 _argv = argv;
205 #endif
206
207 if (!GetOption::GetInstance().Process (argc,_argv))
208 theLog.exit(1);
209 // #endif
210
211 /* Set the default DACL only on NT/W2K. 9x/ME has no idea of access
212 control lists and security at all. */
213 if (iswinnt)
214 set_default_dacl ();
215
216 // Initialize common controls
217 InitCommonControls ();
218
219 // Init window class lib
220 Window::SetAppInstance (hinstance);
221
222 // Create pages
223 Splash.Create ();
224 Source.Create ();
225 Root.Create ();
226 LocalDir.Create ();
227 Net.Create ();
228 Site.Create ();
229 Chooser.Create ();
230 Progress.Create ();
231 Desktop.Create ();
232
233 // Add pages to sheet
234 MainWindow.AddPage (&Splash);
235 MainWindow.AddPage (&Source);
236 MainWindow.AddPage (&Root);
237 MainWindow.AddPage (&LocalDir);
238 MainWindow.AddPage (&Net);
239 MainWindow.AddPage (&Site);
240 MainWindow.AddPage (&Chooser);
241 MainWindow.AddPage (&Progress);
242 MainWindow.AddPage (&Desktop);
243
244 // Create the PropSheet main window
245 MainWindow.Create ();
246
247 theLog.exit (0);
248 /* Keep gcc happy :} */
249 return 0;
250 }
This page took 0.041736 seconds and 5 git commands to generate.