X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fprint_battery_info.c;h=7883a113290896d5d1221af5ac6ad97b5e0ad0c0;hb=37e73e77b0514993cd386a5d12509c88dddba5ed;hp=52d503149d4e2b6081d83517e62cd88daf190741;hpb=dc072f9f5353dc8adab14b2de99f0c1abb25e8d8;p=i3%2Fi3status diff --git a/src/print_battery_info.c b/src/print_battery_info.c index 52d5031..7883a11 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); @@ -483,7 +482,7 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char /* These OSes report battery stats in whole percent. */ integer_battery_capacity = true; #endif -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__OpenBSD__) /* These OSes report battery time in minutes. */ hide_seconds = true; #endif