diff options
author | Quentin Glidic <sardemff7+git@sardemff7.net> | 2013-05-17 16:20:37 +0200 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-05-17 16:23:46 -0400 |
commit | ff3230952a68077669e0ea0ac3ceb234273556fc (patch) | |
tree | fd99c16ddc9e410cf0e7185432ca4fc3808b9b43 /src/weston-launch.c | |
parent | 5545320c36a8a9692bc1f0f0ae6e0341a818449f (diff) | |
download | weston-ff3230952a68077669e0ea0ac3ceb234273556fc.tar.gz |
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>
Diffstat (limited to 'src/weston-launch.c')
-rw-r--r-- | src/weston-launch.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/weston-launch.c b/src/weston-launch.c index 64d4a8ae..89c3c5a2 100644 --- a/src/weston-launch.c +++ b/src/weston-launch.c @@ -60,6 +60,8 @@ #include "weston-launch.h" +#define MAX_ARGV_SIZE 256 + struct weston_launch { struct pam_conv pc; pam_handle_t *ph; @@ -523,8 +525,9 @@ main(int argc, char *argv[]) struct weston_launch wl; char **env; int i, c; - char **child_argv; + char *child_argv[MAX_ARGV_SIZE]; char *tty = NULL, *new_user = NULL; + char *term; int sleep_fork = 0; struct option opts[] = { { "user", required_argument, NULL, 'u' }, @@ -562,8 +565,8 @@ main(int argc, char *argv[]) } } - child_argv = &argv[optind-1]; - child_argv[0] = BINDIR "/weston"; + if ((argc - optind) > (MAX_ARGV_SIZE - 5)) + error(1, E2BIG, "Too many arguments to pass to weston"); if (new_user) wl.pw = getpwnam(new_user); @@ -572,7 +575,17 @@ main(int argc, char *argv[]) if (wl.pw == NULL) 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(); + setenv("TERM", term, 1); setenv("USER", wl.pw->pw_name, 1); setenv("LOGNAME", wl.pw->pw_name, 1); setenv("HOME", wl.pw->pw_dir, 1); |