]> cygwin.com Git - cygwin-apps/setup.git/blob - main.cc
2002-04-29 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 "log.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 int exit_msg = 0;
64
65 HINSTANCE hinstance;
66
67 /* Maximum size of a SID on NT/W2K. */
68 #define MAX_SID_LEN 40
69
70 /* Computes the size of an ACL in relation to the number of ACEs it
71 should contain. */
72 #define TOKEN_ACL_SIZE(cnt) (sizeof(ACL) + \
73 (cnt) * (sizeof(ACCESS_ALLOWED_ACE) + MAX_SID_LEN))
74
75 #define iswinnt (GetVersion() < 0x80000000)
76
77 void
78 set_default_dacl ()
79 {
80 /* To assure that the created files have a useful ACL, the
81 default DACL in the process token is set to full access to
82 everyone. This applies to files and subdirectories created
83 in directories which don't propagate permissions to child
84 objects. */
85
86 /* Create a buffer which has enough room to contain the TOKEN_DEFAULT_DACL
87 structure plus an ACL with one ACE. */
88 char buf[sizeof (TOKEN_DEFAULT_DACL) + TOKEN_ACL_SIZE (1)];
89
90 /* First initialize the TOKEN_DEFAULT_DACL structure. */
91 PTOKEN_DEFAULT_DACL dacl = (PTOKEN_DEFAULT_DACL) buf;
92 dacl->DefaultDacl = (PACL) (buf + sizeof *dacl);
93
94 /* Initialize the ACL for containing one ACE. */
95 if (!InitializeAcl (dacl->DefaultDacl, TOKEN_ACL_SIZE (1), ACL_REVISION))
96 {
97 log (LOG_TIMESTAMP, "InitializeAcl() failed: %lu", GetLastError ());
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: %lu",
107 GetLastError ());
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 ());
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: %lu", GetLastError ());
127 goto out;
128 }
129
130 /* Set the default DACL to the above computed ACL. */
131 if (!SetTokenInformation (token, TokenDefaultDacl, dacl, sizeof buf))
132 log (LOG_TIMESTAMP, "OpenProcessToken() failed: %lu", GetLastError ());
133
134 /* Close token handle. */
135 CloseHandle (token);
136
137 out:
138 /* Free memory occupied by the "Everyone" SID. */
139 FreeSid (sid);
140 }
141
142 // Other threads talk to this page, so we need to have it externable.
143 ThreeBarProgressPage Progress;
144
145 #ifndef __CYGWIN__
146 int WINAPI
147 WinMain (HINSTANCE h,
148 HINSTANCE hPrevInstance, LPSTR command_line, int cmd_show)
149 {
150
151 hinstance = h;
152 #else
153 int
154 main (int argc, char **argv)
155 {
156 hinstance = GetModuleHandle (NULL);
157 #endif
158
159 next_dialog = IDD_SPLASH;
160
161 log (LOG_PLAIN, String ("Starting cygwin install, version ") + version);
162
163 SplashPage Splash;
164 SourcePage Source;
165 RootPage Root;
166 LocalDirPage LocalDir;
167 NetPage Net;
168 SitePage Site;
169 ChooserPage Chooser;
170 DesktopSetupPage Desktop;
171 PropSheet MainWindow;
172
173 char cwd[_MAX_PATH];
174 GetCurrentDirectory (sizeof (cwd), cwd);
175 local_dir = String (cwd);
176 log (LOG_TIMESTAMP, String ("Current Directory: ") + local_dir);
177
178 // TODO: make an equivalent for __argv under cygwin.
179 char **_argv;
180 #ifndef __CYGWIN__
181 int argc;
182 // char **_argv;
183 #ifndef __CYGWIN__
184 for (argc = 0, _argv = __argv; *_argv; _argv++)++argc;
185 _argv = __argv;
186 #else
187 // for (argc = 0, _argv = argv; *_argv; _argv++)++argc;
188 _argv = argv;
189 #endif
190 #else
191 _argv = argv;
192 #endif
193
194 if (!GetOption::GetInstance().Process (argc,_argv))
195 exit_setup(1);
196 // #endif
197
198 /* Set the default DACL only on NT/W2K. 9x/ME has no idea of access
199 control lists and security at all. */
200 if (iswinnt)
201 set_default_dacl ();
202
203 // Initialize common controls
204 InitCommonControls ();
205
206 // Init window class lib
207 Window::SetAppInstance (hinstance);
208
209 // Create pages
210 Splash.Create ();
211 Source.Create ();
212 Root.Create ();
213 LocalDir.Create ();
214 Net.Create ();
215 Site.Create ();
216 Chooser.Create ();
217 Progress.Create ();
218 Desktop.Create ();
219
220 // Add pages to sheet
221 MainWindow.AddPage (&Splash);
222 MainWindow.AddPage (&Source);
223 MainWindow.AddPage (&Root);
224 MainWindow.AddPage (&LocalDir);
225 MainWindow.AddPage (&Net);
226 MainWindow.AddPage (&Site);
227 MainWindow.AddPage (&Chooser);
228 MainWindow.AddPage (&Progress);
229 MainWindow.AddPage (&Desktop);
230
231 // Create the PropSheet main window
232 MainWindow.Create ();
233
234 exit_setup (0);
235 /* Keep gcc happy :} */
236 return 0;
237 }
This page took 0.057761 seconds and 6 git commands to generate.