summaryrefslogtreecommitdiffstats
path: root/usr.sbin/apm
diff options
context:
space:
mode:
authornate <nate@FreeBSD.org>1997-01-06 06:04:42 +0000
committernate <nate@FreeBSD.org>1997-01-06 06:04:42 +0000
commit11d26897a2af3db21563cafdf547d2cff0ddddb5 (patch)
treeb7400e04cf48093b0c3d28447ac7f53885347cb0 /usr.sbin/apm
parentf22ea79edc9966db370846b7a2c1e816e028a79c (diff)
downloadFreeBSD-src-11d26897a2af3db21563cafdf547d2cff0ddddb5.zip
FreeBSD-src-11d26897a2af3db21563cafdf547d2cff0ddddb5.tar.gz
Re-write the driver to use getopt(), add the new display suspend
function of the kernel, and other assorted misc. cleanups. Submitted by: nate & HOSOKAWA, Tatsumi <hosokawa@jp.FreeBSD.org>
Diffstat (limited to 'usr.sbin/apm')
-rw-r--r--usr.sbin/apm/apm.838
-rw-r--r--usr.sbin/apm/apm.c183
2 files changed, 121 insertions, 100 deletions
diff --git a/usr.sbin/apm/apm.8 b/usr.sbin/apm/apm.8
index 0cde379..f30cd23 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 0d19ec8..b21f6b1 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 <hosokawa@mt.cs.keio.ac.jp>
+ * Copyright (C) 1994-1996 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
@@ -14,153 +14,174 @@
*/
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <sys/file.h>
#include <sys/ioctl.h>
+#include <unistd.h>
#include <machine/apm_bios.h>
#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[])
+
+/*
+ * 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 i, j, fd;
- int sleep = 0, all_info = 1, apm_status = 0, batt_status = 0, batt_life = 0, ac_status = 0;
- char *cmdname;
+ int c, fd;
+ int sleep = 0, all_info = 1, apm_status = 0, batt_status = 0;
+ int display = 0, batt_life = 0, ac_status = 0;
- main_argc = argc;
- main_argv = argv;
- if ((cmdname = strrchr(argv[0], '/')) != NULL) {
+ 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;
OpenPOWER on IntegriCloud