summaryrefslogtreecommitdiff
path: root/src/weston-launch.c
diff options
context:
space:
mode:
authorQuentin Glidic <sardemff7+git@sardemff7.net>2013-05-17 16:20:37 +0200
committerKristian Høgsberg <krh@bitplanet.net>2013-05-17 16:23:46 -0400
commitff3230952a68077669e0ea0ac3ceb234273556fc (patch)
treefd99c16ddc9e410cf0e7185432ca4fc3808b9b43 /src/weston-launch.c
parent5545320c36a8a9692bc1f0f0ae6e0341a818449f (diff)
downloadweston-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.c19
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);