Enable weston-launch to export the environment
variables listed with the invocation option
--export (shortened as -e).

The values of the variables are read from the
environment of weston-launch to ensure they
aren't displayed by the unix command 'ps'.

Example:
  weston-launch --export=DBUS_SESSION_BUS_ADDRESS

In the above example, the environment variable
DBUS_SESSION_BUS_ADDRESS is passed to weston.

Note: weston-launch launches the process within
a login shell. So most of the environment variables
are set through the standard process. Then the
option --export is intended to be used only when
the standard way is missing some contextual point.
---
 src/weston-launch.c | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/weston-launch.c b/src/weston-launch.c
index 525c61c..ea59e05 100644
--- a/src/weston-launch.c
+++ b/src/weston-launch.c
@@ -85,6 +85,13 @@ struct weston_launch {
 
 union cmsg_data { unsigned char b[4]; int fd; };
 
+struct reexport {
+    struct reexport * next;
+    char * name, * value;
+};
+
+static struct reexport * reexport_head = NULL;
+
 static gid_t *
 read_groups(void)
 {
@@ -527,6 +534,7 @@ setup_session(struct weston_launch *wl)
        char **env;
        char *term;
        int i;
+       struct reexport * reexport = reexport_head;
 
        if (wl->tty != STDIN_FILENO) {
                if (setsid() < 0)
@@ -537,6 +545,10 @@ setup_session(struct weston_launch *wl)
 
        term = getenv("TERM");
        clearenv();
+       while (reexport != NULL) {
+               setenv(reexport->name, reexport->value, 1);
+               reexport = reexport->next;
+       }
        if (term)
                setenv("TERM", term, 1);
        setenv("USER", wl->pw->pw_name, 1);
@@ -610,6 +622,7 @@ help(const char *name)
        fprintf(stderr, "Usage: %s [args...] [-- [weston args..]]\n", name);
        fprintf(stderr, "  -u, --user      Start session as specified username
\n");
        fprintf(stderr, "  -t, --tty       Start session on alternative tty
\n");
+       fprintf(stderr, "  -e, --export    (re-)Export the given environment
variable\n");
        fprintf(stderr, "  -v, --verbose   Be verbose\n");
        fprintf(stderr, "  -h, --help      Display this help message\n");
 }
@@ -620,9 +633,11 @@ main(int argc, char *argv[])
        struct weston_launch wl;
        int i, c;
        char *tty = NULL;
+       struct reexport **reexport = &reexport_head;
        struct option opts[] = {
                { "user",    required_argument, NULL, 'u' },
                { "tty",     required_argument, NULL, 't' },
+               { "export",  required_argument, NULL, 'e' },
                { "verbose", no_argument,       NULL, 'v' },
                { "help",    no_argument,       NULL, 'h' },
                { 0,         0,                 NULL,  0  }
@@ -630,7 +645,7 @@ main(int argc, char *argv[])
 
        memset(&wl, 0, sizeof wl);
 
-       while ((c = getopt_long(argc, argv, "u:t::vh", opts, &i)) != -1) {
+       while ((c = getopt_long(argc, argv, "u:t::e:vh", opts, &i)) != -1) {
                switch (c) {
                case 'u':
                        wl.new_user = optarg;
@@ -640,6 +655,21 @@ main(int argc, char *argv[])
                case 't':
                        tty = optarg;
                        break;
+               case 'e':
+                       if (getenv(optarg) == NULL) 
+                               error(1, 0, "Environment variable '%s' not 
found.", optarg);
+                       else {
+                               *reexport = malloc(sizeof (struct reexport));
+                               if (*reexport == NULL) {
+                                       error(1, 0, "Memory depletion.");
+                                       exit(EXIT_FAILURE);
+                               }
+                               (*reexport)->name = optarg;
+                               (*reexport)->value = getenv(optarg);
+                               reexport = &((*reexport)->next);
+                               *reexport = NULL;
+                       }
+                       break;
                case 'v':
                        wl.verbose = 1;
                        break;
-- 
1.8.1.4



_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to