]> cygwin.com Git - cygwin-apps/setup.git/blob - main.cc
2002-01-21 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 int next_dialog;
61 int exit_msg = 0;
62
63 HINSTANCE hinstance;
64
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
75 void
76 set_default_dacl ()
77 {
78 /* To assure that the created files have a useful ACL, the
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. */
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;
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))
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. */
111 if (!AddAccessAllowedAce
112 (dacl->DefaultDacl, ACL_REVISION, GENERIC_ALL, sid))
113 {
114 log (LOG_TIMESTAMP, "AddAccessAllowedAce() failed: %lu",
115 GetLastError ());
116 goto out;
117 }
118
119 /* Get the processes access token. */
120 HANDLE token;
121 if (!OpenProcessToken (GetCurrentProcess (),
122 TOKEN_READ | TOKEN_ADJUST_DEFAULT, &token))
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
135 out:
136 /* Free memory occupied by the "Everyone" SID. */
137 FreeSid (sid);
138 }
139
140 // Other threads talk to this page, so we need to have it externable.
141 ThreeBarProgressPage Progress;
142
143 int WINAPI
144 WinMain (HINSTANCE h,
145 HINSTANCE hPrevInstance, LPSTR command_line, int cmd_show)
146 {
147 hinstance = h;
148
149 next_dialog = IDD_SPLASH;
150
151 log (LOG_TIMESTAMP, "Starting cygwin install, version %s", version);
152
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
163 char cwd[_MAX_PATH];
164 GetCurrentDirectory (sizeof (cwd), cwd);
165 local_dir = new char [strlen (cwd) + 1];
166 local_dir [strlen (cwd)] = '\0';
167 strcpy (local_dir, cwd);
168 log (0, "Current Directory: %s", cwd);
169
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);
176
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
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 ();
212
213 exit_setup (0);
214 /* Keep gcc happy :} */
215 return 0;
216 }
This page took 0.047235 seconds and 6 git commands to generate.