The exact location of the state information seems hardware dependent, so this adds the option to
specify it manually. (linux only)
<command>
<option>acpiacadapter</option>
</command>
+ <option>(adapter)</option>
</term>
- <listitem>ACPI ac adapter state.
+ <listitem>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.
<para /></listitem>
</varlistentry>
<varlistentry>
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);
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);
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();
case OBJ_acpitemp:
close(data.i);
break;
+ case OBJ_acpiacadapter:
+ free(data.opaque);
+ break;
#endif /* !__OpenBSD__ */
#ifdef __linux__
case OBJ_i2c:
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;
}
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/
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;
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 */
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;
}