APM Patch - review
Liam J. Foy
liamfoy at sepulcrum.org
Tue May 25 13:13:42 PDT 2004
Hey guys,
Just writing to request your views on a patch I have wrote for apm. This patch makes sure single options such as apm -l have their values checked. The print_all_info function seems to do this, so I imagine it should be done for single options also. The single options will return 255 when device is unsupported, -1 when an invalid value and anything else is the correct value.
I would love any feedback.
Thanks guys, Liam Foy
--- /usr/src/usr.sbin/apm/apm.c Sat May 22 17:18:57 2004
+++ /hd3/apm/apm.c Tue May 25 20:24:39 2004
@@ -33,6 +33,8 @@
#include <unistd.h>
#define APMDEV "/dev/apm"
+#define UNKNOWN 255 /* Unknown/unsupported by device */
+#define INVALID -1 /* We return -1 on invalid values for single options */
#define xh(a) (((a) & 0xff00) >> 8)
#define xl(a) ((a) & 0xff)
@@ -143,55 +145,137 @@
}
}
-void
-print_all_info(int fd, apm_info_t aip, int bioscall_available)
+void
+print_batt_acline(u_int acline, int return_choice)
{
- struct apm_bios_arg args;
- int apmerr;
-
- 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 == 255)
- printf("unknown");
- else if (aip->ai_acline > 1)
- printf("invalid value (0x%x)", aip->ai_acline);
+ if (acline == UNKNOWN)
+ if (return_choice)
+ printf("unknown\n");
+ else
+ printf("%d\n", UNKNOWN);
+ else if (acline > 1)
+ if (return_choice)
+ printf("invalid value 0x%x (%d)\n", acline, acline);
+ else
+ printf("%d\n", INVALID);
else {
- char *messages[] = { "off-line", "on-line" };
- printf("%s", messages[aip->ai_acline]);
+ if (return_choice) {
+ char *messages[] = { "off-line", "on-line" };
+ printf("%s\n", messages[acline]);
+ } else
+ printf("%d\n", 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);
+}
+
+void
+print_batt_stat(u_int batt_stat, int return_choice)
+{
+ if (batt_stat == UNKNOWN)
+ if (return_choice)
+ printf("unknown\n");
+ else
+ printf("%d\n", UNKNOWN);
+ else if (batt_stat > 3)
+ if (return_choice)
+ printf("invalid value 0x%x (%d)\n", batt_stat, batt_stat);
+ else
+ printf("%d\n", INVALID);
else {
- char *messages[] = { "high", "low", "critical", "charging" };
- printf("%s", messages[aip->ai_batt_stat]);
+ if (return_choice) {
+ char *messages[] = { "high", "low", "critical", "charging" };
+ printf("%s\n", messages[batt_stat]);
+ } else
+ printf("%d\n", batt_stat);
}
- printf("\n");
- printf("Remaining battery life: ");
- if (aip->ai_batt_life == 255)
- printf("unknown\n");
- else if (aip->ai_batt_life <= 100)
- printf("%d%%\n", aip->ai_batt_life);
+}
+
+void
+print_batt_life(u_int batt_life, int return_choice)
+{
+ if (batt_life == UNKNOWN)
+ if (return_choice)
+ printf("unknown\n");
+ else
+ printf("%d\n", UNKNOWN);
+ else if (batt_life >= 0 && batt_life <= 100)
+ if (return_choice)
+ printf("%d%%\n", batt_life);
+ else
+ printf("%d\n", batt_life);
else
- printf("invalid value (0x%x)\n", aip->ai_batt_life);
- printf("Remaining battery time: ");
- if (aip->ai_batt_time == -1)
- printf("unknown\n");
+ if (return_choice)
+ printf("invalid value 0x%x (%d)\n", batt_life, batt_life);
+ else
+ printf("%d\n", INVALID);
+}
+
+void
+print_batt_time(int time_seconds,int return_choice)
+{
+ if (time_seconds == -1)
+ if (return_choice)
+ printf("unknown\n");
+ else
+ printf("%d\n", UNKNOWN);
else {
int t, h, m, s;
-
- t = aip->ai_batt_time;
+
+ t = time_seconds;
s = t % 60;
t /= 60;
m = t % 60;
t /= 60;
h = t;
- printf("%2d:%02d:%02d\n", h, m, s);
+
+ if (return_choice)
+ printf("%2d:%02d:%02d\n", h, m, s);
+ else
+ printf("%d\n", time_seconds);
}
+}
+
+void
+print_apm_status(u_int apm_status, int return_choice)
+{
+ if (apm_status == 1)
+ if (return_choice)
+ printf("enabled\n");
+ else
+ printf("%d\n", apm_status);
+ else if (apm_status == 0)
+ if(return_choice)
+ printf("disabled\n");
+ else
+ printf("%d\n", apm_status);
+ else
+ if (return_choice)
+ printf("invalid value 0x%x (%d)\n", apm_status, apm_status);
+ else
+ printf("%d\n", INVALID);
+}
+
+void
+print_all_info(int fd, apm_info_t aip, int bioscall_available)
+{
+ struct apm_bios_arg args;
+ int apmerr;
+
+ printf("APM version: %d.%d\n", aip->ai_major, aip->ai_minor);
+ printf("APM Management: ");
+ print_apm_status(aip->ai_status, 1);
+
+ printf("AC Line status: ");
+ print_batt_acline(aip->ai_acline, 1);
+
+ printf("Battery status: ");
+ print_batt_stat(aip->ai_batt_stat, 1);
+
+ printf("Remaining battery life: ");
+ print_batt_life(aip->ai_batt_life, 1);
+
+ printf("Remaining battery time: ");
+ print_batt_time(aip->ai_batt_time, 1);
+
if (aip->ai_infoversion >= 1) {
printf("Number of batteries: ");
if (aip->ai_batteries == (u_int) -1)
@@ -208,46 +292,19 @@
continue;
printf("Battery %d:\n", i);
printf("\tBattery status: ");
- if (aps.ap_batt_flag != 255 &&
+ if (aps.ap_batt_flag != UNKNOWN &&
(aps.ap_batt_flag & APM_BATT_NOT_PRESENT)) {
printf("not present\n");
continue;
}
- if (aps.ap_batt_stat == 255)
- printf("unknown\n");
- else if (aps.ap_batt_stat > 3)
- printf("invalid value (0x%x)\n",
- aps.ap_batt_stat);
- else {
- char *messages[] = { "high",
- "low",
- "critical",
- "charging" };
- printf("%s\n",
- messages[aps.ap_batt_stat]);
- }
+
+ print_batt_stat(aps.ap_batt_stat, 1);
+
printf("\tRemaining battery life: ");
- if (aps.ap_batt_life == 255)
- printf("unknown\n");
- else if (aps.ap_batt_life <= 100)
- printf("%d%%\n", aps.ap_batt_life);
- else
- printf("invalid value (0x%x)\n",
- aps.ap_batt_life);
+ print_batt_life(aps.ap_batt_life, 1);
+
printf("\tRemaining battery time: ");
- if (aps.ap_batt_time == -1)
- printf("unknown\n");
- else {
- int t, h, m, s;
-
- t = aps.ap_batt_time;
- s = t % 60;
- t /= 60;
- m = t % 60;
- t /= 60;
- h = t;
- printf("%2d:%02d:%02d\n", h, m, s);
- }
+ print_batt_time(aps.ap_batt_time, 1);
}
}
}
@@ -496,19 +553,18 @@
if (all_info)
print_all_info(fd, &info, bioscall_available);
if (ac_status)
- printf("%d\n", info.ai_acline);
+ print_batt_acline(info.ai_acline, 0);
if (batt_status)
- printf("%d\n", info.ai_batt_stat);
+ print_batt_stat(info.ai_batt_stat, 0);
if (batt_life)
- printf("%d\n", info.ai_batt_life);
+ print_batt_life(info.ai_batt_life, 0);
if (apm_status)
- printf("%d\n", info.ai_status);
+ print_apm_status(info.ai_status, 0);
if (batt_time)
- printf("%d\n", info.ai_batt_time);
+ print_batt_time(info.ai_batt_time, 0);
if (display != -1)
apm_display(fd, display);
}
close(fd);
exit(0);
}
-
More information about the freebsd-acpi
mailing list