mirror of
https://github.com/troglobit/finit.git
synced 2026-11-02 13:20:32 +00:00
plugins: sys: use counting semaphores to handle >1 AC supply
- Track number of ac and ac online - Use systemd logic to assert sys/pwr/ac also when no supply Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
1 parent
6f82b806ad
commit
c27f3603e6
1 file changed
+40
-9
+40
-9
@@ -36,21 +36,28 @@
|
|||||||
#define _PATH_SYSFS_PWR "/sys/class/power_supply"
|
#define _PATH_SYSFS_PWR "/sys/class/power_supply"
|
||||||
|
|
||||||
static struct iwatch iw_sys;
|
static struct iwatch iw_sys;
|
||||||
|
static int num_ac_online;
|
||||||
static int num_ac;
|
static int num_ac;
|
||||||
|
|
||||||
static void check_online(char *path, int clear)
|
static void sys_cond(int set)
|
||||||
{
|
{
|
||||||
char cond[MAX_COND_LEN] = COND_SYS;
|
char cond[MAX_COND_LEN] = COND_SYS;
|
||||||
|
|
||||||
|
strlcat(cond, "pwr/ac", sizeof(cond));
|
||||||
|
if (set)
|
||||||
|
cond_set_oneshot(cond);
|
||||||
|
else
|
||||||
|
cond_clear(cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int check_online(char *path)
|
||||||
|
{
|
||||||
int val;
|
int val;
|
||||||
|
|
||||||
if (fngetint(path, &val))
|
if (fngetint(path, &val))
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
strlcat(cond, "pwr/ac", sizeof(cond));
|
return val;
|
||||||
if (val)
|
|
||||||
cond_set_oneshot(cond);
|
|
||||||
else if (clear)
|
|
||||||
cond_clear(cond);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sys_callback(void *arg, int fd, int events)
|
static void sys_callback(void *arg, int fd, int events)
|
||||||
@@ -86,7 +93,19 @@ static void sys_callback(void *arg, int fd, int events)
|
|||||||
if (!iwp)
|
if (!iwp)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
check_online(iwp->path, 1);
|
if (check_online(iwp->path)) {
|
||||||
|
if (!num_ac_online)
|
||||||
|
sys_cond(1);
|
||||||
|
|
||||||
|
if (num_ac_online < num_ac)
|
||||||
|
num_ac_online++;
|
||||||
|
} else {
|
||||||
|
if (num_ac_online > 0)
|
||||||
|
num_ac_online--;
|
||||||
|
|
||||||
|
if (!num_ac_online)
|
||||||
|
sys_cond(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,6 +141,13 @@ static int is_ac(char *path, size_t len)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called when base filesystem is up, modules have been probed,
|
||||||
|
* or insmodded from /etc/finit.conf, so by now we should have
|
||||||
|
* /sys/class/power_supply/ available for probing. If none is
|
||||||
|
* found we assert /sys/pwr/ac condition anyway, this is what
|
||||||
|
* systemd does (ConditionACPower) and also makes most sense.
|
||||||
|
*/
|
||||||
static void sys_init(void *arg)
|
static void sys_init(void *arg)
|
||||||
{
|
{
|
||||||
struct dirent **d = NULL;
|
struct dirent **d = NULL;
|
||||||
@@ -147,7 +173,8 @@ static void sys_init(void *arg)
|
|||||||
num_ac++;
|
num_ac++;
|
||||||
|
|
||||||
snprintf(path, sizeof(path), "%s/%s/online", _PATH_SYSFS_PWR, nm);
|
snprintf(path, sizeof(path), "%s/%s/online", _PATH_SYSFS_PWR, nm);
|
||||||
check_online(path, 0);
|
if (check_online(path))
|
||||||
|
num_ac_online++;
|
||||||
|
|
||||||
if (iwatch_add(&iw_sys, path, 0))
|
if (iwatch_add(&iw_sys, path, 0))
|
||||||
_pe("Failed setting up pwr monitor for %s", path);
|
_pe("Failed setting up pwr monitor for %s", path);
|
||||||
@@ -155,6 +182,10 @@ static void sys_init(void *arg)
|
|||||||
free(d[i]);
|
free(d[i]);
|
||||||
}
|
}
|
||||||
free(d);
|
free(d);
|
||||||
|
|
||||||
|
/* if any power_supply is online, or none can be found */
|
||||||
|
if (num_ac == 0 || num_ac_online > 0)
|
||||||
|
sys_cond(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static plugin_t plugin = {
|
static plugin_t plugin = {
|
||||||
|
|||||||
Reference in new issue
Block a user