]> cygwin.com Git - cygwin-apps/setup.git/blame - main.cc
2002-01-21 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
23c9e63c 60int next_dialog;
f57c332f 61int exit_msg = 0;
23c9e63c
DD
62
63HINSTANCE hinstance;
64
acbae401
CV
65/* Maximum size of a SID on NT/W2K. */
66#define MAX_SID_LEN 40
67
68/* Computes the size of an ACL in relation to the number of ACEs it
69 should contain. */
70#define TOKEN_ACL_SIZE(cnt) (sizeof(ACL) + \
71 (cnt) * (sizeof(ACCESS_ALLOWED_ACE) + MAX_SID_LEN))
72
73#define iswinnt (GetVersion() < 0x80000000)
74
75void
76set_default_dacl ()
77{
78 /* To assure that the created files have a useful ACL, the
b24c88b3
RC
79 default DACL in the process token is set to full access to
80 everyone. This applies to files and subdirectories created
81 in directories which don't propagate permissions to child
82 objects. */
acbae401
CV
83
84 /* Create a buffer which has enough room to contain the TOKEN_DEFAULT_DACL
85 structure plus an ACL with one ACE. */
86 char buf[sizeof (TOKEN_DEFAULT_DACL) + TOKEN_ACL_SIZE (1)];
87
88 /* First initialize the TOKEN_DEFAULT_DACL structure. */
89 PTOKEN_DEFAULT_DACL dacl = (PTOKEN_DEFAULT_DACL) buf;
90 dacl->DefaultDacl = (PACL) (buf + sizeof *dacl);
91
92 /* Initialize the ACL for containing one ACE. */
93 if (!InitializeAcl (dacl->DefaultDacl, TOKEN_ACL_SIZE (1), ACL_REVISION))
94 {
95 log (LOG_TIMESTAMP, "InitializeAcl() failed: %lu", GetLastError ());
96 return;
97 }
98
99 /* Get the SID for "Everyone". */
100 PSID sid;
b24c88b3
RC
101 SID_IDENTIFIER_AUTHORITY sid_auth = { SECURITY_WORLD_SID_AUTHORITY };
102 if (!AllocateAndInitializeSid (&sid_auth, 1, 0, 0, 0, 0, 0, 0, 0, 0, &sid))
acbae401
CV
103 {
104 log (LOG_TIMESTAMP, "AllocateAndInitializeSid() failed: %lu",
105 GetLastError ());
106 return;
107 }
108
109 /* Create the ACE which grants full access to "Everyone" and store it
110 in dacl->DefaultDacl. */
b24c88b3
RC
111 if (!AddAccessAllowedAce
112 (dacl->DefaultDacl, ACL_REVISION, GENERIC_ALL, sid))
acbae401 113 {
b24c88b3
RC
114 log (LOG_TIMESTAMP, "AddAccessAllowedAce() failed: %lu",
115 GetLastError ());
acbae401
CV
116 goto out;
117 }
118
119 /* Get the processes access token. */
120 HANDLE token;
121 if (!OpenProcessToken (GetCurrentProcess (),
b24c88b3 122 TOKEN_READ | TOKEN_ADJUST_DEFAULT, &token))
acbae401
CV
123 {
124 log (LOG_TIMESTAMP, "OpenProcessToken() failed: %lu", GetLastError ());
125 goto out;
126 }
127
128 /* Set the default DACL to the above computed ACL. */
129 if (!SetTokenInformation (token, TokenDefaultDacl, dacl, sizeof buf))
130 log (LOG_TIMESTAMP, "OpenProcessToken() failed: %lu", GetLastError ());
131
132 /* Close token handle. */
133 CloseHandle (token);
134
135out:
136 /* Free memory occupied by the "Everyone" SID. */
137 FreeSid (sid);
138}
139
ab57ceaa
RC
140// Other threads talk to this page, so we need to have it externable.
141ThreeBarProgressPage Progress;
142
23c9e63c 143int WINAPI
1fd6d0a2 144WinMain (HINSTANCE h,
b24c88b3 145 HINSTANCE hPrevInstance, LPSTR command_line, int cmd_show)
23c9e63c
DD
146{
147 hinstance = h;
148
8507f105 149 next_dialog = IDD_SPLASH;
23c9e63c 150
7cc06fd3 151 log (LOG_TIMESTAMP, "Starting cygwin install, version %s", version);
89b1a15b 152
ab57ceaa
RC
153 SplashPage Splash;
154 SourcePage Source;
155 RootPage Root;
156 LocalDirPage LocalDir;
157 NetPage Net;
158 SitePage Site;
159 ChooserPage Chooser;
160 DesktopSetupPage Desktop;
161 PropSheet MainWindow;
162
89b1a15b
DD
163 char cwd[_MAX_PATH];
164 GetCurrentDirectory (sizeof (cwd), cwd);
5e0464a1
RC
165 local_dir = new char [strlen (cwd) + 1];
166 local_dir [strlen (cwd)] = '\0';
167 strcpy (local_dir, cwd);
89b1a15b
DD
168 log (0, "Current Directory: %s", cwd);
169
ef465627
RC
170 char **argv;
171 int argc;
172 log (LOG_TIMESTAMP, "Command line parameters\n");
173 for (argc = 0, argv = __argv; *argv; argv++)
174 log (LOG_TIMESTAMP, "%d - '%s'\n", argc++, *argv);
175 log (LOG_TIMESTAMP, "%d parameters passed\n", argc);
b24c88b3 176
acbae401
CV
177 /* Set the default DACL only on NT/W2K. 9x/ME has no idea of access
178 control lists and security at all. */
179 if (iswinnt)
180 set_default_dacl ();
181
ab57ceaa
RC
182 // Initialize common controls
183 InitCommonControls ();
184
185 // Init window class lib
186 Window::SetAppInstance (h);
187
188 // Create pages
189 Splash.Create ();
190 Source.Create ();
191 Root.Create ();
192 LocalDir.Create ();
193 Net.Create ();
194 Site.Create ();
195 Chooser.Create ();
196 Progress.Create ();
197 Desktop.Create ();
198
199 // Add pages to sheet
200 MainWindow.AddPage (&Splash);
201 MainWindow.AddPage (&Source);
202 MainWindow.AddPage (&Root);
203 MainWindow.AddPage (&LocalDir);
204 MainWindow.AddPage (&Net);
205 MainWindow.AddPage (&Site);
206 MainWindow.AddPage (&Chooser);
207 MainWindow.AddPage (&Progress);
208 MainWindow.AddPage (&Desktop);
209
210 // Create the PropSheet main window
211 MainWindow.Create ();
23c9e63c 212
89b1a15b 213 exit_setup (0);
b24c88b3
RC
214 /* Keep gcc happy :} */
215 return 0;
23c9e63c 216}
This page took 0.053391 seconds and 5 git commands to generate.