Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 May 2004 21:12:20 +0100
From:      "Liam J. Foy" <liamfoy@sepulcrum.org>
To:        freebsd-acpi@freebsd.org
Subject:   APM Patch - review
Message-ID:  <20040525211220.6f349011.liamfoy@sepulcrum.org>

next in thread | raw e-mail | index | archive | help
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);
 }
-



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040525211220.6f349011.liamfoy>