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"
52 extern ThreeBarProgressPage Progress
;
54 unsigned int setup_timestamp
= 0;
55 char *setup_version
= 0;
57 extern int yyparse ();
58 /*extern int yydebug;*/
60 static char *error_buf
= 0;
61 static int error_count
= 0;
66 find_routine (char *path
, unsigned int fsize
)
68 if (!strstr (path
, "setup.ini") )
70 io_stream
*ini_file
= io_stream::open (String ("file://") + local_dir
+ "/" +
74 note (NULL
, IDS_SETUPINI_MISSING
, (String ("file://") + local_dir
+ "/" +
79 log (LOG_BABBLE
, String ("Found ini file - file://") + local_dir
+ "/" + path
);
81 /* FIXME: only use most recent copy */
85 /* Attempt to unescape the string */
86 path
[strlen(path
) -10] = '\0';
87 String mirror
= rfc1738_unescape_part (path
);
88 ini_init (ini_file
, mirror
);
92 if (yyparse () || error_count
> 0)
93 MessageBox (0, error_buf
, error_count
== 1 ? "Parse Error" : "Parse Errors", 0);
99 do_local_ini (HWND owner
)
102 find (local_dir
, find_routine
);
107 do_remote_ini (HWND owner
)
109 size_t ini_count
= 0;
111 for (size_t n
= 1; n
<= site_list
.number (); n
++)
113 io_stream
*ini_file
=
114 get_url_to_membuf (site_list
[n
]->url
+ "/setup.ini", owner
);
118 note (owner
, IDS_SETUPINI_MISSING
, site_list
[n
]->url
.cstr_oneuse());
122 /* FIXME: only use most recent copy */
126 ini_init (ini_file
, site_list
[n
]->url
);
130 if (yyparse () || error_count
> 0)
131 MessageBox (0, error_buf
,
132 error_count
== 1 ? "Parse Error" : "Parse Errors", 0);
135 /* save known-good setup.ini locally */
136 String
const fp
= String ("file://") + local_dir
+ "/" +
137 rfc1738_escape_part (site_list
[n
]->url
) +
139 io_stream::mkpath_p (PATH_TO_FILE
, fp
);
140 io_stream
*inistream
= io_stream::open (fp
, "wb");
141 if (inistream
&& !ini_file
->seek (0, IO_SEEK_SET
))
143 if (io_stream::copy (ini_file
, inistream
))
144 io_stream::remove (fp
.cstr_oneuse());
155 do_ini_thread (HINSTANCE h
, HWND owner
)
157 size_t ini_count
= 0;
158 if (source
== IDC_SOURCE_CWD
)
159 ini_count
= do_local_ini (owner
);
161 ini_count
= do_remote_ini (owner
);
165 next_dialog
= source
== IDC_SOURCE_CWD
? IDD_S_FROM_CWD
: IDD_SITE
;
169 if (get_root_dir ().cstr_oneuse())
171 io_stream::mkpath_p (PATH_TO_DIR
, "cygfile:///etc/setup");
173 unsigned int old_timestamp
= 0;
175 io_stream::open ("cygfile:///etc/setup/timestamp", "rt");
179 memset (temp
, '\0', 20);
180 if (ots
->read (temp
, 19))
181 sscanf (temp
, "%u", &old_timestamp
);
183 if (old_timestamp
&& setup_timestamp
184 && (old_timestamp
> setup_timestamp
))
186 int yn
= yesno (owner
, IDS_OLD_SETUPINI
);
194 io_stream::open ("cygfile:///etc/setup/timestamp", "wt");
198 sprintf (temp
, "%u", setup_timestamp
);
199 nts
->write (temp
, strlen (temp
));
205 msg ("setup_version is %s, our_version is %s", setup_version
? : "(null)",
209 String ini_version
= canonicalize_version (setup_version
);
210 String our_version
= canonicalize_version (version
);
211 // XXX useversion < operator
212 if (our_version
.compare (ini_version
) < 0)
213 note (owner
, IDS_OLD_SETUP_VERSION
, version
, setup_version
);
216 next_dialog
= IDD_CHOOSER
;
220 do_ini_thread_reflector(void* p
)
223 context
= (HANDLE
*)p
;
225 do_ini_thread((HINSTANCE
)context
[0], (HWND
)context
[1]);
227 // Tell the progress page that we're done downloading
228 Progress
.PostMessage(WM_APP_SETUP_INI_DOWNLOAD_COMPLETE
, 0, next_dialog
);
233 static HANDLE context
[2];
236 do_ini (HINSTANCE h
, HWND owner
)
242 CreateThread (NULL
, 0, do_ini_thread_reflector
, context
, 0, &threadID
);
249 yyerror (char *s
, ...)
253 sprintf (buf
, "setup.ini line %d: ", yylineno
);
256 vsprintf (buf
+ strlen (buf
), s
, args
);
257 OutputDebugString (buf
);
260 strcat (error_buf
, "\n");
261 len
= strlen (error_buf
) + strlen (buf
) + 5;
262 error_buf
= (char *) realloc (error_buf
, len
);
263 strcat (error_buf
, buf
);
267 len
= strlen (buf
) + 5;
268 error_buf
= (char *) malloc (len
);
269 strcpy (error_buf
, buf
);
272 /* TODO: is return 0 correct? */
276 extern "C" int fprintf (FILE * f
, const char *s
, ...);
278 static char stderrbuf
[1000];
281 fprintf (FILE * f
, const char *fmt
, ...)
286 va_start (args
, fmt
);
289 rv
= vsprintf (buf
, fmt
, args
);
290 strcat (stderrbuf
, buf
);
291 if (char *nl
= strchr (stderrbuf
, '\n'))
294 /*OutputDebugString (stderrbuf); */
295 MessageBox (0, buf
, "Cygwin Setup", 0);
302 rv
= vfprintf (f
, fmt
, args
);