diff options
author | dg <dg@FreeBSD.org> | 1994-10-01 03:23:33 +0000 |
---|---|---|
committer | dg <dg@FreeBSD.org> | 1994-10-01 03:23:33 +0000 |
commit | 76254fd53b03ef561f2fbc001fed1fb0499ae755 (patch) | |
tree | b6f3ca9c4d755c2750dd52bc1d57939b76613693 /usr.sbin/apm/apm.c | |
parent | b329c8342570e9501a8be46799c51d49939ba5b7 (diff) | |
download | FreeBSD-src-76254fd53b03ef561f2fbc001fed1fb0499ae755.zip FreeBSD-src-76254fd53b03ef561f2fbc001fed1fb0499ae755.tar.gz |
Laptop Advanced Power Management support (userland end) by HOSOKAWA Tatsumi.
Submitted by: HOSOKAWA Tatsumi
Diffstat (limited to 'usr.sbin/apm/apm.c')
-rw-r--r-- | usr.sbin/apm/apm.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/usr.sbin/apm/apm.c b/usr.sbin/apm/apm.c new file mode 100644 index 0000000..e2e1224 --- /dev/null +++ b/usr.sbin/apm/apm.c @@ -0,0 +1,157 @@ +/* + * LP (Laptop Package) + * + * Copyright (C) 1994 by HOSOKAWA Tatasumi <hosokawa@mt.cs.keio.ac.jp> + * + * This software may be used, modified, copied, distributed, and sold, + * in both source and binary form provided that the above copyright and + * these terms are retained. Under no circumstances is the author + * responsible for the proper functioning of this software, nor does + * the author assume any responsibility for damages incurred with its + * use. + * + * Sep., 1994 Implemented on FreeBSD 1.1.5.1R (Toshiba AVS001WD) + */ + +#include <stdio.h> +#include <string.h> +#include <sys/file.h> +#include <sys/ioctl.h> +#include <machine/apm_bios.h> + +#define APMDEV "/dev/apm" + +int main_argc; +char **main_argv; + +void apm_suspend(int fd) +{ + if (ioctl(fd, APMIO_SUSPEND, NULL) == -1) { + fprintf(stderr, "%s: ioctl APMIO_SUSPEND failed.\n", main_argv[0]); + exit(1); + } +} + +void apm_getinfo(int fd, apm_info_t aip) +{ + if (ioctl(fd, APMIO_GETINFO, aip) == -1) { + fprintf(stderr, "%s: ioctl APMIO_GETINFO failed.\n", main_argv[0]); + exit(1); + } +} + +void print_all_info(apm_info_t aip) +{ + printf("APM version: %d.%d\n", aip->ai_major, aip->ai_minor); + printf("AC Line status: "); + if (aip->ai_acline == 255) { + printf("unknown"); + } + else if (aip->ai_acline > 1) { + printf("invalid value (0x%x)", aip->ai_acline); + } + else { + static char messages[][10] = {"off-line", "on-line"}; + printf("%s", messages[aip->ai_acline]); + } + printf("\n"); + printf("Battery status: "); + if (aip->ai_batt_stat == 255) { + printf("unknown"); + } + else if (aip->ai_batt_stat > 3) { + printf("invalid value (0x%x)", aip->ai_batt_stat); + } + else { + static char messages[][10] = {"high", "low", "critical", "charging"}; + printf("%s", messages[aip->ai_batt_stat]); + } + printf("\n"); + printf("Remaining battery life: "); + if (aip->ai_batt_life == 255) { + printf("unknown"); + } + else if (aip->ai_batt_life <= 100) { + printf("%d%%", aip->ai_batt_life); + } + else { + printf("invalid value (0x%x)", aip->ai_batt_life); + } + printf("\n"); +} + +int main(int argc, char *argv[]) +{ + int i, j, fd; + int sleep = 0, all_info = 1, batt_status = 0, batt_life = 0, ac_status = 0; + char *cmdname; + + main_argc = argc; + main_argv = argv; + if ((cmdname = strrchr(argv[0], '/')) != NULL) { + cmdname++; + } + else { + cmdname = argv[0]; + } + + if (strcmp(cmdname, "zzz") == 0) { + sleep = 1; + all_info = 0; + goto finish_option; + } + + for (i = argc - 1; i >= 1; i--) { + if (argv[i][0] != '-') { + fprintf(stderr, "%s: Unknown option '%s'.", argv[0], argv[i]); + } + for (j = 1; argv[i][j]; j++) { + switch (argv[i][j]) { + case 'z': + sleep = 1; + all_info = 0; + break; + case 'b': + batt_status = 1; + all_info = 0; + break; + case 'a': + ac_status = 1; + all_info = 0; + break; + case 'l': + batt_life = 1; + all_info = 0; + break; + } + } + } +finish_option: + fd = open(APMDEV, O_RDWR); + if (fd == -1) { + fprintf(stderr, "%s: Can't open %s.\n", argv[0], APMDEV); + return 1; + } + if (sleep) { + apm_suspend(fd); + } + else { + struct apm_info info; + + apm_getinfo(fd, &info); + if (all_info) { + print_all_info(&info); + } + if (batt_status) { + printf("%d\n", info.ai_batt_stat); + } + if (batt_life) { + printf("%d\n", info.ai_batt_life); + } + if (ac_status) { + printf("%d\n", info.ai_acline); + } + } + close(fd); + return 0; +} |