summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStu Zhao <z12y12l12@gmail.com>2016-10-23 15:20:31 -0400
committerMichael Stapelberg <stapelberg@users.noreply.github.com>2016-10-23 21:20:31 +0200
commit707ceffc8b556a3797651d78c0c0f37bae9884ea (patch)
treec15ff50ae5ed18a0adf41e3661be305556f6428b
parent8d2ef5f99b2ebc08a0a9d1f26492094692b1fc6b (diff)
Detect batteries using glob (#163)
-rw-r--r--i3status.c2
-rw-r--r--include/i3status.h2
-rw-r--r--src/print_battery_info.c61
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 <errno.h>
-#include <sys/stat.h>
+#include <glob.h>
#include <sys/types.h>
#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);