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