apm.c revision 21364
1/*
2 * apm / zzz	APM BIOS utility for FreeBSD
3 *
4 * Copyright (C) 1994-1996 by HOSOKAWA Tatasumi <hosokawa@mt.cs.keio.ac.jp>
5 *
6 * This software may be used, modified, copied, distributed, and sold,
7 * in both source and binary form provided that the above copyright and
8 * these terms are retained. Under no circumstances is the author
9 * responsible for the proper functioning of this software, nor does
10 * the author assume any responsibility for damages incurred with its
11 * use.
12 *
13 * Sep., 1994	Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD)
14 */
15
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19#include <sys/file.h>
20#include <sys/ioctl.h>
21#include <unistd.h>
22#include <machine/apm_bios.h>
23
24#define APMDEV	"/dev/apm"
25
26static char *cmdname;
27
28void
29usage()
30{
31	fprintf(stderr, "usage: %s [-ablsz] [-d 1|0]\n", cmdname);
32	exit(1);
33}
34
35void
36apm_suspend(int fd)
37{
38	if (ioctl(fd, APMIO_SUSPEND, NULL) == -1) {
39		perror(cmdname);
40		exit(1);
41	}
42}
43
44void
45apm_getinfo(int fd, apm_info_t aip)
46{
47	if (ioctl(fd, APMIO_GETINFO, aip) == -1) {
48		perror(cmdname);
49		exit(1);
50	}
51}
52
53void
54print_all_info(apm_info_t aip)
55{
56	printf("APM version: %d.%d\n", aip->ai_major, aip->ai_minor);
57	printf("APM Managment: %s\n", (aip->ai_status ? "Enabled" : "Disabled"));
58	printf("AC Line status: ");
59	if (aip->ai_acline == 255)
60		printf("unknown");
61	else if (aip->ai_acline > 1)
62		printf("invalid value (0x%x)", aip->ai_acline);
63	else {
64		char messages[][10] = {"off-line", "on-line"};
65		printf("%s", messages[aip->ai_acline]);
66	}
67	printf("\n");
68	printf("Battery status: ");
69	if (aip->ai_batt_stat == 255)
70		printf("unknown");
71	else if (aip->ai_batt_stat > 3)
72			printf("invalid value (0x%x)", aip->ai_batt_stat);
73	else {
74		char messages[][10] = {"high", "low", "critical", "charging"};
75		printf("%s", messages[aip->ai_batt_stat]);
76	}
77	printf("\n");
78	printf("Remaining battery life: ");
79	if (aip->ai_batt_life == 255)
80		printf("unknown");
81	else if (aip->ai_batt_life <= 100)
82			printf("%d%%", aip->ai_batt_life);
83	else
84		printf("invalid value (0x%x)", aip->ai_batt_life);
85	printf("\n");
86}
87
88
89/*
90 * currently, it can turn off the display, but the display never comes
91 * back until the machine suspend/resumes :-).
92 */
93void
94apm_display(int fd, int newstate)
95{
96	if (ioctl(fd, APMIO_DISPLAY, &newstate) == -1) {
97		perror(cmdname);
98		exit(1);
99	}
100}
101
102
103extern char *optarg;
104extern int optind;
105
106int
107main(int argc, char *argv[])
108{
109	int	c, fd;
110	int     sleep = 0, all_info = 1, apm_status = 0, batt_status = 0;
111	int     display = 0, batt_life = 0, ac_status = 0;
112
113	if ((cmdname = strrchr(argv[0], '/')) != NULL)
114		cmdname++;
115	else
116		cmdname = argv[0];
117
118	if (strcmp(cmdname, "zzz") == 0) {
119		sleep = 1;
120		all_info = 0;
121		goto finish_option;
122	}
123	while ((c = getopt(argc, argv, "ablszd:")) != EOF) {
124		switch (c) {
125		case 'a':
126			ac_status = 1;
127			all_info = 0;
128			break;
129		case 'b':
130			batt_status = 1;
131			all_info = 0;
132			break;
133		case 'd':
134			display = *optarg - '0';
135			if (display < 0 || display > 1) {
136				fprintf(stderr, "%s: Argument of option '-%c' is invalid.\n", cmdname, c);
137				usage();
138			}
139			display++;
140			all_info = 0;
141			break;
142		case 'l':
143			batt_life = 1;
144			all_info = 0;
145			break;
146		case 's':
147			apm_status = 1;
148			all_info = 0;
149			break;
150		case 'z':
151			sleep = 1;
152			all_info = 0;
153			break;
154		case '?':
155		default:
156			usage();
157		}
158		argc -= optind;
159		argv += optind;
160	}
161finish_option:
162	fd = open(APMDEV, O_RDWR);
163	if (fd == -1) {
164		fprintf(stderr, "%s: Can't open %s.\n", cmdname, APMDEV);
165		return 1;
166	}
167	if (sleep)
168		apm_suspend(fd);
169	else {
170		struct apm_info info;
171
172		apm_getinfo(fd, &info);
173		if (all_info)
174			print_all_info(&info);
175		if (batt_status)
176			printf("%d\n", info.ai_batt_stat);
177		if (batt_life)
178			printf("%d\n", info.ai_batt_life);
179		if (ac_status)
180			printf("%d\n", info.ai_acline);
181		if (apm_status)
182			printf("%d\n", info.ai_status);
183		if (display)
184			apm_display(fd, display - 1);
185	}
186	close(fd);
187	return 0;
188}
189