mirror of
https://github.com/labwc/labwc.git
synced 2026-05-03 06:47:22 -04:00
session: run activation env update synchronously
dbus-update-activation-environment and systemctl --user import-environment were fired asynchronously via spawn_async_no_shell, racing with the autostart script. Any systemd user service started from autostart (e.g. via labwc-session.target) could start before the import completed, leaving WAYLAND_DISPLAY and related variables absent from its environment and those of any apps it launches. Run both commands synchronously via a new spawn_sync_no_shell helper so the import is guaranteed to complete before the autostart script executes.
This commit is contained in:
parent
7ec7a322d2
commit
998fd80737
3 changed files with 40 additions and 2 deletions
|
|
@ -16,6 +16,12 @@ pid_t spawn_primary_client(const char *command);
|
||||||
*/
|
*/
|
||||||
void spawn_async_no_shell(char const *command);
|
void spawn_async_no_shell(char const *command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spawn_sync_no_shell - execute synchronously
|
||||||
|
* @command: command to be executed
|
||||||
|
*/
|
||||||
|
void spawn_sync_no_shell(char const *command);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* spawn_piped - execute asynchronously
|
* spawn_piped - execute asynchronously
|
||||||
* @command: command to be executed
|
* @command: command to be executed
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,38 @@ out:
|
||||||
g_strfreev(argv);
|
g_strfreev(argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
spawn_sync_no_shell(char const *command)
|
||||||
|
{
|
||||||
|
GError *err = NULL;
|
||||||
|
gchar **argv = NULL;
|
||||||
|
|
||||||
|
assert(command);
|
||||||
|
|
||||||
|
g_shell_parse_argv((gchar *)command, NULL, &argv, &err);
|
||||||
|
if (err) {
|
||||||
|
g_message("%s", err->message);
|
||||||
|
g_error_free(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t child = fork();
|
||||||
|
switch (child) {
|
||||||
|
case -1:
|
||||||
|
wlr_log(WLR_ERROR, "unable to fork()");
|
||||||
|
goto out;
|
||||||
|
case 0:
|
||||||
|
reset_signals_and_limits();
|
||||||
|
execvp(argv[0], argv);
|
||||||
|
_exit(1);
|
||||||
|
default:
|
||||||
|
waitpid(child, NULL, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
g_strfreev(argv);
|
||||||
|
}
|
||||||
|
|
||||||
pid_t
|
pid_t
|
||||||
spawn_primary_client(const char *command)
|
spawn_primary_client(const char *command)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -219,12 +219,12 @@ execute_update(const char *env_keys, const char *env_unset_keys, bool initialize
|
||||||
char *cmd =
|
char *cmd =
|
||||||
strdup_printf("dbus-update-activation-environment %s",
|
strdup_printf("dbus-update-activation-environment %s",
|
||||||
initialize ? env_keys : env_unset_keys);
|
initialize ? env_keys : env_unset_keys);
|
||||||
spawn_async_no_shell(cmd);
|
spawn_sync_no_shell(cmd);
|
||||||
free(cmd);
|
free(cmd);
|
||||||
|
|
||||||
cmd = strdup_printf("systemctl --user %s %s",
|
cmd = strdup_printf("systemctl --user %s %s",
|
||||||
initialize ? "import-environment" : "unset-environment", env_keys);
|
initialize ? "import-environment" : "unset-environment", env_keys);
|
||||||
spawn_async_no_shell(cmd);
|
spawn_sync_no_shell(cmd);
|
||||||
free(cmd);
|
free(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue