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