diff options
-rw-r--r-- | .SRCINFO | 15 | ||||
-rw-r--r-- | PKGBUILD | 33 | ||||
-rw-r--r-- | slim-1.3.6.patch | 489 |
3 files changed, 513 insertions, 24 deletions
@@ -1,7 +1,7 @@ pkgbase = slim-xdm pkgdesc = Desktop-independent graphical login manager for X11 with XDM support - pkgver = 1.3.5 - pkgrel = 20 + pkgver = 1.3.6 + pkgrel = 2 url = http://slim.berlios.de/ arch = i686 arch = x86_64 @@ -13,22 +13,23 @@ pkgbase = slim-xdm depends = libpng depends = libjpeg depends = libxft + depends = libxrandr depends = xorg-xauth - provides = slim=1.3.5 + provides = slim=1.3.6 conflicts = slim replaces = slim replaces = wdm-slim backup = etc/slim.conf backup = etc/logrotate.d/slim backup = etc/pam.d/slim - source = http://download.berlios.de/slim/slim-1.3.5.tar.gz + source = http://download.berlios.de/slim/slim-1.3.6.tar.gz + source = slim-1.3.6.patch source = slim.pam source = slim.logrotate - source = slim.patch - sha256sums = 818d209f51e2fa8d5b94ef75ce90a7415be48b45e796d66f8083a9532b655629 + sha256sums = 21defeed175418c46d71af71fd493cd0cbffd693f9d43c2151529125859810df + sha256sums = fedc89cc91d7aa5e87970d4541f70199990801d68ac9db7aef14079400c4b3f6 sha256sums = b9a77a614c451287b574c33d41e28b5b149c6d2464bdb3a5274799842bca51a4 sha256sums = 5bf44748b5003f2332d8b268060c400120b9100d033fa9d35468670d827f6def - sha256sums = 43a6ea707d5273a1a7cb1d03b21ee2dc617a16d85d0616e4a4824b5c7c826e06 pkgname = slim-xdm @@ -2,34 +2,38 @@ pkgname=slim-xdm _pkgname=slim -pkgver=1.3.5 -pkgrel=20 +pkgver=1.3.6 +pkgrel=2 pkgdesc="Desktop-independent graphical login manager for X11 with XDM support" arch=('i686' 'x86_64') url="http://slim.berlios.de/" license=('GPL2') -depends=('pam' 'libxmu' 'libpng' 'libjpeg' 'libxft' 'xorg-xauth') +depends=('pam' 'libxmu' 'libpng' 'libjpeg' 'libxft' 'libxrandr' 'xorg-xauth') provides=("${_pkgname}=${pkgver}") conflicts=($_pkgname) replaces=($_pkgname 'wdm-slim') makedepends=('cmake' 'freeglut') backup=('etc/slim.conf' 'etc/logrotate.d/slim' 'etc/pam.d/slim') source=(http://download.berlios.de/$_pkgname/$_pkgname-$pkgver.tar.gz + slim-$pkgver.patch slim.pam - slim.logrotate - slim.patch) -sha256sums=('818d209f51e2fa8d5b94ef75ce90a7415be48b45e796d66f8083a9532b655629' + slim.logrotate) +sha256sums=('21defeed175418c46d71af71fd493cd0cbffd693f9d43c2151529125859810df' + 'fedc89cc91d7aa5e87970d4541f70199990801d68ac9db7aef14079400c4b3f6' 'b9a77a614c451287b574c33d41e28b5b149c6d2464bdb3a5274799842bca51a4' - '5bf44748b5003f2332d8b268060c400120b9100d033fa9d35468670d827f6def' - '43a6ea707d5273a1a7cb1d03b21ee2dc617a16d85d0616e4a4824b5c7c826e06') + '5bf44748b5003f2332d8b268060c400120b9100d033fa9d35468670d827f6def') -build() { - cd "$srcdir" - patch -p0 <slim.patch +prepare() { cd "$srcdir/$_pkgname-$pkgver" # Fix installation path of slim.service - sed -i 's|usr/lib/systemd/system|/&|' CMakeLists.txt + sed -i 's|set(LIBDIR "/lib")|set(LIBDIR "/usr/lib")|' CMakeLists.txt + + patch -Np1 -i "$srcdir/slim-1.3.6.patch" +} + +build() { + cd "$srcdir/$_pkgname-$pkgver" cmake \ -DCMAKE_INSTALL_PREFIX=/usr \ @@ -54,9 +58,4 @@ package() { "$pkgdir/etc/slim.conf" } -makepatch() { - diff -purN ${_pkgname}-${pkgver}.orig ${_pkgname}-${pkgver} >${_pkgname}.patch - makepkg -c -g >>PKGBUILD -} - # vim:set ts=2 sw=2 et: diff --git a/slim-1.3.6.patch b/slim-1.3.6.patch new file mode 100644 index 000000000000..4f2f8efc7fb0 --- /dev/null +++ b/slim-1.3.6.patch @@ -0,0 +1,489 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index f7256bf..b729672 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -119,6 +119,7 @@ if(USE_PAM) + if(PAM_FOUND) + message("\tPAM Found") + set(SLIM_DEFINITIONS ${SLIM_DEFINITIONS} "-DUSE_PAM") ++ target_link_libraries(libslim ${PAM_LIBRARY}) + target_link_libraries(${PROJECT_NAME} ${PAM_LIBRARY}) + target_link_libraries(slimlock ${PAM_LIBRARY}) + include_directories(${PAM_INCLUDE_DIR}) +@@ -178,6 +179,8 @@ include_directories( + ) + + target_link_libraries(libslim ++ ${X11_Xft_LIB} ++ ${X11_Xrandr_LIB} + ${JPEG_LIBRARIES} + ${PNG_LIBRARIES} + ) +@@ -192,6 +195,7 @@ target_link_libraries(${PROJECT_NAME} + ${X11_Xrender_LIB} + ${X11_Xrandr_LIB} + ${X11_Xmu_LIB} ++ ${X11_Xau_LIB} + ${FREETYPE_LIBRARY} + ${JPEG_LIBRARIES} + ${PNG_LIBRARIES} +diff --git a/app.cpp b/app.cpp +index eb7e05f..f7c69d0 100644 +--- a/app.cpp ++++ b/app.cpp +@@ -141,6 +141,9 @@ App::App(int argc, char** argv) + force_nodaemon = false; + firstlogin = true; + Dpy = NULL; ++ existing_server = false; ++ displayName = string(DISPLAY); ++ screenName = displayName + SCREEN; + + /* Parse command line + Note: we force a option for nodaemon switch to handle "-nodaemon" */ +@@ -185,11 +188,17 @@ App::App(int argc, char** argv) + } + #endif /* XNEST_DEBUG */ + ++ char *p = getenv("DISPLAY"); ++ if (p && p[0]) { ++ displayName = p; ++ screenName = displayName + SCREEN; ++ existing_server = true; ++ ReadServerAuth(); ++ } ++ + } + + void App::Run() { +- DisplayName = DISPLAY; +- + #ifdef XNEST_DEBUG + char* p = getenv("DISPLAY"); + if (p && p[0]) { +@@ -223,11 +232,12 @@ void App::Run() { + #ifdef USE_PAM + try{ + pam.start("slim"); +- pam.set_item(PAM::Authenticator::TTY, DisplayName); ++ pam.set_item(PAM::Authenticator::TTY, screenName.c_str()); + pam.set_item(PAM::Authenticator::Requestor, "root"); + } + catch(PAM::Exception& e){ + logStream << APPNAME << ": " << e << endl; ++ if (existing_server) exit(OPENFAILED_DISPLAY); + exit(ERR_EXIT); + }; + #endif +@@ -240,6 +250,7 @@ void App::Run() { + if (themeName == "default") { + logStream << APPNAME << ": Failed to open default theme file " + << themefile << endl; ++ if (existing_server) exit(OPENFAILED_DISPLAY); + exit(ERR_EXIT); + } else { + logStream << APPNAME << ": Invalid theme in config: " +@@ -251,12 +262,12 @@ void App::Run() { + } + } + +- if (!testing) { ++ if (!testing && !existing_server) { + /* Create lock file */ + LoginApp->GetLock(); + + /* Start x-server */ +- setenv("DISPLAY", DisplayName, 1); ++ setenv("DISPLAY", screenName.c_str(), 1); + signal(SIGQUIT, CatchSignal); + signal(SIGTERM, CatchSignal); + signal(SIGKILL, CatchSignal); +@@ -290,10 +301,11 @@ void App::Run() { + } + + /* Open display */ +- if((Dpy = XOpenDisplay(DisplayName)) == 0) { ++ if((Dpy = XOpenDisplay(screenName.c_str())) == 0) { + logStream << APPNAME << ": could not open display '" +- << DisplayName << "'" << endl; ++ << screenName << "'" << endl; + if (!testing) StopServer(); ++ if (existing_server) exit(OPENFAILED_DISPLAY); + exit(ERR_EXIT); + } + +@@ -434,6 +446,7 @@ bool App::AuthenticateUser(bool focuspass){ + } + catch(PAM::Exception& e){ + logStream << APPNAME << ": " << e << endl; ++ if (existing_server) exit(REMANAGE_DISPLAY); + exit(ERR_EXIT); + }; + return true; +@@ -526,6 +539,7 @@ void App::Login() { + } + catch(PAM::Exception& e){ + logStream << APPNAME << ": " << e << endl; ++ if (existing_server) exit(REMANAGE_DISPLAY); + exit(ERR_EXIT); + }; + #else +@@ -558,12 +572,13 @@ void App::Login() { + pam.setenv("USER", pw->pw_name); + pam.setenv("LOGNAME", pw->pw_name); + pam.setenv("PATH", cfg->getOption("default_path").c_str()); +- pam.setenv("DISPLAY", DisplayName); ++ pam.setenv("DISPLAY", screenName); + pam.setenv("MAIL", maildir.c_str()); + pam.setenv("XAUTHORITY", xauthority.c_str()); + } + catch(PAM::Exception& e){ + logStream << APPNAME << ": " << e << endl; ++ if (existing_server) exit(REMANAGE_DISPLAY); + exit(ERR_EXIT); + } + #endif +@@ -571,10 +586,11 @@ void App::Login() { + #ifdef USE_CONSOLEKIT + /* Setup the ConsoleKit session */ + try { +- ck.open_session(DisplayName, pw->pw_uid); ++ ck.open_session(screenName, pw->pw_uid); + } + catch(Ck::Exception &e) { + logStream << APPNAME << ": " << e << endl; ++ if (existing_server) exit(REMANAGE_DISPLAY); + exit(ERR_EXIT); + } + #endif +@@ -617,7 +633,7 @@ void App::Login() { + child_env[n++]=StrConcat("USER=", pw->pw_name); + child_env[n++]=StrConcat("LOGNAME=", pw->pw_name); + child_env[n++]=StrConcat("PATH=", cfg->getOption("default_path").c_str()); +- child_env[n++]=StrConcat("DISPLAY=", DisplayName); ++ child_env[n++]=StrConcat("DISPLAY=", screenName); + child_env[n++]=StrConcat("MAIL=", maildir.c_str()); + child_env[n++]=StrConcat("XAUTHORITY=", xauthority.c_str()); + # ifdef USE_CONSOLEKIT +@@ -628,7 +644,7 @@ void App::Login() { + #endif + + /* Login process starts here */ +- SwitchUser Su(pw, cfg, DisplayName, child_env); ++ SwitchUser Su(pw, cfg, displayName, child_env); + string session = LoginPanel->getSession(); + string loginCommand = cfg->getOption("login_cmd"); + replaceVariables(loginCommand, SESSION_VAR, session); +@@ -638,6 +654,7 @@ void App::Login() { + replaceVariables(sessStart, USER_VAR, pw->pw_name); + system(sessStart.c_str()); + } ++ putenv(StrConcat("XAUTHORITY=", xauthority.c_str())); + Su.Login(loginCommand.c_str(), mcookie.c_str()); + _exit(OK_EXIT); + } +@@ -651,7 +668,7 @@ void App::Login() { + int status; + while (wpid != pid) { + wpid = wait(&status); +- if (wpid == ServerPID) ++ if (ServerPID != -1 && wpid == ServerPID) + xioerror(Dpy); /* Server died, simulate IO error */ + } + if (WIFEXITED(status) && WEXITSTATUS(status)) { +@@ -722,6 +739,7 @@ void App::Reboot() { + StopServer(); + RemoveLock(); + system(cfg->getOption("reboot_cmd").c_str()); ++ if (existing_server) exit(UNMANAGE_DISPLAY); + exit(OK_EXIT); + } + +@@ -744,6 +762,7 @@ void App::Halt() { + StopServer(); + RemoveLock(); + system(cfg->getOption("halt_cmd").c_str()); ++ if (existing_server) exit(UNMANAGE_DISPLAY); + exit(OK_EXIT); + } + +@@ -792,6 +811,7 @@ void App::Exit() { + RemoveLock(); + } + delete cfg; ++ if (existing_server) exit(REMANAGE_DISPLAY); + exit(OK_EXIT); + } + +@@ -812,6 +832,7 @@ void App::RestartServer() { + StopServer(); + RemoveLock(); + while (waitpid(-1, NULL, WNOHANG) > 0); /* Collects all dead childrens */ ++ if (existing_server) exit(RESERVER_DISPLAY); + Run(); + } + +@@ -881,7 +902,7 @@ int App::WaitForServer() { + int cycles; + + for(cycles = 0; cycles < ncycles; cycles++) { +- if((Dpy = XOpenDisplay(DisplayName))) { ++ if((Dpy = XOpenDisplay(screenName.c_str()))) { + XSetIOErrorHandler(xioerror); + return 1; + } else { +@@ -1132,6 +1153,7 @@ void App::GetLock() { + + /* Remove lockfile and close logs */ + void App::RemoveLock() { ++ if (existing_server) return; + remove(cfg->getOption("lockfile").c_str()); + } + +@@ -1143,6 +1165,7 @@ bool App::isServerStarted() { + /* Redirect stdout and stderr to log file */ + void App::OpenLog() { + ++ if (existing_server) return; + if ( !logStream.openLog( cfg->getOption("logfile").c_str() ) ) { + logStream << APPNAME << ": Could not accesss log file: " << cfg->getOption("logfile") << endl; + RemoveLock(); +@@ -1153,6 +1176,7 @@ void App::OpenLog() { + + /* Relases stdout/err */ + void App::CloseLog(){ ++ if (existing_server) return; + /* Simply closing the log */ + logStream.closeLog(); + } +@@ -1224,7 +1248,7 @@ void App::CreateServerAuth() { + authfile = cfg->getOption("authfile"); + remove(authfile.c_str()); + putenv(StrConcat("XAUTHORITY=", authfile.c_str())); +- Util::add_mcookie(mcookie, ":0", cfg->getOption("xauth_path"), ++ Util::add_mcookie(mcookie, displayName.c_str(), cfg->getOption("xauth_path"), + authfile); + } + +@@ -1244,3 +1268,40 @@ void App::UpdatePid() { + lockfile << getpid() << std::endl; + lockfile.close(); + } ++ ++void App::ReadServerAuth() { ++ /* read authorization from XAUTHORITY file */ ++ char *xauth = getenv("XAUTHORITY"); ++ if (!xauth || !xauth[0]) { ++ logStream << APPNAME << ": XAUTHORITY not defined in environment" << std::endl; ++ exit(OPENFAILED_DISPLAY); ++ } ++ FILE *authf = fopen(xauth,"r"); ++ if (!authf) { ++ logStream << APPNAME << ": " << strerror(errno) << endl; ++ exit(OPENFAILED_DISPLAY); ++ } ++ /* XDM only fills out one entry */ ++ Xauth *auth_in = XauReadAuth(authf); ++ if (!auth_in) { ++ logStream << APPNAME << ": no authority in file " << xauth << endl; ++ fclose(authf); ++ exit(OPENFAILED_DISPLAY); ++ } ++ char buf[256]; ++ for (int i=0;i<auth_in->data_length&&i<128;i++) { ++ char c1, c2; ++ c1 = c2 = auth_in->data[i]; ++ c1 >>= 4; ++ c1 &= 0x0f; ++ c2 &= 0x0f; ++ c1 = (c1 < 10) ? ('0' + c1) : ('a' + (c1 - 10)); ++ c2 = (c2 < 10) ? ('0' + c2) : ('a' + (c2 - 10)); ++ buf[(i<<1)+0] = c1; ++ buf[(i<<1)+1] = c2; ++ buf[(i<<1)+2] = 0; ++ } ++ mcookie = buf; ++ XauDisposeAuth(auth_in); ++ fclose(authf); ++} +diff --git a/app.h b/app.h +index 0bbd7ac..e036641 100644 +--- a/app.h ++++ b/app.h +@@ -14,6 +14,7 @@ + + #include <X11/Xlib.h> + #include <X11/Xatom.h> ++#include <X11/Xauth.h> + #include <signal.h> + #include <unistd.h> + #include <sys/wait.h> +@@ -62,6 +63,7 @@ private: + void CreateServerAuth(); + char *StrConcat(const char *str1, const char *str2); + void UpdatePid(); ++ void ReadServerAuth(); + + bool AuthenticateUser(bool focuspass); + +@@ -81,7 +83,8 @@ private: + int Scr; + Panel *LoginPanel; + int ServerPID; +- const char *DisplayName; ++ std::string displayName; ++ std::string screenName; + bool serverStarted; + + #ifdef USE_PAM +@@ -106,6 +109,7 @@ private: + bool firstlogin; + bool daemonmode; + bool force_nodaemon; ++ bool existing_server; + /* For testing themes */ + char *testtheme; + bool testing; +diff --git a/const.h b/const.h +index 9dd2341..23bf315 100644 +--- a/const.h ++++ b/const.h +@@ -13,7 +13,8 @@ + #define _CONST_H_ + + #define APPNAME "slim" +-#define DISPLAY ":0.0" ++#define DISPLAY ":0" ++#define SCREEN ".0" + + #define CONSOLE_STR "console" + #define HALT_STR "halt" +@@ -30,6 +31,12 @@ + #define OK_EXIT 0 + #define ERR_EXIT 1 + ++#define OBEYSESS_DISPLAY 0 ++#define REMANAGE_DISPLAY 1 ++#define UNMANAGE_DISPLAY 2 ++#define RESERVER_DISPLAY 3 ++#define OPENFAILED_DISPLAY 4 ++ + /* duration for showing error messages, + * as "login command failed", in seconds + */ +diff --git a/log.h b/log.h +index b7810be..8690946 100644 +--- a/log.h ++++ b/log.h +@@ -9,6 +9,7 @@ + #endif + #include "const.h" + #include <fstream> ++#include <iostream> + + using namespace std; + +@@ -22,17 +23,29 @@ public: + + template<typename Type> + LogUnit & operator<<(const Type & text) { +- logFile << text; logFile.flush(); ++ if (logFile.is_open()) { ++ logFile << text; logFile.flush(); ++ } else { ++ cerr << text; ++ } + return *this; + } + + LogUnit & operator<<(ostream & (*fp)(ostream&)) { +- logFile << fp; logFile.flush(); ++ if (logFile.is_open()) { ++ logFile << fp; logFile.flush(); ++ } else { ++ cerr << fp; ++ } + return *this; + } + + LogUnit & operator<<(ios_base & (*fp)(ios_base&)) { +- logFile << fp; logFile.flush(); ++ if (logFile.is_open()) { ++ logFile << fp; logFile.flush(); ++ } else { ++ cerr << fp; ++ } + return *this; + } + } logStream; +diff --git a/panel.cpp b/panel.cpp +index 5057334..cc25496 100644 +--- a/panel.cpp ++++ b/panel.cpp +@@ -624,6 +624,9 @@ bool Panel::OnKeyPress(XEvent& event) { + }; + break; + }; ++ } ++ else { ++ return true; //nodraw if notchange + }; + break; + }; +diff --git a/slim.1 b/slim.1 +index 76e4a30..53678ba 100644 +--- a/slim.1 ++++ b/slim.1 +@@ -1,5 +1,5 @@ + " Text automatically generated by txt2man-1.4.7 +-.TH slim 1 "January 09, 2006" "" "" ++.TH slim 1 "October 03, 2013" "" "" + .SH NAME + \fBslim \fP- Simple LogIn Manager + \fB +@@ -83,11 +83,9 @@ executes a custom command (by default takes a screenshot) + .TP + .B + F1 +-choose session type (see configuration file and xinitrc.sample) ++choose session type from session list. + .SH AUTHORS +-Simone Rota <sip@varlock.com> +-.PP +-Johannes Winkelmann <jw@tks6.net> ++Nobuhiro Iwamatsu <iwamatsu@nigauri.org> + .SH SEE ALSO + See the online documentation at the SLiM web site for further information + on themes, FAQs, etc. +diff --git a/slim.conf b/slim.conf +index a8e2e1c..c5f1d38 100644 +--- a/slim.conf ++++ b/slim.conf +@@ -47,11 +47,9 @@ login_cmd exec /bin/bash -login ~/.xinitrc %session + # options "-d" and "-nodaemon" + # daemon yes + +-# Available sessions (first one is the default). +-# 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-session,wmaker,blackbox ++# Set directory that contains the xsessions. ++# slim reads xsesion from this directory, and be able to select. ++sessiondir /usr/share/xsessions/ + + # Executed when pressing F11 (requires imagemagick) + screenshot_cmd import -window root /slim.png +diff --git a/switchuser.cpp b/switchuser.cpp +index 01aa68a..8440936 100644 +--- a/switchuser.cpp ++++ b/switchuser.cpp +@@ -53,7 +53,6 @@ void SwitchUser::Execute(const char* cmd) { + void SwitchUser::SetClientAuth(const char* mcookie) { + string home = string(Pw->pw_dir); + string authfile = home + "/.Xauthority"; +- remove(authfile.c_str()); +- Util::add_mcookie(mcookie, ":0", cfg->getOption("xauth_path"), ++ Util::add_mcookie(mcookie, displayName.c_str(), cfg->getOption("xauth_path"), + authfile); + } |