Date: Tue, 18 Jan 2000 01:02:17 -0500 (EST) From: Brian Fundakowski Feldman <green@FreeBSD.org> To: Mike Smith <msmith@freebsd.org> Cc: cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/usr.sbin/apm apm.8 apm.c Message-ID: <Pine.BSF.4.10.10001180101280.1103-100000@green.dyndns.org> In-Reply-To: <200001172320.PAA01112@mass.cdrom.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 17 Jan 2000, Mike Smith wrote:
> Please just merge 'apmconf' and 'apm'.
If you can find someone to clean up the manpage's writing a little
bit, here you go :)
>
> --
> \\ Give a man a fish, and you feed him for a day. \\ Mike Smith
> \\ Tell him he should learn how to fish himself, \\ msmith@freebsd.org
> \\ and he'll hate you for a lifetime. \\ msmith@cdrom.com
--
Brian Fundakowski Feldman \ FreeBSD: The Power to Serve! /
green@FreeBSD.org `------------------------------'
cvs diff: Diffing .
Index: apm.8
===================================================================
RCS file: /usr2/ncvs/src/usr.sbin/apm/apm.8,v
retrieving revision 1.13
diff -u -r1.13 apm.8
--- apm.8 2000/01/16 20:25:57 1.13
+++ apm.8 2000/01/18 06:00:13
@@ -19,8 +19,10 @@
.Nd control the APM BIOS and display its information
.Sh SYNOPSIS
.Nm apm
-.Op Fl abelstzZ
-.Op Fl d Ar 1|0
+.Op Fl ablstzZ
+.Op Fl d Ar enable
+.Op Fl e Ar enable
+.Op Fl h Ar enable
.Op Fl r Ar delta
.Pp
.Nm zzz
@@ -60,17 +62,32 @@
status,
.Dq charging
status respectively.
-.It Fl d
+.It Fl d Ar enable
Disable/enable suspending of the display separately from a normal suspend
-using the values
-.Ar 1
-or
-.Ar 0
-respectively. This argument seems to not work on many different
-laptops, including the Libretto 30CT and 50CT.
-.It Fl e
-Enable APM if it is currently not enabled, or disable APM if it is currently
-enabled.
+using the boolean value for
+.Ar enable .
+Strings evaluated to the boolean true value are "true", "yes", "enable", or
+a non-0 number, all case-insensitive. Conversely, boolean false strings
+are "false", "no", "disable", or 0.
+This feature seems to not work on many different laptops, including the
+Libretto 30CT and 50CT.
+.It Fl e Ar enable
+Enable or disable APM functions of the computer, depending on the boolean
+.Ar enable
+argument.
+.It Fl h Ar enable
+Depending on the boolean value of
+.Ar enable ,
+enable or disable the HLT instruction in the kernel context switch routine.
+These options are not necessary for almost all APM implementations,
+but for some implementations whose
+.Dq Pa Idle CPU
+call executes both CPU clock slowdown and HLT instruction,
+.Fl t
+is necessary to prevent the system from reducing its peak performance.
+See
+.Xr apm 4
+for details.
.It Fl l
Display the remaining battery percentage. If your laptop does not
support this function, 255 is displayed.
Index: apm.c
===================================================================
RCS file: /usr2/ncvs/src/usr.sbin/apm/apm.c,v
retrieving revision 1.21
diff -u -r1.21 apm.c
--- apm.c 2000/01/16 20:25:57 1.21
+++ apm.c 2000/01/18 05:58:15
@@ -46,11 +46,38 @@
usage()
{
fprintf(stderr, "%s\n%s\n",
- "usage: apm [-ablstzZ] [-d 1|0] [-r delta]",
+ "usage: apm [-ablstzZ] [-d enable ] [ -e enable ] "
+ "[ -h enable ] [-r delta]",
" zzz");
exit(1);
}
+/*
+ * Return 1 for boolean true, and 0 for false, according to the
+ * interpretation of the string argument given.
+ */
+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 */
+}
+
int
int2bcd(int i)
{
@@ -89,31 +116,33 @@
apm_suspend(int fd)
{
if (ioctl(fd, APMIO_SUSPEND, NULL) == -1)
- err(1, NULL);
+ err(1, "ioctl(APMIO_SUSPEND)");
}
void
apm_standby(int fd)
{
if (ioctl(fd, APMIO_STANDBY, NULL) == -1)
- err(1, NULL);
+ err(1, "ioctl(APMIO_STANDBY)");
}
void
apm_getinfo(int fd, apm_info_t aip)
{
if (ioctl(fd, APMIO_GETINFO, aip) == -1)
- err(1, NULL);
+ err(1, "ioctl(APMIO_GETINFO)");
}
void
-apm_enable(int fd)
-{
- struct apm_info info;
+apm_enable(int fd, int enable) {
- apm_getinfo(fd, &info);
- if (ioctl(fd, info.ai_status ? APMIO_DISABLE : APMIO_ENABLE) == -1)
- err(1, NULL);
+ 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)");
+ }
}
void
@@ -130,7 +159,7 @@
else if (aip->ai_acline > 1)
printf("invalid value (0x%x)", aip->ai_acline);
else {
- char messages[][10] = {"off-line", "on-line"};
+ char *messages[] = { "off-line", "on-line" };
printf("%s", messages[aip->ai_acline]);
}
printf("\n");
@@ -140,21 +169,20 @@
else if (aip->ai_batt_stat > 3)
printf("invalid value (0x%x)", aip->ai_batt_stat);
else {
- char messages[][10] = {"high", "low", "critical", "charging"};
+ char *messages[] = { "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");
+ printf("unknown\n");
else if (aip->ai_batt_life <= 100)
- printf("%d%%", aip->ai_batt_life);
+ printf("%d%%\n", aip->ai_batt_life);
else
- printf("invalid value (0x%x)", aip->ai_batt_life);
- printf("\n");
+ printf("invalid value (0x%x)\n", aip->ai_batt_life);
printf("Remaining battery time: ");
if (aip->ai_batt_time == -1)
- printf("unknown");
+ printf("unknown\n");
else {
int t, h, m, s;
@@ -164,9 +192,8 @@
m = t % 60;
t /= 60;
h = t;
- printf("%2d:%02d:%02d", h, m, s);
+ printf("%2d:%02d:%02d\n", h, m, s);
}
- printf("\n");
if (aip->ai_infoversion >= 1) {
printf("Number of batteries: ");
if (aip->ai_batteries == (u_int) -1)
@@ -265,10 +292,21 @@
apm_display(int fd, int newstate)
{
if (ioctl(fd, APMIO_DISPLAY, &newstate) == -1)
- err(1, NULL);
+ err(1, "ioctl(APMIO_DISPLAY)");
}
+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)");
+ }
+}
+
void
apm_set_timer(int fd, int delta)
{
@@ -302,8 +340,8 @@
{
int c, fd;
int sleep = 0, all_info = 1, apm_status = 0, batt_status = 0;
- int display = 0, batt_life = 0, ac_status = 0, standby = 0;
- int batt_time = 0, delta = 0, enable = 0;
+ int display = -1, batt_life = 0, ac_status = 0, standby = 0;
+ int batt_time = 0, delta = 0, enable = -1, haltcpu = -1;
char *cmdname;
size_t cmos_wall_len = sizeof(cmos_wall);
@@ -320,7 +358,7 @@
all_info = 0;
goto finish_option;
}
- while ((c = getopt(argc, argv, "abelRr:stzd:Z")) != -1) {
+ while ((c = getopt(argc, argv, "abe:h:lRr:stzd:Z")) != -1) {
switch (c) {
case 'a':
ac_status = 1;
@@ -331,12 +369,7 @@
all_info = 0;
break;
case 'd':
- display = *optarg - '0';
- if (display < 0 || display > 1) {
- warnx("argument of option '-%c' is invalid", c);
- usage();
- }
- display++;
+ display = is_true(optarg);
all_info = 0;
break;
case 'l':
@@ -354,8 +387,11 @@
all_info = 0;
break;
case 'e':
- enable = 1;
+ enable = is_true(optarg);
break;
+ case 'h':
+ haltcpu = is_true(optarg);
+ break;
case 't':
batt_time = 1;
all_info = 0;
@@ -377,12 +413,12 @@
}
finish_option:
fd = open(APMDEV, O_RDWR);
- if (fd == -1) {
- warn("can't open %s", APMDEV);
- return 1;
- }
- if (enable)
- apm_enable(fd);
+ 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 (sleep)
@@ -405,9 +441,9 @@
printf("%d\n", info.ai_status);
if (batt_time)
printf("%d\n", info.ai_batt_time);
- if (display)
- apm_display(fd, display - 1);
+ if (display != -1)
+ apm_display(fd, display);
}
close(fd);
- return 0;
+ exit(0);
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.10.10001180101280.1103-100000>
