]> cygwin.com Git - cygwin-apps/setup.git/blame - main.cc
* site.cc (do_download_site_info_thread): Correct spelling error.
[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"
9f4a0c62 42#include "LogFile.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
DD
62int next_dialog;
63
64HINSTANCE hinstance;
65
acbae401
CV
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
76void
77set_default_dacl ()
78{
79 /* To assure that the created files have a useful ACL, the
b24c88b3
RC
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. */
acbae401
CV
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 {
9f4a0c62
RC
96 log (LOG_TIMESTAMP) << "InitializeAcl() failed: " << GetLastError ()
97 << endLog;
acbae401
CV
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 105 {
9f4a0c62
RC
106 log (LOG_TIMESTAMP) << "AllocateAndInitializeSid() failed: " <<
107 GetLastError () << endLog;
acbae401
CV
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 {
9f4a0c62
RC
116 log (LOG_TIMESTAMP) << "AddAccessAllowedAce() failed: %lu" <<
117 GetLastError () << endLog;
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 125 {
9f4a0c62
RC
126 log (LOG_TIMESTAMP) << "OpenProcessToken() failed: "
127 << GetLastError () << endLog;
acbae401
CV
128 goto out;
129 }
130
131 /* Set the default DACL to the above computed ACL. */
132 if (!SetTokenInformation (token, TokenDefaultDacl, dacl, sizeof buf))
9f4a0c62
RC
133 log (LOG_TIMESTAMP) << "OpenProcessToken() failed: " << GetLastError ()
134 << endLog;
acbae401
CV
135
136 /* Close token handle. */
137 CloseHandle (token);
138
139out:
140 /* Free memory occupied by the "Everyone" SID. */
141 FreeSid (sid);
142}
143
ab57ceaa
RC
144// Other threads talk to this page, so we need to have it externable.
145ThreeBarProgressPage Progress;
146
9f4a0c62
RC
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).
150LogFile theLog;
151
45e01f23 152#ifndef __CYGWIN__
23c9e63c 153int WINAPI
1fd6d0a2 154WinMain (HINSTANCE h,
b24c88b3 155 HINSTANCE hPrevInstance, LPSTR command_line, int cmd_show)
23c9e63c 156{
8bb9dad9 157
23c9e63c 158 hinstance = h;
45e01f23
RC
159#else
160int
161main (int argc, char **argv)
162{
163 hinstance = GetModuleHandle (NULL);
164#endif
23c9e63c 165
9f4a0c62
RC
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
8507f105 175 next_dialog = IDD_SPLASH;
23c9e63c 176
9f4a0c62 177 log (LOG_PLAIN) << "Starting cygwin install, version " << version << endLog;
89b1a15b 178
ab57ceaa
RC
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
9f4a0c62 189 log (LOG_TIMESTAMP) << "Current Directory: " << local_dir << endLog;
89b1a15b 190
45e01f23
RC
191 // TODO: make an equivalent for __argv under cygwin.
192 char **_argv;
193#ifndef __CYGWIN__
ef465627 194 int argc;
45e01f23
RC
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
1be8f8fd 206
45e01f23 207 if (!GetOption::GetInstance().Process (argc,_argv))
9f4a0c62 208 theLog.exit(1);
45e01f23 209// #endif
b24c88b3 210
acbae401
CV
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
ab57ceaa
RC
216 // Initialize common controls
217 InitCommonControls ();
218
219 // Init window class lib
45e01f23 220 Window::SetAppInstance (hinstance);
ab57ceaa
RC
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 ();
23c9e63c 246
9f4a0c62 247 theLog.exit (0);
b24c88b3
RC
248 /* Keep gcc happy :} */
249 return 0;
23c9e63c 250}
This page took 0.057893 seconds and 5 git commands to generate.