xref: /netbsd-src/sys/arch/hpcmips/stand/pbsdboot/preference.c (revision 212b3fa9d8c1b08294cae1f6a74cef5bb1885313)
1*212b3fa9Stakemura /*	$NetBSD: preference.c,v 1.4 2000/08/29 15:10:20 takemura Exp $	*/
2db2b0adeStakemura 
3db2b0adeStakemura /*-
4db2b0adeStakemura  * Copyright (c) 1999 Shin Takemura.
5db2b0adeStakemura  * All rights reserved.
6db2b0adeStakemura  *
7db2b0adeStakemura  * This software is part of the PocketBSD.
8db2b0adeStakemura  *
9db2b0adeStakemura  * Redistribution and use in source and binary forms, with or without
10db2b0adeStakemura  * modification, are permitted provided that the following conditions
11db2b0adeStakemura  * are met:
12db2b0adeStakemura  * 1. Redistributions of source code must retain the above copyright
13db2b0adeStakemura  *    notice, this list of conditions and the following disclaimer.
14db2b0adeStakemura  * 2. Redistributions in binary form must reproduce the above copyright
15db2b0adeStakemura  *    notice, this list of conditions and the following disclaimer in the
16db2b0adeStakemura  *    documentation and/or other materials provided with the distribution.
17db2b0adeStakemura  * 3. All advertising materials mentioning features or use of this software
18db2b0adeStakemura  *    must display the following acknowledgement:
19db2b0adeStakemura  *	This product includes software developed by the PocketBSD project
20db2b0adeStakemura  *	and its contributors.
21db2b0adeStakemura  * 4. Neither the name of the project nor the names of its contributors
22db2b0adeStakemura  *    may be used to endorse or promote products derived from this software
23db2b0adeStakemura  *    without specific prior written permission.
24db2b0adeStakemura  *
25db2b0adeStakemura  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26db2b0adeStakemura  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27db2b0adeStakemura  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28db2b0adeStakemura  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29db2b0adeStakemura  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30db2b0adeStakemura  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31db2b0adeStakemura  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32db2b0adeStakemura  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33db2b0adeStakemura  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34db2b0adeStakemura  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35db2b0adeStakemura  * SUCH DAMAGE.
36db2b0adeStakemura  *
37db2b0adeStakemura  */
38db2b0adeStakemura #include <pbsdboot.h>
39db2b0adeStakemura #include <commctrl.h>
40db2b0adeStakemura #include <res/resource.h>
41db2b0adeStakemura 
42*212b3fa9Stakemura 
43db2b0adeStakemura struct preference_s pref;
44db2b0adeStakemura TCHAR* where_pref_load_from = NULL;
45db2b0adeStakemura static TCHAR filenamebuf[1024];
46db2b0adeStakemura 
47*212b3fa9Stakemura 
48*212b3fa9Stakemura #define SETTING_IDX 1
49*212b3fa9Stakemura #define FB_TYPE 2
50*212b3fa9Stakemura #define FB_WIDTH 3
51*212b3fa9Stakemura #define FB_HEIGHT 4
52*212b3fa9Stakemura #define FB_LINEBYTES 5
53*212b3fa9Stakemura #define BOOT_TIME 6
54*212b3fa9Stakemura #define FB_ADDR 7
55*212b3fa9Stakemura #define PLATID_CPU 8
56*212b3fa9Stakemura #define PLATID_MACHINE 9
57*212b3fa9Stakemura #define SETTING_NAME 10
58*212b3fa9Stakemura #define KERNEL_NAME 11
59*212b3fa9Stakemura #define OPTIONS 12
60*212b3fa9Stakemura #define CHECK_LAST_CHANCE 13
61*212b3fa9Stakemura #define LOAD_DEBUG_INFO 14
62*212b3fa9Stakemura #define SERIAL_PORT 15
63*212b3fa9Stakemura #define REVERSE_VIDEO 16
64*212b3fa9Stakemura #define AUTOBOOT 17
65*212b3fa9Stakemura 
66*212b3fa9Stakemura #define NOFID 18
67*212b3fa9Stakemura 
68*212b3fa9Stakemura 
69*212b3fa9Stakemura TCHAR *id_table[] = {
70*212b3fa9Stakemura 0,
71*212b3fa9Stakemura TEXT("setting_idx"),
72*212b3fa9Stakemura TEXT("fb_type"),
73*212b3fa9Stakemura TEXT("fb_width"),
74*212b3fa9Stakemura TEXT("fb_height"),
75*212b3fa9Stakemura TEXT("fb_linebytes"),
76*212b3fa9Stakemura TEXT("boot_time"),
77*212b3fa9Stakemura TEXT("fb_addr"),
78*212b3fa9Stakemura TEXT("platid_cpu"),
79*212b3fa9Stakemura TEXT("platid_machine"),
80*212b3fa9Stakemura TEXT("setting_name"),
81*212b3fa9Stakemura TEXT("kernel_name"),
82*212b3fa9Stakemura TEXT("options"),
83*212b3fa9Stakemura TEXT("check_last_chance"),
84*212b3fa9Stakemura TEXT("load_debug_info"),
85*212b3fa9Stakemura TEXT("serial_port"),
86*212b3fa9Stakemura TEXT("reverse_video"),
87*212b3fa9Stakemura TEXT("autoboot"),
88*212b3fa9Stakemura };
89*212b3fa9Stakemura 
90*212b3fa9Stakemura 
91*212b3fa9Stakemura 
92db2b0adeStakemura void
pref_init(struct preference_s * pref)93db2b0adeStakemura pref_init(struct preference_s* pref)
94db2b0adeStakemura {
95db2b0adeStakemura 	memset(pref, 0, sizeof(*pref));
96db2b0adeStakemura }
97db2b0adeStakemura 
98db2b0adeStakemura 
99*212b3fa9Stakemura /*
100*212b3fa9Stakemura  argument file is handle that was already opened .
101*212b3fa9Stakemura  if read is faile , this function will "not" close this handle .
102*212b3fa9Stakemura  return 0 if error . if end of file , return -1
103*212b3fa9Stakemura */
read1byte(HANDLE file,char * c)104*212b3fa9Stakemura int read1byte(HANDLE file,char *c){
105*212b3fa9Stakemura 	DWORD n;
106*212b3fa9Stakemura 	if(!ReadFile(file,c,sizeof(char),&n,NULL)){
107*212b3fa9Stakemura 		msg_printf(MSG_ERROR, TEXT("pref_load()"),
108*212b3fa9Stakemura 			   TEXT("ReadFile(): error=%d"), GetLastError());
109*212b3fa9Stakemura 		debug_printf(TEXT("ReadFile(): error=%d\r"), GetLastError());
110*212b3fa9Stakemura 
111*212b3fa9Stakemura 		return 0;
112*212b3fa9Stakemura 	}
113*212b3fa9Stakemura 	if (n != sizeof(char)) {
114*212b3fa9Stakemura 		if( n == 0){
115*212b3fa9Stakemura 			return (-1);
116*212b3fa9Stakemura 		}
117*212b3fa9Stakemura 		msg_printf(MSG_ERROR, TEXT("pref_load()"),
118*212b3fa9Stakemura 			   TEXT("ReadFile(): read %d bytes"), n);
119*212b3fa9Stakemura 		debug_printf(TEXT("ReadFile(): read %d bytes\r"), n);
120*212b3fa9Stakemura 
121*212b3fa9Stakemura 		return 0;
122*212b3fa9Stakemura 	}
123*212b3fa9Stakemura 	return 1;
124*212b3fa9Stakemura }
125*212b3fa9Stakemura 
126*212b3fa9Stakemura /*
127*212b3fa9Stakemura  argument file is handle that was already opened .
128*212b3fa9Stakemura  if write is faile, this function will "not" close this handle .
129*212b3fa9Stakemura  return 0 if error . write one line of string .
130*212b3fa9Stakemura */
write1string(HANDLE file,char * string)131*212b3fa9Stakemura int write1string(HANDLE file,char *string){
132*212b3fa9Stakemura 	DWORD n;
133*212b3fa9Stakemura 	if(!WriteFile(file,string,sizeof(char)*strlen(string),&n,NULL)){
134*212b3fa9Stakemura 	    msg_printf(MSG_ERROR, TEXT("pref_write()"),
135*212b3fa9Stakemura 			   TEXT("WriteFile(): error=%d"), GetLastError());
136*212b3fa9Stakemura 		debug_printf(TEXT("WriteFile(): error=%d\n"), GetLastError());
137*212b3fa9Stakemura 
138*212b3fa9Stakemura 		return 0;
139*212b3fa9Stakemura 	}
140*212b3fa9Stakemura 	if (n != sizeof(char)*strlen(string)) {
141*212b3fa9Stakemura 		msg_printf(MSG_ERROR, TEXT("pref_write()"),
142*212b3fa9Stakemura 			   TEXT("WriteFile(): write %d bytes"), n);
143*212b3fa9Stakemura 		debug_printf(TEXT("WriteFile(): write %d bytes\n"), n);
144*212b3fa9Stakemura 
145*212b3fa9Stakemura 		return (0);
146*212b3fa9Stakemura 	}
147*212b3fa9Stakemura 
148*212b3fa9Stakemura 	return 1;
149*212b3fa9Stakemura }
150*212b3fa9Stakemura 
151db2b0adeStakemura void
pref_dump(struct preference_s * pref)152db2b0adeStakemura pref_dump(struct preference_s* pref)
153db2b0adeStakemura {
154db2b0adeStakemura 	debug_printf(TEXT("    kernel_name: %s\n"), pref->kernel_name);
155db2b0adeStakemura 	debug_printf(TEXT("        options: %s\n"), pref->options);
156db2b0adeStakemura 	debug_printf(TEXT("  user def name: %s\n"), pref->setting_name);
157db2b0adeStakemura 	debug_printf(TEXT("  setting index: %d\n"), pref->setting_idx);
158db2b0adeStakemura 	debug_printf(TEXT("           type: %d\n"), pref->fb_type);
159db2b0adeStakemura 	debug_printf(TEXT("          width: %d\n"), pref->fb_width);
160db2b0adeStakemura 	debug_printf(TEXT("         height: %d\n"), pref->fb_height);
161db2b0adeStakemura 	debug_printf(TEXT("     bytes/line: %d\n"), pref->fb_linebytes);
162db2b0adeStakemura 	debug_printf(TEXT("           addr: %d\n"), pref->fb_addr);
163db2b0adeStakemura 	debug_printf(TEXT("            cpu: %08lx\n"), pref->platid_cpu);
164db2b0adeStakemura 	debug_printf(TEXT("        machine: %08lx\n"), pref->platid_machine);
165db2b0adeStakemura 	debug_printf(TEXT("    last chance: %S\n"), pref->check_last_chance ?
166db2b0adeStakemura 		     "TRUE" : "FALSE");
167db2b0adeStakemura 	debug_printf(TEXT("load debug info: %S\n"), pref->load_debug_info ?
168db2b0adeStakemura 		     "TRUE" : "FALSE");
169db2b0adeStakemura 	debug_printf(TEXT("    serial port: %S\n"), pref->serial_port ?
170db2b0adeStakemura 		     "ON" : "OFF");
171db2b0adeStakemura }
172db2b0adeStakemura 
173db2b0adeStakemura 
174*212b3fa9Stakemura 
175*212b3fa9Stakemura /* To Do . modify this function*/
176db2b0adeStakemura int
pref_read(TCHAR * filename,struct preference_s * pref)177db2b0adeStakemura pref_read(TCHAR* filename, struct preference_s* pref)
178db2b0adeStakemura {
179db2b0adeStakemura 	HANDLE file;
180*212b3fa9Stakemura 	DWORD length;
181*212b3fa9Stakemura 	static struct preference_s buf;
182*212b3fa9Stakemura 	char tempbuf[1024];
183*212b3fa9Stakemura 	TCHAR unidata[1024];
184*212b3fa9Stakemura 	TCHAR identif[1024];
185*212b3fa9Stakemura 	char c;
186*212b3fa9Stakemura 	int i,flag,d;
187*212b3fa9Stakemura 	int result;/* count of loading pref item */
188*212b3fa9Stakemura 
189db2b0adeStakemura 
190db2b0adeStakemura 	file = CreateFile(
191db2b0adeStakemura 		filename,      	/* file name */
192db2b0adeStakemura 		GENERIC_READ,	/* access (read-write) mode */
193db2b0adeStakemura 		FILE_SHARE_READ,/* share mode */
194db2b0adeStakemura 		NULL,		/* pointer to security attributes */
195db2b0adeStakemura 		OPEN_EXISTING,	/* how to create */
196db2b0adeStakemura 		FILE_ATTRIBUTE_NORMAL,	/* file attributes*/
197db2b0adeStakemura 		NULL		/* handle to file with attributes to */
198db2b0adeStakemura 		);
199db2b0adeStakemura 
200db2b0adeStakemura 	if (file == INVALID_HANDLE_VALUE) {
201db2b0adeStakemura 		return (-1);
202db2b0adeStakemura 	}
203db2b0adeStakemura 
204*212b3fa9Stakemura 
205*212b3fa9Stakemura 
206*212b3fa9Stakemura 
207*212b3fa9Stakemura 	flag = 1;
208*212b3fa9Stakemura 	result = 0;
209*212b3fa9Stakemura 	while(flag){
210*212b3fa9Stakemura 		i = 0;
211*212b3fa9Stakemura 		d = read1byte(file,&c);
212*212b3fa9Stakemura 		if( d <=0){
213*212b3fa9Stakemura 			if(d == -1){
214*212b3fa9Stakemura 				flag = 0;
215*212b3fa9Stakemura 				break;
216*212b3fa9Stakemura 			}
217*212b3fa9Stakemura 			else
218*212b3fa9Stakemura 			{
219db2b0adeStakemura 				CloseHandle(file);
220db2b0adeStakemura 				return (-1);
221db2b0adeStakemura 			}
222*212b3fa9Stakemura 		}
223db2b0adeStakemura 
224*212b3fa9Stakemura 
225*212b3fa9Stakemura 		while(c != ':' && c != '\r' && c!= '\n'){
226*212b3fa9Stakemura 			tempbuf[i] = c;
227*212b3fa9Stakemura 			d = read1byte(file,&c);
228*212b3fa9Stakemura 			if( d <=0){
229*212b3fa9Stakemura 				if(d == -1){
230*212b3fa9Stakemura 					flag = 0;
231*212b3fa9Stakemura 					break;
232*212b3fa9Stakemura 				}
233*212b3fa9Stakemura 				else
234*212b3fa9Stakemura 				{
235db2b0adeStakemura 					CloseHandle(file);
236db2b0adeStakemura 					return (-1);
237db2b0adeStakemura 				}
238*212b3fa9Stakemura 			}
239*212b3fa9Stakemura 			i++;
240*212b3fa9Stakemura 		}
241*212b3fa9Stakemura 		if(c == ':'){
242*212b3fa9Stakemura 
243*212b3fa9Stakemura 
244*212b3fa9Stakemura 			tempbuf[i] = '\0';
245*212b3fa9Stakemura 			length = MultiByteToWideChar(CP_ACP,0,tempbuf,-1,identif,0);
246*212b3fa9Stakemura 			MultiByteToWideChar(CP_ACP,0,tempbuf,-1,identif,length);
247*212b3fa9Stakemura 
248*212b3fa9Stakemura 			i = 0;
249*212b3fa9Stakemura 			d = read1byte(file,&c);
250*212b3fa9Stakemura 			flag = 1;
251*212b3fa9Stakemura 			while(c != '\r' && c != '\n' && flag){/* get unidata */
252*212b3fa9Stakemura 				if(d <= 0){
253*212b3fa9Stakemura 					if(d == -1){
254*212b3fa9Stakemura 						flag = 0;/* though needless ... */
255*212b3fa9Stakemura 						break;
256*212b3fa9Stakemura 					}
257*212b3fa9Stakemura 					else{
258*212b3fa9Stakemura 						CloseHandle(file);
259*212b3fa9Stakemura 						return -1;
260*212b3fa9Stakemura 					}
261*212b3fa9Stakemura 				}
262*212b3fa9Stakemura 				tempbuf[i] = c;
263*212b3fa9Stakemura 				d = read1byte(file,&c);
264*212b3fa9Stakemura 				i++;
265*212b3fa9Stakemura 
266*212b3fa9Stakemura 			}
267*212b3fa9Stakemura 			if(c == '\r'){/* skip \n */
268*212b3fa9Stakemura 				read1byte(file,&c);
269*212b3fa9Stakemura 			}
270*212b3fa9Stakemura 			tempbuf[i] = '\0';
271*212b3fa9Stakemura 			length = MultiByteToWideChar(CP_ACP,0,tempbuf,-1,unidata,0);
272*212b3fa9Stakemura 			MultiByteToWideChar(CP_ACP,0,tempbuf,-1,unidata,length);
273*212b3fa9Stakemura 
274*212b3fa9Stakemura 			for(i = 1; i < NOFID;i++){
275*212b3fa9Stakemura 				if(wcscmp(identif,id_table[i])==0){
276*212b3fa9Stakemura 					break;
277*212b3fa9Stakemura 				}
278*212b3fa9Stakemura 			}
279*212b3fa9Stakemura 			switch(i){
280*212b3fa9Stakemura 			case SETTING_IDX:
281*212b3fa9Stakemura 				d = _wtoi(unidata);
282*212b3fa9Stakemura 				buf.setting_idx = d;
283*212b3fa9Stakemura 				result++;
284*212b3fa9Stakemura 				break;
285*212b3fa9Stakemura 			case FB_TYPE:
286*212b3fa9Stakemura 				d = _wtoi(unidata);
287*212b3fa9Stakemura 				buf.fb_type = d;
288*212b3fa9Stakemura 				result++;
289*212b3fa9Stakemura 				break;
290*212b3fa9Stakemura 			case FB_WIDTH:
291*212b3fa9Stakemura 				d = _wtoi(unidata);
292*212b3fa9Stakemura 				buf.fb_width = d;
293*212b3fa9Stakemura 				result++;
294*212b3fa9Stakemura 				break;
295*212b3fa9Stakemura 			case FB_HEIGHT:
296*212b3fa9Stakemura 				d = _wtoi(unidata);
297*212b3fa9Stakemura 				buf.fb_height = d;
298*212b3fa9Stakemura 				result++;
299*212b3fa9Stakemura 				break;
300*212b3fa9Stakemura 			case FB_LINEBYTES:
301*212b3fa9Stakemura 				d = _wtoi(unidata);
302*212b3fa9Stakemura 				buf.fb_linebytes = d;
303*212b3fa9Stakemura 				result++;
304*212b3fa9Stakemura 				break;
305*212b3fa9Stakemura 			case BOOT_TIME:
306*212b3fa9Stakemura 				d = _wtoi(unidata);
307*212b3fa9Stakemura 				buf.boot_time = d;
308*212b3fa9Stakemura 				result++;
309*212b3fa9Stakemura 				break;
310*212b3fa9Stakemura 			case FB_ADDR:
311*212b3fa9Stakemura 				d = _wtoi(unidata);
312*212b3fa9Stakemura 				buf.fb_addr = d;
313*212b3fa9Stakemura 				result++;
314*212b3fa9Stakemura 				break;
315*212b3fa9Stakemura 			case PLATID_CPU:
316*212b3fa9Stakemura 				d = _wtoi(unidata);
317*212b3fa9Stakemura 				buf.platid_cpu = d;
318*212b3fa9Stakemura 				result++;
319*212b3fa9Stakemura 				break;
320*212b3fa9Stakemura 			case PLATID_MACHINE:
321*212b3fa9Stakemura 				d = _wtoi(unidata);
322*212b3fa9Stakemura 				buf.platid_machine = d;
323*212b3fa9Stakemura 				result++;
324*212b3fa9Stakemura 				break;
325*212b3fa9Stakemura 			case SETTING_NAME:
326*212b3fa9Stakemura 				wcscpy(buf.setting_name,unidata);
327*212b3fa9Stakemura 				result++;
328*212b3fa9Stakemura 				break;
329*212b3fa9Stakemura 			case KERNEL_NAME:
330*212b3fa9Stakemura 				wcscpy(buf.kernel_name,unidata);
331*212b3fa9Stakemura 				result++;
332*212b3fa9Stakemura 				break;
333*212b3fa9Stakemura 			case OPTIONS:
334*212b3fa9Stakemura 				wcscpy(buf.options,unidata);
335*212b3fa9Stakemura 				result++;
336*212b3fa9Stakemura 				break;
337*212b3fa9Stakemura 			case CHECK_LAST_CHANCE:
338*212b3fa9Stakemura 				if(wcscmp(unidata,TEXT("t")) == 0){
339*212b3fa9Stakemura 					buf.check_last_chance = TRUE;
340*212b3fa9Stakemura 				}
341*212b3fa9Stakemura 				else{
342*212b3fa9Stakemura 					buf.check_last_chance = FALSE;
343*212b3fa9Stakemura 				}
344*212b3fa9Stakemura 				result++;
345*212b3fa9Stakemura 				break;
346*212b3fa9Stakemura 			case LOAD_DEBUG_INFO:
347*212b3fa9Stakemura 				if(wcscmp(unidata,TEXT("t")) == 0){
348*212b3fa9Stakemura 					buf.load_debug_info = TRUE;
349*212b3fa9Stakemura 				}
350*212b3fa9Stakemura 				else{
351*212b3fa9Stakemura 					buf.load_debug_info = FALSE;
352*212b3fa9Stakemura 				}
353*212b3fa9Stakemura 				result++;
354*212b3fa9Stakemura 				break;
355*212b3fa9Stakemura 			case SERIAL_PORT:
356*212b3fa9Stakemura 				if(wcscmp(unidata,TEXT("t")) == 0){
357*212b3fa9Stakemura 					buf.serial_port = TRUE;
358*212b3fa9Stakemura 				}
359*212b3fa9Stakemura 				else{
360*212b3fa9Stakemura 					buf.serial_port = FALSE;
361*212b3fa9Stakemura 				}
362*212b3fa9Stakemura 				result++;
363*212b3fa9Stakemura 				break;
364*212b3fa9Stakemura 			case REVERSE_VIDEO:
365*212b3fa9Stakemura 				if(wcscmp(unidata,TEXT("t")) == 0){
366*212b3fa9Stakemura 					buf.reverse_video = TRUE;
367*212b3fa9Stakemura 				}
368*212b3fa9Stakemura 				else{
369*212b3fa9Stakemura 					buf.reverse_video = FALSE;
370*212b3fa9Stakemura 				}
371*212b3fa9Stakemura 				result++;
372*212b3fa9Stakemura 				break;
373*212b3fa9Stakemura 			case AUTOBOOT:
374*212b3fa9Stakemura 				if(wcscmp(unidata,TEXT("t")) == 0){
375*212b3fa9Stakemura 					buf.autoboot = TRUE;
376*212b3fa9Stakemura 				}
377*212b3fa9Stakemura 				else{
378*212b3fa9Stakemura 					buf.autoboot = FALSE;
379*212b3fa9Stakemura 				}
380*212b3fa9Stakemura 				result++;
381*212b3fa9Stakemura 				break;
382*212b3fa9Stakemura 			default:
383*212b3fa9Stakemura 				break;
384*212b3fa9Stakemura 			}
385*212b3fa9Stakemura 		}
386*212b3fa9Stakemura 	}
387*212b3fa9Stakemura 
388*212b3fa9Stakemura 
389*212b3fa9Stakemura 
390db2b0adeStakemura 
391db2b0adeStakemura 	CloseHandle(file);
392db2b0adeStakemura 
393*212b3fa9Stakemura #if 0
394*212b3fa9Stakemura 	/* shortage of item is not error */
395*212b3fa9Stakemura 	if(result != NOFID -1){
396*212b3fa9Stakemura 		return -1;/* data is shortage */
397*212b3fa9Stakemura 	}
398*212b3fa9Stakemura #endif
399*212b3fa9Stakemura 
400db2b0adeStakemura 	*pref = buf;
401db2b0adeStakemura 
402db2b0adeStakemura 	return (0);
403db2b0adeStakemura }
404db2b0adeStakemura 
405db2b0adeStakemura 
406*212b3fa9Stakemura 
407db2b0adeStakemura int
pref_load(struct path_s load_path[],int pathlen)408dae2c19eStakemura pref_load(struct path_s load_path[], int pathlen)
409db2b0adeStakemura {
410db2b0adeStakemura 	int i;
411db2b0adeStakemura 
412db2b0adeStakemura 	where_pref_load_from = NULL;
413db2b0adeStakemura 	for (i = 0; i < pathlen; i++) {
414db2b0adeStakemura 		wsprintf(filenamebuf, TEXT("%s%s"),
415dae2c19eStakemura 			 load_path[i].name, PREFNAME);
416db2b0adeStakemura 		debug_printf(TEXT("pref_load: try to '%s'\n"), filenamebuf);
417*212b3fa9Stakemura 
418db2b0adeStakemura 		if (pref_read(filenamebuf, &pref) == 0) {
419db2b0adeStakemura 			debug_printf(TEXT("pref_load: succeded, '%s'.\n"),
420db2b0adeStakemura 				     filenamebuf);
421db2b0adeStakemura 			pref_dump(&pref);
422db2b0adeStakemura 			where_pref_load_from = filenamebuf;
423db2b0adeStakemura 			return (0);
424db2b0adeStakemura 		}
425db2b0adeStakemura 	}
426db2b0adeStakemura 
427db2b0adeStakemura 	return (-1);
428db2b0adeStakemura }
429db2b0adeStakemura 
430db2b0adeStakemura 
431db2b0adeStakemura int
pref_save(struct path_s load_path[],int pathlen)432dae2c19eStakemura pref_save(struct path_s load_path[], int pathlen)
433dae2c19eStakemura {
434dae2c19eStakemura 	int i;
435dae2c19eStakemura 
436dae2c19eStakemura 	if (where_pref_load_from) {
437dae2c19eStakemura 		if (pref_write(where_pref_load_from, &pref) != 0) {
438dae2c19eStakemura 			msg_printf(MSG_ERROR, TEXT("Error()"),
439dae2c19eStakemura 			    TEXT("Can't write %s"), where_pref_load_from);
440dae2c19eStakemura 			return -1;
441dae2c19eStakemura 		}
442dae2c19eStakemura 		return 0;
443dae2c19eStakemura 	}
444dae2c19eStakemura 	for (i = 0; i < pathlen; i++) {
445dae2c19eStakemura 		if (!(load_path[i].flags & PATH_SAVE)) {
446dae2c19eStakemura 			continue;
447dae2c19eStakemura 		}
448dae2c19eStakemura 		wsprintf(filenamebuf, TEXT("%s%s"),
449dae2c19eStakemura 		    load_path[i].name, PREFNAME);
450dae2c19eStakemura 		debug_printf(TEXT("pref_save: try to '%s'\n"), filenamebuf);
451dae2c19eStakemura 		if (pref_write(filenamebuf, &pref) == 0) {
452dae2c19eStakemura 			debug_printf(TEXT("pref_write: succeded, '%s'.\n"),
453dae2c19eStakemura 			    filenamebuf);
454dae2c19eStakemura 			return (0);
455dae2c19eStakemura 		}
456dae2c19eStakemura 	}
457dae2c19eStakemura 
458dae2c19eStakemura 	msg_printf(MSG_ERROR, TEXT("Error()"),
459dae2c19eStakemura 	    TEXT("Can't write %s"), PREFNAME);
460dae2c19eStakemura 
461dae2c19eStakemura 	return (-1);
462dae2c19eStakemura }
463dae2c19eStakemura 
464dae2c19eStakemura 
465dae2c19eStakemura int
pref_write(TCHAR * filename,struct preference_s * buf)466db2b0adeStakemura pref_write(TCHAR* filename, struct preference_s* buf)
467db2b0adeStakemura {
468db2b0adeStakemura 	HANDLE file;
469*212b3fa9Stakemura 	char tempbuf[1024];
470*212b3fa9Stakemura 	TCHAR unibuf[1024];
471*212b3fa9Stakemura 	DWORD length;
472*212b3fa9Stakemura 
473db2b0adeStakemura 
474db2b0adeStakemura 	debug_printf(TEXT("pref_write('%s').\n"), filename);
475db2b0adeStakemura 	pref_dump(&pref);
476db2b0adeStakemura 
477db2b0adeStakemura        	file = CreateFile(
478db2b0adeStakemura 	       	filename,      	/* file name */
479db2b0adeStakemura 	       	GENERIC_WRITE,	/* access (read-write) mode */
480db2b0adeStakemura 	       	FILE_SHARE_WRITE,/* share mode */
481db2b0adeStakemura 	       	NULL,		/* pointer to security attributes */
482db2b0adeStakemura 	       	CREATE_ALWAYS,	/* how to create */
483db2b0adeStakemura 	       	FILE_ATTRIBUTE_NORMAL,	/* file attributes*/
484db2b0adeStakemura 	       	NULL		/* handle to file with attributes to */
485db2b0adeStakemura 	       	);
486db2b0adeStakemura 
487db2b0adeStakemura 	if (file == INVALID_HANDLE_VALUE) {
488db2b0adeStakemura 		debug_printf(TEXT("CreateFile(): error=%d\n"), GetLastError());
489db2b0adeStakemura 		return (-1);
490db2b0adeStakemura 	}
491db2b0adeStakemura 
492*212b3fa9Stakemura 
493*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("setting_idx:%d\r\n"),buf->setting_idx);
494*212b3fa9Stakemura 	debug_printf(TEXT("setting_idx,tempbuf=%s"),unibuf);
495*212b3fa9Stakemura 		length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
496*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
497*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
498db2b0adeStakemura 		CloseHandle(file);
499db2b0adeStakemura 		return (-1);
500db2b0adeStakemura 	}
501db2b0adeStakemura 
502*212b3fa9Stakemura 
503*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("fb_type:%d\r\n"),buf->fb_type);
504*212b3fa9Stakemura 	debug_printf(TEXT("fb_type,tempbuf=%s,"),unibuf);
505*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
506*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
507*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
508*212b3fa9Stakemura 		CloseHandle(file);
509*212b3fa9Stakemura 		return (-1);
510*212b3fa9Stakemura 	}
511*212b3fa9Stakemura 
512*212b3fa9Stakemura 
513*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("fb_width:%d\r\n"),buf->fb_width);
514*212b3fa9Stakemura 	debug_printf(TEXT("fb_width,tempbuf=%s"),unibuf);
515*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
516*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
517*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
518*212b3fa9Stakemura 		CloseHandle(file);
519*212b3fa9Stakemura 		return (-1);
520*212b3fa9Stakemura 	}
521*212b3fa9Stakemura 
522*212b3fa9Stakemura 
523*212b3fa9Stakemura 
524*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("fb_height:%d\r\n"),buf->fb_height);
525*212b3fa9Stakemura 	debug_printf(TEXT("fb_height,tempbuf=%s"),unibuf);
526*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
527*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
528*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
529*212b3fa9Stakemura 		CloseHandle(file);
530*212b3fa9Stakemura 		return (-1);
531*212b3fa9Stakemura 	}
532*212b3fa9Stakemura 
533*212b3fa9Stakemura 
534*212b3fa9Stakemura 
535*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("fb_linebytes:%d\r\n"),buf->fb_linebytes);
536*212b3fa9Stakemura 	debug_printf(TEXT("fb_linebytes,tempbuf=%s"),unibuf);
537*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
538*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
539*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
540*212b3fa9Stakemura 		CloseHandle(file);
541*212b3fa9Stakemura 		return (-1);
542*212b3fa9Stakemura 	}
543*212b3fa9Stakemura 
544*212b3fa9Stakemura 
545*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("boot_time:%d\r\n"),buf->boot_time);
546*212b3fa9Stakemura 	debug_printf(TEXT("boot_time,tempbuf=%s\n"),unibuf);
547*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
548*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
549*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
550*212b3fa9Stakemura 		CloseHandle(file);
551*212b3fa9Stakemura 		return (-1);
552*212b3fa9Stakemura 	}
553*212b3fa9Stakemura 
554*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("fb_addr:%d\r\n"),buf->fb_addr);
555*212b3fa9Stakemura 	debug_printf(TEXT("fb_addr,tempbuf=%s"),unibuf);
556*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
557*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
558*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
559*212b3fa9Stakemura 		CloseHandle(file);
560*212b3fa9Stakemura 		return (-1);
561*212b3fa9Stakemura 	}
562*212b3fa9Stakemura 
563*212b3fa9Stakemura 
564*212b3fa9Stakemura 
565*212b3fa9Stakemura     wsprintf(unibuf,TEXT("platid_cpu:%d\r\n"),buf->platid_cpu);
566*212b3fa9Stakemura 	debug_printf(TEXT("platid_cpu,tempbuf=%s"),unibuf);
567*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
568*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
569*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
570*212b3fa9Stakemura 		CloseHandle(file);
571*212b3fa9Stakemura 		return (-1);
572*212b3fa9Stakemura 	}
573*212b3fa9Stakemura 
574*212b3fa9Stakemura 
575*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("platid_machine:%d\r\n"),buf->platid_machine);
576*212b3fa9Stakemura 	debug_printf(TEXT("platid_machine,tempbuf=%s"),unibuf);
577*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
578*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
579*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
580*212b3fa9Stakemura 		CloseHandle(file);
581*212b3fa9Stakemura 		return (-1);
582*212b3fa9Stakemura 	}
583*212b3fa9Stakemura 
584*212b3fa9Stakemura 
585*212b3fa9Stakemura 
586*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("setting_name:%s\r\n"),buf->setting_name);
587*212b3fa9Stakemura 	debug_printf(TEXT("setting_name,unibuf=%s,wcslen=%d"),unibuf,
588*212b3fa9Stakemura 		wcslen(unibuf));
589*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
590*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
591*212b3fa9Stakemura 
592*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
593*212b3fa9Stakemura 		CloseHandle(file);
594*212b3fa9Stakemura 		return (-1);
595*212b3fa9Stakemura 	}
596*212b3fa9Stakemura 
597*212b3fa9Stakemura 
598*212b3fa9Stakemura 
599*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("kernel_name:%s\r\n"),buf->kernel_name);
600*212b3fa9Stakemura 	debug_printf(TEXT("kernel_name,unibuf=%s,wcslen=%d"),unibuf,
601*212b3fa9Stakemura 		wcslen(unibuf));
602*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
603*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
604*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
605*212b3fa9Stakemura 		CloseHandle(file);
606*212b3fa9Stakemura 		return (-1);
607*212b3fa9Stakemura 	}
608*212b3fa9Stakemura 
609*212b3fa9Stakemura 
610*212b3fa9Stakemura 
611*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("options:%s\r\n"),buf->options);
612*212b3fa9Stakemura 	debug_printf(TEXT("options,unibuf=%s,wcslen=%d"),unibuf,
613*212b3fa9Stakemura 		wcslen(unibuf));
614*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
615*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
616*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
617*212b3fa9Stakemura 		CloseHandle(file);
618*212b3fa9Stakemura 		return (-1);
619*212b3fa9Stakemura 	}
620*212b3fa9Stakemura 
621*212b3fa9Stakemura 
622*212b3fa9Stakemura 	if(buf->check_last_chance){
623*212b3fa9Stakemura 		wsprintf(unibuf,TEXT("check_last_chance:t\r\n"));
624*212b3fa9Stakemura 	}
625*212b3fa9Stakemura 	else{
626*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("check_last_chance:n\r\n"));
627*212b3fa9Stakemura 	}
628*212b3fa9Stakemura 
629*212b3fa9Stakemura 
630*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
631*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
632*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
633*212b3fa9Stakemura 		CloseHandle(file);
634*212b3fa9Stakemura 		return (-1);
635*212b3fa9Stakemura 	}
636*212b3fa9Stakemura 
637*212b3fa9Stakemura 
638*212b3fa9Stakemura 
639*212b3fa9Stakemura 
640*212b3fa9Stakemura 	if(buf->load_debug_info){
641*212b3fa9Stakemura 		wsprintf(unibuf,TEXT("load_debug_info:t\r\n"));
642*212b3fa9Stakemura 	}
643*212b3fa9Stakemura 	else{
644*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("load_debug_info:n\r\n"));
645*212b3fa9Stakemura 	}
646*212b3fa9Stakemura 
647*212b3fa9Stakemura 
648*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
649*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
650*212b3fa9Stakemura 
651*212b3fa9Stakemura 
652*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
653*212b3fa9Stakemura 		CloseHandle(file);
654*212b3fa9Stakemura 		return (-1);
655*212b3fa9Stakemura 	}
656*212b3fa9Stakemura 
657*212b3fa9Stakemura 
658*212b3fa9Stakemura 
659*212b3fa9Stakemura 	if(buf->serial_port){
660*212b3fa9Stakemura 		wsprintf(unibuf,TEXT("serial_port:t\r\n"));
661*212b3fa9Stakemura 	}
662*212b3fa9Stakemura 	else{
663*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("serial_port:n\r\n"));
664*212b3fa9Stakemura 	}
665*212b3fa9Stakemura 
666*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
667*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
668*212b3fa9Stakemura 
669*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
670*212b3fa9Stakemura 		CloseHandle(file);
671*212b3fa9Stakemura 		return (-1);
672*212b3fa9Stakemura 	}
673*212b3fa9Stakemura 
674*212b3fa9Stakemura 
675*212b3fa9Stakemura 
676*212b3fa9Stakemura 	if(buf->reverse_video){
677*212b3fa9Stakemura 		wsprintf(unibuf,TEXT("reverse_video:t\r\n"));
678*212b3fa9Stakemura 	}
679*212b3fa9Stakemura 	else{
680*212b3fa9Stakemura 	wsprintf(unibuf,TEXT("reverse_video:n\r\n"));
681*212b3fa9Stakemura 	}
682*212b3fa9Stakemura 
683*212b3fa9Stakemura length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
684*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
685*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
686*212b3fa9Stakemura 		CloseHandle(file);
687*212b3fa9Stakemura 		return (-1);
688*212b3fa9Stakemura 	}
689*212b3fa9Stakemura 
690*212b3fa9Stakemura 	if(buf->autoboot){
691*212b3fa9Stakemura 		wsprintf(unibuf,TEXT("autoboot:t\r\n"));
692*212b3fa9Stakemura 	}
693*212b3fa9Stakemura 	else{
694*212b3fa9Stakemura 		wsprintf(unibuf,TEXT("autoboot:n\r\n"));
695*212b3fa9Stakemura 	}
696*212b3fa9Stakemura 
697*212b3fa9Stakemura 	length = WideCharToMultiByte(CP_ACP,0,unibuf,-1,NULL,0,NULL,NULL);
698*212b3fa9Stakemura 	WideCharToMultiByte(CP_ACP,0,unibuf,-1,tempbuf,length,NULL,NULL);
699*212b3fa9Stakemura 	if(!write1string(file,tempbuf)){
700db2b0adeStakemura 		CloseHandle(file);
701db2b0adeStakemura 		return (-1);
702db2b0adeStakemura 	}
703db2b0adeStakemura 
704db2b0adeStakemura 	CloseHandle(file);
705db2b0adeStakemura 	return (0);
706db2b0adeStakemura }
707db2b0adeStakemura 
708