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