2 * Copyright (c) 2000, Red Hat, Inc.
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.
9 * A copy of the GNU General Public License can be found at
12 * Written by DJ Delorie <dj@cygnus.com>
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. */
22 static const char *cvsid
=
47 #include "io_stream.h"
53 #include "IniDBBuilderPackage.h"
55 extern ThreeBarProgressPage Progress
;
57 unsigned int setup_timestamp
= 0;
60 extern int yyparse ();
61 /*extern int yydebug;*/
63 static char *error_buf
= 0;
64 static int error_count
= 0;
68 static IniDBBuilder
*findBuilder
;
71 find_routine (char *path
, unsigned int fsize
)
73 if (!strstr (path
, "setup.ini") )
75 io_stream
*ini_file
= io_stream::open (String ("file://") + local_dir
+ "/" +
79 note (NULL
, IDS_SETUPINI_MISSING
, (String ("file://") + local_dir
+ "/" +
84 log (LOG_BABBLE
, String ("Found ini file - file://") + local_dir
+ "/" + path
);
86 /* Attempt to unescape the string */
87 path
[strlen(path
) -10] = '\0';
88 String mirror
= rfc1738_unescape_part (path
);
89 findBuilder
->parse_mirror
= mirror
;
90 ini_init (ini_file
, findBuilder
);
94 if (yyparse () || error_count
> 0)
95 MessageBox (0, error_buf
, error_count
== 1 ? "Parse Error" : "Parse Errors", 0);
98 if (findBuilder
->timestamp
> setup_timestamp
)
100 setup_timestamp
= findBuilder
->timestamp
;
101 setup_version
= findBuilder
->version
;
106 do_local_ini (HWND owner
)
109 findBuilder
= new IniDBBuilderPackage
;
110 find (local_dir
, find_routine
);
117 do_remote_ini (HWND owner
)
119 size_t ini_count
= 0;
120 IniDBBuilderPackage
*aBuilder
= new IniDBBuilderPackage
;
122 for (size_t n
= 1; n
<= site_list
.number (); n
++)
124 io_stream
*ini_file
=
125 get_url_to_membuf (site_list
[n
]->url
+ "/setup.ini", owner
);
129 note (owner
, IDS_SETUPINI_MISSING
, site_list
[n
]->url
.cstr_oneuse());
133 aBuilder
->parse_mirror
= site_list
[n
]->url
;
134 ini_init (ini_file
, aBuilder
);
138 if (yyparse () || error_count
> 0)
139 MessageBox (0, error_buf
,
140 error_count
== 1 ? "Parse Error" : "Parse Errors", 0);
143 /* save known-good setup.ini locally */
144 String
const fp
= String ("file://") + local_dir
+ "/" +
145 rfc1738_escape_part (site_list
[n
]->url
) +
147 io_stream::mkpath_p (PATH_TO_FILE
, fp
);
148 io_stream
*inistream
= io_stream::open (fp
, "wb");
149 if (inistream
&& !ini_file
->seek (0, IO_SEEK_SET
))
151 if (io_stream::copy (ini_file
, inistream
))
152 io_stream::remove (fp
.cstr_oneuse());
158 if (aBuilder
->timestamp
> setup_timestamp
)
160 setup_timestamp
= aBuilder
->timestamp
;
161 setup_version
= aBuilder
->version
;
169 do_ini_thread (HINSTANCE h
, HWND owner
)
171 size_t ini_count
= 0;
172 if (source
== IDC_SOURCE_CWD
)
173 ini_count
= do_local_ini (owner
);
175 ini_count
= do_remote_ini (owner
);
179 next_dialog
= source
== IDC_SOURCE_CWD
? IDD_S_FROM_CWD
: IDD_SITE
;
183 if (get_root_dir ().cstr_oneuse())
185 io_stream::mkpath_p (PATH_TO_DIR
, "cygfile:///etc/setup");
187 unsigned int old_timestamp
= 0;
189 io_stream::open ("cygfile:///etc/setup/timestamp", "rt");
193 memset (temp
, '\0', 20);
194 if (ots
->read (temp
, 19))
195 sscanf (temp
, "%u", &old_timestamp
);
197 if (old_timestamp
&& setup_timestamp
198 && (old_timestamp
> setup_timestamp
))
200 int yn
= yesno (owner
, IDS_OLD_SETUPINI
);
208 io_stream::open ("cygfile:///etc/setup/timestamp", "wt");
212 sprintf (temp
, "%u", setup_timestamp
);
213 nts
->write (temp
, strlen (temp
));
219 msg ("setup_version is %s, our_version is %s", setup_version
.size() ?
220 setup_version
.cstr_oneuse() : "(null)",
222 if (setup_version
.size())
224 String ini_version
= canonicalize_version (setup_version
);
225 String our_version
= canonicalize_version (version
);
226 // XXX useversion < operator
227 if (our_version
.compare (ini_version
) < 0)
228 note (owner
, IDS_OLD_SETUP_VERSION
, version
, setup_version
.cstr_oneuse());
231 next_dialog
= IDD_CHOOSER
;
235 do_ini_thread_reflector(void* p
)
238 context
= (HANDLE
*)p
;
240 do_ini_thread((HINSTANCE
)context
[0], (HWND
)context
[1]);
242 // Tell the progress page that we're done downloading
243 Progress
.PostMessage(WM_APP_SETUP_INI_DOWNLOAD_COMPLETE
, 0, next_dialog
);
248 static HANDLE context
[2];
251 do_ini (HINSTANCE h
, HWND owner
)
257 CreateThread (NULL
, 0, do_ini_thread_reflector
, context
, 0, &threadID
);
264 yyerror (String
const &s
)
268 sprintf (buf
, "setup.ini line %d: ", yylineno
);
269 sprintf (buf
+ strlen (buf
), s
.cstr_oneuse());
270 OutputDebugString (buf
);
273 strcat (error_buf
, "\n");
274 len
= strlen (error_buf
) + strlen (buf
) + 5;
275 error_buf
= (char *) realloc (error_buf
, len
);
276 strcat (error_buf
, buf
);
280 len
= strlen (buf
) + 5;
281 error_buf
= (char *) malloc (len
);
282 strcpy (error_buf
, buf
);
285 /* TODO: is return 0 correct? */
289 extern "C" int fprintf (FILE * f
, const char *s
, ...);
291 static char stderrbuf
[1000];
294 fprintf (FILE * f
, const char *fmt
, ...)
299 va_start (args
, fmt
);
302 rv
= vsprintf (buf
, fmt
, args
);
303 strcat (stderrbuf
, buf
);
304 if (char *nl
= strchr (stderrbuf
, '\n'))
307 /*OutputDebugString (stderrbuf); */
308 MessageBox (0, buf
, "Cygwin Setup", 0);
315 rv
= vfprintf (f
, fmt
, args
);