From 707ceffc8b556a3797651d78c0c0f37bae9884ea Mon Sep 17 00:00:00 2001 From: Stu Zhao Date: Sun, 23 Oct 2016 15:20:31 -0400 Subject: Detect batteries using glob (#163) --- i3status.c | 2 +- include/i3status.h | 2 ++ src/print_battery_info.c | 61 ++++++++++++++++++++++++------------------------ 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/i3status.c b/i3status.c index 5e17745..239729e 100644 --- a/i3status.c +++ b/i3status.c @@ -104,7 +104,7 @@ static void *scalloc(size_t size) { return result; } -static char *sstrdup(const char *str) { +char *sstrdup(const char *str) { char *result = strdup(str); exit_if_null(result, "Error: out of memory (strdup())\n"); return result; diff --git a/include/i3status.h b/include/i3status.h index dd0ba02..d168f74 100644 --- a/include/i3status.h +++ b/include/i3status.h @@ -176,6 +176,8 @@ struct min_width { const char *str; }; +char *sstrdup(const char *str); + /* src/general.c */ char *skip_character(char *input, char character, int amount); void die(const char *fmt, ...); diff --git a/src/print_battery_info.c b/src/print_battery_info.c index 52d5031..387fb44 100644 --- a/src/print_battery_info.c +++ b/src/print_battery_info.c @@ -11,7 +11,7 @@ #if defined(LINUX) #include -#include +#include #include #endif @@ -414,40 +414,39 @@ static bool slurp_all_batteries(struct battery_info *batt_info, yajl_gen json_ge char *outwalk = buffer; bool is_found = false; - /* 1,000 batteries should be enough for anyone */ - for (int i = 0; i < 1000; i++) { - char batpath[1024]; - (void)snprintf(batpath, sizeof(batpath), path, i); - - if (!strcmp(batpath, path)) { - OUTPUT_FULL_TEXT("no '%d' in battery path"); - return false; - } + char *placeholder; + char *globpath = sstrdup(path); + if ((placeholder = strstr(path, "%d")) != NULL) { + char *globplaceholder = globpath + (placeholder - path); + *globplaceholder = '*'; + strcpy(globplaceholder + 1, placeholder + 2); + } - /* Probe to see if there is such a battery. */ - struct stat sb; - if (stat(batpath, &sb) != 0) { - /* No such file, then we are done, assuming sysfs files have sequential numbers. */ - if (errno == ENOENT) - break; + if (!strcmp(globpath, path)) { + OUTPUT_FULL_TEXT("no '%d' in battery path"); + return false; + } - OUTPUT_FULL_TEXT(format_down); - return false; + glob_t globbuf; + if (glob(globpath, 0, NULL, &globbuf) == 0) { + for (size_t i = 0; i < globbuf.gl_pathc; i++) { + /* Probe to see if there is such a battery. */ + struct battery_info batt_buf = { + .full_design = 0, + .full_last = 0, + .remaining = 0, + .present_rate = 0, + .status = CS_UNKNOWN, + }; + if (!slurp_battery_info(&batt_buf, json_gen, buffer, i, globbuf.gl_pathv[i], format_down)) + return false; + + is_found = true; + add_battery_info(batt_info, &batt_buf); } - - struct battery_info batt_buf = { - .full_design = 0, - .full_last = 0, - .remaining = 0, - .present_rate = 0, - .status = CS_UNKNOWN, - }; - if (!slurp_battery_info(&batt_buf, json_gen, buffer, i, path, format_down)) - return false; - - is_found = true; - add_battery_info(batt_info, &batt_buf); } + globfree(&globbuf); + free(globpath); if (!is_found) { OUTPUT_FULL_TEXT(format_down); -- cgit v1.2.3