Sync usage with man page.
[netbsd-mini2440.git] / usr.sbin / tadpolectl / tadpolectl.c
blob68ea59dc6de8900d1cc1853abfa7979073718f92
1 /* $NetBSD: tadpolectl.c,v 1.7 2008/04/28 20:24:17 martin Exp $ */
3 /*-
4 * Copyright (c) 1999 The NetBSD Foundation, Inc.
5 * All rights reserved.
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Tim Rightnour.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
32 #include <ctype.h>
33 #include <err.h>
34 #include <stdio.h>
35 #include <string.h>
36 #include <stdlib.h>
37 #include <fcntl.h>
38 #include <unistd.h>
39 #include <sys/ioctl.h>
40 #include <sys/types.h>
41 #include <sys/envsys.h>
42 #include <machine/apmvar.h>
43 #include <machine/tctrl.h>
45 #define TCTRL_DEV "/dev/tctrl0"
47 int aflag, nflag, wflag, dev;
49 #define PROTO(x) int x __P((int, int, int));
50 void usage __P((void));
51 static void parse __P((char *));
52 char *dashdot __P((const char *));
53 int main __P((int, char *[]));
54 PROTO(hw_version)
55 PROTO(hw_microcontroller_version)
56 PROTO(hw_poweroncycles)
57 PROTO(hw_poweronseconds)
58 PROTO(hw_power_mains)
59 PROTO(hw_power_battery_int)
60 PROTO(hw_power_battery_ext)
61 PROTO(hw_power_battery_int_chargerate)
62 PROTO(hw_power_battery_ext_chargerate)
63 PROTO(hw_power_battery_int_chargelevel)
64 PROTO(hw_power_battery_ext_chargelevel)
65 PROTO(hw_video_external)
66 PROTO(hw_video_lid)
67 PROTO(hw_video_syncinva)
68 PROTO(hw_video_syncinvb)
69 PROTO(hw_video_compsync)
70 PROTO(hw_video_tft_brightness)
71 PROTO(hw_speaker_freq)
72 PROTO(hw_speaker_volume)
73 PROTO(hw_kbd_repeat_delay)
74 PROTO(hw_kbd_repeat_speed)
75 PROTO(hw_mouse_recalibrate)
76 PROTO(hw_power_battery_chargedisabled)
77 PROTO(hw_mouse_disable)
78 PROTO(hw_kbd_click)
79 PROTO(hw_mouse_intclick)
80 PROTO(hw_mouse_extclick)
81 PROTO(hw_mouse_sensitivity)
82 PROTO(hw_serial_power)
84 #define NUM_MIBS 29
85 #define TABLE(n) { __STRING(n), 0, n }
87 struct {
88 const char *mib;
89 int value;
90 int (*funcptr)(int, int, int);
91 } table[NUM_MIBS] = {
92 TABLE(hw_microcontroller_version),
93 TABLE(hw_version),
94 TABLE(hw_poweroncycles),
95 TABLE(hw_poweronseconds),
96 TABLE(hw_power_mains),
97 TABLE(hw_power_battery_int),
98 TABLE(hw_power_battery_ext),
99 TABLE(hw_power_battery_chargedisabled),
100 TABLE(hw_power_battery_int_chargerate),
101 TABLE(hw_power_battery_ext_chargerate),
102 TABLE(hw_power_battery_int_chargelevel),
103 TABLE(hw_power_battery_ext_chargelevel),
104 TABLE(hw_video_external),
105 TABLE(hw_video_lid),
106 TABLE(hw_video_syncinva),
107 TABLE(hw_video_syncinvb),
108 TABLE(hw_video_compsync),
109 TABLE(hw_video_tft_brightness),
110 TABLE(hw_speaker_freq),
111 TABLE(hw_speaker_volume),
112 TABLE(hw_kbd_repeat_delay),
113 TABLE(hw_kbd_repeat_speed),
114 TABLE(hw_kbd_click),
115 TABLE(hw_mouse_recalibrate),
116 TABLE(hw_mouse_disable),
117 TABLE(hw_mouse_intclick),
118 TABLE(hw_mouse_extclick),
119 TABLE(hw_mouse_sensitivity),
120 TABLE(hw_serial_power),
123 #define FUNC(x) \
124 int \
125 x(readflg, new, num) \
126 int readflg, new, num;
128 #define READ_REQ(a, b, c) \
129 req.cmdbuf[0] = a; \
130 req.cmdlen = b; \
131 req.rsplen = c; \
132 ioctl(dev, TCTRL_CMD_REQ, &req)
134 #define WRITE_REQ(a, b, c) \
135 req.cmdbuf[0] = a; \
136 req.cmdlen = b; \
137 req.rsplen = c; \
138 ioctl(dev, TCTRL_CMD_REQ, &req)
140 #define READ_ONLY \
141 if (!readflg) \
142 return(0)
144 /* hardware functions */
146 FUNC(hw_mouse_sensitivity)
148 struct tctrl_req req;
150 req.cmdbuf[1] = 0xff;
151 req.cmdbuf[2] = 0x00;
152 READ_REQ(0x2c, 3, 2);
153 table[num].value = req.rspbuf[0];
154 if (readflg)
155 return(1);
156 if (new == 0)
157 req.cmdbuf[2] = 0x00;
158 else if (new > 255)
159 req.cmdbuf[2] = 0xff;
160 else
161 req.cmdbuf[2] = new;
162 req.cmdbuf[1] = 0x00;
163 WRITE_REQ(0x2c, 3, 2);
164 req.cmdbuf[1] = 0xff;
165 req.cmdbuf[2] = 0x00;
166 READ_REQ(0x2c, 3, 2);
167 table[num].value = req.rspbuf[0];
168 return(1);
171 FUNC(hw_power_battery_chargedisabled)
173 struct tctrl_req req;
175 req.cmdbuf[1] = 0xff;
176 req.cmdbuf[2] = 0x00;
177 READ_REQ(0x22, 3, 2);
178 table[num].value = req.rspbuf[0]&0x01 ? 1 : 0;
179 if (readflg)
180 return(1);
181 if (new == 0)
182 req.cmdbuf[2] = 0x00;
183 else
184 req.cmdbuf[2] = 0x01;
185 req.cmdbuf[1] = ~0x01;
186 WRITE_REQ(0x22, 3, 2);
187 req.cmdbuf[1] = 0xff;
188 req.cmdbuf[2] = 0x00;
189 READ_REQ(0x22, 3, 2);
190 table[num].value = req.rspbuf[0]&0x01 ? 1 : 0;
191 return(1);
194 FUNC(hw_mouse_disable)
196 struct tctrl_req req;
198 req.cmdbuf[1] = 0xff;
199 req.cmdbuf[2] = 0x00;
200 READ_REQ(0x22, 3, 2);
201 table[num].value = req.rspbuf[0]&0x02 ? 1 : 0;
202 if (readflg)
203 return(1);
204 if (new == 0)
205 req.cmdbuf[2] = 0x00;
206 else
207 req.cmdbuf[2] = 0x02;
208 req.cmdbuf[1] = ~0x02;
209 WRITE_REQ(0x22, 3, 2);
210 req.cmdbuf[1] = 0xff;
211 req.cmdbuf[2] = 0x00;
212 READ_REQ(0x22, 3, 2);
213 table[num].value = req.rspbuf[0]&0x02 ? 1 : 0;
214 return(1);
217 FUNC(hw_kbd_click)
219 struct tctrl_req req;
221 req.cmdbuf[1] = 0xff;
222 req.cmdbuf[2] = 0x00;
223 READ_REQ(0x22, 3, 2);
224 table[num].value = req.rspbuf[0]&0x04 ? 1 : 0;
225 if (readflg)
226 return(1);
227 if (new == 0)
228 req.cmdbuf[2] = 0x00;
229 else
230 req.cmdbuf[2] = 0x04;
231 req.cmdbuf[1] = ~0x04;
232 WRITE_REQ(0x22, 3, 2);
233 req.cmdbuf[1] = 0xff;
234 req.cmdbuf[2] = 0x00;
235 READ_REQ(0x22, 3, 2);
236 table[num].value = req.rspbuf[0]&0x04 ? 1 : 0;
237 return(1);
240 FUNC(hw_mouse_intclick)
242 struct tctrl_req req;
244 req.cmdbuf[1] = 0xff;
245 req.cmdbuf[2] = 0x00;
246 READ_REQ(0x22, 3, 2);
247 table[num].value = req.rspbuf[0]&0x08 ? 1 : 0;
248 if (readflg)
249 return(1);
250 if (new == 0)
251 req.cmdbuf[2] = 0x00;
252 else
253 req.cmdbuf[2] = 0x08;
254 req.cmdbuf[1] = ~0x08;
255 WRITE_REQ(0x22, 3, 2);
256 req.cmdbuf[1] = 0xff;
257 req.cmdbuf[2] = 0x00;
258 READ_REQ(0x22, 3, 2);
259 table[num].value = req.rspbuf[0]&0x08 ? 1 : 0;
260 return(1);
263 FUNC(hw_mouse_extclick)
265 struct tctrl_req req;
267 req.cmdbuf[1] = 0xff;
268 req.cmdbuf[2] = 0x00;
269 READ_REQ(0x22, 3, 2);
270 table[num].value = req.rspbuf[0]&0x10 ? 1 : 0;
271 if (readflg)
272 return(1);
273 if (new == 0)
274 req.cmdbuf[2] = 0x00;
275 else
276 req.cmdbuf[2] = 0x10;
277 req.cmdbuf[1] = ~0x10;
278 WRITE_REQ(0x22, 3, 2);
279 req.cmdbuf[1] = 0xff;
280 req.cmdbuf[2] = 0x00;
281 READ_REQ(0x22, 3, 2);
282 table[num].value = req.rspbuf[0]&0x10 ? 1 : 0;
283 return(1);
286 /* ARGSUSED */
287 FUNC(hw_mouse_recalibrate)
289 struct tctrl_req req;
291 table[num].value = 0;
292 if (readflg)
293 return(1);
294 READ_REQ(0x36, 1, 1);
295 return(1);
298 FUNC(hw_kbd_repeat_delay)
300 struct tctrl_req req;
302 req.cmdbuf[1] = 0xff;
303 req.cmdbuf[2] = 0x00;
304 READ_REQ(0x28, 3, 2);
305 table[num].value = req.rspbuf[0];
306 if (readflg)
307 return(1);
308 if (new == 0)
309 req.cmdbuf[2] = 0x00;
310 else if (new > 255)
311 req.cmdbuf[2] = 0xff;
312 else
313 req.cmdbuf[2] = new;
314 req.cmdbuf[1] = 0x00;
315 WRITE_REQ(0x28, 3, 2);
316 req.cmdbuf[1] = 0xff;
317 req.cmdbuf[2] = 0x00;
318 READ_REQ(0x28, 3, 2);
319 table[num].value = req.rspbuf[0];
320 return(1);
323 FUNC(hw_kbd_repeat_speed)
325 struct tctrl_req req;
327 req.cmdbuf[1] = 0xff;
328 req.cmdbuf[2] = 0x00;
329 READ_REQ(0x29, 3, 2);
330 table[num].value = req.rspbuf[0];
331 if (readflg)
332 return(1);
333 if (new == 0)
334 req.cmdbuf[2] = 0x00;
335 else if (new > 255)
336 req.cmdbuf[2] = 0xff;
337 else
338 req.cmdbuf[2] = new;
339 req.cmdbuf[1] = 0x00;
340 WRITE_REQ(0x29, 3, 2);
341 req.cmdbuf[1] = 0xff;
342 req.cmdbuf[2] = 0x00;
343 READ_REQ(0x29, 3, 2);
344 table[num].value = req.rspbuf[0];
345 return(1);
348 FUNC(hw_speaker_freq)
350 struct tctrl_req req;
352 table[num].value = 0;
353 if (readflg)
354 return(1);
355 req.cmdbuf[1] = new * 256;
356 req.cmdbuf[2] = new % 256;
357 WRITE_REQ(0x37, 3, 1);
358 return(1);
361 FUNC(hw_speaker_volume)
363 struct tctrl_req req;
365 req.cmdbuf[1] = 0xff;
366 req.cmdbuf[2] = 0x00;
367 READ_REQ(0x23, 3, 2);
368 table[num].value = req.rspbuf[0];
369 if (readflg)
370 return(1);
371 if (new == 0)
372 req.cmdbuf[2] = 0x00;
373 else if (new > 255)
374 req.cmdbuf[2] = 0xff;
375 else
376 req.cmdbuf[2] = new;
377 req.cmdbuf[1] = 0x00;
378 WRITE_REQ(0x23, 3, 2);
379 req.cmdbuf[1] = 0xff;
380 req.cmdbuf[2] = 0x00;
381 READ_REQ(0x23, 3, 2);
382 table[num].value = req.rspbuf[0];
383 return(1);
386 FUNC(hw_video_tft_brightness)
388 struct tctrl_req req;
390 req.cmdbuf[1] = 0xff;
391 req.cmdbuf[2] = 0x00;
392 READ_REQ(0x24, 3, 2);
393 table[num].value = req.rspbuf[0];
394 if (readflg)
395 return(1);
396 if (new == 0)
397 req.cmdbuf[2] = 0x00;
398 else if (new > 255)
399 req.cmdbuf[2] = 0xff;
400 else
401 req.cmdbuf[2] = new;
402 req.cmdbuf[1] = 0x00;
403 WRITE_REQ(0x24, 3, 2);
404 req.cmdbuf[1] = 0xff;
405 req.cmdbuf[2] = 0x00;
406 READ_REQ(0x24, 3, 2);
407 table[num].value = req.rspbuf[0];
408 return(1);
411 FUNC(hw_video_syncinva)
413 struct tctrl_req req;
415 req.cmdbuf[1] = 0xff;
416 req.cmdbuf[2] = 0x00;
417 READ_REQ(0x21, 3, 2);
418 table[num].value = req.rspbuf[0]&0x02 ? 1 : 0;
419 if (readflg)
420 return(1);
421 if (new == 0)
422 req.cmdbuf[2] = 0x00;
423 else
424 req.cmdbuf[2] = 0x02;
425 req.cmdbuf[1] = ~0x02;
426 WRITE_REQ(0x21, 3, 2);
427 req.cmdbuf[1] = 0xff;
428 req.cmdbuf[2] = 0x00;
429 READ_REQ(0x21, 3, 2);
430 table[num].value = req.rspbuf[0]&0x02 ? 1 : 0;
431 return(1);
434 FUNC(hw_video_syncinvb)
436 struct tctrl_req req;
438 req.cmdbuf[1] = 0xff;
439 req.cmdbuf[2] = 0x00;
440 READ_REQ(0x21, 3, 2);
441 table[num].value = req.rspbuf[0]&0x04 ? 1 : 0;
442 if (readflg)
443 return(1);
444 if (new == 0)
445 req.cmdbuf[2] = 0x00;
446 else
447 req.cmdbuf[2] = 0x04;
448 req.cmdbuf[1] = ~0x04;
449 WRITE_REQ(0x21, 3, 2);
450 req.cmdbuf[1] = 0xff;
451 req.cmdbuf[2] = 0x00;
452 READ_REQ(0x21, 3, 2);
453 table[num].value = req.rspbuf[0]&0x04 ? 1 : 0;
454 return(1);
457 FUNC(hw_video_compsync)
459 struct tctrl_req req;
461 req.cmdbuf[1] = 0xff;
462 req.cmdbuf[2] = 0x00;
463 READ_REQ(0x21, 3, 2);
464 table[num].value = req.rspbuf[0]&0x10 ? 1 : 0;
465 if (readflg)
466 return(1);
467 if (new == 0)
468 req.cmdbuf[2] = 0x00;
469 else
470 req.cmdbuf[2] = 0x10;
471 req.cmdbuf[1] = ~0x10;
472 WRITE_REQ(0x21, 3, 2);
473 req.cmdbuf[1] = 0xff;
474 req.cmdbuf[2] = 0x00;
475 READ_REQ(0x21, 3, 2);
476 table[num].value = req.rspbuf[0]&0x10 ? 1 : 0;
477 return(1);
480 /* ARGSUSED */
481 FUNC(hw_video_lid)
483 struct tctrl_req req;
484 short i;
486 READ_ONLY;
487 READ_REQ(0x11, 1, 3);
488 i = (req.rspbuf[0]<<8) + req.rspbuf[1];
489 table[num].value = i&0x0040 ? 0 : 1;
490 return(1);
493 /* ARGSUSED */
494 FUNC(hw_video_external)
496 struct tctrl_req req;
497 short i;
499 READ_ONLY;
500 READ_REQ(0x11, 1, 3);
501 i = (req.rspbuf[0]<<8) + req.rspbuf[1];
502 table[num].value = i&0x0008 ? 1 : 0;
503 return(1);
506 /* ARGSUSED */
507 FUNC(hw_power_battery_int_chargelevel)
509 struct tctrl_req req;
511 READ_ONLY;
512 READ_REQ(0x7a, 1, 3);
513 table[num].value = req.rspbuf[0] == 0xfb ? 0 : req.rspbuf[0];
514 return(1);
518 /* ARGSUSED */
519 FUNC(hw_power_battery_ext_chargelevel)
521 struct tctrl_req req;
523 READ_ONLY;
524 READ_REQ(0x7b, 1, 3);
525 table[num].value = req.rspbuf[0] == 0xfb ? 0 : req.rspbuf[0];
526 return(1);
529 FUNC(hw_power_battery_int_chargerate)
531 struct tctrl_req req;
533 READ_REQ(0x18, 1, 2);
534 table[num].value = req.rspbuf[0];
535 if (readflg)
536 return(1);
537 req.cmdbuf[1] = new < 255 ? new : 255;
538 WRITE_REQ(0x39, 2, 1);
539 READ_REQ(0x18, 1, 2);
540 table[num].value = req.rspbuf[0];
541 return(1);
544 FUNC(hw_power_battery_ext_chargerate)
546 struct tctrl_req req;
548 READ_REQ(0x18, 1, 2);
549 table[num].value = req.rspbuf[0];
550 if (readflg)
551 return(1);
552 req.cmdbuf[1] = new < 255 ? new : 255;
553 WRITE_REQ(0x39, 2, 1);
554 READ_REQ(0x18, 1, 2);
555 table[num].value = req.rspbuf[0];
556 return(1);
559 /* ARGSUSED */
560 FUNC(hw_power_battery_ext)
562 int i;
563 struct tctrl_req req;
565 READ_ONLY;
566 READ_REQ(0x11, 1, 3);
567 i = (req.rspbuf[0]<<8) + req.rspbuf[1];
568 table[num].value = i&0x0004 ? 1 : 0;
569 return(1);
572 /* ARGSUSED */
573 FUNC(hw_power_battery_int)
575 int i;
576 struct tctrl_req req;
578 READ_ONLY;
579 READ_REQ(0x11, 1, 3);
580 i = (req.rspbuf[0]<<8) + req.rspbuf[1];
581 table[num].value = i&0x0002 ? 1 : 0;
582 return(1);
585 /* ARGSUSED */
586 FUNC(hw_power_mains)
588 int i;
589 struct tctrl_req req;
591 READ_ONLY;
592 READ_REQ(0x11, 1, 3);
593 i = (req.rspbuf[0]<<8) + req.rspbuf[1];
594 table[num].value = i&0x0001 ? 1 : 0;
595 return(1);
598 /* ARGSUSED */
599 FUNC(hw_poweroncycles)
601 struct tctrl_req req;
603 READ_ONLY;
604 READ_REQ(0x09, 1, 5);
605 table[num].value = (req.rspbuf[0]<<24)+(req.rspbuf[1]<<16)+
606 (req.rspbuf[2]<<8)+req.rspbuf[3];
607 return(1);
610 /* ARGSUSED */
611 FUNC(hw_poweronseconds)
613 struct tctrl_req req;
615 READ_ONLY;
616 READ_REQ(0x0a, 1, 5);
617 table[num].value = (req.rspbuf[0]<<24)+(req.rspbuf[1]<<16)+
618 (req.rspbuf[2]<<8)+req.rspbuf[3];
619 return(1);
622 /* ARGSUSED */
623 FUNC(hw_microcontroller_version)
625 char buf[BUFSIZ];
626 struct tctrl_req req;
628 READ_ONLY;
629 READ_REQ(0x04, 1, 3);
630 snprintf(buf, sizeof(buf), "%d%d", req.rspbuf[0]*1000,
631 req.rspbuf[1]*10);
632 table[num].value = atoi(strdup(buf));
633 return(1);
637 /* ARGSUSED */
638 FUNC(hw_version)
640 char buf[BUFSIZ];
641 struct tctrl_req req;
643 READ_ONLY;
644 READ_REQ(0x03, 1, 3);
645 snprintf(buf, sizeof(buf), "%d%d", req.rspbuf[0]*1000,
646 req.rspbuf[1]*10);
647 table[num].value = atoi(strdup(buf));
648 return(1);
651 FUNC(hw_serial_power)
653 struct tctrl_pwr pwrreq;
655 if (!readflg) {
656 pwrreq.rw = 0x00;
657 pwrreq.state = new;
658 ioctl(dev, TCTRL_SERIAL_PWR, &pwrreq);
660 pwrreq.rw = 0x01;
661 ioctl(dev, TCTRL_SERIAL_PWR, &pwrreq);
662 table[num].value = pwrreq.state;
663 return(1);
666 void
667 usage()
669 (void)fprintf(stderr,
670 "usage: tadpolectl [-n] name ...\n"
671 " tadpolectl [-n] -w name=value\n"
672 " tadpolectl [-n] -a\n");
673 exit(1);
676 static void
677 parse(string)
678 char *string;
680 char *cp, buf[BUFSIZ];
681 int newval = 0;
682 int i, j, ret;
684 string = dashdot(string);
685 snprintf(buf, (size_t)BUFSIZ, "%s", string);
686 if ((cp = strchr(string, '=')) != NULL) {
687 if (!wflag)
688 errx(2, "Must specify -w to set variables");
689 *strchr(buf, '=') = '\0';
690 *cp++ = '\0';
691 while (isspace((unsigned char) *cp))
692 cp++;
693 newval = atoi(cp);
695 for (j=0,i=-1; j < NUM_MIBS; j++) {
696 if (strcmp(string, table[j].mib) == 0) {
697 i = j;
698 break;
701 if (i == -1)
702 errx(2, "Named value does not exist");
704 if (wflag) {
705 ret = (*table[i].funcptr)(0, newval, i);
706 if (!ret)
707 errx(2, "Cannot modify this value");
708 } else
709 ret = (*table[i].funcptr)(1, 0, i);
710 if (nflag)
711 printf("%d\n", table[i].value);
712 else
713 printf("%s = %d\n", dashdot(table[i].mib), table[i].value);
716 char *
717 dashdot(string)
718 const char *string;
720 char *p;
721 char *save;
723 p = strdup(string);
724 save = p;
726 for (; (*p = *string) != '\0'; ++p, ++string) {
727 if (*p == '.')
728 *p = '_';
729 else if (*p == '_')
730 *p = '.';
732 return(save);
736 main(argc, argv)
737 int argc;
738 char *argv[];
740 int ch, j;
742 while ((ch = getopt(argc, argv, "anw")) != -1) {
743 switch (ch) {
745 case 'a':
746 aflag = 1;
747 break;
748 case 'n':
749 nflag = 1;
750 break;
751 case 'w':
752 wflag = 1;
753 break;
754 default:
755 usage();
758 argc -= optind;
759 argv += optind;
761 if ((dev = open(TCTRL_DEV, O_RDONLY, NULL)) == -1)
762 err(1, "%s", TCTRL_DEV);
764 if (aflag) {
765 for (j=0; j < NUM_MIBS; j++) {
766 (void)(*table[j].funcptr)(1, 0, j);
767 if (nflag)
768 printf("%d\n", table[j].value);
769 else
770 printf("%s = %d\n", dashdot(table[j].mib),
771 table[j].value);
773 return(0);
775 if (argc == 0)
776 usage();
777 while (argc-- > 0)
778 parse(*argv++);
779 return(0);