methods.c revision 1.7 1 1.7 minoura /* $NetBSD: methods.c,v 1.7 2011/01/14 13:31:47 minoura Exp $ */
2 1.1 minoura
3 1.1 minoura /*-
4 1.1 minoura * Copyright (c) 1999 The NetBSD Foundation, Inc.
5 1.1 minoura * All rights reserved.
6 1.1 minoura *
7 1.1 minoura * This code is derived from software contributed to The NetBSD Foundation
8 1.1 minoura * by Minoura Makoto.
9 1.1 minoura *
10 1.1 minoura * Redistribution and use in source and binary forms, with or without
11 1.1 minoura * modification, are permitted provided that the following conditions
12 1.1 minoura * are met:
13 1.1 minoura * 1. Redistributions of source code must retain the above copyright
14 1.1 minoura * notice, this list of conditions and the following disclaimer.
15 1.1 minoura * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 minoura * notice, this list of conditions and the following disclaimer in the
17 1.1 minoura * documentation and/or other materials provided with the distribution.
18 1.1 minoura *
19 1.1 minoura * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 minoura * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 minoura * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 minoura * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 minoura * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 minoura * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 minoura * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 minoura * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 minoura * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 minoura * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 minoura * POSSIBILITY OF SUCH DAMAGE.
30 1.1 minoura */
31 1.1 minoura
32 1.1 minoura #include <stdio.h>
33 1.1 minoura #include <string.h>
34 1.1 minoura #include <err.h>
35 1.1 minoura #include <sys/types.h>
36 1.1 minoura
37 1.1 minoura #include "memswitch.h"
38 1.2 minoura #include "methods.h"
39 1.1 minoura
40 1.1 minoura int
41 1.7 minoura atoi_(p)
42 1.2 minoura const char **p;
43 1.1 minoura {
44 1.2 minoura const char *p1 = *p;
45 1.1 minoura int v = 0;
46 1.1 minoura int first = 1;
47 1.1 minoura
48 1.1 minoura while (*p1 == ' ' || *p1 == '\t')
49 1.1 minoura p1++;
50 1.1 minoura
51 1.1 minoura if (*p1 == 0) {
52 1.1 minoura *p = 0;
53 1.1 minoura return 0;
54 1.1 minoura }
55 1.7 minoura if (strlen(p1) >= 2 && strncasecmp("0x", p1, 2) == 0) {
56 1.1 minoura p1 += 2;
57 1.1 minoura while (1) {
58 1.1 minoura if (*p1 >= '0' && *p1 <= '9') {
59 1.1 minoura v *= 16;
60 1.1 minoura v += *p1 - '0';
61 1.1 minoura first = 0;
62 1.1 minoura } else if (*p1 >= 'A' && *p1 <= 'F') {
63 1.1 minoura v *= 16;
64 1.1 minoura v += *p1 - 'A' + 10;
65 1.1 minoura first = 0;
66 1.1 minoura } else if (*p1 >= 'a' && *p1 <= 'f') {
67 1.1 minoura v *= 16;
68 1.1 minoura v += *p1 - 'a' + 10;
69 1.1 minoura first = 0;
70 1.1 minoura } else {
71 1.1 minoura break;
72 1.1 minoura }
73 1.1 minoura p1++;
74 1.1 minoura }
75 1.1 minoura } else {
76 1.1 minoura while (1) {
77 1.1 minoura if (*p1 >= '0' && *p1 <= '9') {
78 1.1 minoura v *= 10;
79 1.1 minoura v += *p1 - '0';
80 1.1 minoura first = 0;
81 1.1 minoura } else {
82 1.1 minoura break;
83 1.1 minoura }
84 1.1 minoura p1++;
85 1.1 minoura }
86 1.1 minoura }
87 1.1 minoura
88 1.1 minoura if (first) {
89 1.1 minoura *p = 0;
90 1.1 minoura return 0;
91 1.1 minoura }
92 1.1 minoura
93 1.3 minoura while (*p1 == ' ' || *p1 == '\t') p1++;
94 1.1 minoura *p = p1;
95 1.1 minoura return v;
96 1.1 minoura }
97 1.1 minoura
98 1.1 minoura int
99 1.7 minoura fill_uchar(prop)
100 1.1 minoura struct property *prop;
101 1.1 minoura {
102 1.1 minoura if (current_values == 0)
103 1.7 minoura alloc_current_values();
104 1.1 minoura
105 1.1 minoura prop->current_value.byte[0] = current_values[prop->offset];
106 1.1 minoura prop->current_value.byte[1] = 0;
107 1.1 minoura prop->current_value.byte[2] = 0;
108 1.1 minoura prop->current_value.byte[3] = 0;
109 1.1 minoura prop->value_valid = 1;
110 1.1 minoura
111 1.1 minoura return 0;
112 1.1 minoura }
113 1.1 minoura
114 1.1 minoura int
115 1.7 minoura fill_ushort(prop)
116 1.1 minoura struct property *prop;
117 1.1 minoura {
118 1.1 minoura if (current_values == 0)
119 1.7 minoura alloc_current_values();
120 1.1 minoura
121 1.1 minoura prop->current_value.byte[0] = current_values[prop->offset];
122 1.1 minoura prop->current_value.byte[1] = current_values[prop->offset+1];
123 1.1 minoura prop->current_value.byte[2] = 0;
124 1.1 minoura prop->current_value.byte[3] = 0;
125 1.1 minoura prop->value_valid = 1;
126 1.1 minoura
127 1.1 minoura return 0;
128 1.1 minoura }
129 1.1 minoura
130 1.1 minoura int
131 1.7 minoura fill_ulong(prop)
132 1.1 minoura struct property *prop;
133 1.1 minoura {
134 1.1 minoura if (current_values == 0)
135 1.7 minoura alloc_current_values();
136 1.1 minoura
137 1.1 minoura prop->current_value.byte[0] = current_values[prop->offset];
138 1.1 minoura prop->current_value.byte[1] = current_values[prop->offset+1];
139 1.1 minoura prop->current_value.byte[2] = current_values[prop->offset+2];
140 1.1 minoura prop->current_value.byte[3] = current_values[prop->offset+3];
141 1.1 minoura prop->value_valid = 1;
142 1.1 minoura
143 1.1 minoura return 0;
144 1.1 minoura }
145 1.1 minoura
146 1.1 minoura int
147 1.7 minoura flush_uchar(prop)
148 1.1 minoura struct property *prop;
149 1.1 minoura {
150 1.1 minoura if (!prop->modified)
151 1.1 minoura return 0;
152 1.1 minoura
153 1.1 minoura if (modified_values == 0)
154 1.7 minoura alloc_modified_values();
155 1.1 minoura
156 1.1 minoura modified_values[prop->offset] = prop->modified_value.byte[0];
157 1.1 minoura
158 1.1 minoura return 0;
159 1.1 minoura }
160 1.1 minoura
161 1.1 minoura int
162 1.7 minoura flush_ushort(prop)
163 1.1 minoura struct property *prop;
164 1.1 minoura {
165 1.1 minoura if (!prop->modified)
166 1.1 minoura return 0;
167 1.1 minoura
168 1.1 minoura if (modified_values == 0)
169 1.7 minoura alloc_modified_values();
170 1.1 minoura
171 1.1 minoura modified_values[prop->offset] = prop->modified_value.byte[0];
172 1.1 minoura modified_values[prop->offset+1] = prop->modified_value.byte[1];
173 1.1 minoura
174 1.1 minoura return 0;
175 1.1 minoura }
176 1.1 minoura
177 1.1 minoura int
178 1.7 minoura flush_ulong(prop)
179 1.1 minoura struct property *prop;
180 1.1 minoura {
181 1.1 minoura if (!prop->modified)
182 1.1 minoura return 0;
183 1.1 minoura
184 1.1 minoura if (modified_values == 0)
185 1.7 minoura alloc_modified_values();
186 1.1 minoura
187 1.1 minoura modified_values[prop->offset] = prop->modified_value.byte[0];
188 1.1 minoura modified_values[prop->offset+1] = prop->modified_value.byte[1];
189 1.1 minoura modified_values[prop->offset+2] = prop->modified_value.byte[2];
190 1.1 minoura modified_values[prop->offset+3] = prop->modified_value.byte[3];
191 1.1 minoura
192 1.1 minoura return 0;
193 1.1 minoura }
194 1.1 minoura
195 1.1 minoura int
196 1.7 minoura flush_dummy(prop)
197 1.1 minoura struct property *prop;
198 1.1 minoura {
199 1.1 minoura return 0;
200 1.1 minoura }
201 1.1 minoura
202 1.1 minoura int
203 1.7 minoura parse_dummy(prop, value)
204 1.1 minoura struct property *prop;
205 1.1 minoura const char *value;
206 1.1 minoura {
207 1.7 minoura warnx("Cannot modify %s.%s", prop->class, prop->node);
208 1.1 minoura
209 1.1 minoura return -1;
210 1.1 minoura }
211 1.1 minoura
212 1.1 minoura int
213 1.7 minoura parse_byte(prop, value)
214 1.1 minoura struct property *prop;
215 1.1 minoura const char *value;
216 1.1 minoura {
217 1.1 minoura const char *p = value;
218 1.1 minoura int v;
219 1.1 minoura
220 1.7 minoura v = atoi_(&p);
221 1.1 minoura if (p == 0) {
222 1.7 minoura warnx("%s: Invalid value", value);
223 1.1 minoura return -1;
224 1.1 minoura }
225 1.1 minoura
226 1.7 minoura if (strcasecmp("MB", p) == 0)
227 1.1 minoura v *= 1024 * 1024;
228 1.7 minoura else if (strcasecmp("KB", p) == 0)
229 1.1 minoura v *= 1024;
230 1.1 minoura else if (*p != 0 &&
231 1.7 minoura strcasecmp("B", p) != 0) {
232 1.7 minoura warnx("%s: Invalid value", value);
233 1.1 minoura return -1;
234 1.1 minoura }
235 1.1 minoura
236 1.1 minoura if (v < prop->min) {
237 1.7 minoura warnx("%s: Too small", value);
238 1.1 minoura return -1;
239 1.1 minoura } else if (v > prop->max) {
240 1.7 minoura warnx("%s: Too large", value);
241 1.1 minoura return -1;
242 1.1 minoura }
243 1.1 minoura
244 1.1 minoura prop->modified = 1;
245 1.1 minoura prop->modified_value.longword = v;
246 1.1 minoura
247 1.1 minoura return 0;
248 1.1 minoura }
249 1.1 minoura
250 1.1 minoura int
251 1.7 minoura parse_uchar(prop, value)
252 1.1 minoura struct property *prop;
253 1.1 minoura const char *value;
254 1.1 minoura {
255 1.1 minoura const char *p = value;
256 1.1 minoura int v;
257 1.1 minoura
258 1.7 minoura v = atoi_(&p);
259 1.1 minoura if (p == 0) {
260 1.7 minoura warnx("%s: Invalid value", value);
261 1.1 minoura return -1;
262 1.1 minoura }
263 1.1 minoura
264 1.1 minoura if (v < prop->min) {
265 1.7 minoura warnx("%s: Too small", value);
266 1.1 minoura return -1;
267 1.1 minoura } else if (v > prop->max) {
268 1.7 minoura warnx("%s: Too large", value);
269 1.1 minoura return -1;
270 1.1 minoura }
271 1.1 minoura
272 1.1 minoura prop->modified = 1;
273 1.1 minoura prop->modified_value.byte[0] = v;
274 1.1 minoura
275 1.1 minoura return 0;
276 1.1 minoura }
277 1.1 minoura
278 1.1 minoura int
279 1.7 minoura parse_ulong(prop, value)
280 1.1 minoura struct property *prop;
281 1.1 minoura const char *value;
282 1.1 minoura {
283 1.1 minoura const char *p = value;
284 1.1 minoura int v;
285 1.1 minoura
286 1.7 minoura v = atoi_(&p);
287 1.1 minoura if (p == 0) {
288 1.7 minoura warnx("%s: Invalid value", value);
289 1.1 minoura return -1;
290 1.1 minoura }
291 1.1 minoura
292 1.1 minoura if (v < prop->min) {
293 1.7 minoura warnx("%s: Too small", value);
294 1.1 minoura return -1;
295 1.1 minoura } else if (v > prop->max) {
296 1.7 minoura warnx("%s: Too large", value);
297 1.1 minoura return -1;
298 1.1 minoura }
299 1.1 minoura
300 1.1 minoura prop->modified = 1;
301 1.1 minoura prop->modified_value.longword = v;
302 1.1 minoura
303 1.1 minoura return 0;
304 1.1 minoura }
305 1.1 minoura
306 1.1 minoura int
307 1.7 minoura parse_ushort(prop, value)
308 1.1 minoura struct property *prop;
309 1.1 minoura const char *value;
310 1.1 minoura {
311 1.1 minoura const char *p = value;
312 1.1 minoura int v;
313 1.1 minoura
314 1.7 minoura v = atoi_(&p);
315 1.1 minoura if (p == 0) {
316 1.7 minoura warnx("%s: Invalid value", value);
317 1.1 minoura return -1;
318 1.1 minoura }
319 1.1 minoura
320 1.1 minoura if (v < prop->min) {
321 1.7 minoura warnx("%s: Too small", value);
322 1.1 minoura return -1;
323 1.1 minoura } else if (v > prop->max) {
324 1.7 minoura warnx("%s: Too large", value);
325 1.1 minoura return -1;
326 1.1 minoura }
327 1.1 minoura
328 1.1 minoura prop->modified = 1;
329 1.1 minoura prop->modified_value.word[0] = v;
330 1.1 minoura
331 1.1 minoura return 0;
332 1.1 minoura }
333 1.1 minoura
334 1.1 minoura int
335 1.7 minoura parse_time(prop, value)
336 1.1 minoura struct property *prop;
337 1.1 minoura const char *value;
338 1.1 minoura {
339 1.1 minoura const char *p = value;
340 1.1 minoura int v;
341 1.1 minoura
342 1.3 minoura while (*p == ' ' || *p == '\t') p++;
343 1.1 minoura if (*p == '-') {
344 1.1 minoura p++;
345 1.7 minoura v = -atoi_(&p);
346 1.1 minoura } else
347 1.7 minoura v = atoi_(&p);
348 1.1 minoura if (p == 0) {
349 1.7 minoura warnx("%s: Invalid value", value);
350 1.1 minoura return -1;
351 1.1 minoura }
352 1.1 minoura
353 1.7 minoura if (strcasecmp("hours", p) == 0 || strcasecmp("hour", p) == 0)
354 1.1 minoura v *= 60 * 60;
355 1.7 minoura else if (strcasecmp("minutes", p) == 0 ||
356 1.7 minoura strcasecmp("minute", p) == 0)
357 1.1 minoura v *= 60;
358 1.1 minoura else if (*p != 0 &&
359 1.7 minoura strcasecmp("second", p) != 0 &&
360 1.7 minoura strcasecmp("seconds", p) != 0) {
361 1.7 minoura warnx("%s: Invalid value", value);
362 1.1 minoura return -1;
363 1.1 minoura }
364 1.1 minoura
365 1.1 minoura if (v < prop->min) {
366 1.7 minoura warnx("%s: Too small", value);
367 1.1 minoura return -1;
368 1.1 minoura } else if (v > prop->max) {
369 1.7 minoura warnx("%s: Too large", value);
370 1.1 minoura return -1;
371 1.1 minoura }
372 1.1 minoura
373 1.1 minoura prop->modified = 1;
374 1.1 minoura prop->modified_value.longword = v;
375 1.1 minoura
376 1.1 minoura return 0;
377 1.1 minoura }
378 1.1 minoura
379 1.1 minoura int
380 1.7 minoura parse_bootdev(prop, value)
381 1.1 minoura struct property *prop;
382 1.1 minoura const char *value;
383 1.1 minoura {
384 1.1 minoura const char *p = value;
385 1.1 minoura int v;
386 1.4 minoura char expr_scsi[32];
387 1.1 minoura
388 1.3 minoura while (*p == ' ' || *p == '\t') p++;
389 1.1 minoura
390 1.7 minoura if (strcasecmp("STD", p) == 0)
391 1.1 minoura v = 0;
392 1.7 minoura else if (strcasecmp("ROM", p) == 0)
393 1.1 minoura v = 0xa000;
394 1.7 minoura else if (strcasecmp("RAM", p) == 0)
395 1.1 minoura v = 0xb000;
396 1.7 minoura else if (strncasecmp("HD", p, 2) == 0) {
397 1.1 minoura p += 2;
398 1.7 minoura v = atoi_(&p);
399 1.1 minoura if (p == 0 || v < 0 || v > 15) {
400 1.7 minoura warnx("%s: Invalid value", value);
401 1.1 minoura return -1;
402 1.1 minoura }
403 1.1 minoura v *= 0x0100;
404 1.1 minoura v += 0x8000;
405 1.7 minoura } else if (strncasecmp("FD", p, 2) == 0) {
406 1.1 minoura p += 2;
407 1.7 minoura v = atoi_(&p);
408 1.1 minoura if (p == 0 || v < 0 || v > 3) {
409 1.7 minoura warnx("%s: Invalid value", value);
410 1.1 minoura return -1;
411 1.1 minoura }
412 1.1 minoura v *= 0x0100;
413 1.1 minoura v += 0x9070;
414 1.7 minoura } else if (strncasecmp("INSCSI", p, 6) == 0 ||
415 1.7 minoura strncasecmp("EXSCSI", p, 6) == 0) {
416 1.7 minoura int isin = strncasecmp("EXSCSI", p, 6);
417 1.4 minoura
418 1.4 minoura p += 6;
419 1.7 minoura v = atoi_(&p);
420 1.4 minoura if (p == 0 || v < 0 || v > 7) {
421 1.7 minoura warnx("%s: Invalid value", value);
422 1.4 minoura return -1;
423 1.4 minoura }
424 1.4 minoura
425 1.4 minoura /* change boot.romaddr */
426 1.4 minoura sprintf(expr_scsi, "boot.romaddr=0x%06x",
427 1.4 minoura (isin ? 0xfc0000 : 0xea0020) + v * 4);
428 1.4 minoura modify_single(expr_scsi);
429 1.4 minoura
430 1.4 minoura /* boot.device again */
431 1.4 minoura v = 0xa000;
432 1.1 minoura } else {
433 1.7 minoura warnx("%s: Invalid value", value);
434 1.1 minoura return -1;
435 1.1 minoura }
436 1.1 minoura
437 1.1 minoura prop->modified = 1;
438 1.1 minoura prop->modified_value.word[0] = v;
439 1.1 minoura
440 1.1 minoura return 0;
441 1.1 minoura }
442 1.1 minoura
443 1.1 minoura int
444 1.7 minoura parse_serial(prop, value)
445 1.3 minoura struct property *prop;
446 1.3 minoura const char *value;
447 1.3 minoura #define NEXTSPEC while (*p == ' ' || *p == '\t') p++; \
448 1.3 minoura if (*p++ != ',') { \
449 1.7 minoura warnx("%s: Invalid value", value); \
450 1.3 minoura return -1; \
451 1.3 minoura } \
452 1.3 minoura while (*p == ' ' || *p == '\t') p++;
453 1.3 minoura {
454 1.3 minoura const char *p = value;
455 1.3 minoura const char *q;
456 1.3 minoura int baud, bit, parity, stop, flow;
457 1.5 yamt static const int bauds[] = {75, 150, 300, 600, 1200, 2400, 4800, 9600,
458 1.5 yamt 17361, 0};
459 1.5 yamt static const char parities[] = "noe";
460 1.3 minoura int i;
461 1.3 minoura
462 1.3 minoura while (*p == ' ' || *p == '\t') p++;
463 1.3 minoura
464 1.3 minoura /* speed */
465 1.7 minoura baud = atoi_(&p);
466 1.3 minoura if (p == 0) {
467 1.7 minoura warnx("%s: Invalid value", value);
468 1.3 minoura return -1;
469 1.3 minoura }
470 1.3 minoura for (i = 0; bauds[i]; i++)
471 1.3 minoura if (baud == bauds[i])
472 1.3 minoura break;
473 1.3 minoura if (bauds[i] == 0) {
474 1.7 minoura warnx("%d: Invalid speed", baud);
475 1.3 minoura return -1;
476 1.3 minoura }
477 1.3 minoura baud = i;
478 1.3 minoura
479 1.3 minoura NEXTSPEC;
480 1.3 minoura
481 1.3 minoura /* bit size */
482 1.3 minoura if (*p < '5' || *p > '8') {
483 1.7 minoura warnx("%c: Invalid bit size", *p);
484 1.3 minoura return -1;
485 1.3 minoura }
486 1.3 minoura bit = *p++ - '5';
487 1.3 minoura
488 1.3 minoura NEXTSPEC;
489 1.3 minoura
490 1.3 minoura /* parity */
491 1.3 minoura q = strchr(parities, *p++);
492 1.3 minoura if (q == 0) {
493 1.7 minoura warnx("%c: Invalid parity spec", *p);
494 1.3 minoura return -1;
495 1.3 minoura }
496 1.3 minoura parity = q - parities;
497 1.3 minoura
498 1.3 minoura NEXTSPEC;
499 1.3 minoura
500 1.3 minoura /* stop bit */
501 1.7 minoura if (strncmp(p, "1.5", 3) == 0) {
502 1.3 minoura stop = 2;
503 1.3 minoura p += 3;
504 1.7 minoura } else if (strncmp(p, "2", 1) == 0) {
505 1.3 minoura stop = 0;
506 1.3 minoura p++;
507 1.7 minoura } else if (strncmp(p, "1", 1) == 0) {
508 1.3 minoura stop = 1;
509 1.3 minoura p++;
510 1.3 minoura } else {
511 1.7 minoura warnx("%s: Invalid value", value);
512 1.3 minoura return -1;
513 1.3 minoura }
514 1.3 minoura
515 1.3 minoura NEXTSPEC;
516 1.3 minoura
517 1.3 minoura /* flow */
518 1.3 minoura if (*p == '-')
519 1.3 minoura flow = 0;
520 1.3 minoura else if (*p == 's')
521 1.3 minoura flow = 1;
522 1.3 minoura else {
523 1.7 minoura warnx("%s: Invalid value", value);
524 1.3 minoura return -1;
525 1.3 minoura }
526 1.3 minoura
527 1.3 minoura p++;
528 1.3 minoura while (*p == ' ' || *p == '\t') p++;
529 1.3 minoura if (*p != 0) {
530 1.7 minoura warnx("%s: Invalid value", value);
531 1.3 minoura return -1;
532 1.3 minoura }
533 1.3 minoura
534 1.3 minoura prop->modified = 1;
535 1.3 minoura prop->modified_value.word[0] = ((stop << 14) +
536 1.3 minoura (parity << 12) +
537 1.3 minoura (bit << 10) +
538 1.3 minoura (flow << 9) +
539 1.3 minoura baud);
540 1.3 minoura
541 1.3 minoura return 0;
542 1.3 minoura }
543 1.3 minoura #undef NEXTSPEC
544 1.3 minoura
545 1.3 minoura int
546 1.7 minoura parse_srammode(prop, value)
547 1.3 minoura struct property *prop;
548 1.3 minoura const char *value;
549 1.3 minoura {
550 1.5 yamt static const char *const sramstrs[] = {"unused", "SRAMDISK", "program"};
551 1.3 minoura int i;
552 1.3 minoura
553 1.3 minoura for (i = 0; i <= 2; i++) {
554 1.7 minoura if (strcasecmp(value, sramstrs[i]) == 0)
555 1.3 minoura break;
556 1.3 minoura }
557 1.3 minoura if (i > 2) {
558 1.7 minoura warnx("%s: Invalid value", value);
559 1.3 minoura return -1;
560 1.3 minoura }
561 1.3 minoura
562 1.3 minoura prop->modified = 1;
563 1.3 minoura prop->modified_value.byte[0] = i;
564 1.3 minoura
565 1.3 minoura return 0;
566 1.3 minoura }
567 1.3 minoura
568 1.3 minoura int
569 1.7 minoura print_uchar(prop, str)
570 1.1 minoura struct property *prop;
571 1.1 minoura char *str;
572 1.1 minoura {
573 1.1 minoura if (prop->modified)
574 1.7 minoura snprintf(str, MAXVALUELEN,
575 1.7 minoura "%d", prop->modified_value.byte[0]);
576 1.1 minoura else {
577 1.1 minoura if (!prop->value_valid)
578 1.7 minoura prop->fill(prop);
579 1.7 minoura snprintf(str, MAXVALUELEN, "%d",
580 1.7 minoura prop->current_value.byte[0]);
581 1.1 minoura }
582 1.1 minoura
583 1.1 minoura return 0;
584 1.1 minoura }
585 1.1 minoura
586 1.1 minoura int
587 1.7 minoura print_ucharh(prop, str)
588 1.1 minoura struct property *prop;
589 1.1 minoura char *str;
590 1.1 minoura {
591 1.1 minoura if (prop->modified)
592 1.7 minoura snprintf(str, MAXVALUELEN,
593 1.7 minoura "0x%4.4x", prop->modified_value.byte[0]);
594 1.1 minoura else {
595 1.1 minoura if (!prop->value_valid)
596 1.7 minoura prop->fill(prop);
597 1.7 minoura snprintf(str, MAXVALUELEN,
598 1.7 minoura "0x%4.4x", prop->current_value.byte[0]);
599 1.1 minoura }
600 1.1 minoura
601 1.1 minoura return 0;
602 1.1 minoura }
603 1.1 minoura
604 1.1 minoura int
605 1.7 minoura print_ushorth(prop, str)
606 1.1 minoura struct property *prop;
607 1.1 minoura char *str;
608 1.1 minoura {
609 1.1 minoura if (prop->modified)
610 1.7 minoura snprintf(str, MAXVALUELEN,
611 1.1 minoura "0x%4.4x", prop->modified_value.word[0]);
612 1.1 minoura else {
613 1.1 minoura if (!prop->value_valid)
614 1.7 minoura prop->fill(prop);
615 1.7 minoura snprintf(str, MAXVALUELEN,
616 1.7 minoura "0x%4.4x", prop->current_value.word[0]);
617 1.1 minoura }
618 1.1 minoura
619 1.1 minoura return 0;
620 1.1 minoura }
621 1.1 minoura
622 1.1 minoura int
623 1.7 minoura print_ulong(prop, str)
624 1.1 minoura struct property *prop;
625 1.1 minoura char *str;
626 1.1 minoura {
627 1.1 minoura if (prop->modified)
628 1.7 minoura snprintf(str, MAXVALUELEN,
629 1.7 minoura "%ld", prop->modified_value.longword);
630 1.1 minoura else {
631 1.1 minoura if (!prop->value_valid)
632 1.7 minoura prop->fill(prop);
633 1.7 minoura snprintf(str, MAXVALUELEN,
634 1.7 minoura "%ld", prop->current_value.longword);
635 1.1 minoura }
636 1.1 minoura
637 1.1 minoura return 0;
638 1.1 minoura }
639 1.1 minoura
640 1.1 minoura int
641 1.7 minoura print_ulongh(prop, str)
642 1.1 minoura struct property *prop;
643 1.1 minoura char *str;
644 1.1 minoura {
645 1.1 minoura if (prop->modified)
646 1.7 minoura snprintf(str, MAXVALUELEN,
647 1.7 minoura "0x%8.8lx", prop->modified_value.longword);
648 1.1 minoura else {
649 1.1 minoura if (!prop->value_valid)
650 1.7 minoura prop->fill(prop);
651 1.7 minoura snprintf(str, MAXVALUELEN,
652 1.7 minoura "0x%8.8lx", prop->current_value.longword);
653 1.1 minoura }
654 1.1 minoura
655 1.1 minoura return 0;
656 1.1 minoura }
657 1.1 minoura
658 1.1 minoura int
659 1.7 minoura print_magic(prop, str)
660 1.1 minoura struct property *prop;
661 1.1 minoura char *str;
662 1.1 minoura {
663 1.1 minoura if (!prop->value_valid)
664 1.7 minoura prop->fill(prop);
665 1.7 minoura snprintf(str, MAXVALUELEN, "%c%c%c%c",
666 1.7 minoura prop->current_value.byte[0],
667 1.7 minoura prop->current_value.byte[1],
668 1.7 minoura prop->current_value.byte[2],
669 1.7 minoura prop->current_value.byte[3]);
670 1.1 minoura
671 1.1 minoura return 0;
672 1.1 minoura }
673 1.1 minoura
674 1.1 minoura int
675 1.7 minoura print_timesec(prop, str)
676 1.1 minoura struct property *prop;
677 1.1 minoura char *str;
678 1.1 minoura {
679 1.1 minoura if (prop->modified)
680 1.7 minoura snprintf(str, MAXVALUELEN,
681 1.7 minoura "%ld second", prop->modified_value.longword);
682 1.1 minoura else {
683 1.1 minoura if (!prop->value_valid)
684 1.7 minoura prop->fill(prop);
685 1.7 minoura snprintf(str, MAXVALUELEN,
686 1.7 minoura "%ld second", prop->current_value.longword);
687 1.1 minoura }
688 1.1 minoura
689 1.1 minoura return 0;
690 1.1 minoura }
691 1.1 minoura
692 1.1 minoura int
693 1.7 minoura print_bootdev(prop, str)
694 1.1 minoura struct property *prop;
695 1.1 minoura char *str;
696 1.1 minoura {
697 1.1 minoura unsigned int v;
698 1.1 minoura
699 1.1 minoura if (prop->modified)
700 1.1 minoura v = prop->modified_value.word[0];
701 1.1 minoura else {
702 1.1 minoura if (!prop->value_valid)
703 1.7 minoura prop->fill(prop);
704 1.1 minoura v = prop->current_value.word[0];
705 1.1 minoura }
706 1.1 minoura
707 1.1 minoura if (v == 0)
708 1.7 minoura strcpy(str, "STD");
709 1.1 minoura else if (v == 0xa000)
710 1.7 minoura strcpy(str, "ROM");
711 1.1 minoura else if (v == 0xb000)
712 1.7 minoura strcpy(str, "RAM");
713 1.1 minoura else if (v >= 0x8000 && v < 0x9000)
714 1.7 minoura snprintf(str, MAXVALUELEN, "HD%d", (v & 0x0f00) >> 8);
715 1.1 minoura else if (v >= 0x9000 && v < 0xa000)
716 1.7 minoura snprintf(str, MAXVALUELEN, "FD%d", (v & 0x0f00) >> 8);
717 1.1 minoura else
718 1.7 minoura snprintf(str, MAXVALUELEN, "%8.8x", v);
719 1.3 minoura
720 1.3 minoura return 0;
721 1.3 minoura }
722 1.3 minoura
723 1.3 minoura int
724 1.7 minoura print_serial(prop, str)
725 1.3 minoura struct property *prop;
726 1.3 minoura char *str;
727 1.3 minoura {
728 1.3 minoura unsigned int v;
729 1.4 minoura const char *baud, *stop;
730 1.4 minoura char bit, parity, flow;
731 1.5 yamt static const char *const bauds[] = {"75", "150", "300", "600", "1200",
732 1.4 minoura "2400", "4800", "9600", "17361"};
733 1.5 yamt static const char bits[] = "5678";
734 1.5 yamt static const char parities[] = "noen";
735 1.5 yamt static const char *const stops[] = {"2", "1", "1.5", "2"};
736 1.5 yamt static const char flows[] = "-s";
737 1.3 minoura
738 1.3 minoura if (prop->modified)
739 1.3 minoura v = prop->modified_value.word[0];
740 1.3 minoura else {
741 1.3 minoura if (!prop->value_valid)
742 1.7 minoura prop->fill(prop);
743 1.3 minoura v = prop->current_value.word[0];
744 1.3 minoura }
745 1.3 minoura
746 1.3 minoura baud = bauds[v & 0x000f];
747 1.3 minoura bit = bits[(v & 0x0c00) >> 10];
748 1.3 minoura parity = parities[(v & 0x3000) >> 12];
749 1.3 minoura stop = stops[(v & 0xe000) >> 14];
750 1.3 minoura flow = flows[(v & 0x0200) >> 9];
751 1.7 minoura sprintf(str, "%s,%c,%c,%s,%c", baud, bit, parity, stop, flow);
752 1.3 minoura
753 1.3 minoura return 0;
754 1.3 minoura }
755 1.3 minoura
756 1.3 minoura int
757 1.7 minoura print_srammode(prop, str)
758 1.3 minoura struct property *prop;
759 1.3 minoura char *str;
760 1.3 minoura {
761 1.3 minoura int v;
762 1.5 yamt static const char *const sramstrs[] = {"unused", "SRAMDISK", "program"};
763 1.3 minoura
764 1.3 minoura if (prop->modified)
765 1.3 minoura v = prop->modified_value.byte[0];
766 1.3 minoura else {
767 1.3 minoura if (!prop->value_valid)
768 1.7 minoura prop->fill(prop);
769 1.3 minoura v = prop->current_value.byte[0];
770 1.3 minoura }
771 1.3 minoura
772 1.3 minoura if (v < 0 || v > 2)
773 1.7 minoura strcpy(str, "INVALID");
774 1.3 minoura else
775 1.7 minoura strcpy(str, sramstrs[v]);
776 1.1 minoura
777 1.1 minoura return 0;
778 1.1 minoura }
779