]> cygwin.com Git - cygwin-apps/setup.git/blob - ini.cc
2002-05-02 Robert Collins <rbtcollins@hotmail.com>
[cygwin-apps/setup.git] / ini.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 /* The purpose of this file is to get and parse the setup.ini file
17 from the mirror site. A few support routines for the bison and
18 flex parsers are provided also. We check to see if this setup.ini
19 is older than the one we used last time, and if so, warn the user. */
20
21 #if 0
22 static const char *cvsid =
23 "\n%%% $Id$\n";
24 #endif
25
26 #include "win32.h"
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <stdarg.h>
31 #include <process.h>
32
33 #include "ini.h"
34 #include "resource.h"
35 #include "String++.h"
36 #include "state.h"
37 #include "geturl.h"
38 #include "dialog.h"
39 #include "msg.h"
40 #include "log.h"
41 #include "version.h"
42 #include "mount.h"
43 #include "site.h"
44 #include "rfc1738.h"
45 #include "find.h"
46
47 #include "io_stream.h"
48
49 #include "threebar.h"
50
51 #include "rfc1738.h"
52 extern ThreeBarProgressPage Progress;
53
54 unsigned int setup_timestamp = 0;
55 char *setup_version = 0;
56
57 extern int yyparse ();
58 /*extern int yydebug;*/
59
60 static char *error_buf = 0;
61 static int error_count = 0;
62
63 static int local_ini;
64
65 static void
66 find_routine (char *path, unsigned int fsize)
67 {
68 if (!strstr (path, "setup.ini") )
69 return;
70 io_stream *ini_file = io_stream::open (String ("file://") + local_dir + "/" +
71 path, "rb");
72 if (!ini_file)
73 {
74 note (NULL, IDS_SETUPINI_MISSING, (String ("file://") + local_dir + "/" +
75 path).cstr_oneuse());
76 return;
77 }
78 else
79 log (LOG_BABBLE, String ("Found ini file - file://") + local_dir + "/" + path);
80
81 /* FIXME: only use most recent copy */
82 setup_timestamp = 0;
83 setup_version = 0;
84
85 /* Attempt to unescape the string */
86 path[strlen(path) -10] = '\0';
87 String mirror = rfc1738_unescape_part (path);
88 ini_init (ini_file, mirror);
89
90 /*yydebug = 1; */
91
92 if (yyparse () || error_count > 0)
93 MessageBox (0, error_buf, error_count == 1 ? "Parse Error" : "Parse Errors", 0);
94 else
95 local_ini++;
96 }
97
98 static int
99 do_local_ini (HWND owner)
100 {
101 local_ini = 0;
102 find (local_dir, find_routine);
103 return local_ini;
104 }
105
106 static int
107 do_remote_ini (HWND owner)
108 {
109 size_t ini_count = 0;
110
111 for (size_t n = 1; n <= site_list.number (); n++)
112 {
113 io_stream *ini_file =
114 get_url_to_membuf (site_list[n]->url + "/setup.ini", owner);
115
116 if (!ini_file)
117 {
118 note (owner, IDS_SETUPINI_MISSING, site_list[n]->url.cstr_oneuse());
119 continue;
120 }
121
122 /* FIXME: only use most recent copy */
123 setup_timestamp = 0;
124 setup_version = 0;
125
126 ini_init (ini_file, site_list[n]->url);
127
128 /*yydebug = 1; */
129
130 if (yyparse () || error_count > 0)
131 MessageBox (0, error_buf,
132 error_count == 1 ? "Parse Error" : "Parse Errors", 0);
133 else
134 {
135 /* save known-good setup.ini locally */
136 String const fp = String ("file://") + local_dir + "/" +
137 rfc1738_escape_part (site_list[n]->url) +
138 "/setup.ini";
139 io_stream::mkpath_p (PATH_TO_FILE, fp);
140 io_stream *inistream = io_stream::open (fp, "wb");
141 if (inistream && !ini_file->seek (0, IO_SEEK_SET))
142 {
143 if (io_stream::copy (ini_file, inistream))
144 io_stream::remove (fp.cstr_oneuse());
145 delete ini_file;
146 delete inistream;
147 }
148 ++ini_count;
149 }
150 }
151 return ini_count;
152 }
153
154 static void
155 do_ini_thread (HINSTANCE h, HWND owner)
156 {
157 size_t ini_count = 0;
158 if (source == IDC_SOURCE_CWD)
159 ini_count = do_local_ini (owner);
160 else
161 ini_count = do_remote_ini (owner);
162
163 if (ini_count == 0)
164 {
165 next_dialog = source == IDC_SOURCE_CWD ? IDD_S_FROM_CWD : IDD_SITE;
166 return;
167 }
168
169 if (get_root_dir ().cstr_oneuse())
170 {
171 io_stream::mkpath_p (PATH_TO_DIR, "cygfile:///etc/setup");
172
173 unsigned int old_timestamp = 0;
174 io_stream *ots =
175 io_stream::open ("cygfile:///etc/setup/timestamp", "rt");
176 if (ots)
177 {
178 char temp[20];
179 memset (temp, '\0', 20);
180 if (ots->read (temp, 19))
181 sscanf (temp, "%u", &old_timestamp);
182 delete ots;
183 if (old_timestamp && setup_timestamp
184 && (old_timestamp > setup_timestamp))
185 {
186 int yn = yesno (owner, IDS_OLD_SETUPINI);
187 if (yn == IDNO)
188 exit_setup (1);
189 }
190 }
191 if (setup_timestamp)
192 {
193 io_stream *nts =
194 io_stream::open ("cygfile:///etc/setup/timestamp", "wt");
195 if (nts)
196 {
197 char temp[20];
198 sprintf (temp, "%u", setup_timestamp);
199 nts->write (temp, strlen (temp));
200 delete nts;
201 }
202 }
203 }
204
205 msg ("setup_version is %s, our_version is %s", setup_version ? : "(null)",
206 version);
207 if (setup_version)
208 {
209 String ini_version = canonicalize_version (setup_version);
210 String our_version = canonicalize_version (version);
211 // XXX useversion < operator
212 if (our_version.compare (ini_version) < 0)
213 note (owner, IDS_OLD_SETUP_VERSION, version, setup_version);
214 }
215
216 next_dialog = IDD_CHOOSER;
217 }
218
219 static DWORD WINAPI
220 do_ini_thread_reflector(void* p)
221 {
222 HANDLE *context;
223 context = (HANDLE*)p;
224
225 do_ini_thread((HINSTANCE)context[0], (HWND)context[1]);
226
227 // Tell the progress page that we're done downloading
228 Progress.PostMessage(WM_APP_SETUP_INI_DOWNLOAD_COMPLETE, 0, next_dialog);
229
230 ExitThread(0);
231 }
232
233 static HANDLE context[2];
234
235 void
236 do_ini (HINSTANCE h, HWND owner)
237 {
238 context[0] = h;
239 context[1] = owner;
240
241 DWORD threadID;
242 CreateThread (NULL, 0, do_ini_thread_reflector, context, 0, &threadID);
243 }
244
245
246 extern int yylineno;
247
248 extern "C" int
249 yyerror (char *s, ...)
250 {
251 char buf[1000];
252 int len;
253 sprintf (buf, "setup.ini line %d: ", yylineno);
254 va_list args;
255 va_start (args, s);
256 vsprintf (buf + strlen (buf), s, args);
257 OutputDebugString (buf);
258 if (error_buf)
259 {
260 strcat (error_buf, "\n");
261 len = strlen (error_buf) + strlen (buf) + 5;
262 error_buf = (char *) realloc (error_buf, len);
263 strcat (error_buf, buf);
264 }
265 else
266 {
267 len = strlen (buf) + 5;
268 error_buf = (char *) malloc (len);
269 strcpy (error_buf, buf);
270 }
271 error_count++;
272 /* TODO: is return 0 correct? */
273 return 0;
274 }
275
276 extern "C" int fprintf (FILE * f, const char *s, ...);
277
278 static char stderrbuf[1000];
279
280 int
281 fprintf (FILE * f, const char *fmt, ...)
282 {
283 char buf[1000];
284 int rv;
285 va_list args;
286 va_start (args, fmt);
287 if (f == stderr)
288 {
289 rv = vsprintf (buf, fmt, args);
290 strcat (stderrbuf, buf);
291 if (char *nl = strchr (stderrbuf, '\n'))
292 {
293 *nl = 0;
294 /*OutputDebugString (stderrbuf); */
295 MessageBox (0, buf, "Cygwin Setup", 0);
296 stderrbuf[0] = 0;
297 }
298
299 }
300 else
301 {
302 rv = vfprintf (f, fmt, args);
303 }
304 return rv;
305 }
This page took 0.047719 seconds and 5 git commands to generate.