summaryrefslogtreecommitdiffstats
path: root/src/ac-power
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:49:52 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:49:52 +0000
commit55944e5e40b1be2afc4855d8d2baf4b73d1876b5 (patch)
tree33f869f55a1b149e9b7c2b7e201867ca5dd52992 /src/ac-power
parentInitial commit. (diff)
downloadsystemd-55944e5e40b1be2afc4855d8d2baf4b73d1876b5.tar.xz
systemd-55944e5e40b1be2afc4855d8d2baf4b73d1876b5.zip
Adding upstream version 255.4.upstream/255.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/ac-power')
-rw-r--r--src/ac-power/ac-power.c109
-rw-r--r--src/ac-power/meson.build9
2 files changed, 118 insertions, 0 deletions
diff --git a/src/ac-power/ac-power.c b/src/ac-power/ac-power.c
new file mode 100644
index 0000000..fadf1da
--- /dev/null
+++ b/src/ac-power/ac-power.c
@@ -0,0 +1,109 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <getopt.h>
+
+#include "battery-util.h"
+#include "build.h"
+#include "main-func.h"
+
+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"
+ " --low Check if battery is discharging and low\n",
+ program_invocation_short_name);
+}
+
+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 },
+ {}
+ };
+
+ int c;
+
+ assert(argc >= 0);
+ assert(argv);
+
+ while ((c = getopt_long(argc, argv, "hv", options, NULL)) >= 0)
+
+ switch (c) {
+
+ case 'h':
+ help();
+ return 0;
+
+ case ARG_VERSION:
+ return version();
+
+ case 'v':
+ arg_verbose = true;
+ break;
+
+ case ARG_LOW:
+ arg_action = ACTION_LOW;
+ break;
+
+ case '?':
+ return -EINVAL;
+
+ default:
+ assert_not_reached();
+ }
+
+ if (optind < argc)
+ return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+ "%s takes no arguments.",
+ program_invocation_short_name);
+
+ return 1;
+}
+
+static int run(int argc, char *argv[]) {
+ int r;
+
+ /* This is mostly intended to be used for scripts which want
+ * to detect whether AC power is plugged in or not. */
+
+ log_parse_environment();
+ log_open();
+
+ r = parse_argv(argc, argv);
+ if (r <= 0)
+ return r;
+
+ 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));
+
+ return r == 0;
+}
+
+DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run);
diff --git a/src/ac-power/meson.build b/src/ac-power/meson.build
new file mode 100644
index 0000000..032c027
--- /dev/null
+++ b/src/ac-power/meson.build
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+executables += [
+ executable_template + {
+ 'name' : 'systemd-ac-power',
+ 'public' : true,
+ 'sources' : files('ac-power.c'),
+ },
+]