- state = sysctl_rslt;
- if (state == 0 && present_rate == 100)
- status = CS_FULL;
- else if (state == 0 && present_rate < 100)
- status = CS_CHARGING;
- else
- status = CS_DISCHARGING;
-
- full_design = sysctl_rslt;
-
- (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
-
- (void)snprintf(percentagebuf, sizeof(percentagebuf), "%02d%%",
- present_rate);
-
- if (state == 1) {
- int hours, minutes;
- minutes = remaining;
- hours = minutes / 60;
- minutes -= (hours * 60);
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02dh%02d",
- max(hours, 0), max(minutes, 0));
- if (strcasecmp(threshold_type, "percentage") == 0
- && present_rate < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- } else if (strcasecmp(threshold_type, "time") == 0
- && remaining < (u_int) low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- }
-#elif defined(__OpenBSD__)
- /*
- * We're using apm(4) here, which is the interface to acpi(4) on amd64/i386 and
- * the generic interface on macppc/sparc64/zaurus, instead of using sysctl(3) and
- * probing acpi(4) devices.
- */
- struct apm_power_info apm_info;
- int apm_fd;
-
- apm_fd = open("/dev/apm", O_RDONLY);
- if (apm_fd < 0) {
- OUTPUT_FULL_TEXT("can't open /dev/apm");
- return;
- }
- if (ioctl(apm_fd, APM_IOC_GETPOWER, &apm_info) < 0)
- OUTPUT_FULL_TEXT("can't read power info");
-
- close(apm_fd);
-
- /* Don't bother to go further if there's no battery present. */
- if ((apm_info.battery_state == APM_BATTERY_ABSENT) ||
- (apm_info.battery_state == APM_BATT_UNKNOWN)) {
- OUTPUT_FULL_TEXT(format_down);
- return;
- }
-
- switch(apm_info.ac_state) {
- case APM_AC_OFF:
- status = CS_DISCHARGING;
- break;
- case APM_AC_ON:
- status = CS_CHARGING;
- break;
- default:
- /* If we don't know what's going on, just assume we're discharging. */
- status = CS_DISCHARGING;
- break;
- }
-
- (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
- /* integer_battery_capacity is implied as battery_life is already in whole numbers. */
- (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.00d%%", apm_info.battery_life);
-
- if (status == CS_DISCHARGING && low_threshold > 0) {
- if (strcasecmp(threshold_type, "percentage") == 0
- && apm_info.battery_life < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- } else if (strcasecmp(threshold_type, "time") == 0
- && apm_info.minutes_left < (u_int) low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- }
-
- /* Can't give a meaningful value for remaining minutes if we're charging. */
- if (status != CS_CHARGING) {
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%d", apm_info.minutes_left);
- } else {
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%s", "(CHR)");
- }
-
- if (colorful_output)
- END_COLOR;
-#elif defined(__NetBSD__)
- /*
- * Using envsys(4) via sysmon(4).
- */
- int fd, rval, last_full_cap;
- bool is_found = false;
- char *sensor_desc;
- bool is_full = false;
-
- prop_dictionary_t dict;
- prop_array_t array;
- prop_object_iterator_t iter;
- prop_object_iterator_t iter2;
- prop_object_t obj, obj2, obj3, obj4, obj5;
-
- asprintf(&sensor_desc, "acpibat%d", number);
-
- fd = open("/dev/sysmon", O_RDONLY);
- if (fd < 0) {
- OUTPUT_FULL_TEXT("can't open /dev/sysmon");
- return;
- }