From 855272198365de506d342b6388e8659bda7d610d Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Thu, 25 Feb 2010 13:35:32 -0500 Subject: [PATCH] [gnome-shell.in] When we don't have DISPLAY, attempt to pull in running session This is a convenience for debugging when logging in over ssh. Longer term we should stick this code (in a more OS portable fashion) into ConsoleKit. --- src/gnome-shell.in | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) mode change 100755 => 100644 src/gnome-shell.in diff --git a/src/gnome-shell.in b/src/gnome-shell.in old mode 100755 new mode 100644 index 254cdee4a..36548c582 --- a/src/gnome-shell.in +++ b/src/gnome-shell.in @@ -14,6 +14,50 @@ import termios import time import errno +def get_running_session_environs(): + wanted_environment = ['DBUS_SESSION_BUS_ADDRESS', 'DISPLAY', 'XDG_DATA_DIRS', + 'XAUTHORITY', 'XDG_SESSION_COOKIE', 'ORBIT_SOCKETDIR', + 'SESSION_MANAGER'] + num_re = re.compile('^[0-9]+$') + myuid = os.getuid() + if not os.path.isdir('/proc'): + return {} + for filename in os.listdir('/proc'): + if not num_re.match(filename): + continue + piddir = '/proc/' + filename + try: + stat = os.stat(piddir) + except OSError, e: + continue + if not stat.st_uid == myuid: + continue + try: + exe = os.readlink(piddir + '/exe') + except OSError, e: + continue + if os.path.basename(exe) != 'gnome-session': + continue + try: + f = open(os.path.join(piddir, 'environ')) + except OSError, e: + continue + environ_data = f.read() + f.close() + # There's a trailing null at the last one, so remove the + # empty string + environs = environ_data.split('\0')[:-1] + # Rumor has it the presence of just FOO (instead of FOO=bar) + # represents a deleted environment variable + environs = filter(lambda x: '=' in x, environs) + # Turn it into a dictionary + environs = dict(map(lambda x: x.split('=', 1), environs)) + result = {} + for key in wanted_environment: + if key in environs: + result[key] = environs[key] + return result + def start_xephyr(): tmpdir = tempfile.mkdtemp("", "gnome-shell.") atexit.register(shutil.rmtree, tmpdir) @@ -343,6 +387,12 @@ else: if options.verbose: print "Starting shell" + +# Handle ssh logins +if 'DISPLAY' not in os.environ: + running_env = get_running_session_environs() + os.environ.update(running_env) + if options.debug: # Record initial terminal state so we can reset it to that # later, in case we kill gdb at a bad time