diff --git a/usr.sbin/apm/apm.8 b/usr.sbin/apm/apm.8 index 0cde3794a900..f30cd23481e4 100644 --- a/usr.sbin/apm/apm.8 +++ b/usr.sbin/apm/apm.8 @@ -16,11 +16,8 @@ .Nd control the APM BIOS and display its information .Sh SYNOPSIS .Nm apm -.Op Fl z -.Op Fl b -.Op Fl a -.Op Fl l -.Op Fl s +.Op Fl ablsz +.Op Fl d Ar 1|0 .Pp .Nm zzz .Sh DESCRIPTION @@ -39,10 +36,13 @@ If no options are specified, .Nm apm displays information and current status of APM in verbose mode. .Bl -tag -width indent -.It Fl z -Suspend the system. It is equivalent to -.Nm zzz. -.Pp +.It Fl a +Display the current AC-line status as an integer value. The values +0 and 1 correspond to the +.Dq off-line +state or +.Dq on-line +state, respectively. .It Fl b Display an integer value reflecting the current battery status. The values 0, 1, 2, 3, correspond to the @@ -54,19 +54,16 @@ status, status, .Dq charging status respectively. -.Pp -.It Fl a -Display the current AC-line status as an integer value. The values -0 and 1 correspond to the -.Dq off-line -state or -.Dq on-line -state, respectively. -.Pp +.It Fl d +Disable/enable suspending of the display separately from a normal suspend +using using the values +.Ar 1 +or +.Ar 0 +respectively. .It Fl l Display the remaining battery percentage. If your laptop does not support this function, 255 is displayed. -.Pp .It Fl s Display the status of the APM support as an integer value. The values 0 and 1 correspond to the @@ -74,6 +71,9 @@ Display the status of the APM support as an integer value. The values state or .Dq disabled state respecitively +.It Fl z +Suspend the system. It is equivalent to +.Nm zzz. .Sh BUGS Some APM implementations do not support parameters needed by .Nm apm. diff --git a/usr.sbin/apm/apm.c b/usr.sbin/apm/apm.c index 0d19ec80f77b..b21f6b126c89 100644 --- a/usr.sbin/apm/apm.c +++ b/usr.sbin/apm/apm.c @@ -1,7 +1,7 @@ /* - * LP (Laptop Package) + * apm / zzz APM BIOS utility for FreeBSD * - * Copyright (C) 1994 by HOSOKAWA Tatasumi + * Copyright (C) 1994-1996 by HOSOKAWA Tatasumi * * This software may be used, modified, copied, distributed, and sold, * in both source and binary form provided that the above copyright and @@ -14,153 +14,174 @@ */ #include +#include #include #include #include +#include #include #define APMDEV "/dev/apm" -int main_argc; -char **main_argv; +static char *cmdname; -void apm_suspend(int fd) +void +usage() +{ + fprintf(stderr, "usage: %s [-ablsz] [-d 1|0]\n", cmdname); + exit(1); +} + +void +apm_suspend(int fd) { if (ioctl(fd, APMIO_SUSPEND, NULL) == -1) { - fprintf(stderr, "%s: ioctl APMIO_SUSPEND failed.\n", main_argv[0]); + perror(cmdname); exit(1); } } -void apm_getinfo(int fd, apm_info_t aip) +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]); + perror(cmdname); exit(1); } } -void print_all_info(apm_info_t aip) +void +print_all_info(apm_info_t aip) { printf("APM version: %d.%d\n", aip->ai_major, aip->ai_minor); - printf("APM Managment: %s\n", (aip->ai_status ? "Enabled": "Disabled")); + printf("APM Managment: %s\n", (aip->ai_status ? "Enabled" : "Disabled")); printf("AC Line status: "); - if (aip->ai_acline == 255) { + if (aip->ai_acline == 255) printf("unknown"); - } - else if (aip->ai_acline > 1) { + 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) { + 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 if (aip->ai_batt_stat > 3) + printf("invalid value (0x%x)", aip->ai_batt_stat); else { - static char messages[][10] = {"high", "low", "critical", "charging"}; + 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) { + if (aip->ai_batt_life == 255) printf("unknown"); - } - else if (aip->ai_batt_life <= 100) { - printf("%d%%", aip->ai_batt_life); - } - else { + 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, apm_status = 0, batt_status = 0, batt_life = 0, ac_status = 0; - char *cmdname; - main_argc = argc; - main_argv = argv; - if ((cmdname = strrchr(argv[0], '/')) != NULL) { +/* + * currently, it can turn off the display, but the display never comes + * back until the machine suspend/resumes :-). + */ +void +apm_display(int fd, int newstate) +{ + if (ioctl(fd, APMIO_DISPLAY, &newstate) == -1) { + perror(cmdname); + exit(1); + } +} + + +extern char *optarg; +extern int optind; + +int +main(int argc, char *argv[]) +{ + int c, fd; + int sleep = 0, all_info = 1, apm_status = 0, batt_status = 0; + int display = 0, batt_life = 0, ac_status = 0; + + if ((cmdname = strrchr(argv[0], '/')) != NULL) cmdname++; - } - else { + 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'.\n", argv[0], argv[i]); - exit(1); - } - 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; - case 's': - apm_status = 1; - all_info = 0; - break; - default: - fprintf(stderr, "%s Unknown option '%s'.\n", argv[0], argv[i]); - exit(1); + while ((c = getopt(argc, argv, "ablszd:")) != EOF) { + switch (c) { + case 'a': + ac_status = 1; + all_info = 0; + break; + case 'b': + batt_status = 1; + all_info = 0; + break; + case 'd': + display = *optarg - '0'; + if (display < 0 || display > 1) { + fprintf(stderr, "%s: Argument of option '-%c' is invalid.\n", cmdname, c); + usage(); } + display++; + all_info = 0; + break; + case 'l': + batt_life = 1; + all_info = 0; + break; + case 's': + apm_status = 1; + all_info = 0; + break; + case 'z': + sleep = 1; + all_info = 0; + break; + case '?': + default: + usage(); } + argc -= optind; + argv += optind; } finish_option: fd = open(APMDEV, O_RDWR); if (fd == -1) { - fprintf(stderr, "%s: Can't open %s.\n", argv[0], APMDEV); + fprintf(stderr, "%s: Can't open %s.\n", cmdname, APMDEV); return 1; } - if (sleep) { + if (sleep) apm_suspend(fd); - } else { - struct apm_info info; + else { + struct apm_info info; apm_getinfo(fd, &info); - if (all_info) { + if (all_info) print_all_info(&info); - } - if (batt_status) { + if (batt_status) printf("%d\n", info.ai_batt_stat); - } - if (batt_life) { + if (batt_life) printf("%d\n", info.ai_batt_life); - } - if (ac_status) { + if (ac_status) printf("%d\n", info.ai_acline); - } - if (apm_status) { + if (apm_status) printf("%d\n", info.ai_status); - } + if (display) + apm_display(fd, display - 1); } close(fd); return 0;