All pastes #2110904 Raw Edit

slim-1.3.2-ck.patch

public text v1 · immutable
#2110904 ·published 2012-02-07 18:48 UTC
rendered paste body
--- a/slim-1.3.2/app.cpp
+++ b/slim-1.3.2/app.cpp
@@ -536,6 +536,60 @@
     string xauthority = pw->pw_dir;
     xauthority.append("/.Xauthority");
     
+#ifdef USE_CONSOLEKIT
+  cerr << APPNAME << ": consolekit support enabled" << endl;
+    int ret;
+    DBusError error;
+    char  *remote_host_name = "";
+    dbus_bool_t is_local;
+    char *display_device = "";
+    //char devtmp[16];
+
+    // if (!use_consolekit) return 1;
+    cerr << APPNAME << ": initializing a consolekit session" << endl;
+
+    is_local = TRUE; //is_local = Dpy->displayType.location == Local;
+    //if (Dpy->peerlen > 0 && Dpy->peer)
+    //remote_host_name = Dpy->peer;
+    /* how can we get the corresponding tty at best...? */
+//    if (Dpy->windowPath) {
+//   display_device = strchr(Dpy->windowPath, ':');
+//   if (display_device && display_device[1])
+//       display_device++;
+//   else
+//       display_device = Dpy->windowPath;
+//   snprintf(devtmp, sizeof(devtmp), "/dev/tty%s", display_device);
+//   display_device = devtmp;
+display_device = dpy_tty; //    }
+
+    ckconnector = ck_connector_new();
+    if (!ckconnector) {
+      cerr << APPNAME << ": ck_connector not initialized" << endl;
+   //return 0;
+    }
+
+    dbus_error_init(&error);
+    ret = ck_connector_open_session_with_parameters(
+       ckconnector, &error,
+       "unix-user", &pw->pw_uid,
+       "x11-display", &DisplayName,
+       "x11-display-device", &display_device,
+       "remote-host-name", &remote_host_name,
+       "is-local", &is_local,
+       NULL);
+    if (!ret) {
+   if (dbus_error_is_set(&error)) {
+       cerr << APPNAME << ": Dbus error: " << error.message << endl;
+       dbus_error_free(&error);
+   } else {
+       cerr << APPNAME << ": ConsoleKit error" << endl;
+   }
+   cerr << APPNAME << ": console-kit-daemon not running?" << endl;
+   ck_connector_unref(ckconnector);
+   ckconnector = NULL;
+    }  
+#endif
+
 #ifdef USE_PAM
     // Setup the PAM environment
     try{
@@ -548,6 +602,10 @@
         pam.setenv("DISPLAY", DisplayName);
         pam.setenv("MAIL", maildir.c_str());
         pam.setenv("XAUTHORITY", xauthority.c_str());
+#ifdef USE_CONSOLEKIT
+        pam.setenv("XDG_SESSION_COOKIE", ck_connector_get_cookie(ckconnector));
+    cerr << APPNAME << ": ck_connector has XDG_SESSION_COOKIE of " << ck_connector_get_cookie(ckconnector) << endl;
+#endif
     }
     catch(PAM::Exception& e){
         cerr << APPNAME << ": " << e << endl;
@@ -564,7 +622,11 @@
         char** child_env = pam.getenvlist();
         pam.end();
 #else
+#if USE_CONSOLEKIT
+        const int Num_Of_Variables = 11; // Number of env. variables + 1
+#else
         const int Num_Of_Variables = 10; // Number of env. variables + 1
+#endif
         char** child_env = static_cast<char**>(malloc(sizeof(char*)*Num_Of_Variables));
         int n = 0;
         if(term) child_env[n++]=StrConcat("TERM=", term);
@@ -576,6 +638,10 @@
         child_env[n++]=StrConcat("DISPLAY=", DisplayName);
         child_env[n++]=StrConcat("MAIL=", maildir.c_str());
         child_env[n++]=StrConcat("XAUTHORITY=", xauthority.c_str());
+#if USE_CONSOLEKIT
+	        child_env[n++]=StrConcat("XDG_SESSION_COOKIE=", ck_connector_get_cookie(ckconnector));
+    cerr << APPNAME << ": ck_connector has XDG_SESSION_COOKIE of " << ck_connector_get_cookie(ckconnector) << endl;
+#endif
         child_env[n++]=0;
 #endif
 
@@ -617,6 +683,28 @@
         }
     }
 
+#ifdef USE_CONSOLEKIT
+  
+    //DBusError error;
+
+   // if (!ckconnector)
+   //return;
+
+    //dbus_error_init(&error);
+    if (!ck_connector_close_session(ckconnector, &error)) {
+   if (dbus_error_is_set(&error)) {
+       cerr << APPNAME << ": Dbus error: " << error.message << endl;
+       dbus_error_free(&error);
+   } else {
+       cerr << APPNAME << ": ConsoleKit close error" << endl;
+   }
+   cerr << APPNAME << ": console-kit-daemon not running?" << endl;
+    }
+    ck_connector_unref(ckconnector);
+    ckconnector = NULL;
+  //}
+#endif
+
 #ifdef USE_PAM
     try{
         pam.close_session();
@@ -881,12 +969,18 @@
             bool ok = false;
             Cfg::string2int(server[i]+2, &ok);
             if (ok) {
+#ifdef USE_CONSOLEKIT
+		sprintf(dpy_tty,"/dev/tty%d",atoi(server[i]+2));
+#endif
                 hasVtSet = true;
             }
         }
     }
 
     if (!hasVtSet && daemonmode) {
+#ifdef USE_CONSOLEKIT
+	sprintf(dpy_tty,"/dev/tty7");
+#endif
         server[argc++] = (char*)"vt07";
     }
     server[argc] = NULL;
--- a/slim-1.3.2/app.h
+++ b/slim-1.3.2/app.h
@@ -27,6 +27,10 @@
 #ifdef USE_PAM
 #include "PAM.h"
 #endif
+#ifdef USE_CONSOLEKIT
+#include <ck-connector.h>
+#include <dbus/dbus.h>
+#endif
 
 class App {
 public:
@@ -81,6 +85,12 @@
 #ifdef USE_PAM
 	PAM::Authenticator pam;
 #endif
+#ifdef USE_CONSOLEKIT
+	CkConnector *ckconnector;
+	int use_consolekit;
+	char dpy_tty[16];
+#endif
+
 
     // Options
     char* DispName;
--- a/slim-1.3.2/Makefile
+++ b/slim-1.3.2/Makefile
@@ -13,6 +13,11 @@
 LDFLAGS+= -lpam
 CUSTOM+= -DUSE_PAM
 endif
+ifdef USE_CONSOLEKIT
+LDFLAGS+= `pkg-config --libs ck-connector`
+CFLAGS+= `pkg-config --cflags ck-connector`
+CUSTOM+= -DUSE_CONSOLEKIT
+endif
 PREFIX=/usr
 CFGDIR=/etc
 MANDIR=/usr/share/man