]> cygwin.com Git - cygwin-apps/setup.git/blame - main.cc
2001-11-01 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
8507f105
DD
26static char *cvsid = "\n%%% $Id$\n";
27
23c9e63c
DD
28#include "win32.h"
29
30#include <stdio.h>
89b1a15b 31#include <stdlib.h>
23c9e63c
DD
32#include "resource.h"
33#include "dialog.h"
34#include "state.h"
35#include "msg.h"
36#include "netio.h"
37#include "find.h"
38#include "mount.h"
89b1a15b 39#include "log.h"
7cc06fd3 40#include "version.h"
89b1a15b
DD
41
42#include "port.h"
23c9e63c
DD
43
44void netio_test (char *);
45
46int next_dialog;
f57c332f 47int exit_msg = 0;
23c9e63c
DD
48
49HINSTANCE hinstance;
50
acbae401
CV
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
61void
62set_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 (dacl->DefaultDacl, ACL_REVISION, GENERIC_ALL, sid))
98 {
99 log (LOG_TIMESTAMP, "AddAccessAllowedAce() failed: %lu", GetLastError ());
100 goto out;
101 }
102
103 /* Get the processes access token. */
104 HANDLE token;
105 if (!OpenProcessToken (GetCurrentProcess (),
106 TOKEN_READ | TOKEN_ADJUST_DEFAULT, &token))
107 {
108 log (LOG_TIMESTAMP, "OpenProcessToken() failed: %lu", GetLastError ());
109 goto out;
110 }
111
112 /* Set the default DACL to the above computed ACL. */
113 if (!SetTokenInformation (token, TokenDefaultDacl, dacl, sizeof buf))
114 log (LOG_TIMESTAMP, "OpenProcessToken() failed: %lu", GetLastError ());
115
116 /* Close token handle. */
117 CloseHandle (token);
118
119out:
120 /* Free memory occupied by the "Everyone" SID. */
121 FreeSid (sid);
122}
123
23c9e63c 124int WINAPI
1fd6d0a2
DD
125WinMain (HINSTANCE h,
126 HINSTANCE hPrevInstance,
127 LPSTR command_line,
128 int cmd_show)
23c9e63c
DD
129{
130 hinstance = h;
131
8507f105 132 next_dialog = IDD_SPLASH;
23c9e63c 133
7cc06fd3 134 log (LOG_TIMESTAMP, "Starting cygwin install, version %s", version);
89b1a15b
DD
135
136 char cwd[_MAX_PATH];
137 GetCurrentDirectory (sizeof (cwd), cwd);
c92e1307 138 local_dir = strdup (cwd);
89b1a15b
DD
139 log (0, "Current Directory: %s", cwd);
140
ef465627
RC
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
acbae401
CV
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
23c9e63c
DD
153 while (next_dialog)
154 {
155 switch (next_dialog)
156 {
8507f105 157 case IDD_SPLASH: do_splash (h); break;
f57c332f 158 case IDD_SOURCE: do_source (h); break;
c92e1307 159 case IDD_LOCAL_DIR: do_local_dir (h); break;
f57c332f 160 case IDD_ROOT: do_root (h); break;
23c9e63c 161 case IDD_NET: do_net (h); break;
f57c332f
DD
162 case IDD_SITE: do_site (h); break;
163 case IDD_OTHER_URL: do_other (h); break;
164 case IDD_S_LOAD_INI: do_ini (h); break;
165 case IDD_S_FROM_CWD: do_fromcwd (h); break;
713bbe5f 166 case IDD_CHOOSE: do_choose (h); break;
f57c332f
DD
167 case IDD_S_DOWNLOAD: do_download (h); break;
168 case IDD_S_INSTALL: do_install (h); break;
50225eae 169 case IDD_DESKTOP: do_desktop (h); break;
f57c332f 170 case IDD_S_POSTINSTALL: do_postinstall (h); break;
23c9e63c
DD
171
172 default:
173 next_dialog = 0;
174 break;
175 }
176 }
177
89b1a15b 178 exit_setup (0);
23c9e63c 179}
This page took 0.044215 seconds and 5 git commands to generate.