apm.c revision 8857
13259Sdg/*
23259Sdg * LP (Laptop Package)
33259Sdg *
43259Sdg * Copyright (C) 1994 by HOSOKAWA Tatasumi <hosokawa@mt.cs.keio.ac.jp>
53259Sdg *
63259Sdg * This software may be used, modified, copied, distributed, and sold,
73259Sdg * in both source and binary form provided that the above copyright and
88857Srgrimes * these terms are retained. Under no circumstances is the author
98857Srgrimes * responsible for the proper functioning of this software, nor does
108857Srgrimes * the author assume any responsibility for damages incurred with its
113259Sdg * use.
123259Sdg *
133259Sdg * Sep., 1994	Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD)
143259Sdg */
153259Sdg
163259Sdg#include <stdio.h>
173259Sdg#include <string.h>
183259Sdg#include <sys/file.h>
193259Sdg#include <sys/ioctl.h>
204075Sphk#include <machine/apm_bios.h>
213259Sdg
224062Sphk#define APMDEV	"/dev/apm0"
233259Sdg
243259Sdgint main_argc;
253259Sdgchar **main_argv;
263259Sdg
273259Sdgvoid apm_suspend(int fd)
283259Sdg{
293259Sdg	if (ioctl(fd, APMIO_SUSPEND, NULL) == -1) {
303259Sdg		fprintf(stderr, "%s: ioctl APMIO_SUSPEND failed.\n", main_argv[0]);
313259Sdg		exit(1);
323259Sdg	}
333259Sdg}
343259Sdg
353259Sdgvoid apm_getinfo(int fd, apm_info_t aip)
363259Sdg{
373259Sdg	if (ioctl(fd, APMIO_GETINFO, aip) == -1) {
383259Sdg		fprintf(stderr, "%s: ioctl APMIO_GETINFO failed.\n", main_argv[0]);
393259Sdg		exit(1);
403259Sdg	}
413259Sdg}
423259Sdg
433259Sdgvoid print_all_info(apm_info_t aip)
443259Sdg{
453259Sdg	printf("APM version: %d.%d\n", aip->ai_major, aip->ai_minor);
463259Sdg	printf("AC Line status: ");
473259Sdg	if (aip->ai_acline == 255) {
483259Sdg		printf("unknown");
493259Sdg	}
503259Sdg	else if (aip->ai_acline > 1) {
513259Sdg		printf("invalid value (0x%x)", aip->ai_acline);
523259Sdg	}
533259Sdg	else {
543259Sdg		static char messages[][10] = {"off-line", "on-line"};
553259Sdg		printf("%s", messages[aip->ai_acline]);
563259Sdg	}
573259Sdg	printf("\n");
583259Sdg	printf("Battery status: ");
593259Sdg	if (aip->ai_batt_stat == 255) {
603259Sdg		printf("unknown");
613259Sdg	}
623259Sdg	else if (aip->ai_batt_stat > 3) {
633259Sdg		printf("invalid value (0x%x)", aip->ai_batt_stat);
643259Sdg	}
653259Sdg	else {
663259Sdg		static char messages[][10] = {"high", "low", "critical", "charging"};
673259Sdg		printf("%s", messages[aip->ai_batt_stat]);
683259Sdg	}
693259Sdg	printf("\n");
703259Sdg	printf("Remaining battery life: ");
713259Sdg	if (aip->ai_batt_life == 255) {
723259Sdg		printf("unknown");
733259Sdg	}
743259Sdg	else if (aip->ai_batt_life <= 100) {
753259Sdg		printf("%d%%", aip->ai_batt_life);
763259Sdg	}
773259Sdg	else {
783259Sdg		printf("invalid value (0x%x)", aip->ai_batt_life);
793259Sdg	}
803259Sdg	printf("\n");
813259Sdg}
823259Sdg
833259Sdgint main(int argc, char *argv[])
843259Sdg{
853259Sdg	int i, j, fd;
863259Sdg	int sleep = 0, all_info = 1, batt_status = 0, batt_life = 0, ac_status = 0;
873259Sdg	char *cmdname;
888857Srgrimes
893259Sdg	main_argc = argc;
903259Sdg	main_argv = argv;
913259Sdg	if ((cmdname = strrchr(argv[0], '/')) != NULL) {
923259Sdg		cmdname++;
933259Sdg	}
943259Sdg	else {
953259Sdg		cmdname = argv[0];
963259Sdg	}
973259Sdg
983259Sdg	if (strcmp(cmdname, "zzz") == 0) {
993259Sdg		sleep = 1;
1003259Sdg		all_info = 0;
1013259Sdg		goto finish_option;
1023259Sdg	}
1033259Sdg
1043259Sdg	for (i = argc - 1; i >= 1; i--) {
1053259Sdg		if (argv[i][0] != '-') {
1064062Sphk			fprintf(stderr, "%s: Unknown option '%s'.\n", argv[0], argv[i]);
1074062Sphk			exit(1);
1083259Sdg		}
1093259Sdg		for (j = 1; argv[i][j]; j++) {
1103259Sdg			switch (argv[i][j]) {
1113259Sdg			case 'z':
1123259Sdg				sleep = 1;
1133259Sdg				all_info = 0;
1143259Sdg				break;
1153259Sdg			case 'b':
1163259Sdg				batt_status = 1;
1173259Sdg				all_info = 0;
1183259Sdg				break;
1193259Sdg			case 'a':
1203259Sdg				ac_status = 1;
1213259Sdg				all_info = 0;
1223259Sdg				break;
1233259Sdg			case 'l':
1243259Sdg				batt_life = 1;
1253259Sdg				all_info = 0;
1263259Sdg				break;
1274062Sphk			default:
1284062Sphk				fprintf(stderr, "%s Unknown option '%s'.\n", argv[0], argv[i]);
1294062Sphk				exit(1);
1303259Sdg			}
1313259Sdg		}
1323259Sdg	}
1333259Sdgfinish_option:
1343259Sdg	fd = open(APMDEV, O_RDWR);
1353259Sdg	if (fd == -1) {
1363259Sdg		fprintf(stderr, "%s: Can't open %s.\n", argv[0], APMDEV);
1373259Sdg		return 1;
1383259Sdg	}
1393259Sdg	if (sleep) {
1403259Sdg		apm_suspend(fd);
1413259Sdg	}
1423259Sdg	else {
1433259Sdg		struct apm_info	info;
1443259Sdg
1453259Sdg		apm_getinfo(fd, &info);
1463259Sdg		if (all_info) {
1473259Sdg			print_all_info(&info);
1483259Sdg		}
1493259Sdg		if (batt_status) {
1503259Sdg			printf("%d\n", info.ai_batt_stat);
1513259Sdg		}
1523259Sdg		if (batt_life) {
1533259Sdg			printf("%d\n", info.ai_batt_life);
1543259Sdg		}
1553259Sdg		if (ac_status) {
1563259Sdg			printf("%d\n", info.ai_acline);
1573259Sdg		}
1583259Sdg	}
1593259Sdg	close(fd);
1603259Sdg	return 0;
1613259Sdg}
162