Compare commits

..

3 Commits

Author SHA1 Message Date
22fcfcdba9 fix: don't leak memory...
There's still memory being leaked by the wayland stuff
2025-09-26 16:45:31 -04:00
afa4e48757 fix: stop segfaulting on non-existent directories 2025-09-26 16:40:27 -04:00
ee6dfc9ac6 remove the extra print from cargs example 2025-09-26 16:00:17 -04:00
4 changed files with 53 additions and 16 deletions

View File

@@ -3,6 +3,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <unistd.h> #include <unistd.h>
#include "log.h"
#include "utils.h" #include "utils.h"
#include "config.h" #include "config.h"
@@ -17,6 +18,11 @@ char
/* open up the battery capacity for reading */ /* open up the battery capacity for reading */
d = concat(battery_status_path, "/capacity"); d = concat(battery_status_path, "/capacity");
f = fopen(d, "r"); f = fopen(d, "r");
if (!f) {
log_fatal("battery directory does not exist");
free(d);
return NULL;
}
free(d); free(d);
/* create enough space for the battery percentage */ /* create enough space for the battery percentage */

View File

@@ -86,6 +86,7 @@ parse_config_file(char *path)
f = fopen(path, "r"); f = fopen(path, "r");
if (!f) { if (!f) {
log_fatal("Failed to open config file: %s", path); log_fatal("Failed to open config file: %s", path);
return;
} }
config = toml_parse_file(f, errbuf, sizeof(errbuf)); config = toml_parse_file(f, errbuf, sizeof(errbuf));
@@ -106,4 +107,6 @@ parse_config_file(char *path)
set_int_conf(led_blink_trigger_level, led_blink, "power_source"); set_int_conf(led_blink_trigger_level, led_blink, "power_source");
set_str_conf(led_blink_timing_formula, led_blink, "timing_formula"); set_str_conf(led_blink_timing_formula, led_blink, "timing_formula");
set_str_conf(acpi_daemon_socket_path, acpi_daemon, "socket_path"); set_str_conf(acpi_daemon_socket_path, acpi_daemon, "socket_path");
toml_free(config);
} }

View File

@@ -6,6 +6,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/poll.h> #include <sys/poll.h>
#include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include "led.h" #include "led.h"
@@ -124,6 +125,13 @@ led_create_thread(char *file)
int err; int err;
struct sigaction act; struct sigaction act;
static bool running; static bool running;
struct stat s;
/* ensure that file exists */
err = stat(file, &s);
if (err < 0 || !S_ISREG(s.st_mode)) {
return 2;
}
/* make sure the led thread cannot be created twice */ /* make sure the led thread cannot be created twice */
if (running) { if (running) {

View File

@@ -23,7 +23,13 @@
#include "config.h" #include "config.h"
#define MAX_BUFLEN 1024 #define MAX_BUFLEN 1024
#define wrap(ok, func) do { \
if (ok) { \
func; \
} \
} while (0)
bool led_ok, wayland_ok;
static struct cag_option options[] = { static struct cag_option options[] = {
{ {
.identifier = 'c', .identifier = 'c',
@@ -51,19 +57,21 @@ on_battery_event(char *percent, bool plugged)
/* convert battery percentage to an int */ /* convert battery percentage to an int */
res = strtol(percent, &ep, 10); res = strtol(percent, &ep, 10);
if (res <= led_blink_trigger_level) { wrap(led_ok,
rate = led_blink_timing_func(res); if (res <= led_blink_trigger_level) {
if (rate >= 1) { rate = led_blink_timing_func(res);
led_set_rate(rate); if (rate >= 1) {
led_set_rate(rate);
}
} else {
led_set_rate(0);
} }
} else { );
led_set_rate(0);
}
wayland_set_idle_lock(false); wrap(wayland_ok, wayland_set_idle_lock(false));
} else { } else {
led_set_rate(0); wrap(led_ok, led_set_rate(0));
wayland_set_idle_lock(true); wrap(wayland_ok, wayland_set_idle_lock(true));
} }
free(percent); free(percent);
@@ -74,9 +82,12 @@ main(int argc, char *argv[])
{ {
cag_option_context context; cag_option_context context;
bool plugged = plugged_in(battery_power_source); bool plugged = plugged_in(battery_power_source);
char buffer[MAX_BUFLEN], *out[4], *config_path; char buffer[MAX_BUFLEN], *out[4], *config_path, *percent;
int sock_fd; int sock_fd;
/* defaults to working */
led_ok = wayland_ok = true;
cag_option_init(&context, options, CAG_ARRAY_SIZE(options), argc, argv); cag_option_init(&context, options, CAG_ARRAY_SIZE(options), argc, argv);
while (cag_option_fetch(&context)) { while (cag_option_fetch(&context)) {
switch (cag_option_get_identifier(&context)) { switch (cag_option_get_identifier(&context)) {
@@ -86,7 +97,6 @@ main(int argc, char *argv[])
break; break;
case 'h': case 'h':
printf("Usage: eh [OPTION]...\n"); printf("Usage: eh [OPTION]...\n");
printf("Demonstrates the cargs library.\n\n");
cag_option_print(options, CAG_ARRAY_SIZE(options), stdout); cag_option_print(options, CAG_ARRAY_SIZE(options), stdout);
return EXIT_SUCCESS; return EXIT_SUCCESS;
case '?': case '?':
@@ -105,15 +115,22 @@ main(int argc, char *argv[])
sock_fd = acpi_create_socket(acpi_daemon_socket_path); sock_fd = acpi_create_socket(acpi_daemon_socket_path);
/* create the led thread */ /* create the led thread */
led_create_thread(led_brightness_path); if (led_create_thread(led_brightness_path)) {
led_ok = false;
}
/* create the wayland thread */ /* create the wayland thread */
wayland_create_thread(); if (wayland_create_thread()) {
wayland_ok = false;
}
/* run events that need to be run on start to ensure that the current state /* run events that need to be run on start to ensure that the current state
* inside the program reflects that that is outside the program * inside the program reflects that that is outside the program
*/ */
on_battery_event(battery_percent(), plugged); percent = battery_percent();
if (percent == NULL) {
on_battery_event(percent, plugged);
}
/* zero buffer */ /* zero buffer */
memset(out, 0, sizeof(out)); memset(out, 0, sizeof(out));
@@ -146,7 +163,10 @@ main(int argc, char *argv[])
if (strcmp(s, "PNP") == 0) { if (strcmp(s, "PNP") == 0) {
if (strcmp(out[2], "00000080") == 0) { if (strcmp(out[2], "00000080") == 0) {
if (strcmp(out[3], "00000001") == 0) { if (strcmp(out[3], "00000001") == 0) {
on_battery_event(battery_percent(), plugged); percent = battery_percent();
if (percent == NULL) {
on_battery_event(percent, plugged);
}
} }
} }
} }