weston-launch: Run weston in the user login shell
This patch brings back the user environment from the shell. In the future, weston-launch could create the Wayland socket earlier, in which case the user's shell could be used to run Wayland-specific tools in the new Weston session. Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
committed by
Kristian Høgsberg
parent
5545320c36
commit
ff3230952a
+16
-3
@@ -60,6 +60,8 @@
|
|||||||
|
|
||||||
#include "weston-launch.h"
|
#include "weston-launch.h"
|
||||||
|
|
||||||
|
#define MAX_ARGV_SIZE 256
|
||||||
|
|
||||||
struct weston_launch {
|
struct weston_launch {
|
||||||
struct pam_conv pc;
|
struct pam_conv pc;
|
||||||
pam_handle_t *ph;
|
pam_handle_t *ph;
|
||||||
@@ -523,8 +525,9 @@ main(int argc, char *argv[])
|
|||||||
struct weston_launch wl;
|
struct weston_launch wl;
|
||||||
char **env;
|
char **env;
|
||||||
int i, c;
|
int i, c;
|
||||||
char **child_argv;
|
char *child_argv[MAX_ARGV_SIZE];
|
||||||
char *tty = NULL, *new_user = NULL;
|
char *tty = NULL, *new_user = NULL;
|
||||||
|
char *term;
|
||||||
int sleep_fork = 0;
|
int sleep_fork = 0;
|
||||||
struct option opts[] = {
|
struct option opts[] = {
|
||||||
{ "user", required_argument, NULL, 'u' },
|
{ "user", required_argument, NULL, 'u' },
|
||||||
@@ -562,8 +565,8 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
child_argv = &argv[optind-1];
|
if ((argc - optind) > (MAX_ARGV_SIZE - 5))
|
||||||
child_argv[0] = BINDIR "/weston";
|
error(1, E2BIG, "Too many arguments to pass to weston");
|
||||||
|
|
||||||
if (new_user)
|
if (new_user)
|
||||||
wl.pw = getpwnam(new_user);
|
wl.pw = getpwnam(new_user);
|
||||||
@@ -572,7 +575,17 @@ main(int argc, char *argv[])
|
|||||||
if (wl.pw == NULL)
|
if (wl.pw == NULL)
|
||||||
error(1, errno, "failed to get username");
|
error(1, errno, "failed to get username");
|
||||||
|
|
||||||
|
child_argv[0] = wl.pw->pw_shell;
|
||||||
|
child_argv[1] = "-l";
|
||||||
|
child_argv[2] = "-c";
|
||||||
|
child_argv[3] = BINDIR "/weston \"$@\"";
|
||||||
|
child_argv[4] = "weston";
|
||||||
|
for (i = 0; i < (argc - optind); ++i)
|
||||||
|
child_argv[5+i] = argv[optind+i];
|
||||||
|
|
||||||
|
term = getenv("TERM");
|
||||||
clearenv();
|
clearenv();
|
||||||
|
setenv("TERM", term, 1);
|
||||||
setenv("USER", wl.pw->pw_name, 1);
|
setenv("USER", wl.pw->pw_name, 1);
|
||||||
setenv("LOGNAME", wl.pw->pw_name, 1);
|
setenv("LOGNAME", wl.pw->pw_name, 1);
|
||||||
setenv("HOME", wl.pw->pw_dir, 1);
|
setenv("HOME", wl.pw->pw_dir, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user