]> cygwin.com Git - cygwin-apps/setup.git/blame - main.cc
2002-04-27 Robert Collins <rbtcollins@hotmail.com>
[cygwin-apps/setup.git] / main.cc
CommitLineData
23c9e63c
DD
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
b24c88b3
RC
26#if 0
27static const char *cvsid =
28 "\n%%% $Id$\n";
29#endif
8507f105 30
23c9e63c 31#include "win32.h"
ab57ceaa 32#include <commctrl.h>
23c9e63c
DD
33
34#include <stdio.h>
89b1a15b 35#include <stdlib.h>
23c9e63c
DD
36#include "resource.h"
37#include "dialog.h"
38#include "state.h"
39#include "msg.h"
23c9e63c
DD
40#include "find.h"
41#include "mount.h"
89b1a15b 42#include "log.h"
7cc06fd3 43#include "version.h"
89b1a15b
DD
44
45#include "port.h"
ab57ceaa
RC
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"
23c9e63c 59
6908b7d7 60#include "getopt++/GetOption.h"
1be8f8fd 61
23c9e63c 62int next_dialog;
f57c332f 63int exit_msg = 0;
23c9e63c
DD
64
65HINSTANCE hinstance;
66
acbae401
CV
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
77void
78set_default_dacl ()
79{
80 /* To assure that the created files have a useful ACL, the
b24c88b3
RC
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. */
acbae401
CV
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;
b24c88b3
RC
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))
acbae401
CV
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. */
b24c88b3
RC
113 if (!AddAccessAllowedAce
114 (dacl->DefaultDacl, ACL_REVISION, GENERIC_ALL, sid))
acbae401 115 {
b24c88b3
RC
116 log (LOG_TIMESTAMP, "AddAccessAllowedAce() failed: %lu",
117 GetLastError ());
acbae401
CV
118 goto out;
119 }
120
121 /* Get the processes access token. */
122 HANDLE token;
123 if (!OpenProcessToken (GetCurrentProcess (),
b24c88b3 124 TOKEN_READ | TOKEN_ADJUST_DEFAULT, &token))
acbae401
CV
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
137out:
138 /* Free memory occupied by the "Everyone" SID. */
139 FreeSid (sid);
140}
141
ab57ceaa
RC
142// Other threads talk to this page, so we need to have it externable.
143ThreeBarProgressPage Progress;
144
23c9e63c 145int WINAPI
1fd6d0a2 146WinMain (HINSTANCE h,
b24c88b3 147 HINSTANCE hPrevInstance, LPSTR command_line, int cmd_show)
23c9e63c 148{
8bb9dad9 149
23c9e63c
DD
150 hinstance = h;
151
8507f105 152 next_dialog = IDD_SPLASH;
23c9e63c 153
1ac649ed 154 log (LOG_PLAIN, String ("Starting cygwin install, version ") + version);
89b1a15b 155
ab57ceaa
RC
156 SplashPage Splash;
157 SourcePage Source;
158 RootPage Root;
159 LocalDirPage LocalDir;
160 NetPage Net;
161 SitePage Site;
162 ChooserPage Chooser;
163 DesktopSetupPage Desktop;
164 PropSheet MainWindow;
165
89b1a15b
DD
166 char cwd[_MAX_PATH];
167 GetCurrentDirectory (sizeof (cwd), cwd);
3c054baf 168 local_dir = String (cwd);
1ac649ed 169 log (LOG_TIMESTAMP, String ("Current Directory: ") + local_dir);
89b1a15b 170
ef465627
RC
171 char **argv;
172 int argc;
1be8f8fd
RC
173 for (argc = 0, argv = __argv; *argv; argv++)++argc;
174
6908b7d7 175 if (!GetOption::GetInstance().Process (argc, __argv))
1be8f8fd
RC
176 exit_setup(1);
177
b24c88b3 178
acbae401
CV
179 /* Set the default DACL only on NT/W2K. 9x/ME has no idea of access
180 control lists and security at all. */
181 if (iswinnt)
182 set_default_dacl ();
183
ab57ceaa
RC
184 // Initialize common controls
185 InitCommonControls ();
186
187 // Init window class lib
188 Window::SetAppInstance (h);
189
190 // Create pages
191 Splash.Create ();
192 Source.Create ();
193 Root.Create ();
194 LocalDir.Create ();
195 Net.Create ();
196 Site.Create ();
197 Chooser.Create ();
198 Progress.Create ();
199 Desktop.Create ();
200
201 // Add pages to sheet
202 MainWindow.AddPage (&Splash);
203 MainWindow.AddPage (&Source);
204 MainWindow.AddPage (&Root);
205 MainWindow.AddPage (&LocalDir);
206 MainWindow.AddPage (&Net);
207 MainWindow.AddPage (&Site);
208 MainWindow.AddPage (&Chooser);
209 MainWindow.AddPage (&Progress);
210 MainWindow.AddPage (&Desktop);
211
212 // Create the PropSheet main window
213 MainWindow.Create ();
23c9e63c 214
89b1a15b 215 exit_setup (0);
b24c88b3
RC
216 /* Keep gcc happy :} */
217 return 0;
23c9e63c 218}
This page took 0.05126 seconds and 5 git commands to generate.