]> cygwin.com Git - cygwin-apps/setup.git/blob - ini.cc
2001-12-02 Robert Collins <rbtcollins@hotmail.com>
[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
32 #include "ini.h"
33 #include "resource.h"
34 #include "concat.h"
35 #include "state.h"
36 #include "geturl.h"
37 #include "dialog.h"
38 #include "msg.h"
39 #include "log.h"
40 #include "version.h"
41 #include "mount.h"
42
43 #include "io_stream.h"
44
45 unsigned int setup_timestamp = 0;
46 char *setup_version = 0;
47
48 extern int yyparse ();
49 /*extern int yydebug;*/
50
51 static char *error_buf = 0;
52 static int error_count = 0;
53
54 void
55 do_ini (HINSTANCE h)
56 {
57 io_stream *ini_file = get_url_to_membuf (concat (MIRROR_SITE, "/setup.ini", 0));
58 dismiss_url_status_dialog ();
59
60 if (!ini_file)
61 {
62 note (IDS_SETUPINI_MISSING, MIRROR_SITE);
63 next_dialog = IDD_SITE;
64 return;
65 }
66
67 setup_timestamp = 0;
68 setup_version = 0;
69
70 ini_init (ini_file, MIRROR_SITE);
71
72 /*yydebug = 1; */
73
74 if (yyparse () || error_count > 0)
75 MessageBox (0, error_buf, error_count == 1 ? "Parse Error" : "Parse Errors", 0);
76 else
77 {
78 /* save known-good setup.ini locally */
79 io_stream *inistream = io_stream::open ("file://setup.ini", "wb");
80 if (inistream &&
81 ! ini_file->seek (0, IO_SEEK_SET))
82 {
83 if (io_stream::copy (ini_file, inistream))
84 io_stream::remove ("file://setup.ini");
85 delete ini_file;
86 delete inistream;
87 }
88 }
89
90 if (get_root_dir ())
91 {
92 io_stream::mkpath_p (PATH_TO_DIR, "cygfile:///etc/setup");
93
94 unsigned int old_timestamp = 0;
95 io_stream *ots =
96 io_stream::open ("cygfile:///etc/setup/timestamp", "rt");
97 if (ots)
98 {
99 char temp[20];
100 memset (temp, '\0', 20);
101 if (ots->read (temp, 19))
102 sscanf (temp, "%u", &old_timestamp);
103 delete ots;
104 if (old_timestamp && setup_timestamp
105 && (old_timestamp > setup_timestamp))
106 {
107 int yn = yesno (IDS_OLD_SETUPINI);
108 if (yn == IDNO)
109 exit_setup (1);
110 }
111 }
112 if (setup_timestamp)
113 {
114 io_stream *nts =
115 io_stream::open ("cygfile:///etc/setup/timestamp", "wt");
116 if (nts)
117 {
118 char temp[20];
119 sprintf (temp, "%u", setup_timestamp);
120 nts->write (temp, strlen (temp));
121 delete nts;
122 }
123 }
124 }
125
126 msg ("setup_version is %s, our_version is %s", setup_version ? : "(null)",
127 version);
128 if (setup_version)
129 {
130 char *ini_version = canonicalize_version (setup_version);
131 char *our_version = canonicalize_version (version);
132 if (strcmp (our_version, ini_version) < 0)
133 note (IDS_OLD_SETUP_VERSION, version, setup_version);
134 }
135
136 next_dialog = IDD_CHOOSE;
137 }
138
139 extern int yylineno;
140
141 extern "C" int
142 yyerror (char *s, ...)
143 {
144 char buf[1000];
145 int len;
146 sprintf (buf, "setup.ini line %d: ", yylineno);
147 va_list args;
148 va_start (args, s);
149 vsprintf (buf + strlen (buf), s, args);
150 OutputDebugString (buf);
151 if (error_buf)
152 {
153 strcat (error_buf, "\n");
154 len = strlen (error_buf) + strlen (buf) + 5;
155 error_buf = (char *) realloc (error_buf, len);
156 strcat (error_buf, buf);
157 }
158 else
159 {
160 len = strlen (buf) + 5;
161 error_buf = (char *) malloc (len);
162 strcpy (error_buf, buf);
163 }
164 error_count++;
165 /* TODO: is return 0 correct? */
166 return 0;
167 }
168
169 extern "C" int fprintf (FILE * f, const char *s, ...);
170
171 static char stderrbuf[1000];
172
173 int
174 fprintf (FILE * f, const char *fmt, ...)
175 {
176 char buf[1000];
177 int rv;
178 va_list args;
179 va_start (args, fmt);
180 if (f == stderr)
181 {
182 rv = vsprintf (buf, fmt, args);
183 strcat (stderrbuf, buf);
184 if (char *nl = strchr (stderrbuf, '\n'))
185 {
186 *nl = 0;
187 /*OutputDebugString (stderrbuf); */
188 MessageBox (0, buf, "Cygwin Setup", 0);
189 stderrbuf[0] = 0;
190 }
191
192 }
193 else
194 {
195 rv = vfprintf (f, fmt, args);
196 }
197 return rv;
198 }
This page took 0.042698 seconds and 5 git commands to generate.