From 7f1520c6a150f4eea531ef6e57d5bd37c682af21 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 5 Jun 2023 12:14:12 +0200 Subject: [PATCH] ac-power: add --low switch to systemd-ac-power tool This allows checking from shell scripts whether the system is in a low battery state. It just exposed the code we anyway have in a directly accessible way. This is also very useful for testing things. --- man/systemd-ac-power.xml | 8 ++++++++ src/ac-power/ac-power.c | 26 ++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/man/systemd-ac-power.xml b/man/systemd-ac-power.xml index a4c9378cfd7..e06a88a9750 100644 --- a/man/systemd-ac-power.xml +++ b/man/systemd-ac-power.xml @@ -50,6 +50,14 @@ Show result as text instead of just returning success or failure. + + + + Instead of showing AC power state, show low battery state. In this case will return + zero if all batteries are currently discharging and below 5% of maximum charge. Returns non-zero + otherwise. + + diff --git a/src/ac-power/ac-power.c b/src/ac-power/ac-power.c index 62181a83df7..f027c31208d 100644 --- a/src/ac-power/ac-power.c +++ b/src/ac-power/ac-power.c @@ -8,12 +8,18 @@ static bool arg_verbose = false; +static enum { + ACTION_AC_POWER, + ACTION_LOW, +} arg_action = ACTION_AC_POWER; + static void help(void) { printf("%s\n\n" "Report whether we are connected to an external power source.\n\n" " -h --help Show this help\n" " --version Show package version\n" - " -v --verbose Show state as text\n", + " -v --verbose Show state as text\n" + " --low Checks if battery is discharing and low\n", program_invocation_short_name); } @@ -21,12 +27,14 @@ static int parse_argv(int argc, char *argv[]) { enum { ARG_VERSION = 0x100, + ARG_LOW, }; static const struct option options[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, ARG_VERSION }, { "verbose", no_argument, NULL, 'v' }, + { "low", no_argument, NULL, ARG_LOW }, {} }; @@ -50,6 +58,10 @@ static int parse_argv(int argc, char *argv[]) { arg_verbose = true; break; + case ARG_LOW: + arg_action = ACTION_LOW; + break; + case '?': return -EINVAL; @@ -78,9 +90,15 @@ static int run(int argc, char *argv[]) { if (r <= 0) return r; - r = on_ac_power(); - if (r < 0) - return log_error_errno(r, "Failed to read AC status: %m"); + if (arg_action == ACTION_AC_POWER) { + r = on_ac_power(); + if (r < 0) + return log_error_errno(r, "Failed to read AC status: %m"); + } else { + r = battery_is_discharging_and_low(); + if (r < 0) + return log_error_errno(r, "Failed to read battery discharging + low status: %m"); + } if (arg_verbose) puts(yes_no(r));