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:
Jos Dehaes 2026-04-29 11:14:21 +02:00 committed by Johan Malm
parent 7ec7a322d2
commit 998fd80737
3 changed files with 40 additions and 2 deletions

View file

@ -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

View file

@ -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)
{ {

View file

@ -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);
} }