From f5363b6539d7bd4928437823d3ebc81b7f7502d5 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Sun, 24 Jan 2010 15:34:03 +0100 Subject: [PATCH] Add optional argument to $acpiacadapter The exact location of the state information seems hardware dependent, so this adds the option to specify it manually. (linux only) --- doc/variables.xml | 5 ++++- src/common.h | 2 +- src/conky.c | 2 +- src/core.c | 19 +++++++++++++++++++ src/freebsd.c | 4 +++- src/linux.c | 9 ++++++--- src/netbsd.c | 4 +++- 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/doc/variables.xml b/doc/variables.xml index 8b438b8d..6c53a2c2 100644 --- a/doc/variables.xml +++ b/doc/variables.xml @@ -4,8 +4,11 @@ + - ACPI ac adapter state. + ACPI ac adapter state. On linux, the adapter option specifies the + subfolder of /sys/class/power_supply containing the state information (defaults + to "AC"). Other systems ignore it. diff --git a/src/common.h b/src/common.h index 2c1ddd17..f9f03930 100644 --- a/src/common.h +++ b/src/common.h @@ -61,7 +61,7 @@ extern int no_buffers; int open_acpi_temperature(const char *name); double get_acpi_temperature(int fd); -void get_acpi_ac_adapter(char *, size_t); +void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, const char *adapter); void get_acpi_fan(char *, size_t); void get_battery_stuff(char *buf, unsigned int n, const char *bat, int item); int get_battery_perct(const char *bat); diff --git a/src/conky.c b/src/conky.c index fdc5996a..7c47b331 100644 --- a/src/conky.c +++ b/src/conky.c @@ -865,7 +865,7 @@ void generate_text_internal(char *p, int p_max_size, get_acpi_fan(p, p_max_size); } OBJ(acpiacadapter) { - get_acpi_ac_adapter(p, p_max_size); + get_acpi_ac_adapter(p, p_max_size, (const char *)obj->data.opaque); } OBJ(battery) { get_battery_stuff(p, p_max_size, obj->data.s, BATTERY_STATUS); diff --git a/src/core.c b/src/core.c index 7b500306..68997ad9 100644 --- a/src/core.c +++ b/src/core.c @@ -157,6 +157,22 @@ struct text_object *construct_text_object(const char *s, const char *arg, long OBJ(acpitemp, 0) obj->data.i = open_acpi_temperature(arg); END OBJ(acpiacadapter, 0) + if(arg) { +#ifdef __linux__ + if(strpbrk(arg, "/.") != NULL) { + /* + * a bit of paranoia. screen out funky paths + * i hope no device will have a '.' in its name + */ + NORM_ERR("acpiacadapter: arg must not contain '/' or '.'"); + } else + obj->data.opaque = strdup(arg); +#else + NORM_ERR("acpiacadapter: arg is only used on linux"); +#endif + } + if(! obj->data.opaque) + obj->data.opaque = strdup("AC"); #endif /* !__OpenBSD__ */ END OBJ(freq, 0) get_cpu_count(); @@ -1351,6 +1367,9 @@ void free_text_objects(struct text_object *root, int internal) case OBJ_acpitemp: close(data.i); break; + case OBJ_acpiacadapter: + free(data.opaque); + break; #endif /* !__OpenBSD__ */ #ifdef __linux__ case OBJ_i2c: diff --git a/src/freebsd.c b/src/freebsd.c index aa942465..d79c9c41 100644 --- a/src/freebsd.c +++ b/src/freebsd.c @@ -480,10 +480,12 @@ int open_acpi_temperature(const char *name) return 0; } -void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size) +void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, const char *adapter) { int state; + (void) adapter; // only linux uses this + if (!p_client_buffer || client_buffer_size <= 0) { return; } diff --git a/src/linux.c b/src/linux.c index 9ee271fa..e00f2644 100644 --- a/src/linux.c +++ b/src/linux.c @@ -1321,7 +1321,7 @@ void get_acpi_fan(char *p_client_buffer, size_t client_buffer_size) snprintf(p_client_buffer, client_buffer_size, "%s", buf); } -#define SYSFS_AC_ADAPTER_DIR "/sys/class/power_supply/AC" +#define SYSFS_AC_ADAPTER_DIR "/sys/class/power_supply" #define ACPI_AC_ADAPTER_DIR "/proc/acpi/ac_adapter/" /* Linux 2.6.25 onwards ac adapter info is in /sys/class/power_supply/AC/ @@ -1333,9 +1333,12 @@ void get_acpi_fan(char *p_client_buffer, size_t client_buffer_size) POWER_SUPPLY_NAME=AC POWER_SUPPLY_TYPE=Mains POWER_SUPPLY_ONLINE=1 + + Update: it seems the folder name is hardware-dependent. We add an aditional adapter + argument, specifying the folder name. */ -void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size) +void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, const char *adapter) { static int rep = 0; @@ -1347,7 +1350,7 @@ void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size) return; } - snprintf(buf2, sizeof(buf2), "%s/uevent", SYSFS_AC_ADAPTER_DIR); + snprintf(buf2, sizeof(buf2), "%s/%s/uevent", SYSFS_AC_ADAPTER_DIR, adapter); fp = open_file(buf2, &rep); if (fp) { /* sysfs processing */ diff --git a/src/netbsd.c b/src/netbsd.c index 9730b160..d1236bb8 100644 --- a/src/netbsd.c +++ b/src/netbsd.c @@ -332,8 +332,10 @@ int open_acpi_temperature(const char *name) return -1; } -void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size) +void get_acpi_ac_adapter(char *p_client_buffer, size_t client_buffer_size, const char *adapter) { + (void) adapter; // only linux uses this + if (!p_client_buffer || client_buffer_size <= 0) { return; }