Detect batteries using glob (#163)
This commit is contained in:
parent
8d2ef5f99b
commit
707ceffc8b
@ -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;
|
||||||
|
@ -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, ...);
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user