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"
50 extern ThreeBarProgressPage Progress
;
52 unsigned int setup_timestamp
= 0;
53 char *setup_version
= 0;
55 extern int yyparse ();
56 /*extern int yydebug;*/
58 static char *error_buf
= 0;
59 static int error_count
= 0;
64 find_routine (char *path
, unsigned int fsize
)
66 if (!strstr (path
, "setup.ini") )
68 io_stream
*ini_file
= io_stream::open (String ("file://") + local_dir
+ "/" + path
, "rb");
71 note (NULL
, IDS_SETUPINI_MISSING
, (String ("file://") + local_dir
+ "/" + path
).cstr_oneuse());
75 log (LOG_BABBLE
, String ("Found ini file - file://") + local_dir
+ "/" + path
);
77 /* FIXME: only use most recent copy */
81 ini_init (ini_file
, String ("file://") + local_dir
+ "/" + path
);
85 if (yyparse () || error_count
> 0)
86 MessageBox (0, error_buf
, error_count
== 1 ? "Parse Error" : "Parse Errors", 0);
92 do_local_ini (HWND owner
)
95 find (local_dir
, find_routine
);
100 do_remote_ini (HWND owner
)
102 size_t ini_count
= 0;
104 for (size_t n
= 1; n
<= site_list
.number (); n
++)
106 io_stream
*ini_file
=
107 get_url_to_membuf (site_list
[n
]->url
+ "/setup.ini", owner
);
111 note (owner
, IDS_SETUPINI_MISSING
, site_list
[n
]->url
.cstr_oneuse());
115 /* FIXME: only use most recent copy */
119 ini_init (ini_file
, site_list
[n
]->url
);
123 if (yyparse () || error_count
> 0)
124 MessageBox (0, error_buf
,
125 error_count
== 1 ? "Parse Error" : "Parse Errors", 0);
128 /* save known-good setup.ini locally */
129 String
const fp
= String ("file://") + local_dir
+ "/" +
130 rfc1738_escape_part (site_list
[n
]->url
) +
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
))
136 if (io_stream::copy (ini_file
, inistream
))
137 io_stream::remove (fp
.cstr_oneuse());
148 do_ini_thread (HINSTANCE h
, HWND owner
)
150 size_t ini_count
= 0;
151 if (source
== IDC_SOURCE_CWD
)
152 ini_count
= do_local_ini (owner
);
154 ini_count
= do_remote_ini (owner
);
158 next_dialog
= source
== IDC_SOURCE_CWD
? IDD_S_FROM_CWD
: IDD_SITE
;
162 if (get_root_dir ().cstr_oneuse())
164 io_stream::mkpath_p (PATH_TO_DIR
, "cygfile:///etc/setup");
166 unsigned int old_timestamp
= 0;
168 io_stream::open ("cygfile:///etc/setup/timestamp", "rt");
172 memset (temp
, '\0', 20);
173 if (ots
->read (temp
, 19))
174 sscanf (temp
, "%u", &old_timestamp
);
176 if (old_timestamp
&& setup_timestamp
177 && (old_timestamp
> setup_timestamp
))
179 int yn
= yesno (owner
, IDS_OLD_SETUPINI
);
187 io_stream::open ("cygfile:///etc/setup/timestamp", "wt");
191 sprintf (temp
, "%u", setup_timestamp
);
192 nts
->write (temp
, strlen (temp
));
198 msg ("setup_version is %s, our_version is %s", setup_version
? : "(null)",
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
);
209 next_dialog
= IDD_CHOOSER
;
213 do_ini_thread_reflector(void* p
)
216 context
= (HANDLE
*)p
;
218 do_ini_thread((HINSTANCE
)context
[0], (HWND
)context
[1]);
220 // Tell the progress page that we're done downloading
221 Progress
.PostMessage(WM_APP_SETUP_INI_DOWNLOAD_COMPLETE
, 0, next_dialog
);
226 static HANDLE context
[2];
229 do_ini (HINSTANCE h
, HWND owner
)
234 _beginthread(do_ini_thread_reflector
, 0, context
);
241 yyerror (char *s
, ...)
245 sprintf (buf
, "setup.ini line %d: ", yylineno
);
248 vsprintf (buf
+ strlen (buf
), s
, args
);
249 OutputDebugString (buf
);
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
);
259 len
= strlen (buf
) + 5;
260 error_buf
= (char *) malloc (len
);
261 strcpy (error_buf
, buf
);
264 /* TODO: is return 0 correct? */
268 extern "C" int fprintf (FILE * f
, const char *s
, ...);
270 static char stderrbuf
[1000];
273 fprintf (FILE * f
, const char *fmt
, ...)
278 va_start (args
, fmt
);
281 rv
= vsprintf (buf
, fmt
, args
);
282 strcat (stderrbuf
, buf
);
283 if (char *nl
= strchr (stderrbuf
, '\n'))
286 /*OutputDebugString (stderrbuf); */
287 MessageBox (0, buf
, "Cygwin Setup", 0);
294 rv
= vfprintf (f
, fmt
, args
);