]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ac-power: add --low switch to systemd-ac-power tool 27924/head
authorLennart Poettering <lennart@poettering.net>
Mon, 5 Jun 2023 10:14:12 +0000 (12:14 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 5 Jun 2023 10:21:28 +0000 (12:21 +0200)
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
src/ac-power/ac-power.c

index a4c9378cfd7cf43981f65d9f22cbe2e673e82d98..e06a88a9750c1ff701a9cf72fee0c1adf2458717 100644 (file)
         <listitem><para>Show result as text instead of just returning success or failure.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><option>--low</option></term>
+
+        <listitem><para>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.</para></listitem>
+      </varlistentry>
+
       <xi:include href="standard-options.xml" xpointer="help" />
       <xi:include href="standard-options.xml" xpointer="version" />
     </variablelist>
index 62181a83df718af1e1b248ddeff29d9198a723e1..f027c31208d2afb6216bc1cc6e9cd0d5a211824a 100644 (file)
@@ -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));