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
+ "/" +
72 note (NULL
, IDS_SETUPINI_MISSING
, (String ("file://") + local_dir
+ "/" +
77 log (LOG_BABBLE
, String ("Found ini file - file://") + local_dir
+ "/" + path
);
79 /* FIXME: only use most recent copy */
83 ini_init (ini_file
, String ("file://") + local_dir
+ "/" + path
);
87 if (yyparse () || error_count
> 0)
88 MessageBox (0, error_buf
, error_count
== 1 ? "Parse Error" : "Parse Errors", 0);
94 do_local_ini (HWND owner
)
97 find (local_dir
, find_routine
);
102 do_remote_ini (HWND owner
)
104 size_t ini_count
= 0;
106 for (size_t n
= 1; n
<= site_list
.number (); n
++)
108 io_stream
*ini_file
=
109 get_url_to_membuf (site_list
[n
]->url
+ "/setup.ini", owner
);
113 note (owner
, IDS_SETUPINI_MISSING
, site_list
[n
]->url
.cstr_oneuse());
117 /* FIXME: only use most recent copy */
121 ini_init (ini_file
, site_list
[n
]->url
);
125 if (yyparse () || error_count
> 0)
126 MessageBox (0, error_buf
,
127 error_count
== 1 ? "Parse Error" : "Parse Errors", 0);
130 /* save known-good setup.ini locally */
131 String
const fp
= String ("file://") + local_dir
+ "/" +
132 rfc1738_escape_part (site_list
[n
]->url
) +
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
))
138 if (io_stream::copy (ini_file
, inistream
))
139 io_stream::remove (fp
.cstr_oneuse());
150 do_ini_thread (HINSTANCE h
, HWND owner
)
152 size_t ini_count
= 0;
153 if (source
== IDC_SOURCE_CWD
)
154 ini_count
= do_local_ini (owner
);
156 ini_count
= do_remote_ini (owner
);
160 next_dialog
= source
== IDC_SOURCE_CWD
? IDD_S_FROM_CWD
: IDD_SITE
;
164 if (get_root_dir ().cstr_oneuse())
166 io_stream::mkpath_p (PATH_TO_DIR
, "cygfile:///etc/setup");
168 unsigned int old_timestamp
= 0;
170 io_stream::open ("cygfile:///etc/setup/timestamp", "rt");
174 memset (temp
, '\0', 20);
175 if (ots
->read (temp
, 19))
176 sscanf (temp
, "%u", &old_timestamp
);
178 if (old_timestamp
&& setup_timestamp
179 && (old_timestamp
> setup_timestamp
))
181 int yn
= yesno (owner
, IDS_OLD_SETUPINI
);
189 io_stream::open ("cygfile:///etc/setup/timestamp", "wt");
193 sprintf (temp
, "%u", setup_timestamp
);
194 nts
->write (temp
, strlen (temp
));
200 msg ("setup_version is %s, our_version is %s", setup_version
? : "(null)",
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
);
211 next_dialog
= IDD_CHOOSER
;
215 do_ini_thread_reflector(void* p
)
218 context
= (HANDLE
*)p
;
220 do_ini_thread((HINSTANCE
)context
[0], (HWND
)context
[1]);
222 // Tell the progress page that we're done downloading
223 Progress
.PostMessage(WM_APP_SETUP_INI_DOWNLOAD_COMPLETE
, 0, next_dialog
);
228 static HANDLE context
[2];
231 do_ini (HINSTANCE h
, HWND owner
)
236 _beginthread(do_ini_thread_reflector
, 0, context
);
243 yyerror (char *s
, ...)
247 sprintf (buf
, "setup.ini line %d: ", yylineno
);
250 vsprintf (buf
+ strlen (buf
), s
, args
);
251 OutputDebugString (buf
);
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
);
261 len
= strlen (buf
) + 5;
262 error_buf
= (char *) malloc (len
);
263 strcpy (error_buf
, buf
);
266 /* TODO: is return 0 correct? */
270 extern "C" int fprintf (FILE * f
, const char *s
, ...);
272 static char stderrbuf
[1000];
275 fprintf (FILE * f
, const char *fmt
, ...)
280 va_start (args
, fmt
);
283 rv
= vsprintf (buf
, fmt
, args
);
284 strcat (stderrbuf
, buf
);
285 if (char *nl
= strchr (stderrbuf
, '\n'))
288 /*OutputDebugString (stderrbuf); */
289 MessageBox (0, buf
, "Cygwin Setup", 0);
296 rv
= vfprintf (f
, fmt
, args
);