Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=frugalware-current.git;a=commitdiff;h=42047952eee4c5dcbcf011ce0049b567f8c971b0

commit 42047952eee4c5dcbcf011ce0049b567f8c971b0
Author: PacMiam <[email protected]>
Date:   Thu Dec 11 20:50:50 2014 +0100

lxdm-0.5.0-1-i686

* Version bump: 0.4.1 -> 0.5.0

diff --git a/source/x11-extra/lxdm/FrugalBuild 
b/source/x11-extra/lxdm/FrugalBuild
index 75a119f..ae4db37 100644
--- a/source/x11-extra/lxdm/FrugalBuild
+++ b/source/x11-extra/lxdm/FrugalBuild
@@ -1,40 +1,47 @@
-# Compiling Time: 0.04 SBU
-# Maintainer: bouleetbil <[email protected]>
+# Compiling Time: 0.10 SBU
+# Maintainer: PacMiam <[email protected]>
+# Contributor: bouleetbil <[email protected]>

pkgname=lxdm
-pkgver=0.4.1
+pkgver=0.5.0
pkgdesc="LXDM - GUI login manager for LXDE"
-depends=('libxml2>=2.7.8' 'gtk+3' 'glibc' 'iso-codes')
-rodepends=('lxde-common' 'gtk+2-theme-frugalware' 'gnome-themes-standard' 
'lxde-frugalware' 'xorg-server')
-makedepends=('intltool')
-options=('scriptlet')
-replaces=('entrace')
+
groups=('x11-extra')
-archs=('i686' 'x86_64')
+
+depends=('gtk+2' 'glibc' 'iso-codes')
+makedepends=('intltool')
+rodepends=('lxde-common' 'lxde-frugalware' 'gnome-themes-standard' 
'xorg-server')
+
+options+=('scriptlet' 'nostrip')
+
+_F_lxde_dirname="$pkgname"
Finclude lxde
-pkgrel=7
-source=(${source[@]} pam lxdm frugalware_theme.patch fix_event_check.patch 
lxdm.service)
-sha1sums=('652886ac27ac01b24e7d13c3be3b1e582e2159cc' \
-          '05dd826d76e7be40649209ba4480810c9914708b' \
-          'b707a2f6e01a7a2b61be2489c7b425ecc138a91f' \
-          'd45e7a46a93b0de881349f1addd3d53e54ca19be' \
-          '23370b535d78266f9e3f6710aa4aae67fe360a4a' \
-          '3db903fee2e8965ed0cab00f28ffee1ecebff630')
-backup=('etc/lxdm/lxdm.conf' 'etc/pam.d/lxdm')
+
+source=(${source[@]} lxdm_frugalware.patch lxdm_fix.patch lxdm.service pam)
+sha1sums=('0a91c906b3a0edd181fad74965b22ebaa9891798' \
+          '0189b7186fef18a656b3d51969a8c8377e68d982' \
+          '29bebd9b61fd5b2e62c0825272678e4e0e4e6e91' \
+          '3db903fee2e8965ed0cab00f28ffee1ecebff630' \
+          '05dd826d76e7be40649209ba4480810c9914708b')
+
+backup=('etc/lxdm/lxdm.conf')

build()  {
-       Fcd
-       #use tty12 by default
-       Fsed "def_tty = 7" "def_tty = 12" src/lxdm.c
-       Fpatchall
-       Fautoreconf
-       Fmake
-       Fmakeinstall
-       Frm usr/sbin/lxdm
-       Fcp lxdm usr/sbin/lxdm
-       Frm etc/pam.d/lxdm
-       Fcp pam etc/pam.d/lxdm
-       Ffile /lib/systemd/system/lxdm.service
+    Fcd
+
+    # Use tty12 by default
+    Fsed "def_tty = 7" "def_tty = 12" src/lxdm.c
+
+    Fpatchall
+    Fmake
+    Fmakeinstall
+
+    # Change default LXDM pam to custom one
+    Frm etc/pam.d/lxdm
+    Fcp pam etc/pam.d/lxdm
+
+    # Add LXDM service
+    Ffile /lib/systemd/system/lxdm.service
}

# optimization OK
diff --git a/source/x11-extra/lxdm/frugalware_theme.patch 
b/source/x11-extra/lxdm/frugalware_theme.patch
deleted file mode 100644
index 3f5aff0..0000000
--- a/source/x11-extra/lxdm/frugalware_theme.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- lxdm-0.4.1/data/lxdm.conf  2011-07-29 15:44:51.000000000 +0200
-+++ lxdm-0.4.1new/data/lxdm.conf       2011-11-26 11:32:51.000000000 +0100
-@@ -16,7 +16,7 @@
- # xauth_path=/tmp
-
- ## greeter used to welcome the user
--greeter=/usr/local/libexec/lxdm-greeter-gtk
-+greeter=/usr/libexec/lxdm-greeter-gtk
-
- [server]
- ## arg used to start xserver, not fully function
-@@ -27,7 +27,7 @@
- gtk_theme=Clearlooks
-
- ## background of the greeter
--bg=/usr/share/backgrounds/default.png
-+bg=/usr/share/lxdm/themes/Frugalware/wall.png
-
- ## if show bottom pane
- bottom_pane=1
diff --git a/source/x11-extra/lxdm/lxdm_fix.patch 
b/source/x11-extra/lxdm/lxdm_fix.patch
new file mode 100644
index 0000000..bc349c7
--- /dev/null
+++ b/source/x11-extra/lxdm/lxdm_fix.patch
@@ -0,0 +1,2111 @@
+diff -Naur lxdm-0.5.0/src/lxcom.c lxdm-0.5.0b/src/lxcom.c
+--- lxdm-0.5.0/src/lxcom.c     2013-10-04 09:40:08.000000000 +0200
++++ lxdm-0.5.0b/src/lxcom.c    2014-12-09 19:08:42.203080280 +0100
+@@ -183,7 +183,6 @@
+       GSList *p,*n;
+       GString *res=NULL;
+       assert(argc>0 && argv!=NULL);
+-
+       do{
+       if(!strcmp(argv[0],"SIGNAL"))
+       {
+@@ -193,16 +192,18 @@
+                       int sig=atoi(argv[1]);
+                       if(sig==SIGCHLD)
+                       {
+-                              for(p=child_watch_list;p!=NULL;p=n)
++                              CHECK_SIGCHLD:
++                              for(p=child_watch_list;p!=NULL;p=p->next)
+                               {
+                                       ChildWatch *item=p->data;
+                                       int status;
+-                                      n=p->next;
+                                       if(waitpid(item->pid,&status,WNOHANG)>0)
+                                       {
+                                               
child_watch_list=g_slist_delete_link(child_watch_list,p);
++                                              // item->func may change the 
child_watch_list
+                                               
item->func(item->data,item->pid,status);
+                                               g_free(item);
++                                              goto CHECK_SIGCHLD;
+                                       }
+                               }
+                       }
+@@ -438,7 +439,7 @@
+ int lxcom_add_child_watch(int pid,void (*func)(void*,int,int),void *data)
+ {
+       ChildWatch *item;
+-      if(pid<0 || !func)
++      if(pid<=0 || !func)
+               return -1;
+       item=g_new(ChildWatch,1);
+       item->func=func;
+diff -Naur lxdm-0.5.0/src/lxcom.c.rej lxdm-0.5.0b/src/lxcom.c.rej
+--- lxdm-0.5.0/src/lxcom.c.rej 1970-01-01 01:00:00.000000000 +0100
++++ lxdm-0.5.0b/src/lxcom.c.rej        2014-12-09 19:09:11.627750646 +0100
+@@ -0,0 +1,40 @@
++--- src/lxcom.c
+++++ src/lxcom.c
++@@ -183,7 +183,6 @@
++      GSList *p,*n;
++      GString *res=NULL;
++      assert(argc>0 && argv!=NULL);
++-
++      do{
++      if(!strcmp(argv[0],"SIGNAL"))
++      {
++@@ -193,16 +192,18 @@
++                      int sig=atoi(argv[1]);
++                      if(sig==SIGCHLD)
++                      {
++-                             for(p=child_watch_list;p!=NULL;p=n)
+++                             CHECK_SIGCHLD:
+++                             for(p=child_watch_list;p!=NULL;p=p->next)
++                              {
++                                      ChildWatch *item=p->data;
++                                      int status;
++-                                     n=p->next;
++                                      if(waitpid(item->pid,&status,WNOHANG)>0)
++                                      {
++                                              
child_watch_list=g_slist_delete_link(child_watch_list,p);
+++                                             // item->func may change the 
child_watch_list
++                                              
item->func(item->data,item->pid,status);
++                                              g_free(item);
+++                                             goto CHECK_SIGCHLD;
++                                      }
++                              }
++                      }
++@@ -438,7 +439,7 @@
++ int lxcom_add_child_watch(int pid,void (*func)(void*,int,int),void *data)
++ {
++      ChildWatch *item;
++-     if(pid<0 || !func)
+++     if(pid<=0 || !func)
++              return -1;
++      item=g_new(ChildWatch,1);
++      item->func=func;
+diff -Naur lxdm-0.5.0/src/lxdm.c lxdm-0.5.0b/src/lxdm.c
+--- lxdm-0.5.0/src/lxdm.c      2013-11-01 14:01:31.000000000 +0100
++++ lxdm-0.5.0b/src/lxdm.c     2014-12-09 19:09:41.625414598 +0100
+@@ -669,7 +669,7 @@
+       gethostname(addr,sizeof(addr));
+
+       fd=open(file,O_CREAT|O_TRUNC|O_WRONLY,0600);
+-      if(!fd==-1) return;
++      if(fd==-1) return;
+       xauth_write_uint16(fd,256);             //FamilyLocalHost
+       xauth_write_string(fd,addr);
+       xauth_write_string(fd,buf);
+@@ -1022,7 +1022,18 @@
+       int level;
+       LXSession *s=data;
+
+-      lxsession_stop(s);
++      gchar *argv[] = { "/etc/lxdm/PostLogout", NULL };
++      g_spawn_async(NULL, argv, s->env, G_SPAWN_SEARCH_PATH, NULL, NULL, 
NULL, NULL);
++
++      if(g_key_file_get_integer(config,"server","reset",NULL)!=1)
++      {
++              lxsession_stop(s);
++      }
++      else
++      {
++              lxsession_free(s);
++              s=NULL;
++      }
+
+       level=get_run_level();
+       if(level=='0' || level=='6')
+@@ -1034,22 +1045,19 @@
+               g_message("run level %c\n",level);
+               lxdm_quit_self(0);
+       }
+-      if(s!=lxsession_greeter())
++      if(s && s!=lxsession_greeter())
+       {
+               lxsession_free(s);
+       }
+-      else if(g_key_file_get_integer(config,"server","reset",NULL)==1)
++      else if(!s)
+       {
+-              lxsession_free(s);
+               lxsession_greeter();
+       }
+-      gchar *argv[] = { "/etc/lxdm/PostLogout", NULL };
+-      g_spawn_async(NULL, argv, s->env, G_SPAWN_SEARCH_PATH, NULL, NULL, 
NULL, NULL);
+ }
+
+-gboolean lxdm_get_session_info(char *session,char **pname,char **pexec)
++gboolean lxdm_get_session_info(const char *session,char **pname,char 
**pexec,char **pdesktop_names)
+ {
+-      char *name=NULL,*exec=NULL;
++      char *name=NULL,*exec=NULL,**names=NULL,*desktop_names=NULL;
+       if(!session || !session[0])
+       {
+               name=g_key_file_get_string(config, "base", "session", 0);
+@@ -1072,6 +1080,11 @@
+                       }
+                       name=g_key_file_get_string(cfg,"Desktop 
Entry","Name",NULL);
+                       exec=g_key_file_get_string(cfg,"Desktop 
Entry","Exec",NULL);
++                      names = g_key_file_get_string_list (cfg, "Desktop 
Entry", "DesktopNames", NULL, NULL);
++                      if (names != NULL) {
++                              desktop_names = g_strjoinv (":", names);
++                              g_strfreev (names);
++                      }
+                       g_key_file_free(cfg);
+                       if(!name || !exec)
+                       {
+@@ -1097,6 +1110,11 @@
+                       {
+                               name = g_key_file_get_locale_string(f, "Desktop 
Entry", "Name", NULL, NULL);
+                               exec = g_key_file_get_string(f, "Desktop 
Entry", "Exec", NULL);
++                              names = g_key_file_get_string_list (f, "Desktop 
Entry", "DesktopNames", NULL, NULL);
++                              if (names != NULL) {
++                                      desktop_names = g_strjoinv (":", names);
++                                      g_strfreev (names);
++                              }
+                       }
+                       else
+                       {
+@@ -1120,6 +1138,7 @@
+       }
+       if(pname) *pname=name;
+       if(pexec) *pexec=exec;
++      if(pdesktop_names) *pdesktop_names=desktop_names;
+       return TRUE;
+ }
+
+@@ -1194,7 +1213,7 @@
+
+ void lxdm_do_login(struct passwd *pw, char *session, char *lang, char *option)
+ {
+-      char *session_name=0,*session_exec=0;
++      char *session_name=0,*session_exec=0,*session_desktop_names=0;
+       gboolean alloc_session=FALSE,alloc_lang=FALSE;
+       int pid;
+       LXSession *s,*prev;
+@@ -1222,7 +1241,7 @@
+               g_key_file_free(dmrc);
+       }
+
+-      if(!lxdm_get_session_info(session,&session_name,&session_exec))
++      
if(!lxdm_get_session_info(session,&session_name,&session_exec,&session_desktop_names))
+       {
+               if(alloc_session)
+                       g_free(session);
+@@ -1329,6 +1348,9 @@
+               env=g_environ_setenv(env, "LC_MESSAGES", lang, TRUE);
+               env=g_environ_setenv(env, "LANGUAGE", lang, TRUE);
+       }
++
++      if( session_desktop_names && session_desktop_names[0] )
++              env=g_environ_setenv(env, "XDG_CURRENT_DESKTOP", 
session_desktop_names, TRUE);
+
+ #ifndef DISABLE_XAUTH
+       env=create_client_auth(pw,env);
+@@ -1348,6 +1370,7 @@
+
+       g_free(session_name);
+       g_free(session_exec);
++      g_free(session_desktop_names);
+       if(alloc_session)
+               g_free(session);
+       if(alloc_lang)
+@@ -1370,7 +1393,7 @@
+ {
+       char *cmd;
+       cmd = g_key_file_get_string(config, "cmd", "shutdown", 0);
+-      if( !cmd ) cmd = g_strdup("shutdown -h now");
++      if( !cmd ) cmd = g_strdup("systemctl -i poweroff");
+       g_spawn_command_line_sync("/etc/lxdm/PreShutdown",0,0,0,0);
+       g_spawn_command_line_async(cmd,0);
+       g_free(cmd);
+diff -Naur lxdm-0.5.0/src/lxdm.c.orig lxdm-0.5.0b/src/lxdm.c.orig
+--- lxdm-0.5.0/src/lxdm.c.orig 1970-01-01 01:00:00.000000000 +0100
++++ lxdm-0.5.0b/src/lxdm.c.orig        2014-12-09 19:08:24.755275743 +0100
+@@ -0,0 +1,1729 @@
++/*
++ *      lxdm.c - main entry of lxdm
++ *
++ *      Copyright 2009 dgod <[email protected]>
++ *
++ *      This program is free software; you can redistribute it and/or modify
++ *      it under the terms of the GNU General Public License as published by
++ *      the Free Software Foundation; either version 3 of the License, or
++ *      (at your option) any later version.
++ *
++ *      This program is distributed in the hope that it will be useful,
++ *      but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *      GNU General Public License for more details.
++ *
++ *      You should have received a copy of the GNU General Public License
++ *      along with this program; if not, write to the Free Software
++ *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
++ *      MA 02110-1301, USA.
++ */
++
++#define _GNU_SOURCE
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <stdarg.h>
++#include <ctype.h>
++#include <stdint.h>
++#include <unistd.h>
++#include <stdarg.h>
++#include <fcntl.h>
++#include <pwd.h>
++#include <grp.h>
++#include <shadow.h>
++#include <errno.h>
++#include <signal.h>
++#include <time.h>
++#include <dirent.h>
++#include <sys/wait.h>
++#include <glib.h>
++#include <glib/gstdio.h>
++
++#include <sys/vt.h>
++#include <sys/ioctl.h>
++#include <sys/stat.h>
++
++#include <execinfo.h>
++
++#ifdef HAVE_UTMPX_H
++#include <utmpx.h>
++#endif
++
++#if HAVE_LIBCK_CONNECTOR
++#include <ck-connector.h>
++#endif
++
++#ifndef HAVE_LIBPAM
++#ifdef USE_PAM
++#define HAVE_LIBPAM 1
++#else
++#define HAVE_LIBPAM 0
++#endif
++#endif
++
++#if HAVE_LIBPAM
++#include <security/pam_appl.h>
++#endif
++
++#include "lxdm.h"
++#include "lxcom.h"
++#include "xconn.h"
++#include "lxcommon.h"
++#include "auth.h"
++
++#define LOGFILE "/var/log/lxdm.log"
++
++typedef struct{
++      gboolean idle;
++      gboolean greeter;
++      int tty;
++      pid_t server;
++      pid_t child;
++      uid_t user;
++      int display;
++      char *option;   /* hold option in config file */
++      xconn_t dpy;    /* hold this, or X crack */
++      LXDM_AUTH auth;
++#if HAVE_LIBCK_CONNECTOR
++      CkConnector *ckc;
++#endif
++#ifndef DISABLE_XAUTH
++      char mcookie[16];
++#endif
++      char **env;
++}LXSession;
++
++GKeyFile *config;
++static int old_tty=1,def_tty = 7,nr_tty=0;
++static int def_display=0;
++static GSList *session_list;
++
++static void lxdm_startx(LXSession *s);
++
++static int get_active_vt(void)
++{
++      int console_fd;
++      struct vt_stat console_state = { 0 };
++
++      console_fd = open("/dev/console", O_RDONLY | O_NOCTTY);
++
++      if( console_fd < 0 )
++              goto out;
++
++      if( ioctl(console_fd, VT_GETSTATE, &console_state) < 0 )
++              goto out;
++
++out:
++      if( console_fd >= 0 )
++              close(console_fd);
++
++      return console_state.v_active;
++}
++
++static void set_active_vt(int vt)
++{
++      int fd;
++
++      fd = open("/dev/console", O_RDWR);
++      if( fd < 0 )
++              fd = 0;
++      ioctl(fd, VT_ACTIVATE, vt);
++      if(fd!=0)
++              close(fd);
++}
++
++void stop_pid(int pid)
++{
++    if( pid <= 0 ) return;
++    lxcom_del_child_watch(pid);
++    if( killpg(pid, SIGTERM) < 0 )
++        killpg(pid, SIGKILL);
++    if( kill(pid, 0) == 0 )
++    {
++        if( kill(pid, SIGTERM) )
++            kill(pid, SIGKILL);
++    }
++    while( 1 )
++    {
++        int wpid, status;
++        wpid = waitpid(pid,&status,0);
++        if(pid == wpid)
++            break;
++      if(wpid<0 && errno!=EINTR)
++              break;
++    }
++
++    while( waitpid(-1, 0, WNOHANG) > 0 ) ;
++}
++
++static LXSession *lxsession_find_greeter(void)
++{
++      GSList *p;
++      for(p=session_list;p!=NULL;p=p->next)
++      {
++              LXSession *s=p->data;
++              if(s->greeter) return s;
++      }
++      return NULL;
++}
++
++static LXSession *lxsession_find_idle(void)
++{
++      GSList *p;
++      for(p=session_list;p!=NULL;p=p->next)
++      {
++              LXSession *s=p->data;
++              if(s->idle) return s;
++      }
++      return NULL;
++}
++
++static LXSession *lxsession_find_user(uid_t user)
++{
++      GSList *p;
++      for(p=session_list;p!=NULL;p=p->next)
++      {
++              LXSession *s=p->data;
++              if(s->greeter) continue;
++              if(s->user==user) return s;
++      }
++      return NULL;
++}
++
++LXSession *lxsession_find_tty(int tty)
++{
++      GSList *p;
++      for(p=session_list;p!=NULL;p=p->next)
++      {
++              LXSession *s=p->data;
++              if(s->tty==tty) return s;
++      }
++      return NULL;
++}
++
++static gboolean lxsession_get_active(void)
++{
++      GSList *p;
++      for(p=session_list;p!=NULL;p=p->next)
++      {
++              LXSession *s=p->data;
++              if(s->greeter || s->idle)
++                      continue;
++              return TRUE;
++      }
++      return FALSE;
++}
++
++static void lxsession_set_active(LXSession *s)
++{
++      if(!s || s->tty<=0) return;
++      if(get_active_vt()==s->tty)
++              return;
++      set_active_vt(s->tty);
++}
++
++static gboolean tty_is_used(int tty)
++{
++      GSList *p;
++      for(p=session_list;p!=NULL;p=p->next)
++      {
++              LXSession *s=p->data;
++              if(s->tty==tty)
++                      return TRUE;
++      }
++      return FALSE;
++}
++
++static gboolean display_is_used(int display)
++{
++      GSList *p;
++      for(p=session_list;p!=NULL;p=p->next)
++      {
++              LXSession *s=p->data;
++              if(s->display==display)
++                      return TRUE;
++      }
++      return FALSE;
++}
++
++static int lxsession_alloc_tty(void)
++{
++      int i;
++      if(!tty_is_used(def_tty))
++              return def_tty;
++      for(i=7;i<13;i++)
++      {
++              if(!tty_is_used(i))
++                      return i;
++      }
++      return 0;
++}
++
++static int lxsession_alloc_display(void)
++{
++      int i;
++      for(i=def_display;i<11;i++)
++      {
++              if(!display_is_used(i))
++                      return i;
++      }
++      return -1;
++}
++
++static LXSession *lxsession_add(void)
++{
++      LXSession *s;
++
++      s=lxsession_find_idle();
++      if(s) return s;
++      if(g_slist_length(session_list)>=4)
++              return NULL;
++      s=g_new0(LXSession,1);
++      s->greeter=FALSE;
++      s->tty=lxsession_alloc_tty();
++      s->display=lxsession_alloc_display();
++      s->idle=TRUE;
++      if(!s->tty || s->display<0)
++      {
++              g_message("alloc tty s->tty, display %d fail\n",s->display);
++              g_free(s);
++              return NULL;
++      }
++      s->env=NULL;
++      lxdm_auth_init(&s->auth);
++      session_list=g_slist_prepend(session_list,s);
++      lxdm_startx(s);
++      return s;
++}
++
++static LXSession *lxsession_greeter(void)
++{
++      char temp[16];
++      LXSession *s;
++      s=lxsession_find_greeter();
++      if(s)
++      {
++              g_message("find prev greeter\n");
++              lxsession_set_active(s);
++              return s;
++      }
++      g_message("find greeter %p\n",s);
++      s=lxsession_find_idle();
++      g_message("find idle %p\n",s);
++      if(!s) s=lxsession_add();
++      g_message("add %p\n",s);
++      if(!s)
++      {
++              g_warning("add new fail\n");
++              return NULL;
++      }
++      s->greeter=TRUE;
++      s->idle=FALSE;
++      sprintf(temp,":%d",s->display);
++      setenv("DISPLAY",temp,1);
++      g_message("prepare greeter on %s\n",temp);
++      ui_prepare();
++      lxsession_set_active(s);
++      g_message("start greeter on %s\n",temp);
++      return s;
++}
++
++static void lxsession_stop(LXSession *s)
++{
++      if(s->greeter)
++      {
++              ui_drop();
++              s->greeter=FALSE;
++      }
++      if(s->child>0)
++      {
++              lxcom_del_child_watch(s->child);
++              killpg(s->child, SIGHUP);
++              stop_pid(s->child);
++              s->child = -1;
++      }
++      if( s->server > 0 )
++      {
++              xconn_clean(s->dpy);
++      }
++      lxdm_auth_session_end(&s->auth);
++#if HAVE_LIBCK_CONNECTOR
++      if( s->ckc != NULL )
++      {
++              DBusError error;
++              dbus_error_init(&error);
++              ck_connector_close_session(s->ckc, &error);
++              if(dbus_error_is_set(&error))
++              {
++                      dbus_error_free(&error);
++              }
++              ck_connector_unref(s->ckc);
++              s->ckc=NULL;
++      }
++#endif
++      s->idle=TRUE;
++}
++
++static void lxsession_free(LXSession *s)
++{
++      if(!s)
++              return;
++      session_list=g_slist_remove(session_list,s);
++      lxsession_stop(s);
++      if(s->server)
++      {
++              if(s->dpy)
++              {
++                      xconn_close(s->dpy);
++                      s->dpy=NULL;
++              }
++              stop_pid(s->server);
++              s->server=0;
++      }
++      g_free(s->option);
++      g_strfreev(s->env);
++      g_free(s);
++}
++
++static gboolean plymouth_is_running(void)
++{
++      int status;
++      gboolean res;
++
++      res=g_spawn_command_line_sync ("/bin/plymouth 
--ping",NULL,NULL,&status,NULL);
++      if(!res) return FALSE;
++      return WIFEXITED (status) && WEXITSTATUS (status) == 0;
++}
++
++static void plymouth_quit_with_transition(void)
++{
++      g_spawn_command_line_sync("/bin/plymouth quit 
--retain-splash",NULL,NULL,NULL,NULL);
++}
++
++static void plymouth_quit_without_transition(void)
++{
++      g_spawn_command_line_sync("/bin/plymouth quit",NULL,NULL,NULL,NULL);
++}
++
++static void plymouth_prepare_transition(void)
++{
++      g_spawn_command_line_sync ("/bin/plymouth 
deactivate",NULL,NULL,NULL,NULL);
++}
++
++static char *lxsession_xserver_command(LXSession *s)
++{
++      char *p;
++      int arc;
++      char **arg;
++      int i;
++      int novtswitch=0;
++
++      if(s->option)
++      {
++              p=g_key_file_get_string(config,s->option,"xarg",0);
++              if(p) return p;
++      }
++
++      p=g_key_file_get_string(config, "server", "arg", 0);
++      if(!p) p=g_strdup("/usr/bin/X");
++      g_shell_parse_argv(p, &arc, &arg, 0);
++      g_free(p);
++      for(i=1;i<arc;)
++      {
++              p = arg[i];
++              if(!strncmp(p, "vt", 2) && isdigit(p[2]) &&
++                      ( !p[3] || (isdigit(p[3]) && !p[4]) ) )
++              {
++                      g_free(arg[i]);
++                      arc--;memcpy(arg+i,arg+i+1,(arc-i)*sizeof(char*));
++              }
++              else if(!strcmp(p,"-background"))
++              {
++                      g_free(arg[i]);
++                      arc--;memcpy(arg+i,arg+i+1,(arc-i)*sizeof(char*));
++                      if(i<arc && !strcmp(arg[i],"none"))
++                      {
++                              g_free(arg[i]);
++                              
arc--;memcpy(arg+i,arg+i+1,(arc-i)*sizeof(char*));
++                      }
++              }
++              else if(!strcmp(p,"-nr"))
++              {
++                      g_free(arg[i]);
++                      arc--;memcpy(arg+i,arg+i+1,(arc-i)*sizeof(char*));
++              }
++              else if(!strcmp(p,"-novtswitch"))
++              {
++                      novtswitch=1;
++              }
++              else
++              {
++                      i++;
++              }
++      }
++
++      arg = g_renew(char *, arg, arc + 10);
++      if(nr_tty)
++      {
++              arg[arc++] = g_strdup("-background");
++              arg[arc++] = g_strdup("none");
++      }
++      arg[arc++] = g_strdup_printf(":%d",s->display);
++      if(s->tty>0)
++              arg[arc++] = g_strdup_printf("vt%02d", s->tty);
++      if(g_key_file_get_integer(config,"server","tcp_listen",0)!=1)
++      {
++              arg[arc++] = g_strdup("-nolisten");
++              arg[arc++] = g_strdup("tcp");
++      }
++      if(!novtswitch)
++      {
++              arg[arc++] = g_strdup("-novtswitch");
++      }
++      arg[arc] = NULL;
++      p=g_strjoinv(" ", arg);
++      g_strfreev(arg);
++      return p;
++}
++
++void lxdm_get_tty(void)
++{
++      char *s = g_key_file_get_string(config, "server", "arg", 0);
++      int arc;
++      char **arg;
++      int len;
++      int gotvtarg = 0;
++      gboolean plymouth;
++
++      plymouth=plymouth_is_running();
++      if(plymouth)
++      {
++              g_message("found plymouth running\n");
++              plymouth_prepare_transition();
++      }
++
++      old_tty=get_active_vt();
++      if( !s ) s = g_strdup("/usr/bin/X");
++      g_shell_parse_argv(s, &arc, &arg, 0);
++      g_free(s);
++      for( len = 0; arg && arg[len]; len++ )
++      {
++              char *p = arg[len];
++              if( !strncmp(p, "vt", 2) && isdigit(p[2]) &&
++              ( !p[3] || (isdigit(p[3]) && !p[4]) ) )
++              {
++                      def_tty = atoi(p + 2);
++                      gotvtarg = 1;
++              }
++              else if(!strcmp(p,"-background") || !strcmp(p,"-nr"))
++              {
++                      nr_tty=1;
++              }
++              else if(p[0]==':' && isdigit(p[1]))
++              {
++                      def_display=atoi(p+1);
++              }
++      }
++      if(!gotvtarg)
++      {
++              /* support plymouth */
++              if(g_key_file_get_integer(config, "server", "active_vt", 0) )
++                      /* use the active vt */
++                      def_tty = old_tty;
++              if(plymouth)
++              {
++                      nr_tty=1;
++                      plymouth_quit_with_transition();
++              }
++      }
++      else
++      {
++              if(plymouth) /* set tty and plymouth running */
++                      plymouth_quit_without_transition();
++      }
++      g_strfreev(arg);
++}
++
++void lxdm_quit_self(int code)
++{
++      g_message("quit code %d\n",code);
++      exit(code);
++}
++
++static void log_init(void)
++{
++      int fd_log;
++      g_unlink(LOGFILE ".old");
++      g_rename(LOGFILE, LOGFILE ".old");
++      fd_log = open(LOGFILE, O_CREAT|O_APPEND|O_TRUNC|O_WRONLY|O_EXCL, 0640);
++      if(fd_log == -1) return;
++      dup2(fd_log, 1);
++      dup2(fd_log, 2);
++      close(fd_log);
++}
++
++static void log_ignore(const gchar *log_domain, GLogLevelFlags log_level,
++                       const gchar *message, gpointer user_data)
++{
++}
++#if 0
++GSList *do_scan_xsessions(void)
++{
++    GSList *xsessions = NULL;
++    GDir *d;
++    const char *basename;
++    GKeyFile *f;
++
++    d = g_dir_open(XSESSIONS_DIR, 0, NULL);
++    if( !d )
++        return NULL;
++
++    f = g_key_file_new();
++    while( ( basename = g_dir_read_name(d) ) != NULL )
++    {
++        char *file_path;
++        gboolean loaded;
++
++        if(!g_str_has_suffix(basename, ".desktop"))
++            continue;
++
++        file_path = g_build_filename(XSESSIONS_DIR, basename, NULL);
++        loaded = g_key_file_load_from_file(f, file_path, G_KEY_FILE_NONE, 
NULL);
++        g_free(file_path);
++
++        if( loaded )
++        {
++            char *name = g_key_file_get_locale_string(f, "Desktop Entry", 
"Name", NULL, NULL);
++            if( name )
++            {
++                char *exec = g_key_file_get_string(f, "Desktop Entry", 
"Exec", NULL);
++                if(exec)
++                {
++                    Session* sess = g_new( Session, 1 );
++                    sess->name = name;
++                    sess->exec = exec;
++                    sess->desktop_file = g_strdup(basename);
++                    if( !strcmp(name, "LXDE") )
++                        xsessions = g_slist_prepend(xsessions, sess);
++                    else
++                        xsessions = g_slist_append(xsessions, sess);
++                    continue; /* load next file */
++                    g_free(exec);
++                }
++                g_free(name);
++            }
++        }
++    }
++    g_dir_close(d);
++    g_key_file_free(f);
++    return xsessions;
++}
++
++void free_xsessions(GSList *l)
++{
++    GSList *p;
++    Session *sess;
++
++    for( p = l; p; p = p->next )
++    {
++        sess = p->data;
++        g_free(sess->name);
++        g_free(sess->exec);
++        g_free(sess);
++    }
++    g_slist_free(l);
++}
++#endif
++
++#ifndef DISABLE_XAUTH
++
++static inline void xauth_write_uint16(int fd,uint16_t data)
++{
++      uint8_t t;
++      t=data>>8;
++      write(fd,&t,1);
++      t=data&0xff;
++      write(fd,&t,1);
++}
++
++static inline void xauth_write_string(int fd,const char *s)
++{
++      size_t len=strlen(s);
++      xauth_write_uint16(fd,(uint16_t)len);
++      write(fd,s,len);
++}
++
++static void xauth_write_file(const char *file,int dpy,char data[16])
++{
++      int fd;
++      char addr[128];
++      char buf[16];
++
++      sprintf(buf,"%d",dpy);
++      gethostname(addr,sizeof(addr));
++
++      fd=open(file,O_CREAT|O_TRUNC|O_WRONLY,0600);
++      if(!fd==-1) return;
++      xauth_write_uint16(fd,256);             //FamilyLocalHost
++      xauth_write_string(fd,addr);
++      xauth_write_string(fd,buf);
++      xauth_write_string(fd,"MIT-MAGIC-COOKIE-1");
++      xauth_write_uint16(fd,16);
++      write(fd,data,16);
++      close(fd);
++}
++
++static void create_server_auth(LXSession *s)
++{
++      GRand *h;
++      int i;
++      char *authfile;
++
++      h = g_rand_new();
++      for( i = 0; i < 16; i++ )
++      {
++              s->mcookie[i] = g_rand_int(h)&0xff;
++      }
++      g_rand_free(h);
++
++      authfile = g_strdup_printf("/var/run/lxdm/lxdm-:%d.auth",s->display);
++
++      //setenv("XAUTHORITY",authfile,1);
++      remove(authfile);
++      xauth_write_file(authfile,s->display,s->mcookie);
++      g_free(authfile);
++}
++
++static char ** create_client_auth(struct passwd *pw,char **env)
++{
++      LXSession *s;
++      char *authfile;
++
++      if(pw->pw_uid==0) /* root don't need it */
++              return env;
++
++      s=lxsession_find_user(pw->pw_uid);
++      if(!s)
++              return env;
++
++      /* pam_mktemp may provide XAUTHORITY to DM, just use it */
++      if((authfile=(char*)g_environ_getenv(env,"XAUTHORITY"))!=NULL)
++      {
++              authfile=g_strdup(authfile);
++      }
++      else
++      {
++              char *path;
++              path=g_key_file_get_string(config,"base","xauth_path",NULL);
++              if(path)
++              {
++                      authfile = g_strdup_printf("%s/.Xauth%d", 
path,pw->pw_uid);
++                      g_free(path);
++              }
++              else
++              {
++                      authfile = g_strdup_printf("%s/.Xauthority", 
pw->pw_dir);
++              }
++      }
++      remove(authfile);
++      xauth_write_file(authfile,s->display,s->mcookie);
++      env=g_environ_setenv(env,"XAUTHORITY",authfile,TRUE);
++      chown(authfile,pw->pw_uid,pw->pw_gid);
++      g_free(authfile);
++
++      return env;
++}
++#endif
++
++int lxdm_auth_user(int type,char *user, char *pass, struct passwd **ppw)
++{
++    LXSession *s;
++    int ret;
++    s=lxsession_find_greeter();
++    if(!s) s=lxsession_find_idle();
++    if(!s) s=lxsession_add();
++    if(!s)
++    {
++        g_critical("lxsession_add fail\n");
++        exit(0);
++    }
++      ret=lxdm_auth_user_authenticate(&s->auth,user,pass,type);
++      if(ret==AUTH_SUCCESS)
++              *ppw=&s->auth.pw;
++      return ret;
++}
++
++static void close_left_fds(void)
++{
++      struct dirent **list;
++      char path[256];
++      int n;
++
++      snprintf(path,sizeof(path),"/proc/%d/fd",getpid());
++      n=scandir(path,&list,0,0);
++      if(n<0) return;
++      while(n--)
++      {
++              int fd=atoi(list[n]->d_name);
++              free(list[n]);
++              if(fd<=STDERR_FILENO)
++                      continue;
++              close(fd);
++      }
++      free(list);
++
++      int fd = open("/dev/null", O_WRONLY);
++      if(fd == -1) return;
++      dup2(fd, 1);
++      dup2(fd, 2);
++      close(fd);
++}
++
++void switch_user(struct passwd *pw, const char *run, char **env)
++{
++      int fd;
++
++      setenv("USER",pw->pw_name,1);
++      setenv("LOGNAME",pw->pw_name,1);
++      setenv("SHELL",pw->pw_shell,1);
++      setenv("HOME",pw->pw_dir,1);
++
++      g_spawn_command_line_sync ("/etc/lxdm/PreLogin",NULL,NULL,NULL,NULL);
++
++      if( !pw || initgroups(pw->pw_name, pw->pw_gid) ||
++                      setgid(pw->pw_gid) || setuid(pw->pw_uid) || setsid() == 
-1 )
++              exit(EXIT_FAILURE);
++      chdir(pw->pw_dir);
++      fd=open(".xsession-errors",O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);
++      if(fd!=-1)
++      {
++              dup2(fd,STDERR_FILENO);
++              close(fd);
++      }
++
++      /* reset signal */
++      signal(SIGCHLD, SIG_DFL);
++      signal(SIGTERM, SIG_DFL);
++      signal(SIGPIPE, SIG_DFL);
++      signal(SIGALRM, SIG_DFL);
++      signal(SIGHUP, SIG_DFL);
++      close_left_fds();
++
++      g_spawn_command_line_async ("/etc/lxdm/PostLogin",NULL);
++      execle("/etc/lxdm/Xsession", "/etc/lxdm/Xsession", run, NULL, env);
++      exit(EXIT_FAILURE);
++}
++
++static void get_lock(void)
++{
++      FILE *fp;
++      char *lockfile;
++
++      lockfile = g_key_file_get_string(config, "base", "lock", 0);
++      if( !lockfile ) lockfile = g_strdup("/var/run/lxdm.pid");
++
++      fp = fopen(lockfile, "r");
++      if( fp )
++      {
++              int pid;
++              int ret;
++              ret = fscanf(fp, "%d", &pid);
++              fclose(fp);
++              if(ret == 1 && pid!=getpid())
++              {
++                      if(kill(pid, 0) == 0 || (ret == -1 && errno == EPERM))
++                      {
++                              /* we should only quit if the pid running is 
lxdm */
++#ifdef __linux__
++                              char path[64],buf[128];
++                              sprintf(path,"/proc/%d/exe",pid);
++                              ret=readlink(path,buf,128);
++                              if(ret<128 && ret>0 && 
strstr(buf,"lxdm-binary"))
++                                      lxdm_quit_self(1);
++#else
++                              lxdm_quit_self(1);
++#endif
++                      }
++              }
++      }
++      fp = fopen(lockfile, "w");
++      if( !fp )
++      {
++              g_critical("open lock file %s fail\n",lockfile);
++              lxdm_quit_self(0);
++      }
++      fprintf( fp, "%d", getpid() );
++      fclose(fp);
++      g_free(lockfile);
++}
++
++static void put_lock(void)
++{
++    FILE *fp;
++    char *lockfile;
++
++    lockfile = g_key_file_get_string(config, "base", "lock", 0);
++    if( !lockfile ) lockfile = g_strdup("/var/run/lxdm.pid");
++    fp = fopen(lockfile, "r");
++    if( fp )
++    {
++        int pid;
++        int ret;
++        ret = fscanf(fp, "%d", &pid);
++        fclose(fp);
++        if( ret == 1 && pid == getpid() )
++            remove(lockfile);
++    }
++    g_free(lockfile);
++}
++
++static void on_xserver_stop(void *data,int pid, int status)
++{
++      LXSession *s=data;
++      LXSession *greeter;
++
++      g_message("xserver stop, restart. return status %x\n",status);
++
++      stop_pid(pid);
++      s->server = -1;
++      lxsession_stop(s);
++      greeter=lxsession_find_greeter();
++      if(s->greeter || !greeter)
++      {
++              s->greeter=TRUE;
++              xconn_close(s->dpy);
++              s->dpy=NULL;
++              lxdm_startx(s);
++              ui_drop();
++              ui_prepare();
++              lxsession_set_active(greeter);
++      }
++      else
++      {
++              lxsession_free(s);
++              lxsession_set_active(greeter);
++      }
++}
++
++void lxdm_startx(LXSession *s)
++{
++      char *arg;
++      char **args;
++      int i;
++      char display[16];
++
++      lxsession_set_active(s);
++
++      sprintf(display,":%d",s->display);
++      setenv("DISPLAY",display,1);
++
++      #ifndef DISABLE_XAUTH
++      create_server_auth(s);
++      #endif
++
++      arg = lxsession_xserver_command(s);
++      args = g_strsplit(arg, " ", -1);
++      g_free(arg);
++
++      s->server = vfork();
++
++      switch( s->server )
++      {
++      case 0:
++              execvp(args[0], args);
++              g_critical("exec %s fail\n",args[0]);
++              lxdm_quit_self(0);
++              break;
++      case -1:
++      /* fatal error, should not restart self */
++              g_critical("fork proc fail\n");
++              lxdm_quit_self(0);
++              break;
++      default:
++              break;
++      }
++      g_strfreev(args);
++      lxcom_add_child_watch(s->server, on_xserver_stop, s);
++
++      g_message("%ld: add xserver watch\n",time(NULL));
++      for( i = 0; i < 100; i++ )
++      {
++              if(lxcom_last_sig==SIGINT || lxcom_last_sig==SIGTERM)
++                      break;
++              if((s->dpy=xconn_open(display))!=NULL)
++                      break;
++              g_usleep(50 * 1000);
++              //g_message("retry %d\n",i);
++      }
++      g_message("%ld: start xserver in %d retry",time(NULL),i);
++      if(s->dpy==NULL)
++              exit(EXIT_FAILURE);
++
++      if(s->option && g_key_file_has_key(config,s->option,"numlock",NULL))
++      {
++              i=g_key_file_get_integer(config,s->option,"numlock",0);
++              arg=g_strdup_printf("%s %d",LXDM_NUMLOCK_PATH,i);
++              g_spawn_command_line_async(arg,NULL);
++              g_free(arg);
++
++      }
++      else if(g_key_file_has_key(config,"base","numlock",NULL))
++      {
++              i=g_key_file_get_integer(config,"base","numlock",0);
++              arg=g_strdup_printf("%s %d",LXDM_NUMLOCK_PATH,i);
++              g_spawn_command_line_async(arg,NULL);
++              g_free(arg);
++      }
++}
++
++static void exit_cb(void)
++{
++      g_message("exit cb\n");
++      ui_drop();
++      while(session_list)
++              lxsession_free(session_list->data);
++      g_message("free session\n");
++      put_lock();
++      set_active_vt(old_tty);
++      g_key_file_free(config);
++}
++
++static int get_run_level(void)
++{
++#if defined(HAVE_UTMPX_H) && defined(RUN_LVL)
++      int res=0;
++      struct utmpx *ut,tmp;
++
++      setutxent();
++      tmp.ut_type=RUN_LVL;
++      ut=getutxid(&tmp);
++      if(!ut)
++      {
++              endutxent();
++              return 5;
++      }
++      res=ut->ut_pid & 0xff;
++      endutxent();
++      //g_message("runlevel %c\n",res);
++      return res;
++#else
++      return 5;
++#endif
++}
++
++static void on_session_stop(void *data,int pid, int status)
++{
++      int level;
++      LXSession *s=data;
++
++      lxsession_stop(s);
++
++      level=get_run_level();
++      if(level=='0' || level=='6')
++      {
++              if(level=='0')
++                      
g_spawn_command_line_sync("/etc/lxdm/PreShutdown",0,0,0,0);
++              else
++                      
g_spawn_command_line_sync("/etc/lxdm/PreReboot",0,0,0,0);
++              g_message("run level %c\n",level);
++              lxdm_quit_self(0);
++      }
++      if(s!=lxsession_greeter())
++      {
++              lxsession_free(s);
++      }
++      else if(g_key_file_get_integer(config,"server","reset",NULL)==1)
++      {
++              lxsession_free(s);
++              lxsession_greeter();
++      }
++      gchar *argv[] = { "/etc/lxdm/PostLogout", NULL };
++      g_spawn_async(NULL, argv, s->env, G_SPAWN_SEARCH_PATH, NULL, NULL, 
NULL, NULL);
++}
++
++gboolean lxdm_get_session_info(char *session,char **pname,char **pexec)
++{
++      char *name=NULL,*exec=NULL;
++      if(!session || !session[0])
++      {
++              name=g_key_file_get_string(config, "base", "session", 0);
++              if(!name && getenv("PREFERRED"))
++                      name = g_strdup(getenv("PREFERRED"));
++              if(!name && getenv("DESKTOP"))
++                      name = g_strdup(getenv("DESKTOP"));
++              if(!name) name=g_strdup("LXDE");
++      }
++      else
++      {
++              char *p=strrchr(session,'.');
++              if(p && !strcmp(p,".desktop"))
++              {
++                      GKeyFile *cfg=g_key_file_new();
++                      
if(!g_key_file_load_from_file(cfg,session,G_KEY_FILE_NONE,NULL))
++                      {
++                              g_key_file_free(cfg);
++                              return FALSE;
++                      }
++                      name=g_key_file_get_string(cfg,"Desktop 
Entry","Name",NULL);
++                      exec=g_key_file_get_string(cfg,"Desktop 
Entry","Exec",NULL);
++                      g_key_file_free(cfg);
++                      if(!name || !exec)
++                      {
++                              g_free(name);
++                              g_free(exec);
++                              return FALSE;
++                      }
++              }
++              else
++              {
++                      GKeyFile *f;
++                      char *file_path;
++                      gboolean loaded;
++
++                      f = g_key_file_new();
++                      char *desktop_name = g_strconcat(session, ".desktop", 
NULL);
++                      file_path = g_build_filename(XSESSIONS_DIR, 
desktop_name, NULL);
++                      loaded = g_key_file_load_from_file(f, file_path, 
G_KEY_FILE_NONE, NULL);
++                      g_free(file_path);
++                      g_free(desktop_name);
++
++                      if ( loaded )
++                      {
++                              name = g_key_file_get_locale_string(f, "Desktop 
Entry", "Name", NULL, NULL);
++                              exec = g_key_file_get_string(f, "Desktop 
Entry", "Exec", NULL);
++                      }
++                      else
++                      {
++                              name=g_strdup(session);
++                      }
++                      g_key_file_free(f);
++              }
++      }
++      if(name && !exec)
++      {
++              if(!strcasecmp(name,"LXDE"))
++                      exec = g_strdup("startlxde");
++              else if( !strcasecmp(name, "GNOME") )
++                      exec = g_strdup("gnome-session");
++              else if( !strcasecmp(name, "KDE") )
++                      exec = g_strdup("startkde");
++              else if( !strcasecmp(name, "XFCE") || !strcasecmp(name, 
"xfce4"))
++                      exec = g_strdup("startxfce4");
++              else
++                      exec=g_strdup(name);
++      }
++      if(pname) *pname=name;
++      if(pexec) *pexec=exec;
++      return TRUE;
++}
++
++static void lxdm_save_login(char *session,char *lang)
++{
++      char *old;
++      GKeyFile *var;
++      int dirty=0;
++      if(!session || !session[0])
++              session="__default__";
++      if(!lang)
++              lang="";
++      var=g_key_file_new();
++      g_key_file_set_list_separator(var, ' ');
++      g_key_file_load_from_file(var,VCONFIG_FILE,0,NULL);
++      old=g_key_file_get_string(var,"base","last_session",0);
++      if(0!=g_strcmp0(old,session))
++      {
++              g_key_file_set_string(var,"base","last_session",session);
++              dirty++;
++      }
++      g_free(old);
++      old=g_key_file_get_string(var,"base","last_lang",0);
++      if(0!=g_strcmp0(old,lang))
++      {
++              g_key_file_set_string(var,"base","last_lang",lang);
++              dirty++;
++      }
++      g_free(old);
++      if(lang[0])
++      {
++              char **list;
++              gsize len;
++              
list=g_key_file_get_string_list(var,"base","last_langs",&len,NULL);
++              if(!list)
++              {
++                      list=g_new0(char*,2);
++                      list[0]=g_strdup(lang);
++                      
g_key_file_set_string_list(var,"base","last_langs",(void*)list,1);
++                      g_strfreev(list);
++                      dirty++;
++              }
++              else
++              {
++                      int i;
++                      for(i=0;i<len;i++)
++                      {
++                              if(!strcmp(list[i],lang)) break;
++                      }
++                      if(i==len)
++                      {
++                              list=g_renew(char*,list,len+2);
++                              list[len]=g_strdup(lang);
++                              list[len+1]=NULL;
++                              
g_key_file_set_string_list(var,"base","last_langs",(void*)list,len+1);
++                              dirty++;
++                      }
++                      g_strfreev(list);
++              }
++      }
++      if(dirty)
++      {
++              gsize len;
++        char* data = g_key_file_to_data(var, &len, NULL);
++              mkdir("/var/lib/lxdm",0755);
++              chmod("/var/lib/lxdm",0755);
++        g_file_set_contents(VCONFIG_FILE, data, len, NULL);
++        g_free(data);
++      }
++      g_key_file_free(var);
++}
++
++void lxdm_do_login(struct passwd *pw, char *session, char *lang, char *option)
++{
++      char *session_name=0,*session_exec=0;
++      gboolean alloc_session=FALSE,alloc_lang=FALSE;
++      int pid;
++      LXSession *s,*prev;
++
++      lxdm_save_login(session,lang);
++      if(!strcmp(session,"__default__"))
++              session=NULL;
++
++      if(!session ||!session[0] || !lang || !lang[0])
++      {
++              char *path=g_strdup_printf("%s/.dmrc",pw->pw_dir);
++              GKeyFile *dmrc=g_key_file_new();
++              g_key_file_load_from_file(dmrc,path,G_KEY_FILE_NONE,0);
++              g_free(path);
++              if(!session || !session[0])
++              {
++                      
session=g_key_file_get_string(dmrc,"Desktop","Session",NULL);
++                      alloc_session=TRUE;
++              }
++              if(!lang || !lang[0])
++              {
++                      
lang=g_key_file_get_string(dmrc,"Desktop","Language",NULL);
++                      alloc_lang=TRUE;
++              }
++              g_key_file_free(dmrc);
++      }
++
++      if(!lxdm_get_session_info(session,&session_name,&session_exec))
++      {
++              if(alloc_session)
++                      g_free(session);
++              if(alloc_lang)
++                      g_free(lang);
++              ui_prepare();
++              g_debug("get session %s info fail\n",session);
++              return;
++      }
++
++      g_debug("login user %s session %s lang 
%s\n",pw->pw_name,session_exec,lang);
++
++      if( pw->pw_shell[0] == '\0' )
++      {
++              setusershell();
++              strcpy(pw->pw_shell, getusershell());
++              endusershell();
++      }
++      prev=lxsession_find_user(pw->pw_uid);
++      s=lxsession_find_greeter();
++      if(prev && prev->child>0)
++      {
++              if(s) lxsession_free(s);
++              lxsession_set_active(prev);
++              return;
++      }
++      if(!s) s=lxsession_find_idle();
++      if(!s) s=lxsession_add();
++      if(!s)
++      {
++              g_critical("lxsession_add fail\n");
++              exit(0);
++      }
++      s->greeter=FALSE;
++      s->idle=FALSE;
++      s->user=pw->pw_uid;
++      if(option)
++              s->option=g_strdup(option);
++#if HAVE_LIBCK_CONNECTOR
++      if(s->ckc)
++      {
++              ck_connector_unref(s->ckc);
++              s->ckc=NULL;
++      }
++#endif
++      
lxdm_auth_session_begin(&s->auth,session_name,s->tty,s->display,s->mcookie);
++#if HAVE_LIBCK_CONNECTOR
++#if HAVE_LIBPAM
++      if(!s->ckc && (!s->auth.handle || 
!pam_getenv(s->auth.handle,"XDG_SESSION_COOKIE")))
++#else
++      if(!s->ckc)
++#endif
++      {
++              s->ckc = ck_connector_new();
++      }
++      if( s->ckc != NULL )
++      {
++              DBusError error;
++              char x[256], *d, *n;
++              gboolean is_local=TRUE;
++              sprintf(x, "/dev/tty%d", s->tty);
++              dbus_error_init(&error);
++              d = x; n = getenv("DISPLAY");
++              if( ck_connector_open_session_with_parameters(s->ckc, &error,
++                                                        "unix-user", 
&pw->pw_uid,
++      // disable this, follow the gdm way
++                                                        //"display-device", 
&d,
++                                                        "x11-display-device", 
&d,
++                                                        "x11-display", &n,
++                                                        "is-local",&is_local,
++                                                        NULL))
++              {
++                      setenv("XDG_SESSION_COOKIE", 
ck_connector_get_cookie(s->ckc), 1);
++              }
++              else
++              {
++                      g_message("create ConsoleKit session fail\n");
++              }
++      }
++      else
++      {
++              g_message("create ConsoleKit connector fail\n");
++      }
++#endif
++      char **env, *path;
++      env=g_get_environ();
++
++      env=g_environ_setenv(env, "HOME", pw->pw_dir, TRUE);
++      env=g_environ_setenv(env, "SHELL", pw->pw_shell, TRUE);
++      env=g_environ_setenv(env, "USER", pw->pw_name, TRUE);
++      env=g_environ_setenv(env, "LOGNAME", pw->pw_name, TRUE);
++
++      /* override $PATH if needed */
++      path = g_key_file_get_string(config, "base", "path", 0);
++      if( G_UNLIKELY(path) && path[0] ) /* if PATH is specified in config 
file */
++              env=g_environ_setenv(env, "PATH", path, TRUE); /* override 
current $PATH with config value */
++      else /* don't use the global env, they are bad for user */
++              env=g_environ_setenv(env, "PATH", 
"/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin", TRUE); /* set 
proper default */
++      g_free(path);
++      /* optionally override $LANG, $LC_MESSAGES, and $LANGUAGE */
++      if( lang && lang[0] )
++      {
++              env=g_environ_setenv(env, "LANG", lang, TRUE);
++              env=g_environ_setenv(env, "LC_MESSAGES", lang, TRUE);
++              env=g_environ_setenv(env, "LANGUAGE", lang, TRUE);
++      }
++
++#ifndef DISABLE_XAUTH
++      env=create_client_auth(pw,env);
++#endif
++      s->env = env;
++
++      /*s->child = pid = fork();
++      if(s->child==0)
++      {
++              env=lxdm_auth_append_env(&s->auth,env);
++              lxdm_auth_clean_for_child(&s->auth);
++              switch_user(pw, session_exec, env);
++              lxdm_quit_self(4);
++      }*/
++
++      s->child = pid = lxdm_auth_session_run(&s->auth,session_exec,env);
++
++      g_free(session_name);
++      g_free(session_exec);
++      if(alloc_session)
++              g_free(session);
++      if(alloc_lang)
++              g_free(lang);
++      lxcom_add_child_watch(pid, on_session_stop, s);
++}
++
++void lxdm_do_reboot(void)
++{
++      char *cmd;
++      cmd = g_key_file_get_string(config, "cmd", "reboot", 0);
++      if( !cmd ) cmd = g_strdup("reboot");
++      g_spawn_command_line_sync("/etc/lxdm/PreReboot",0,0,0,0);
++      g_spawn_command_line_async(cmd,0);
++      g_free(cmd);
++      lxdm_quit_self(0);
++}
++
++void lxdm_do_shutdown(void)
++{
++      char *cmd;
++      cmd = g_key_file_get_string(config, "cmd", "shutdown", 0);
++      if( !cmd ) cmd = g_strdup("shutdown -h now");
++      g_spawn_command_line_sync("/etc/lxdm/PreShutdown",0,0,0,0);
++      g_spawn_command_line_async(cmd,0);
++      g_free(cmd);
++      lxdm_quit_self(0);
++}
++
++static gboolean auto_login_future(void)
++{
++      return g_key_file_get_integer(config,"base","timeout",NULL)>=5;
++}
++
++int lxdm_do_auto_login(void)
++{
++      struct passwd *pw;
++      char *p,**users;
++      char *pass=NULL;
++      int i,count,ret;
++      int success=0;
++
++      p = g_key_file_get_string(config, "base", "autologin", 0);
++      if(!p) return 0;
++      users=g_strsplit(p," ",8);
++      g_free(p);
++      count=g_strv_length(users);
++
++      #ifdef ENABLE_PASSWORD
++      if(count==1)
++              pass = g_key_file_get_string(config, "base", "password", 0);
++      #endif
++
++      /* get defaults from last login */
++      GKeyFile *var_config = g_key_file_new();
++      g_key_file_set_list_separator(var_config, ' ');
++      
g_key_file_load_from_file(var_config,VCONFIG_FILE,G_KEY_FILE_KEEP_COMMENTS, 
NULL);
++
++      char* last_session = g_key_file_get_string(var_config, "base", 
"last_session", NULL);
++      if(last_session != NULL && last_session[0] == 0)
++      {
++              g_free(last_session);
++              last_session = NULL;
++      }
++
++      char* last_lang = g_key_file_get_string(var_config, "base", 
"last_lang", NULL);
++
++      g_key_file_free(var_config);
++
++      for(i=0;i<count;i++)
++      {
++              char *user,*session=NULL,*lang=NULL,*option=NULL;
++              p=users[i];
++              /* autologin users starting with '@' get own config section with
++               * user=, session= and lang= entry
++               */
++              if(p[0]=='@')
++              {
++                      option=p+1;
++                      user=g_key_file_get_string(config,option,"user",NULL);
++                      
session=g_key_file_get_string(config,option,"session",0);
++                      lang=g_key_file_get_string(config,option,"lang",0);
++              }
++              /* autologin users not starting with '@' get user, session, 
lang section
++                 * from last login
++                 */
++              else
++              {
++                      user=g_strdup(p);
++                      session=g_strdup(last_session);
++                      lang=g_strdup(last_lang);
++              }
++              ret=lxdm_auth_user(AUTH_TYPE_AUTO_LOGIN, user, pass, &pw);
++              if(ret==AUTH_SUCCESS)
++              {
++                      lxdm_do_login(pw,session,lang,option);
++                      success=1;
++              }
++              g_free(user);g_free(session);g_free(lang);
++      }
++      g_free(last_lang);
++      g_free(last_session);
++      g_strfreev(users);
++      g_free(pass);
++      return success;
++}
++
++static void log_sigsegv(void)
++{
++      void *array[40];
++      size_t size;
++      char **bt_strs;
++      size_t i;
++
++      size=backtrace(array,40);
++      bt_strs=backtrace_symbols(array, size);
++
++      for (i=0; i<size; i++)
++          fprintf(stderr, "%s\n", bt_strs[i]);
++
++      free(bt_strs);
++}
++
++static void sigsegv_handler(int sig)
++{
++      switch(sig){
++      case SIGSEGV:
++              log_sigsegv();
++              lxdm_quit_self(0);
++              break;
++      default:
++              break;
++      }
++}
++
++static void lxdm_signal_handler(void *data,int sig)
++{
++      switch(sig){
++      case SIGTERM:
++      case SIGINT:
++              g_critical("QUIT BY SIGNAL\n");
++              lxdm_quit_self(0);
++              break;
++      default:
++              break;
++      }
++}
++
++static gboolean strv_find(char **strv,const char *p)
++{
++      int i;
++      if(!strv || !p) return FALSE;
++      for(i=0;strv[i]!=NULL;i++)
++      {
++              if(!strcmp(strv[i],p))
++                      return TRUE;
++      }
++      return FALSE;
++}
++
++static char *lxdm_get_user_face(struct passwd *pw)
++{
++      GKeyFile *kf;
++      char *face;
++      char *file;
++      face=g_strdup_printf("%s/.face",pw->pw_dir);
++      if(!access(face,R_OK))
++              return face;
++      g_free(face);
++      kf=g_key_file_new();
++      file=g_build_filename ("/var/lib/AccountsService/users/", pw->pw_name, 
NULL);
++      g_key_file_load_from_file (kf, file, 0, NULL);
++      g_free(file);
++      face=g_key_file_get_string(kf,"User","Icon",NULL);
++      g_key_file_free(kf);
++      if(face && !access(face,R_OK))
++              return face;
++      g_free(face);
++      return NULL;
++}
++
++GKeyFile *lxdm_user_list(void)
++{
++      struct passwd *pw;
++      GKeyFile *kf;
++      char *face;
++      char **black=NULL;
++      char **white=NULL;
++
++      // load black list
++      face=g_key_file_get_string(config,"userlist","black",NULL);
++      if(face)
++      {
++              black=g_strsplit(face," ",-1);
++              g_free(face);
++      }
++      //load white list
++      face=g_key_file_get_string(config,"userlist","white",NULL);
++      if(face)
++      {
++              white=g_strsplit(face," ",-1);
++              g_free(face);
++      }
++
++      kf=g_key_file_new();
++      g_key_file_set_comment(kf,NULL,NULL,"lxdm user list",NULL);
++      while((pw=getpwent())!=NULL)
++      {
++              char *valid_shell;
++              gboolean ret;
++
++              if(strstr(pw->pw_shell, "nologin"))
++                      continue;
++
++              ret = FALSE;
++              setusershell();
++              while ((valid_shell = getusershell()) != NULL) {
++                      if (g_strcmp0 (pw->pw_shell, valid_shell) != 0)
++                              continue;
++                      ret = TRUE;
++              }
++              endusershell();
++              if(!ret)
++                      continue;
++
++              if(strncmp(pw->pw_dir,"/home/",6))
++              {
++                      if(!strv_find(white,pw->pw_name))
++                              continue;
++              }
++              else
++              {
++                      if(strv_find(black,pw->pw_name))
++                              continue;
++              }
++
++              g_key_file_set_string(kf,pw->pw_name,"name",pw->pw_name);
++              if(pw->pw_gecos && pw->pw_gecos[0] && 
strcmp(pw->pw_name,pw->pw_gecos))
++                      
g_key_file_set_string(kf,pw->pw_name,"gecos",pw->pw_gecos);
++              if(lxsession_find_user(pw->pw_uid))
++                      g_key_file_set_boolean(kf,pw->pw_name,"login",TRUE);
++              face=lxdm_get_user_face(pw);
++              if(face)
++                      g_key_file_set_string(kf,pw->pw_name,"face",face);
++              g_free(face);
++      }
++      endpwent();
++      if(black) g_strfreev(black);
++      if(white) g_strfreev(white);
++      return kf;
++}
++
++static GString *lxdm_user_cmd(void *data,int user,int arc,char **arg)
++{
++      LXSession *s=NULL;
++      GString *res=NULL;
++      s=lxsession_find_user(user);
++      if(!s && user==ui_greeter_user())
++              s=lxsession_find_greeter();
++      g_message("greeter %d session 
%p\n",ui_greeter_user(),lxsession_find_greeter());
++      g_message("user %d session %p cmd %s\n",user,s,arg[0]);
++      if(user!=0 && s==NULL)
++              return NULL;
++      if(!strcmp(arg[0],"USER_SWITCH"))
++      {
++              g_message("start greeter\n");
++              lxsession_greeter();
++      }
++      else if(!strcmp(arg[0],"USER_LIST"))
++      {
++              GKeyFile *kf=lxdm_user_list();
++              gsize len;
++              char *p=g_key_file_to_data(kf,&len,NULL);
++              if(p)
++              {
++                      res=g_string_new_len(p,len);
++              }
++              g_key_file_free(kf);
++      }
++      return res;
++}
++
++void set_signal(void)
++{
++      lxcom_set_signal_handler(SIGQUIT,lxdm_signal_handler,0);
++      lxcom_set_signal_handler(SIGTERM,lxdm_signal_handler,0);
++      lxcom_set_signal_handler(SIGINT,lxdm_signal_handler,0);
++      lxcom_set_signal_handler(SIGHUP,lxdm_signal_handler,0);
++      lxcom_set_signal_handler(SIGPIPE,lxdm_signal_handler,0);
++      lxcom_set_signal_handler(SIGALRM,lxdm_signal_handler,0);
++      signal(SIGTTIN,SIG_IGN);
++      signal(SIGTTOU,SIG_IGN);
++      signal(SIGUSR1,SIG_IGN);
++      signal(SIGSEGV, sigsegv_handler);
++}
++
++int main(int arc, char *arg[])
++{
++      int daemonmode = 0;
++      gboolean debugmode = FALSE;
++      int i;
++
++
++      for(i=1;i<arc;i++)
++      {
++              if(!strcmp(arg[i],"-d"))
++              {
++                      daemonmode=1;
++              }
++              else if(!strcmp(arg[i],"-D"))
++              {
++                      debugmode=TRUE;
++              }
++              else if(!strcmp(arg[i],"-c") && i+1<arc)
++              {
++                      return 
lxcom_send("/var/run/lxdm/lxdm.sock",arg[i+1],NULL)?0:-1;
++              }
++              else if(!strcmp(arg[i],"-w") && i+1<arc)
++              {
++                      char *res=NULL;
++                      lxcom_send("/var/run/lxdm/lxdm.sock",arg[i+1],&res);
++                      if(res) printf("%s\n",res);
++                      g_free(res);
++                      return res?0:-1;
++              }
++      }
++      if(getuid() != 0)
++      {
++              fprintf(stderr, "only root is allowed to use this program\n");
++              exit(EXIT_FAILURE);
++      }
++
++      if(daemonmode)
++      {
++              (void)daemon(1, 1);
++      }
++      log_init();
++
++      if(!debugmode)
++      {
++              /* turn off debug output */
++              g_log_set_handler(NULL, G_LOG_LEVEL_DEBUG, log_ignore, NULL);
++      }
++
++      config = g_key_file_new();
++      g_key_file_load_from_file(config, CONFIG_FILE, G_KEY_FILE_NONE, NULL);
++
++      get_lock();
++
++      if(0!=mkdir("/var/run/lxdm",0755))
++      {
++              if(errno==EEXIST)
++              {
++                      chmod("/var/run/lxdm",0755);
++              }
++              else
++              {
++                      g_critical("mkdir /var/run/lxdm fail\n");
++                      exit(-1);
++              }
++      }
++      lxcom_init("/var/run/lxdm/lxdm.sock");
++      atexit(exit_cb);
++
++      set_signal();
++      lxdm_get_tty();
++
++      if(!auto_login_future())
++              lxdm_do_auto_login();
++      if(!lxsession_get_active())
++              lxsession_greeter();
++
++      lxcom_add_cmd_handler(-1,lxdm_user_cmd,NULL);
++
++      ui_main();
++
++      return 0;
++}
++
+diff -Naur lxdm-0.5.0/src/lxdm.c.rej lxdm-0.5.0b/src/lxdm.c.rej
+--- lxdm-0.5.0/src/lxdm.c.rej  1970-01-01 01:00:00.000000000 +0100
++++ lxdm-0.5.0b/src/lxdm.c.rej 2014-12-09 19:09:11.628750635 +0100
+@@ -0,0 +1,126 @@
++--- src/lxdm.c
+++++ src/lxdm.c
++@@ -669,7 +669,7 @@
++      gethostname(addr,sizeof(addr));
++
++      fd=open(file,O_CREAT|O_TRUNC|O_WRONLY,0600);
++-     if(!fd==-1) return;
+++     if(fd==-1) return;
++      xauth_write_uint16(fd,256);             //FamilyLocalHost
++      xauth_write_string(fd,addr);
++      xauth_write_string(fd,buf);
++@@ -1022,7 +1022,18 @@
++      int level;
++      LXSession *s=data;
++
++-     lxsession_stop(s);
+++     gchar *argv[] = { "/etc/lxdm/PostLogout", NULL };
+++     g_spawn_async(NULL, argv, s->env, G_SPAWN_SEARCH_PATH, NULL, NULL, 
NULL, NULL);
+++
+++     if(g_key_file_get_integer(config,"server","reset",NULL)!=1)
+++     {
+++             lxsession_stop(s);
+++     }
+++     else
+++     {
+++             lxsession_free(s);
+++             s=NULL;
+++     }
++
++      level=get_run_level();
++      if(level=='0' || level=='6')
++@@ -1034,22 +1045,19 @@
++              g_message("run level %c\n",level);
++              lxdm_quit_self(0);
++      }
++-     if(s!=lxsession_greeter())
+++     if(s && s!=lxsession_greeter())
++      {
++              lxsession_free(s);
++      }
++-     else if(g_key_file_get_integer(config,"server","reset",NULL)==1)
+++     else if(!s)
++      {
++-             lxsession_free(s);
++              lxsession_greeter();
++      }
++-     gchar *argv[] = { "/etc/lxdm/PostLogout", NULL };
++-     g_spawn_async(NULL, argv, s->env, G_SPAWN_SEARCH_PATH, NULL, NULL, 
NULL, NULL);
++ }
++
++-gboolean lxdm_get_session_info(char *session,char **pname,char **pexec)
+++gboolean lxdm_get_session_info(const char *session,char **pname,char 
**pexec,char **pdesktop_names)
++ {
++-     char *name=NULL,*exec=NULL;
+++     char *name=NULL,*exec=NULL,**names=NULL,*desktop_names=NULL;
++      if(!session || !session[0])
++      {
++              name=g_key_file_get_string(config, "base", "session", 0);
++@@ -1072,6 +1080,11 @@
++                      }
++                      name=g_key_file_get_string(cfg,"Desktop 
Entry","Name",NULL);
++                      exec=g_key_file_get_string(cfg,"Desktop 
Entry","Exec",NULL);
+++                     names = g_key_file_get_string_list (cfg, "Desktop 
Entry", "DesktopNames", NULL, NULL);
+++                     if (names != NULL) {
+++                             desktop_names = g_strjoinv (":", names);
+++                             g_strfreev (names);
+++                     }
++                      g_key_file_free(cfg);
++                      if(!name || !exec)
++                      {
++@@ -1097,6 +1110,11 @@
++                      {
++                              name = g_key_file_get_locale_string(f, "Desktop 
Entry", "Name", NULL, NULL);
++                              exec = g_key_file_get_string(f, "Desktop 
Entry", "Exec", NULL);
+++                             names = g_key_file_get_string_list (f, "Desktop 
Entry", "DesktopNames", NULL, NULL);
+++                             if (names != NULL) {
+++                                     desktop_names = g_strjoinv (":", names);
+++                                     g_strfreev (names);
+++                             }
++                      }
++                      else
++                      {
++@@ -1120,6 +1138,7 @@
++      }
++      if(pname) *pname=name;
++      if(pexec) *pexec=exec;
+++     if(pdesktop_names) *pdesktop_names=desktop_names;
++      return TRUE;
++ }
++
++@@ -1194,7 +1213,7 @@
++
++ void lxdm_do_login(struct passwd *pw, char *session, char *lang, char 
*option)
++ {
++-     char *session_name=0,*session_exec=0;
+++     char *session_name=0,*session_exec=0,*session_desktop_names=0;
++      gboolean alloc_session=FALSE,alloc_lang=FALSE;
++      int pid;
++      LXSession *s,*prev;
++@@ -1222,7 +1241,7 @@
++              g_key_file_free(dmrc);
++      }
++
++-     if(!lxdm_get_session_info(session,&session_name,&session_exec))
+++     
if(!lxdm_get_session_info(session,&session_name,&session_exec,&session_desktop_names))
++      {
++              if(alloc_session)
++                      g_free(session);
++@@ -1329,6 +1348,9 @@
++              env=g_environ_setenv(env, "LC_MESSAGES", lang, TRUE);
++              env=g_environ_setenv(env, "LANGUAGE", lang, TRUE);
++      }
+++
+++     if( session_desktop_names && session_desktop_names[0] )
+++             env=g_environ_setenv(env, "XDG_CURRENT_DESKTOP", 
session_desktop_names, TRUE);
++
++ #ifndef DISABLE_XAUTH
++      env=create_client_auth(pw,env);
++@@ -1348,6 +1370,7 @@
++
++      g_free(session_name);
++      g_free(session_exec);
+++     g_free(session_desktop_names);
++      if(alloc_session)
++              g_free(session);
++      if(alloc_lang)
+diff -Naur lxdm-0.5.0/src/ui.c lxdm-0.5.0b/src/ui.c
+--- lxdm-0.5.0/src/ui.c        2013-09-11 15:47:36.000000000 +0200
++++ lxdm-0.5.0b/src/ui.c       2014-12-09 19:08:42.205080256 +0100
+@@ -145,7 +145,7 @@
+       else if( !strncmp(str, "shutdown", 6) )
+               lxdm_do_shutdown();
+       else if( !strncmp(str, "log ", 4) )
+-              g_message(str + 4);
++              g_message("%s",str + 4);
+       else if( !strncmp(str, "login ", 6) )
+       {
+               char *user = greeter_param(str, "user");
+diff -Naur lxdm-0.5.0/src/ui.c.rej lxdm-0.5.0b/src/ui.c.rej
+--- lxdm-0.5.0/src/ui.c.rej    1970-01-01 01:00:00.000000000 +0100
++++ lxdm-0.5.0b/src/ui.c.rej   2014-12-09 19:09:11.628750635 +0100
+@@ -0,0 +1,11 @@
++--- src/ui.c
+++++ src/ui.c
++@@ -145,7 +145,7 @@
++      else if( !strncmp(str, "shutdown", 6) )
++              lxdm_do_shutdown();
++      else if( !strncmp(str, "log ", 4) )
++-             g_message(str + 4);
+++             g_message("%s",str + 4);
++      else if( !strncmp(str, "login ", 6) )
++      {
++              char *user = greeter_param(str, "user");
diff --git a/source/x11-extra/lxdm/lxdm_frugalware.patch 
b/source/x11-extra/lxdm/lxdm_frugalware.patch
new file mode 100644
index 0000000..ff7b275
--- /dev/null
+++ b/source/x11-extra/lxdm/lxdm_frugalware.patch
@@ -0,0 +1,87 @@
+diff -Naur lxdm-0.5.0/data/lxdm.conf lxdm-0.5.0b/data/lxdm.conf
+--- lxdm-0.5.0/data/lxdm.conf  2012-05-24 15:13:44.000000000 +0200
++++ lxdm-0.5.0b/data/lxdm.conf 2014-12-10 09:58:36.215280541 +0100
+@@ -31,10 +31,10 @@
+
+ [display]
+ ## gtk theme used by greeter
+-gtk_theme=Clearlooks
++gtk_theme=Frugalware
+
+ ## background of the greeter
+-bg=/usr/share/backgrounds/default.png
++bg=/usr/share/lxdm/themes/Frugalware/background.png
+
+ ## if show bottom pane
+ bottom_pane=1
+@@ -43,10 +43,10 @@
+ transparent_pane=0
+
+ ## if show sessions
+-show_sessions=0
++show_sessions=1
+
+ ## if show language select control
+-lang=1
++lang=0
+
+ ## if show keyboard layout select control
+ keyboard=0
+@@ -58,7 +58,7 @@
+ show_time=1
+
+ ## the theme of greeter
+-theme=Industrial
++theme=Frugalware
+
+ [input]
+
+@@ -70,5 +70,5 @@
+ white=
+
+ ## blacklist user
+-black=
++black=ftp syncpkgd rsyncd partimag
+
+diff -Naur lxdm-0.5.0/data/lxdm.in lxdm-0.5.0b/data/lxdm.in
+--- lxdm-0.5.0/data/lxdm.in    2011-11-03 13:52:31.000000000 +0100
++++ lxdm-0.5.0b/data/lxdm.in   2014-12-10 09:58:15.061584245 +0100
+@@ -1,31 +1,23 @@
+ #!/bin/sh
+
+-[ -f /etc/sysconfig/i18n ] && . /etc/sysconfig/i18n
+-
+-if [ -z "$LANG" -a -e /etc/sysconfig/language ]; then
+-      . /etc/sysconfig/language
+-      if [ -n "$RC_LANG"]; then
+-              LANG=$RC_LANG
+-      fi
++if [ -f /etc/locale.conf ]; then
++    . /etc/locale.conf
+ fi
+
+ if [ -n "$LANG" ]; then
+-      export LANG
++    export LANG
+ fi
+
+-[ -f /etc/sysconfig/desktop ] && . /etc/sysconfig/desktop
+-[ -f /etc/sysconfig/windowmanager ] && . /etc/sysconfig/windowmanager
+-
+ if [ -n "$DEFAULT_WM" ]; then
+-      PREFERRED=$DEFAULT_WM
++    PREFERRED=$DEFAULT_WM
+ fi
+
+ if [ -n "$DESKTOP" ]; then
+-      export DESKTOP
++    export DESKTOP
+ fi
+
+ if [ -n "$PREFERRED" ]; then
+-      export PREFERRED
++    export PREFERRED
+ fi
+
+-exec @prefix@/sbin/lxdm-binary $*
++exec @prefix@/sbin/lxdm-binary $* >/dev/null 2>&1
diff --git a/source/x11-extra/lxdm/tty.diff b/source/x11-extra/lxdm/tty.diff
deleted file mode 100644
index dd4c83d..0000000
--- a/source/x11-extra/lxdm/tty.diff
+++ /dev/null
@@ -1,11 +0,0 @@
---- lxdm/src/lxdm.c.orig       2009-12-20 23:53:16.000000000 +0100
-+++ lxdm/src/lxdm.c    2009-12-20 23:54:00.000000000 +0100
-@@ -57,7 +57,7 @@
- static pid_t child;
- static int reason;
- static char mcookie[33];
--static int tty=7;
-+static int tty=12;
-
- static int get_active_vt (void)
- {
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to