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