aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@no-log.org>2011-03-26 18:08:22 +0100
committerDenis 'GNUtoo' Carikli <GNUtoo@no-log.org>2011-03-27 00:39:34 +0100
commitb7fd958ca39eab3bcdbd20c35334dab30299c215 (patch)
tree44bad0698012952165ab4aff466ca0947a209576
parent40225fbb406dbeb07101c54b2a1da00b564a3262 (diff)
downloadopenembedded-b7fd958ca39eab3bcdbd20c35334dab30299c215.zip
openembedded-b7fd958ca39eab3bcdbd20c35334dab30299c215.tar.gz
openembedded-b7fd958ca39eab3bcdbd20c35334dab30299c215.tar.bz2
add new recipe: slim (an X display manager)
The slim recipe was taken from the openpandora git here: http://git.openpandora.org/cgi-bin/gitweb.cgi?p=openpandora.oe.git;a=tree;f=recipes/slim;h=6ac85b55ec8fb1d600bdc0322b0a61c50520e290;hb=HEAD And updated to use newer openembedded standards (like for instance apply=yes instead of patch=1) Thanks JaMa|Off and woglinde for the help on DEPENDS and RDEPENDS: From #oe on Freenode on IRC: <JaMa|Off> GNUtoo|laptop: 1) it should be RDEPENDS_${PN} And: <woglinde> no RDEPENDS with virtual Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@no-log.org>
-rw-r--r--recipes/slim/slim/Makefile.oe64
-rw-r--r--recipes/slim/slim/Makefile.patch20
-rw-r--r--recipes/slim/slim/delay.patch12
-rw-r--r--recipes/slim/slim/fix-manpage.patch9
-rw-r--r--recipes/slim/slim/ftbfs_gcc_4.4.patch12
-rw-r--r--recipes/slim/slim/pam-unix2.patch89
-rw-r--r--recipes/slim/slim/rc.slim27
-rw-r--r--recipes/slim/slim/slim-conf.patch56
-rw-r--r--recipes/slim/slim/slim-dynwm8
-rw-r--r--recipes/slim/slim/slim.pamd19
-rw-r--r--recipes/slim/slim/types.patch12
-rw-r--r--recipes/slim/slim/update_slim_wmlist76
-rw-r--r--recipes/slim/slim/xauth_secret_support.patch316
-rw-r--r--recipes/slim/slim_1.3.1.bb84
14 files changed, 804 insertions, 0 deletions
diff --git a/recipes/slim/slim/Makefile.oe b/recipes/slim/slim/Makefile.oe
new file mode 100644
index 0000000..ade4e29
--- /dev/null
+++ b/recipes/slim/slim/Makefile.oe
@@ -0,0 +1,64 @@
+# Makefile for slim - OpenEmbedded
+#######################################################
+
+
+LDFLAGS=-lXft -lX11 -lfreetype -lXrender -lfontconfig -lpng12 -lz -lm -lcrypt -lXmu -lpng -ljpeg -lrt
+CUSTOM=-DHAVE_SHADOW
+
+USE_PAM=1
+ifdef USE_PAM
+LDFLAGS+= -lpam
+CUSTOM+= -DUSE_PAM
+endif
+
+#######################################################
+
+NAME=slim
+VERSION=1.3.1
+
+DEFINES=-DPACKAGE=\"$(NAME)\" -DVERSION=\"$(VERSION)\" \
+ -DPKGDATADIR=\"$(PREFIX)/share/slim\" -DSYSCONFDIR=\"$(CFGDIR)\"
+
+OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o \
+ panel.o util.o
+ifdef USE_PAM
+OBJECTS+=PAM.o
+endif
+
+all: slim
+
+slim: $(OBJECTS)
+ $(CXX) $(LDFLAGS) $(OBJECTS) -o $(NAME)
+
+.cpp.o:
+ $(CXX) $(CXXFLAGS) $(DEFINES) $(CUSTOM) -c $< -o $@
+
+.c.o:
+ $(CC) $(CFLAGS) $(DEFINES) $(CUSTOM) -c $< -o $@
+
+install: slim install-theme
+ install -D -m 755 slim $(DESTDIR)$(PREFIX)/bin/slim
+ install -D -m 644 slim.1 $(DESTDIR)$(MANDIR)/man1/slim.1
+ test -e $(DESTDIR)$(CFGDIR)/slim.conf || \
+ install -D -m 644 slim.conf $(DESTDIR)$(CFGDIR)/slim.conf
+
+clean:
+ @rm -f slim *.o
+
+dist:
+ @rm -rf $(NAME)-$(VERSION)
+ @mkdir $(NAME)-$(VERSION)
+ @cp -r *.cpp *.h *.c Makefile Makefile.* COPYING ChangeLog INSTALL README TODO \
+ xinitrc.sample slim.1 THEMES themes slim.conf $(NAME)-$(VERSION)
+ @rm -rf $(NAME)-$(VERSION)/themes/.svn $(NAME)-$(VERSION)/themes/default/.svn
+ @tar cvzf $(NAME)-$(VERSION).tar.gz $(NAME)-$(VERSION)
+ @rm -rf $(NAME)-$(VERSION)
+
+
+install-theme:
+ install -D -m 644 themes/default/slim.theme \
+ $(DESTDIR)$(PREFIX)/share/slim/themes/default/slim.theme
+ install -D -m 644 themes/default/panel.png \
+ $(DESTDIR)$(PREFIX)/share/slim/themes/default/panel.png
+ install -D -m 644 themes/default/background.jpg \
+ $(DESTDIR)$(PREFIX)/share/slim/themes/default/background.jpg
diff --git a/recipes/slim/slim/Makefile.patch b/recipes/slim/slim/Makefile.patch
new file mode 100644
index 0000000..957b517
--- /dev/null
+++ b/recipes/slim/slim/Makefile.patch
@@ -0,0 +1,20 @@
+--- a/Makefile 2009-08-23 13:56:12.000000000 +0900
++++ b/Makefile 2009-08-23 13:56:51.000000000 +0900
+@@ -7,7 +7,7 @@
+ CC=/usr/bin/gcc
+ CFLAGS=-Wall -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -I/usr/include/libpng12 -I/usr/include
+ CXXFLAGS=$(CFLAGS)
+-LDFLAGS=-lXft -lX11 -lfreetype -lXrender -lfontconfig -lpng12 -lz -lm -lcrypt -lXmu -lpng -ljpeg
++LDFLAGS=-L/usr/X11R6/lib -lXft -lX11 -lpng12 -lm -lXmu -lpng -ljpeg
+ CUSTOM=-DHAVE_SHADOW
+ ifdef USE_PAM
+ LDFLAGS+= -lpam
+@@ -15,7 +15,7 @@
+ endif
+ PREFIX=/usr
+ CFGDIR=/etc
+-MANDIR=/usr/man
++MANDIR=/usr/share/man
+ DESTDIR=
+ #######################################################
+
diff --git a/recipes/slim/slim/delay.patch b/recipes/slim/slim/delay.patch
new file mode 100644
index 0000000..abab191
--- /dev/null
+++ b/recipes/slim/slim/delay.patch
@@ -0,0 +1,12 @@
+--- slim-1.3.1-orig/app.cpp.orig 2007-07-15 22:09:28.000000000 +0800
++++ slim-1.3.1/app.cpp 2008-05-06 23:33:40.000000000 +0800
+@@ -884,9 +884,6 @@
+ ServerPID = -1;
+ break;
+ }
+- alarm(15);
+- pause();
+- alarm(0);
+
+ // Wait for server to start up
+ if(WaitForServer() == 0) {
diff --git a/recipes/slim/slim/fix-manpage.patch b/recipes/slim/slim/fix-manpage.patch
new file mode 100644
index 0000000..24f0d9e
--- /dev/null
+++ b/recipes/slim/slim/fix-manpage.patch
@@ -0,0 +1,9 @@
+Index: slim-1.3.0/slim.1
+===================================================================
+--- slim-1.3.0.orig/slim.1 2008-09-13 11:20:32.000000000 +0000
++++ slim-1.3.0/slim.1 2008-09-13 11:20:35.000000000 +0000
+@@ -1,4 +1,3 @@
+-." Text automatically generated by txt2man-1.4.7
+ .TH slim 1 "January 09, 2006" "" ""
+ .SH NAME
+ \fBslim \fP- Simple LogIn Manager
diff --git a/recipes/slim/slim/ftbfs_gcc_4.4.patch b/recipes/slim/slim/ftbfs_gcc_4.4.patch
new file mode 100644
index 0000000..7038636
--- /dev/null
+++ b/recipes/slim/slim/ftbfs_gcc_4.4.patch
@@ -0,0 +1,12 @@
+# From http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=505332
+
+--- a/switchuser.h 2009-09-21 16:10:43.000000000 +0900
++++ b/switchuser.h 2009-09-21 16:11:06.000000000 +0900
+@@ -18,6 +18,7 @@
+ #include <pwd.h>
+ #include <grp.h>
+ #include <paths.h>
++#include <cstdio>
+ #include <iostream>
+ #include "const.h"
+ #include "cfg.h"
diff --git a/recipes/slim/slim/pam-unix2.patch b/recipes/slim/slim/pam-unix2.patch
new file mode 100644
index 0000000..2163d20
--- /dev/null
+++ b/recipes/slim/slim/pam-unix2.patch
@@ -0,0 +1,89 @@
+diff -rc slim-1.3.1-orig/app.cpp slim-1.3.1/app.cpp
+*** slim-1.3.1-orig/app.cpp 2008-09-26 02:54:15.000000000 +0200
+--- slim-1.3.1/app.cpp 2009-02-17 19:50:06.000000000 +0100
+***************
+*** 41,48 ****
+ Panel* panel = *static_cast<Panel**>(appdata_ptr);
+ int result = PAM_SUCCESS;
+ for (int i=0; i<num_msg; i++){
+! resp[i]->resp=0;
+! resp[i]->resp_retcode=0;
+ switch(msg[i]->msg_style){
+ case PAM_PROMPT_ECHO_ON:
+ // We assume PAM is asking for the username
+--- 41,48 ----
+ Panel* panel = *static_cast<Panel**>(appdata_ptr);
+ int result = PAM_SUCCESS;
+ for (int i=0; i<num_msg; i++){
+! (*resp)[i].resp=0;
+! (*resp)[i].resp_retcode=0;
+ switch(msg[i]->msg_style){
+ case PAM_PROMPT_ECHO_ON:
+ // We assume PAM is asking for the username
+***************
+*** 51,63 ****
+ case Panel::Suspend:
+ case Panel::Halt:
+ case Panel::Reboot:
+! resp[i]->resp=strdup("root");
+ break;
+
+ case Panel::Console:
+ case Panel::Exit:
+ case Panel::Login:
+! resp[i]->resp=strdup(panel->GetName().c_str());
+ break;
+ }
+ break;
+--- 51,63 ----
+ case Panel::Suspend:
+ case Panel::Halt:
+ case Panel::Reboot:
+! (*resp)[i].resp=strdup("root");
+ break;
+
+ case Panel::Console:
+ case Panel::Exit:
+ case Panel::Login:
+! (*resp)[i].resp=strdup(panel->GetName().c_str());
+ break;
+ }
+ break;
+***************
+*** 73,79 ****
+
+ default:
+ panel->EventHandler(Panel::Get_Passwd);
+! resp[i]->resp=strdup(panel->GetPasswd().c_str());
+ break;
+ }
+ break;
+--- 73,79 ----
+
+ default:
+ panel->EventHandler(Panel::Get_Passwd);
+! (*resp)[i].resp=strdup(panel->GetPasswd().c_str());
+ break;
+ }
+ break;
+***************
+*** 89,97 ****
+ }
+ if (result!=PAM_SUCCESS){
+ for (int i=0; i<num_msg; i++){
+! if (resp[i]->resp==0) continue;
+! free(resp[i]->resp);
+! resp[i]->resp=0;
+ };
+ free(*resp);
+ *resp=0;
+--- 89,97 ----
+ }
+ if (result!=PAM_SUCCESS){
+ for (int i=0; i<num_msg; i++){
+! if ((*resp)[i].resp==0) continue;
+! free((*resp)[i].resp);
+! (*resp)[i].resp=0;
+ };
+ free(*resp);
+ *resp=0;
diff --git a/recipes/slim/slim/rc.slim b/recipes/slim/slim/rc.slim
new file mode 100644
index 0000000..bf63857
--- /dev/null
+++ b/recipes/slim/slim/rc.slim
@@ -0,0 +1,27 @@
+#! /bin/sh
+### BEGIN INIT INFO
+# Provides: slim
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: SLiM Display Manager (and wrapper script)
+# Description: init script for the SLiM Display Manager
+### END INIT INFO
+
+case $1 in
+start)
+ /usr/bin/slim -d &
+ ;;
+stop)
+ killall /usr/bin/slim
+ ;;
+restart)
+ $0 stop
+ sleep 2
+ $0 start
+ ;;
+*)
+ echo "usage: $0 [start|stop|restart]"
+ ;;
+esac
+
+# End of file
diff --git a/recipes/slim/slim/slim-conf.patch b/recipes/slim/slim/slim-conf.patch
new file mode 100644
index 0000000..aae7eb5
--- /dev/null
+++ b/recipes/slim/slim/slim-conf.patch
@@ -0,0 +1,56 @@
+--- a/slim.conf 2009-08-23 13:48:20.000000000 +0900
++++ b/slim.conf 2009-08-23 13:53:50.000000000 +0900
+@@ -1,17 +1,17 @@
+ # Path, X server and arguments (if needed)
+ # Note: -xauth $authfile is automatically appended
+-default_path ./:/bin:/usr/bin:/usr/local/bin
+-default_xserver /usr/bin/X
+-#xserver_arguments -dpi 75
++default_path /bin:/usr/bin:/usr/local/bin:/usr/bin/X11
++default_xserver /usr/bin/X11/X
++xserver_arguments -nolisten tcp
+
+ # Commands for halt, login, etc.
+ halt_cmd /sbin/shutdown -h now
+ reboot_cmd /sbin/shutdown -r now
+-console_cmd /usr/bin/xterm -C -fg white -bg black +sb -T "Console login" -e /bin/sh -c "/bin/cat /etc/issue; exec /bin/login"
++console_cmd /usr/bin/x-terminal-emulator -C -fg white -bg black +sb -T "Console login" -e /bin/sh -c "/bin/cat /etc/issue.net; exec /bin/login"
+ #suspend_cmd /usr/sbin/suspend
+
+ # Full path to the xauth binary
+-xauth_path /usr/bin/xauth
++xauth_path /usr/bin/X11/xauth
+
+ # Xauth file for server
+ authfile /var/run/slim.auth
+@@ -33,7 +33,7 @@
+ # to adjust the command according to your preferred shell,
+ # i.e. for freebsd use:
+ # login_cmd exec /bin/sh - ~/.xinitrc %session
+-login_cmd exec /bin/bash -login ~/.xinitrc %session
++login_cmd exec /bin/bash -login /etc/X11/Xsession %session
+
+ # Commands executed when starting and exiting a session.
+ # They can be used for registering a X11 session with
+@@ -51,10 +51,10 @@
+ # The current chosen session name is replaced in the login_cmd
+ # above, so your login command can handle different sessions.
+ # see the xinitrc.sample file shipped with slim sources
+-sessions xfce4,icewm,wmaker,blackbox
++sessions default,startxfce4,openbox,ion3,icewm,wmaker,blackbox,awesome
+
+ # Executed when pressing F11 (requires imagemagick)
+-screenshot_cmd import -window root /slim.png
++screenshot_cmd screenshot_cmd scrot /tmp/slim.png
+
+ # welcome message. Available variables: %host, %domain
+ welcome_msg Welcome to %host
+@@ -81,7 +81,7 @@
+
+ # current theme, use comma separated list to specify a set to
+ # randomly choose from
+-current_theme default
++current_theme debian-moreblue-orbit
+
+ # Lock file
+ lockfile /var/run/slim.lock
diff --git a/recipes/slim/slim/slim-dynwm b/recipes/slim/slim/slim-dynwm
new file mode 100644
index 0000000..49c9d47
--- /dev/null
+++ b/recipes/slim/slim/slim-dynwm
@@ -0,0 +1,8 @@
+#!/bin/sh
+update_slim_wmlist
+if [ "x$1" = "x-nodaemon" ]; then
+ shift
+ exec slim "$@"
+else
+ slim -d "$@"
+fi
diff --git a/recipes/slim/slim/slim.pamd b/recipes/slim/slim/slim.pamd
new file mode 100644
index 0000000..80c34b1
--- /dev/null
+++ b/recipes/slim/slim/slim.pamd
@@ -0,0 +1,19 @@
+# Begin /etc/pam.d/slim
+
+auth required pam_shells.so
+auth include common-auth
+auth optional pam_securetty.so
+auth optional pam_gnome_keyring.so
+
+account required pam_nologin.so
+account include common-account
+
+password include common-password
+
+session include common-session
+session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
+session optional pam_lastlog.so nowtmp
+session optional pam_mail.so dir=/var/mail standard
+session optional pam_gnome_keyring.so auto_start
+
+# End /etc/pam.d/slim
diff --git a/recipes/slim/slim/types.patch b/recipes/slim/slim/types.patch
new file mode 100644
index 0000000..2335b60
--- /dev/null
+++ b/recipes/slim/slim/types.patch
@@ -0,0 +1,12 @@
+Index: slim-1.3.1/app.cpp
+===================================================================
+--- slim-1.3.1.orig/app.cpp 2011-03-21 18:33:43.630046799 +0100
++++ slim-1.3.1/app.cpp 2011-03-21 18:34:16.130046805 +0100
+@@ -16,6 +16,7 @@
+ #include <fcntl.h>
+ #include <cstring>
+ #include <cstdio>
++#include <stdint.h>
+
+ #include <iostream>
+ #include <fstream>
diff --git a/recipes/slim/slim/update_slim_wmlist b/recipes/slim/slim/update_slim_wmlist
new file mode 100644
index 0000000..0f11653
--- /dev/null
+++ b/recipes/slim/slim/update_slim_wmlist
@@ -0,0 +1,76 @@
+#!/usr/bin/perl -w
+#
+# update_slim_wmlist, based on:
+# update_wdm_wmlist, (c) 1998 Marcelo Magallón <mmagallo@debian.org>
+# rewriten to use the x-window-manager alternative
+# modified to also use the x-session-manager alternative by Arthur Korn
+# Copyright 2000 Wichert Akkerman <wakkerma@debian.org>
+# Modified to use the freedesktop.org .desktop like kdm and gdm
+#
+# This script will read the list of installed window managers from
+# the freedesktop .desktop files in <etc>/X11/sessions/:<etc>/dm/Sessions/:
+# <share>/xsessions/
+# and update the sessions line in /etc/slim.conf.
+# BEWARE: It doesn't ask any questions about this. It just does it. It
+# takes an optional list of window managers.
+
+use strict;
+use File::DesktopEntry;
+
+my $wm_list='';
+my %desktop_files;
+
+unless (@ARGV) {
+ #my @wm_list = ('default');
+ my @wm_list;
+ foreach my $dir ('/etc/X11/sessions/','/etc/dm/Sessions/','/usr/share/xsessions/') {
+ next unless (opendir DIR, $dir);
+ my @files;
+ @files = grep { /\.desktop$/ && -r "$dir/$_" } readdir(DIR);
+ foreach my $file (@files) {
+ push @{$desktop_files{$file}}, "$dir/$file";
+ }
+ }
+ DESKTOP: foreach my $desktop_file (keys(%desktop_files)) {
+ foreach my $file (@{$desktop_files{$desktop_file}}) {
+ my $entry = File::DesktopEntry->new_from_file($file);
+ next DESKTOP if (defined($entry->get_value('Hidden'))
+ and $entry->get_value('Hidden') eq 'true');
+ if ($entry->get_value('Name') =~ /^gnome$/i) {
+ push (@wm_list, 'gnome');
+ }
+ elsif ($entry->get_value('Name') =~ /^kde$/i) {
+ push (@wm_list, 'kde');
+ }
+ elsif (defined($entry->get_value('Exec'))) {
+ push (@wm_list, $entry->get_value('Exec'));
+ }
+ else { # not found, go to next file
+ next;
+ }
+ # found, proceed to next destop file
+ next DESKTOP;
+ }
+ }
+ $wm_list = join (',', sort @wm_list) . ',custom';
+} else {
+ $wm_list = join (',', sort @ARGV);
+}
+
+open (SLIM_CONFIG_FILE, '</etc/slim.conf')
+ or die "Can't open /etc/slim.conf for reading: $!";
+open (NEW_SLIM_CONFIG_FILE, '>/etc/slim.conf.new')
+ or die "Can't open /etc/slim.conf.new for writing: $!";
+
+while (<SLIM_CONFIG_FILE>) {
+ s|^(sessions\s*).*|$1$wm_list|;
+ print NEW_SLIM_CONFIG_FILE;
+}
+
+close(SLIM_CONFIG_FILE);
+close(NEW_SLIM_CONFIG_FILE);
+
+rename '/etc/slim.conf.new', '/etc/slim.conf'
+ or die "Can't rename /etc/slim.conf.new: $!";
+
+exit 0;
diff --git a/recipes/slim/slim/xauth_secret_support.patch b/recipes/slim/slim/xauth_secret_support.patch
new file mode 100644
index 0000000..c2d4044
--- /dev/null
+++ b/recipes/slim/slim/xauth_secret_support.patch
@@ -0,0 +1,316 @@
+# From http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=529306
+# Commited to upstream.
+
+diff --git a/Makefile b/Makefile
+index a01bafd..9bd5555 100644
+--- a/Makefile
++++ b/Makefile
+@@ -7,7 +7,7 @@ CXX=/usr/bin/g++
+ CC=/usr/bin/gcc
+ CFLAGS=-Wall -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -I/usr/include/libpng12 -I/usr/include
+ CXXFLAGS=$(CFLAGS)
+-LDFLAGS=-L/usr/X11R6/lib -lXft -lX11 -lpng12 -lm -lXmu -lpng -ljpeg
++LDFLAGS=-L/usr/X11R6/lib -lXft -lX11 -lpng12 -lm -lXmu -lpng -ljpeg -lrt
+ CUSTOM=-DHAVE_SHADOW
+ ifdef USE_PAM
+ LDFLAGS+= -lpam
+@@ -25,7 +25,8 @@ VERSION=1.3.1
+ DEFINES=-DPACKAGE=\"$(NAME)\" -DVERSION=\"$(VERSION)\" \
+ -DPKGDATADIR=\"$(PREFIX)/share/slim\" -DSYSCONFDIR=\"$(CFGDIR)\"
+
+-OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o panel.o
++OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o \
++ panel.o util.o
+ ifdef USE_PAM
+ OBJECTS+=PAM.o
+ endif
+diff --git a/Makefile.freebsd b/Makefile.freebsd
+index 3ff326e..c925a39 100644
+--- a/Makefile.freebsd
++++ b/Makefile.freebsd
+@@ -24,7 +24,8 @@ VERSION=1.3.1
+ DEFINES=-DPACKAGE=\"$(NAME)\" -DVERSION=\"$(VERSION)\" \
+ -DPKGDATADIR=\"$(PREFIX)/share/slim\" -DSYSCONFDIR=\"$(CFGDIR)\"
+
+-OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o panel.o
++OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o \
++ panel.o util.o
+ .ifdef USE_PAM
+ OBJECTS+=PAM.o
+ .endif
+diff --git a/Makefile.netbsd b/Makefile.netbsd
+index ad8bb8b..45f33e6 100644
+--- a/Makefile.netbsd
++++ b/Makefile.netbsd
+@@ -24,7 +24,8 @@ VERSION=1.3.1
+ DEFINES=-DPACKAGE=\"$(NAME)\" -DVERSION=\"$(VERSION)\" \
+ -DPKGDATADIR=\"$(PREFIX)/share/slim\" -DSYSCONFDIR=\"$(CFGDIR)\"
+
+-OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o panel.o
++OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o \
++ panel.o util.o
+ .ifdef USE_PAM
+ OBJECTS+=PAM.o
+ .endif
+diff --git a/Makefile.openbsd b/Makefile.openbsd
+index b1829f8..1205b84 100644
+--- a/Makefile.openbsd
++++ b/Makefile.openbsd
+@@ -20,7 +20,8 @@ VERSION=1.3.1
+ DEFINES=-DPACKAGE=\"$(NAME)\" -DVERSION=\"$(VERSION)\" \
+ -DPKGDATADIR=\"$(PREFIX)/share/slim\" -DSYSCONFDIR=\"$(CFGDIR)\"
+
+-OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o panel.o
++OBJECTS=jpeg.o png.o main.o image.o numlock.o cfg.o switchuser.o app.o \
++ util.o panel.o
+
+ .SUFFIXES: .c.o .cpp.o
+
+diff --git a/app.cpp b/app.cpp
+index 83ae947..0ac8c3a 100644
+--- a/app.cpp
++++ b/app.cpp
+@@ -24,6 +24,7 @@
+ #include <algorithm>
+ #include "app.h"
+ #include "numlock.h"
++#include "util.h"
+
+
+ #ifdef HAVE_SHADOW
+@@ -128,15 +129,18 @@ void User1Signal(int sig) {
+
+
+ #ifdef USE_PAM
+-App::App(int argc, char** argv):
+- pam(conv, static_cast<void*>(&LoginPanel)){
++App::App(int argc, char** argv)
++ : pam(conv, static_cast<void*>(&LoginPanel)),
+ #else
+-App::App(int argc, char** argv){
++App::App(int argc, char** argv)
++ :
+ #endif
++ mcookiesize(32) // Must be divisible by 4
++{
+ int tmp;
+ ServerPID = -1;
+ testing = false;
+- mcookie = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
++ mcookie = string(App::mcookiesize, 'a');
+ daemonmode = false;
+ force_nodaemon = false;
+ firstlogin = true;
+@@ -1127,13 +1131,13 @@ string App::findValidRandomTheme(const string& set)
+ name = name.substr(0, name.length() - 1);
+ }
+
+- srandom(getpid()+time(NULL));
++ Util::srandom(Util::makeseed());
+
+ vector<string> themes;
+ string themefile;
+ Cfg::split(themes, name, ',');
+ do {
+- int sel = random() % themes.size();
++ int sel = Util::random() % themes.size();
+
+ name = Cfg::Trim(themes[sel]);
+ themefile = string(THEMESDIR) +"/" + name + THEMESFILE;
+@@ -1160,33 +1164,33 @@ void App::replaceVariables(string& input,
+ }
+
+
++/*
++ * We rely on the fact that all bits generated by Util::random()
++ * are usable, so we are taking full words from its output.
++ */
+ void App::CreateServerAuth() {
+ /* create mit cookie */
+- int i, r;
+- int hexcount = 0;
+- string authfile;
+- string cmd;
++ uint16_t word;
++ uint8_t hi, lo;
++ int i;
++ string authfile;
+ const char *digits = "0123456789abcdef";
+- srand( time(NULL) );
+- for ( i = 0; i < 31; i++ ) {
+- r = rand()%16;
+- mcookie[i] = digits[r];
+- if (r>9)
+- hexcount++;
++ Util::srandom(Util::makeseed());
++ for (i = 0; i < App::mcookiesize; i+=4) {
++ word = Util::random() & 0xffff;
++ lo = word & 0xff;
++ hi = word >> 8;
++ mcookie[i] = digits[lo & 0x0f];
++ mcookie[i+1] = digits[lo >> 4];
++ mcookie[i+2] = digits[hi & 0x0f];
++ mcookie[i+3] = digits[hi >> 4];
+ }
+- /* MIT-COOKIE: even occurrences of digits and hex digits */
+- if ((hexcount%2) == 0) {
+- r = rand()%10;
+- } else {
+- r = rand()%5+10;
+- }
+- mcookie[31] = digits[r];
+ /* reinitialize auth file */
+ authfile = cfg->getOption("authfile");
+ remove(authfile.c_str());
+ putenv(StrConcat("XAUTHORITY=", authfile.c_str()));
+- cmd = cfg->getOption("xauth_path") + " -q -f " + authfile + " add :0 . " + mcookie;
+- system(cmd.c_str());
++ Util::add_mcookie(mcookie, ":0", cfg->getOption("xauth_path"),
++ authfile);
+ }
+
+ char* App::StrConcat(const char* str1, const char* str2) {
+diff --git a/app.h b/app.h
+index 7b4bd10..9a44269 100644
+--- a/app.h
++++ b/app.h
+@@ -101,6 +101,8 @@ private:
+
+ std::string themeName;
+ std::string mcookie;
++
++ const int mcookiesize;
+ };
+
+
+diff --git a/switchuser.cpp b/switchuser.cpp
+index e72a8fc..ec298e1 100644
+--- a/switchuser.cpp
++++ b/switchuser.cpp
+@@ -10,6 +10,7 @@
+ */
+
+ #include "switchuser.h"
++#include "util.h"
+
+ using namespace std;
+
+@@ -53,10 +54,10 @@ void SwitchUser::Execute(const char* cmd) {
+ }
+
+ void SwitchUser::SetClientAuth(const char* mcookie) {
+- int r;
++ bool r;
+ string home = string(Pw->pw_dir);
+ string authfile = home + "/.Xauthority";
+ remove(authfile.c_str());
+- string cmd = cfg->getOption("xauth_path") + " -q -f " + authfile + " add :0 . " + mcookie;
+- r = system(cmd.c_str());
++ r = Util::add_mcookie(mcookie, ":0", cfg->getOption("xauth_path"),
++ authfile);
+ }
+diff --git a/util.cpp b/util.cpp
+new file mode 100644
+index 0000000..5ed972f
+--- /dev/null
++++ b/util.cpp
+@@ -0,0 +1,69 @@
++/* SLiM - Simple Login Manager
++ Copyright (C) 2009 Eygene Ryabinkin <rea@codelabs.ru>
++
++ 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 2 of the License, or
++ (at your option) any later version.
++*/
++
++#include <sys/types.h>
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <time.h>
++#include <unistd.h>
++
++#include "util.h"
++
++/*
++ * Adds the given cookie to the specified Xauthority file.
++ * Returns true on success, false on fault.
++ */
++bool Util::add_mcookie(const std::string &mcookie, const char *display,
++ const std::string &xauth_cmd, const std::string &authfile)
++{
++ FILE *fp;
++ std::string cmd = xauth_cmd + " -f " + authfile + " -q";
++
++ fp = popen(cmd.c_str(), "w");
++ if (!fp)
++ return false;
++ fprintf(fp, "remove %s\n", display);
++ fprintf(fp, "add %s %s %s\n", display, ".", mcookie.c_str());
++ fprintf(fp, "exit\n");
++
++ pclose(fp);
++ return true;
++}
++
++/*
++ * Interface for random number generator. Just now it uses ordinary
++ * random/srandom routines and serves as a wrapper for them.
++ */
++void Util::srandom(unsigned long seed)
++{
++ ::srandom(seed);
++}
++
++long Util::random(void)
++{
++ return ::random();
++}
++
++/*
++ * Makes seed for the srandom() using "random" values obtained from
++ * getpid(), time(NULL) and others.
++ */
++long Util::makeseed(void)
++{
++ struct timespec ts;
++ long pid = getpid();
++ long tm = time(NULL);
++
++ if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
++ ts.tv_sec = ts.tv_nsec = 0;
++ }
++
++ return pid + tm + (ts.tv_sec ^ ts.tv_nsec);
++}
+diff --git a/util.h b/util.h
+new file mode 100644
+index 0000000..b8d2993
+--- /dev/null
++++ b/util.h
+@@ -0,0 +1,24 @@
++/* SLiM - Simple Login Manager
++ Copyright (C) 2009 Eygene Ryabinkin <rea@codelabs.ru>
++
++ 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 2 of the License, or
++ (at your option) any later version.
++*/
++#ifndef __UTIL_H__
++#define __UTIL_H__
++
++#include <string>
++
++namespace Util {
++ bool add_mcookie(const std::string &mcookie, const char *display,
++ const std::string &xauth_cmd, const std::string &authfile);
++
++ void srandom(unsigned long seed);
++ long random(void);
++
++ long makeseed(void);
++};
++
++#endif /* __UTIL_H__ */
diff --git a/recipes/slim/slim_1.3.1.bb b/recipes/slim/slim_1.3.1.bb
new file mode 100644
index 0000000..f0a57d0
--- /dev/null
+++ b/recipes/slim/slim_1.3.1.bb
@@ -0,0 +1,84 @@
+DESCRIPTION="Simple Login Manager"
+HOMEPAGE="http://slim.berlios.de"
+LICENSE = "GPLv2+"
+
+PR = "r0"
+
+inherit update-rc.d
+
+DEPEND = "virtual/x11 libxmu libpng libjpeg libpam freetype sessreg"
+RDEPEND_${PN} = "perl libpam-meta xauth freetype sessreg"
+
+SRC_URI = " \
+ http://download.berlios.de/${PN}/${P}.tar.gz \
+ file://fix-manpage.patch;apply=1 \
+ file://ftbfs_gcc_4.4.patch;apply=1 \
+ file://Makefile.patch;apply=1 \
+ file://xauth_secret_support.patch;apply=1 \
+ file://delay.patch;apply=1 \
+ file://pam-unix2.patch;apply=1 \
+ file://types.patch;apply=1 \
+ file://rc.slim \
+ file://slim-dynwm \
+ file://update_slim_wmlist \
+ file://Makefile.oe \
+ file://slim.pamd \
+"
+
+EXTRA_OEMAKE += " \
+ USE_PAM=1 \
+ PREFIX=${prefix} \
+ CFGDIR=${sysconfdir} \
+ MANDIR=${mandir} \
+ DESTDIR=${D} \
+ CFLAGS+=-I${STAGING_INCDIR}/freetype2 \
+ CXXFLAGS+=-I${STAGING_INCDIR}/freetype2 \
+ LDFLAGS+=-lXft \
+ LDFLAGS+=-lX11 \
+ LDFLAGS+=-lfreetype \
+ LDFLAGS+=-lXrender \
+ LDFLAGS+=-lfontconfig \
+ LDFLAGS+=-lpng12 \
+ LDFLAGS+=-lz \
+ LDFLAGS+=-lm \
+ LDFLAGS+=-lcrypt \
+ LDFLAGS+=-lXmu \
+ LDFLAGS+=-lpng \
+ LDFLAGS+=-ljpeg \
+ LDFLAGS+=-lrt \
+ LDFLAGS+=-lpam \
+"
+
+do_compile_prepend() {
+ cp -pP ${WORKDIR}/Makefile.oe ${S}/Makefile
+}
+
+do_install() {
+ oe_runmake install
+ install -d ${D}${bindir}
+ install -m 0755 ${WORKDIR}/slim-dynwm ${D}${bindir}/
+ install -m 0755 ${WORKDIR}/update_slim_wmlist ${D}${bindir}/
+ install -d ${D}${sysconfdir}/pam.d/
+ install -m 0644 ${WORKDIR}/slim.pamd ${D}${sysconfdir}/pam.d/slim
+ install -d ${D}${sysconfdir}/init.d/
+ install -m 0755 ${WORKDIR}/rc.slim ${D}${sysconfdir}/init.d/slim-init
+
+ echo 'sessionstart_cmd /usr/bin/sessreg -a -l $DISPLAY %user' >> ${D}${sysconfdir}/slim.conf
+ echo 'sessionstop_cmd /usr/bin/sessreg -d -l $DISPLAY %user' >> ${D}${sysconfdir}/slim.conf
+}
+
+INITSCRIPT_NAME = "slim-init"
+INITSCRIPT_PARAMS = "start 99 5 2 . stop 20 0 1 6 ."
+
+pkg_postinst_${PN} () {
+# Register SLiM as default DM
+mkdir -p ${sysconfdir}/X11/
+echo "${bindir}/slim" > ${sysconfdir}/X11/default-display-manager
+}
+
+pkg_postrm_${PN} () {
+sed -i /slim/d ${sysconfdir}/X11/default-display-manager || true
+}
+
+SRC_URI[md5sum] = "727d0acb24c0fbf0751134c37a9c895f"
+SRC_URI[sha256sum] = "acd7a4024bfd7c2a4f3cd5d77ffed4956d13727a8f554042126d0568defe0f77"