diff options
Diffstat (limited to 'usr.sbin/apm/apm.c')
-rw-r--r-- | usr.sbin/apm/apm.c | 490 |
1 files changed, 0 insertions, 490 deletions
diff --git a/usr.sbin/apm/apm.c b/usr.sbin/apm/apm.c deleted file mode 100644 index b4c34ab..0000000 --- a/usr.sbin/apm/apm.c +++ /dev/null @@ -1,490 +0,0 @@ -/* - * APM BIOS utility for FreeBSD - * - * Copyright (C) 1994-1996 by Tatsumi Hosokawa <hosokawa@jp.FreeBSD.org> - * - * 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 <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/file.h> -#include <sys/ioctl.h> -#include <sys/types.h> -#include <sys/sysctl.h> - -#include <machine/apm_bios.h> - -#include <err.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <unistd.h> - -#define APMDEV "/dev/apm" - -#define APM_UNKNOWN 255 - -#define xh(a) (((a) & 0xff00) >> 8) -#define xl(a) ((a) & 0xff) -#define APMERR(a) xh(a) - -int cmos_wall = 0; /* True when wall time is in cmos clock, else UTC */ - -static void -usage(void) -{ - fprintf(stderr, - "usage: apm [-ablstzZ] [-d enable ] [ -e enable ] " - "[ -h enable ] [-r delta]\n"); - exit(1); -} - -/* - * Return 1 for boolean true, and 0 for false, according to the - * interpretation of the string argument given. - */ -static int -is_true(const char *boolean) -{ - char *endp; - long val; - - val = strtoul(boolean, &endp, 0); - if (*endp == '\0') - return (val != 0 ? 1 : 0); - if (strcasecmp(boolean, "true") == 0 || - strcasecmp(boolean, "yes") == 0 || - strcasecmp(boolean, "enable") == 0) - return (1); - if (strcasecmp(boolean, "false") == 0 || - strcasecmp(boolean, "no") == 0 || - strcasecmp(boolean, "disable") == 0) - return (0); - /* Well, I have no idea what the user wants, so... */ - warnx("invalid boolean argument \"%s\"", boolean); - usage(); - /* NOTREACHED */ - - return (0); -} - -static int -int2bcd(int i) -{ - int retval = 0; - int base = 0; - - if (i >= 10000) - return -1; - - while (i) { - retval |= (i % 10) << base; - i /= 10; - base += 4; - } - return retval; -} - -static int -bcd2int(int bcd) -{ - int retval = 0; - int place = 1; - - if (bcd > 0x9999) - return -1; - - while (bcd) { - retval += (bcd & 0xf) * place; - bcd >>= 4; - place *= 10; - } - return retval; -} - -static void -apm_suspend(int fd) -{ - if (ioctl(fd, APMIO_SUSPEND, NULL) == -1) - err(1, "ioctl(APMIO_SUSPEND)"); -} - -static void -apm_standby(int fd) -{ - if (ioctl(fd, APMIO_STANDBY, NULL) == -1) - err(1, "ioctl(APMIO_STANDBY)"); -} - -static void -apm_getinfo(int fd, apm_info_t aip) -{ - if (ioctl(fd, APMIO_GETINFO, aip) == -1) - err(1, "ioctl(APMIO_GETINFO)"); -} - -static void -apm_enable(int fd, int enable) -{ - if (enable) { - if (ioctl(fd, APMIO_ENABLE) == -1) - err(1, "ioctl(APMIO_ENABLE)"); - } else { - if (ioctl(fd, APMIO_DISABLE) == -1) - err(1, "ioctl(APMIO_DISABLE)"); - } -} - -static void -print_batt_time(int batt_time) -{ - printf("Remaining battery time: "); - if (batt_time == -1) - printf("unknown\n"); - else { - int h, m, s; - - h = batt_time; - s = h % 60; - h /= 60; - m = h % 60; - h /= 60; - printf("%2d:%02d:%02d\n", h, m, s); - } -} - -static void -print_batt_life(u_int batt_life) -{ - printf("Remaining battery life: "); - if (batt_life == APM_UNKNOWN) - printf("unknown\n"); - else if (batt_life <= 100) - printf("%d%%\n", batt_life); - else - printf("invalid value (0x%x)\n", batt_life); -} - -static void -print_batt_stat(u_int batt_stat) -{ - const char *batt_msg[] = { "high", "low", "critical", "charging" }; - - printf("Battery Status: "); - if (batt_stat == APM_UNKNOWN) - printf("unknown\n"); - else if (batt_stat > 3) - printf("invalid value (0x%x)\n", batt_stat); - else - printf("%s\n", batt_msg[batt_stat]); -} - -static void -print_all_info(int fd, apm_info_t aip, int bioscall_available) -{ - struct apm_bios_arg args; - int apmerr; - const char *line_msg[] = { "off-line", "on-line" , "backup power"}; - - printf("APM version: %d.%d\n", aip->ai_major, aip->ai_minor); - printf("APM Management: %s\n", aip->ai_status ? "Enabled" : "Disabled"); - printf("AC Line status: "); - if (aip->ai_acline == APM_UNKNOWN) - printf("unknown\n"); - else if (aip->ai_acline > 2) - printf("invalid value (0x%x)\n", aip->ai_acline); - else - printf("%s\n", line_msg[aip->ai_acline]); - - print_batt_stat(aip->ai_batt_stat); - print_batt_life(aip->ai_batt_life); - print_batt_time(aip->ai_batt_time); - - if (aip->ai_infoversion >= 1) { - printf("Number of batteries: "); - if (aip->ai_batteries == ~0U) - printf("unknown\n"); - else { - u_int i; - struct apm_pwstatus aps; - - printf("%d\n", aip->ai_batteries); - for (i = 0; i < aip->ai_batteries; ++i) { - bzero(&aps, sizeof(aps)); - aps.ap_device = PMDV_BATT0 + i; - if (ioctl(fd, APMIO_GETPWSTATUS, &aps) == -1) - continue; - printf("Battery %d:\n", i); - if (aps.ap_batt_flag & APM_BATT_NOT_PRESENT) { - printf("not present\n"); - continue; - } - printf("\t"); - print_batt_stat(aps.ap_batt_stat); - printf("\t"); - print_batt_life(aps.ap_batt_life); - printf("\t"); - print_batt_time(aps.ap_batt_time); - } - } - } - - if (bioscall_available) { - /* - * try to get the suspend timer - */ - bzero(&args, sizeof(args)); - args.eax = (APM_BIOS) << 8 | APM_RESUMETIMER; - args.ebx = PMDV_APMBIOS; - args.ecx = 0x0001; - if (ioctl(fd, APMIO_BIOS, &args)) { - printf("Resume timer: unknown\n"); - } else { - apmerr = APMERR(args.eax); - if (apmerr == 0x0d || apmerr == 0x86) - printf("Resume timer: disabled\n"); - else if (apmerr) - warnx( - "failed to get the resume timer: APM error0x%x", apmerr); - else { - /* - * OK. We have the time (all bcd). - * CH - seconds - * DH - hours - * DL - minutes - * xh(SI) - month (1-12) - * xl(SI) - day of month (1-31) - * DI - year - */ - struct tm tm; - char buf[1024]; - time_t t; - - tm.tm_sec = bcd2int(xh(args.ecx)); - tm.tm_min = bcd2int(xl(args.edx)); - tm.tm_hour = bcd2int(xh(args.edx)); - tm.tm_mday = bcd2int(xl(args.esi)); - tm.tm_mon = bcd2int(xh(args.esi)) - 1; - tm.tm_year = bcd2int(args.edi) - 1900; - if (cmos_wall) - t = mktime(&tm); - else - t = timegm(&tm); - if (t != -1) { - tm = *localtime(&t); - strftime(buf, sizeof(buf), "%c", &tm); - printf("Resume timer: %s\n", buf); - } else - printf("Resume timer: unknown\n"); - } - } - - /* - * Get the ring indicator resume state - */ - bzero(&args, sizeof(args)); - args.eax = (APM_BIOS) << 8 | APM_RESUMEONRING; - args.ebx = PMDV_APMBIOS; - args.ecx = 0x0002; - if (ioctl(fd, APMIO_BIOS, &args) == 0) { - printf("Resume on ring indicator: %sabled\n", - args.ecx ? "en" : "dis"); - } - } - - if (aip->ai_infoversion >= 1) { - if (aip->ai_capabilities == 0xff00) - return; - printf("APM Capabilities:\n"); - if (aip->ai_capabilities & 0x01) - printf("\tglobal standby state\n"); - if (aip->ai_capabilities & 0x02) - printf("\tglobal suspend state\n"); - if (aip->ai_capabilities & 0x04) - printf("\tresume timer from standby\n"); - if (aip->ai_capabilities & 0x08) - printf("\tresume timer from suspend\n"); - if (aip->ai_capabilities & 0x10) - printf("\tRI resume from standby\n"); - if (aip->ai_capabilities & 0x20) - printf("\tRI resume from suspend\n"); - if (aip->ai_capabilities & 0x40) - printf("\tPCMCIA RI resume from standby\n"); - if (aip->ai_capabilities & 0x80) - printf("\tPCMCIA RI resume from suspend\n"); - } - -} - -/* - * currently, it can turn off the display, but the display never comes - * back until the machine suspend/resumes :-). - */ -static void -apm_display(int fd, int newstate) -{ - if (ioctl(fd, APMIO_DISPLAY, &newstate) == -1) - err(1, "ioctl(APMIO_DISPLAY)"); -} - -static void -apm_haltcpu(int fd, int enable) -{ - if (enable) { - if (ioctl(fd, APMIO_HALTCPU, NULL) == -1) - err(1, "ioctl(APMIO_HALTCPU)"); - } else { - if (ioctl(fd, APMIO_NOTHALTCPU, NULL) == -1) - err(1, "ioctl(APMIO_NOTHALTCPU)"); - } -} - -static void -apm_set_timer(int fd, int delta) -{ - time_t tmr; - struct tm *tm; - struct apm_bios_arg args; - - tmr = time(NULL) + delta; - if (cmos_wall) - tm = localtime(&tmr); - else - tm = gmtime(&tmr); - bzero(&args, sizeof(args)); - args.eax = (APM_BIOS) << 8 | APM_RESUMETIMER; - args.ebx = PMDV_APMBIOS; - if (delta > 0) { - args.ecx = (int2bcd(tm->tm_sec) << 8) | 0x02; - args.edx = (int2bcd(tm->tm_hour) << 8) | int2bcd(tm->tm_min); - args.esi = (int2bcd(tm->tm_mon + 1) << 8) | int2bcd(tm->tm_mday); - args.edi = int2bcd(tm->tm_year + 1900); - } else { - args.ecx = 0x0000; - } - if (ioctl(fd, APMIO_BIOS, &args)) { - err(1,"set resume timer"); - } -} - -int -main(int argc, char *argv[]) -{ - int c, fd; - int dosleep = 0, all_info = 1, apm_status = 0, batt_status = 0; - int display = -1, batt_life = 0, ac_status = 0, standby = 0; - int batt_time = 0, delta = 0, enable = -1, haltcpu = -1; - int bioscall_available = 0; - size_t cmos_wall_len = sizeof(cmos_wall); - - if (sysctlbyname("machdep.wall_cmos_clock", &cmos_wall, &cmos_wall_len, - NULL, 0) == -1) - err(1, "sysctlbyname(machdep.wall_cmos_clock)"); - - while ((c = getopt(argc, argv, "abe:h:lRr:stzd:Z")) != -1) { - switch (c) { - case 'a': - ac_status = 1; - all_info = 0; - break; - case 'b': - batt_status = 1; - all_info = 0; - break; - case 'd': - display = is_true(optarg); - all_info = 0; - break; - case 'l': - batt_life = 1; - all_info = 0; - break; - case 'R': - delta = -1; - break; - case 'r': - delta = atoi(optarg); - break; - case 's': - apm_status = 1; - all_info = 0; - break; - case 'e': - enable = is_true(optarg); - all_info = 0; - break; - case 'h': - haltcpu = is_true(optarg); - all_info = 0; - break; - case 't': - batt_time = 1; - all_info = 0; - break; - case 'z': - dosleep = 1; - all_info = 0; - break; - case 'Z': - standby = 1; - all_info = 0; - break; - case '?': - default: - usage(); - } - argc -= optind; - argv += optind; - } - if (haltcpu != -1 || enable != -1 || display != -1 || delta || dosleep - || standby) { - fd = open(APMDEV, O_RDWR); - bioscall_available = 1; - } else if ((fd = open(APMDEV, O_RDWR)) >= 0) - bioscall_available = 1; - else - fd = open(APMDEV, O_RDONLY); - if (fd == -1) - err(1, "can't open %s", APMDEV); - if (enable != -1) - apm_enable(fd, enable); - if (haltcpu != -1) - apm_haltcpu(fd, haltcpu); - if (delta) - apm_set_timer(fd, delta); - if (dosleep) - apm_suspend(fd); - else if (standby) - apm_standby(fd); - else if (delta == 0) { - struct apm_info info; - - apm_getinfo(fd, &info); - if (all_info) - print_all_info(fd, &info, bioscall_available); - if (ac_status) - printf("%d\n", info.ai_acline); - if (batt_status) - printf("%d\n", info.ai_batt_stat); - if (batt_life) - printf("%d\n", info.ai_batt_life); - if (apm_status) - printf("%d\n", info.ai_status); - if (batt_time) - printf("%d\n", info.ai_batt_time); - if (display != -1) - apm_display(fd, display); - } - close(fd); - exit(0); -} |