]> cygwin.com Git - cygwin-apps/setup.git/blob - main.cc
2001-11-13 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
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include "resource.h"
36 #include "dialog.h"
37 #include "state.h"
38 #include "msg.h"
39 #include "find.h"
40 #include "mount.h"
41 #include "log.h"
42 #include "version.h"
43
44 #include "port.h"
45
46 int next_dialog;
47 int exit_msg = 0;
48
49 HINSTANCE hinstance;
50
51 /* Maximum size of a SID on NT/W2K. */
52 #define MAX_SID_LEN 40
53
54 /* Computes the size of an ACL in relation to the number of ACEs it
55 should contain. */
56 #define TOKEN_ACL_SIZE(cnt) (sizeof(ACL) + \
57 (cnt) * (sizeof(ACCESS_ALLOWED_ACE) + MAX_SID_LEN))
58
59 #define iswinnt (GetVersion() < 0x80000000)
60
61 void
62 set_default_dacl ()
63 {
64 /* To assure that the created files have a useful ACL, the
65 default DACL in the process token is set to full access to
66 everyone. This applies to files and subdirectories created
67 in directories which don't propagate permissions to child
68 objects. */
69
70 /* Create a buffer which has enough room to contain the TOKEN_DEFAULT_DACL
71 structure plus an ACL with one ACE. */
72 char buf[sizeof (TOKEN_DEFAULT_DACL) + TOKEN_ACL_SIZE (1)];
73
74 /* First initialize the TOKEN_DEFAULT_DACL structure. */
75 PTOKEN_DEFAULT_DACL dacl = (PTOKEN_DEFAULT_DACL) buf;
76 dacl->DefaultDacl = (PACL) (buf + sizeof *dacl);
77
78 /* Initialize the ACL for containing one ACE. */
79 if (!InitializeAcl (dacl->DefaultDacl, TOKEN_ACL_SIZE (1), ACL_REVISION))
80 {
81 log (LOG_TIMESTAMP, "InitializeAcl() failed: %lu", GetLastError ());
82 return;
83 }
84
85 /* Get the SID for "Everyone". */
86 PSID sid;
87 SID_IDENTIFIER_AUTHORITY sid_auth = { SECURITY_WORLD_SID_AUTHORITY };
88 if (!AllocateAndInitializeSid (&sid_auth, 1, 0, 0, 0, 0, 0, 0, 0, 0, &sid))
89 {
90 log (LOG_TIMESTAMP, "AllocateAndInitializeSid() failed: %lu",
91 GetLastError ());
92 return;
93 }
94
95 /* Create the ACE which grants full access to "Everyone" and store it
96 in dacl->DefaultDacl. */
97 if (!AddAccessAllowedAce
98 (dacl->DefaultDacl, ACL_REVISION, GENERIC_ALL, sid))
99 {
100 log (LOG_TIMESTAMP, "AddAccessAllowedAce() failed: %lu",
101 GetLastError ());
102 goto out;
103 }
104
105 /* Get the processes access token. */
106 HANDLE token;
107 if (!OpenProcessToken (GetCurrentProcess (),
108 TOKEN_READ | TOKEN_ADJUST_DEFAULT, &token))
109 {
110 log (LOG_TIMESTAMP, "OpenProcessToken() failed: %lu", GetLastError ());
111 goto out;
112 }
113
114 /* Set the default DACL to the above computed ACL. */
115 if (!SetTokenInformation (token, TokenDefaultDacl, dacl, sizeof buf))
116 log (LOG_TIMESTAMP, "OpenProcessToken() failed: %lu", GetLastError ());
117
118 /* Close token handle. */
119 CloseHandle (token);
120
121 out:
122 /* Free memory occupied by the "Everyone" SID. */
123 FreeSid (sid);
124 }
125
126 int WINAPI
127 WinMain (HINSTANCE h,
128 HINSTANCE hPrevInstance, LPSTR command_line, int cmd_show)
129 {
130 hinstance = h;
131
132 next_dialog = IDD_SPLASH;
133
134 log (LOG_TIMESTAMP, "Starting cygwin install, version %s", version);
135
136 char cwd[_MAX_PATH];
137 GetCurrentDirectory (sizeof (cwd), cwd);
138 local_dir = strdup (cwd);
139 log (0, "Current Directory: %s", cwd);
140
141 char **argv;
142 int argc;
143 log (LOG_TIMESTAMP, "Command line parameters\n");
144 for (argc = 0, argv = __argv; *argv; argv++)
145 log (LOG_TIMESTAMP, "%d - '%s'\n", argc++, *argv);
146 log (LOG_TIMESTAMP, "%d parameters passed\n", argc);
147
148 /* Set the default DACL only on NT/W2K. 9x/ME has no idea of access
149 control lists and security at all. */
150 if (iswinnt)
151 set_default_dacl ();
152
153 while (next_dialog)
154 {
155 switch (next_dialog)
156 {
157 case IDD_SPLASH:
158 do_splash (h);
159 break;
160 case IDD_SOURCE:
161 do_source (h);
162 break;
163 case IDD_LOCAL_DIR:
164 do_local_dir (h);
165 break;
166 case IDD_ROOT:
167 do_root (h);
168 break;
169 case IDD_NET:
170 do_net (h);
171 break;
172 case IDD_SITE:
173 do_site (h);
174 break;
175 case IDD_OTHER_URL:
176 do_other (h);
177 break;
178 case IDD_S_LOAD_INI:
179 do_ini (h);
180 break;
181 case IDD_S_FROM_CWD:
182 do_fromcwd (h);
183 break;
184 case IDD_CHOOSE:
185 do_choose (h);
186 break;
187 case IDD_S_DOWNLOAD:
188 do_download (h);
189 break;
190 case IDD_S_INSTALL:
191 do_install (h);
192 break;
193 case IDD_DESKTOP:
194 do_desktop (h);
195 break;
196 case IDD_S_POSTINSTALL:
197 do_postinstall (h);
198 break;
199
200 default:
201 next_dialog = 0;
202 break;
203 }
204 }
205
206 exit_setup (0);
207 /* Keep gcc happy :} */
208 return 0;
209 }
This page took 0.046917 seconds and 6 git commands to generate.