Detect batteries using glob (#163)

This commit is contained in:
Stu Zhao 2016-10-23 15:20:31 -04:00 committed by Michael Stapelberg
parent 8d2ef5f99b
commit 707ceffc8b
3 changed files with 36 additions and 35 deletions

View File

@ -104,7 +104,7 @@ static void *scalloc(size_t size) {
return result; return result;
} }
static char *sstrdup(const char *str) { char *sstrdup(const char *str) {
char *result = strdup(str); char *result = strdup(str);
exit_if_null(result, "Error: out of memory (strdup())\n"); exit_if_null(result, "Error: out of memory (strdup())\n");
return result; return result;

View File

@ -176,6 +176,8 @@ struct min_width {
const char *str; const char *str;
}; };
char *sstrdup(const char *str);
/* src/general.c */ /* src/general.c */
char *skip_character(char *input, char character, int amount); char *skip_character(char *input, char character, int amount);
void die(const char *fmt, ...); void die(const char *fmt, ...);

View File

@ -11,7 +11,7 @@
#if defined(LINUX) #if defined(LINUX)
#include <errno.h> #include <errno.h>
#include <sys/stat.h> #include <glob.h>
#include <sys/types.h> #include <sys/types.h>
#endif #endif
@ -414,41 +414,40 @@ static bool slurp_all_batteries(struct battery_info *batt_info, yajl_gen json_ge
char *outwalk = buffer; char *outwalk = buffer;
bool is_found = false; bool is_found = false;
/* 1,000 batteries should be enough for anyone */ char *placeholder;
for (int i = 0; i < 1000; i++) { char *globpath = sstrdup(path);
char batpath[1024]; if ((placeholder = strstr(path, "%d")) != NULL) {
(void)snprintf(batpath, sizeof(batpath), path, i); char *globplaceholder = globpath + (placeholder - path);
*globplaceholder = '*';
if (!strcmp(batpath, path)) { strcpy(globplaceholder + 1, placeholder + 2);
OUTPUT_FULL_TEXT("no '%d' in battery path");
return false;
}
/* 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;
OUTPUT_FULL_TEXT(format_down);
return false;
}
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);
} }
if (!strcmp(globpath, path)) {
OUTPUT_FULL_TEXT("no '%d' in battery path");
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);
}
}
globfree(&globbuf);
free(globpath);
if (!is_found) { if (!is_found) {
OUTPUT_FULL_TEXT(format_down); OUTPUT_FULL_TEXT(format_down);
return false; return false;