forked from Frogging-Family/wine-tkg-git
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4 from goatcorp/linux-battery-fix
Don't hard-code the battery and AC adapter names on Linux
- Loading branch information
Showing
1 changed file
with
126 additions
and
0 deletions.
There are no files selected for viewing
126 changes: 126 additions & 0 deletions
126
wine-tkg-git/wine-tkg-userpatches/linux-battery-ac-fix.mypatch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
From 770dc75aae2d17fb5ce1bcbdcd2dcd33922bddf1 Mon Sep 17 00:00:00 2001 | ||
From: Alex Henrie <[email protected]> | ||
Date: Tue, 31 May 2022 21:44:36 -0600 | ||
Subject: [PATCH] ntdll: Don't hard-code the battery and AC adapter names on | ||
Linux | ||
|
||
Look through all of the devices in /sys/class/power_supply and take the | ||
statistics from the first battery and the first AC adapter. | ||
|
||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52831 | ||
Signed-off-by: Alex Henrie <[email protected]> | ||
--- | ||
dlls/ntdll/unix/system.c | 66 +++++++++++++++++++++++++--------------- | ||
1 file changed, 41 insertions(+), 25 deletions(-) | ||
|
||
diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c | ||
index 87cc8b9c3a4..779b6591012 100644 | ||
--- a/dlls/ntdll/unix/system.c | ||
+++ b/dlls/ntdll/unix/system.c | ||
@@ -35,6 +35,7 @@ | ||
#include <errno.h> | ||
#include <sys/time.h> | ||
#include <time.h> | ||
+#include <dirent.h> | ||
#ifdef HAVE_SYS_PARAM_H | ||
# include <sys/param.h> | ||
#endif | ||
@@ -3379,12 +3380,14 @@ static ULONG mhz_from_cpuinfo(void) | ||
return cmz; | ||
} | ||
|
||
-static const char * get_sys_str(const char *path, char *s) | ||
+static const char * get_sys_str(const char *dirname, const char *basename, char *s) | ||
{ | ||
- FILE *f = fopen(path, "r"); | ||
+ char path[64]; | ||
+ FILE *f; | ||
const char *ret = NULL; | ||
|
||
- if (f) | ||
+ if (snprintf(path, sizeof(path), "%s/%s", dirname, basename) < 0) return NULL; | ||
+ if ((f = fopen(path, "r"))) | ||
{ | ||
if (fgets(s, 16, f)) ret = s; | ||
fclose(f); | ||
@@ -3392,42 +3395,55 @@ static const char * get_sys_str(const char *path, char *s) | ||
return ret; | ||
} | ||
|
||
-static int get_sys_int(const char *path, int def) | ||
+static int get_sys_int(const char *dirname, const char *basename) | ||
{ | ||
char s[16]; | ||
- return get_sys_str(path, s) ? atoi(s) : def; | ||
+ return get_sys_str(dirname, basename, s) ? atoi(s) : 0; | ||
} | ||
|
||
static NTSTATUS fill_battery_state( SYSTEM_BATTERY_STATE *bs ) | ||
{ | ||
+ DIR *d = opendir("/sys/class/power_supply"); | ||
+ struct dirent *de; | ||
char s[16], path[64]; | ||
- unsigned int i = 0; | ||
+ BOOL found_ac = FALSE, found_battery = FALSE; | ||
LONG64 voltage; /* microvolts */ | ||
|
||
- bs->AcOnLine = get_sys_int("/sys/class/power_supply/AC/online", 1); | ||
+ bs->AcOnLine = TRUE; | ||
+ if (!d) return STATUS_SUCCESS; | ||
|
||
- for (;;) | ||
+ while ((de = readdir(d)) && (!found_ac || !found_battery)) | ||
{ | ||
- sprintf(path, "/sys/class/power_supply/BAT%u/status", i); | ||
- if (!get_sys_str(path, s)) break; | ||
- bs->Charging |= (strcmp(s, "Charging\n") == 0); | ||
- bs->Discharging |= (strcmp(s, "Discharging\n") == 0); | ||
- bs->BatteryPresent = TRUE; | ||
- i++; | ||
- } | ||
+ if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) continue; | ||
+ if (snprintf(path, sizeof(path), "/sys/class/power_supply/%s", de->d_name) < 0) continue; | ||
+ if (get_sys_str(path, "scope", s) && strcmp(s, "Device\n") == 0) continue; | ||
+ if (!get_sys_str(path, "type", s)) continue; | ||
|
||
- if (bs->BatteryPresent) | ||
- { | ||
- voltage = get_sys_int("/sys/class/power_supply/BAT0/voltage_now", 0); | ||
- bs->MaxCapacity = get_sys_int("/sys/class/power_supply/BAT0/charge_full", 0) * voltage / 1e9; | ||
- bs->RemainingCapacity = get_sys_int("/sys/class/power_supply/BAT0/charge_now", 0) * voltage / 1e9; | ||
- bs->Rate = -get_sys_int("/sys/class/power_supply/BAT0/current_now", 0) * voltage / 1e9; | ||
- if (!bs->Charging && (LONG)bs->Rate < 0) | ||
- bs->EstimatedTime = 3600 * bs->RemainingCapacity / -(LONG)bs->Rate; | ||
- else | ||
- bs->EstimatedTime = ~0u; | ||
+ if (!found_ac && strcmp(s, "Mains\n") == 0) | ||
+ { | ||
+ if (!get_sys_str(path, "online", s)) continue; | ||
+ bs->AcOnLine = atoi(s); | ||
+ found_ac = TRUE; | ||
+ } | ||
+ else if (!found_battery && strcmp(s, "Battery\n") == 0) | ||
+ { | ||
+ if (!get_sys_str(path, "status", s)) continue; | ||
+ bs->Charging = (strcmp(s, "Charging\n") == 0); | ||
+ bs->Discharging = (strcmp(s, "Discharging\n") == 0); | ||
+ bs->BatteryPresent = TRUE; | ||
+ voltage = get_sys_int(path, "voltage_now"); | ||
+ bs->MaxCapacity = get_sys_int(path, "charge_full") * voltage / 1e9; | ||
+ bs->RemainingCapacity = get_sys_int(path, "charge_now") * voltage / 1e9; | ||
+ bs->Rate = -get_sys_int(path, "current_now") * voltage / 1e9; | ||
+ if (!bs->Charging && (LONG)bs->Rate < 0) | ||
+ bs->EstimatedTime = 3600 * bs->RemainingCapacity / -(LONG)bs->Rate; | ||
+ else | ||
+ bs->EstimatedTime = ~0u; | ||
+ found_battery = TRUE; | ||
+ } | ||
} | ||
|
||
+ closedir(d); | ||
return STATUS_SUCCESS; | ||
} | ||
|
||
-- | ||
GitLab | ||
|