2 * Copyright (c) 2000, Red Hat, Inc.
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.
9 * A copy of the GNU General Public License can be found at
12 * Written by DJ Delorie <dj@cygnus.com>
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. */
27 static const char *cvsid
=
47 #include "propsheet.h"
60 #include "getopt++/GetOption.h"
61 #include "getopt++/BoolOption.h"
67 static BoolOption
UnattendedOption (false, 'q', "quiet-mode", "Unattended setup mode");
69 /* Maximum size of a SID on NT/W2K. */
70 #define MAX_SID_LEN 40
72 /* Computes the size of an ACL in relation to the number of ACEs it
74 #define TOKEN_ACL_SIZE(cnt) (sizeof(ACL) + \
75 (cnt) * (sizeof(ACCESS_ALLOWED_ACE) + MAX_SID_LEN))
77 #define iswinnt (GetVersion() < 0x80000000)
82 /* To assure that the created files have a useful ACL, the
83 default DACL in the process token is set to full access to
84 everyone. This applies to files and subdirectories created
85 in directories which don't propagate permissions to child
88 /* Create a buffer which has enough room to contain the TOKEN_DEFAULT_DACL
89 structure plus an ACL with one ACE. */
90 char buf
[sizeof (TOKEN_DEFAULT_DACL
) + TOKEN_ACL_SIZE (1)];
92 /* First initialize the TOKEN_DEFAULT_DACL structure. */
93 PTOKEN_DEFAULT_DACL dacl
= (PTOKEN_DEFAULT_DACL
) buf
;
94 dacl
->DefaultDacl
= (PACL
) (buf
+ sizeof *dacl
);
96 /* Initialize the ACL for containing one ACE. */
97 if (!InitializeAcl (dacl
->DefaultDacl
, TOKEN_ACL_SIZE (1), ACL_REVISION
))
99 log (LOG_TIMESTAMP
) << "InitializeAcl() failed: " << GetLastError ()
104 /* Get the SID for "Everyone". */
106 SID_IDENTIFIER_AUTHORITY sid_auth
= { SECURITY_WORLD_SID_AUTHORITY
};
107 if (!AllocateAndInitializeSid (&sid_auth
, 1, 0, 0, 0, 0, 0, 0, 0, 0, &sid
))
109 log (LOG_TIMESTAMP
) << "AllocateAndInitializeSid() failed: " <<
110 GetLastError () << endLog
;
114 /* Create the ACE which grants full access to "Everyone" and store it
115 in dacl->DefaultDacl. */
116 if (!AddAccessAllowedAce
117 (dacl
->DefaultDacl
, ACL_REVISION
, GENERIC_ALL
, sid
))
119 log (LOG_TIMESTAMP
) << "AddAccessAllowedAce() failed: %lu" <<
120 GetLastError () << endLog
;
124 /* Get the processes access token. */
126 if (!OpenProcessToken (GetCurrentProcess (),
127 TOKEN_READ
| TOKEN_ADJUST_DEFAULT
, &token
))
129 log (LOG_TIMESTAMP
) << "OpenProcessToken() failed: "
130 << GetLastError () << endLog
;
134 /* Set the default DACL to the above computed ACL. */
135 if (!SetTokenInformation (token
, TokenDefaultDacl
, dacl
, sizeof buf
))
136 log (LOG_TIMESTAMP
) << "OpenProcessToken() failed: " << GetLastError ()
139 /* Close token handle. */
143 /* Free memory occupied by the "Everyone" SID. */
147 // Other threads talk to this page, so we need to have it externable.
148 ThreeBarProgressPage Progress
;
150 // This is a little ugly, but the decision about where to log occurs
151 // after the source is set AND the root mount obtained
152 // so we make the actual logger available to the appropriate routine(s).
157 WinMain (HINSTANCE h
,
158 HINSTANCE hPrevInstance
, LPSTR command_line
, int cmd_show
)
164 main (int argc
, char **argv
)
166 hinstance
= GetModuleHandle (NULL
);
169 char *cwd
=new char[_MAX_PATH
];
170 GetCurrentDirectory (_MAX_PATH
, cwd
);
171 local_dir
= String (cwd
);
174 LogSingleton::SetInstance (*(theLog
= LogFile::createLogFile()));
175 theLog
->setFile (LOG_BABBLE
, local_dir
+ "/setup.log.full", false);
176 theLog
->setFile (0, local_dir
+ "/setup.log", true);
178 next_dialog
= IDD_SPLASH
;
180 log (LOG_PLAIN
) << "Starting cygwin install, version " << version
<< endLog
;
185 LocalDirPage LocalDir
;
189 DesktopSetupPage Desktop
;
190 PropSheet MainWindow
;
192 log (LOG_TIMESTAMP
) << "Current Directory: " << local_dir
<< endLog
;
194 // TODO: make an equivalent for __argv under cygwin.
200 for (argc
= 0, _argv
= __argv
; *_argv
; _argv
++)++argc
;
203 // for (argc = 0, _argv = argv; *_argv; _argv++)++argc;
210 if (!GetOption::GetInstance().Process (argc
,_argv
))
214 unattended_mode
= UnattendedOption
;
216 /* Set the default DACL only on NT/W2K. 9x/ME has no idea of access
217 control lists and security at all. */
221 // Initialize common controls
222 InitCommonControls ();
224 // Init window class lib
225 Window::SetAppInstance (hinstance
);
238 // Add pages to sheet
239 MainWindow
.AddPage (&Splash
);
240 MainWindow
.AddPage (&Source
);
241 MainWindow
.AddPage (&Root
);
242 MainWindow
.AddPage (&LocalDir
);
243 MainWindow
.AddPage (&Net
);
244 MainWindow
.AddPage (&Site
);
245 MainWindow
.AddPage (&Chooser
);
246 MainWindow
.AddPage (&Progress
);
247 MainWindow
.AddPage (&Desktop
);
249 // Create the PropSheet main window
250 MainWindow
.Create ();
253 /* Keep gcc happy :} */