about summary refs log tree commit diff
path: root/pkgs/applications/display-managers/slim
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2017-04-23 19:02:50 +0200
committeraszlig <aszlig@redmoonstudios.org>2017-04-23 19:25:23 +0200
commit83e1400e0ce762a9932041977e3c9b90f049425b (patch)
tree2d074e7aaccded16c8cade9c4e22ec12c33efd2f /pkgs/applications/display-managers/slim
parentdcc61da97c7223dd30562145a7294e2e40b8741f (diff)
downloadnixlib-83e1400e0ce762a9932041977e3c9b90f049425b.tar
nixlib-83e1400e0ce762a9932041977e3c9b90f049425b.tar.gz
nixlib-83e1400e0ce762a9932041977e3c9b90f049425b.tar.bz2
nixlib-83e1400e0ce762a9932041977e3c9b90f049425b.tar.lz
nixlib-83e1400e0ce762a9932041977e3c9b90f049425b.tar.xz
nixlib-83e1400e0ce762a9932041977e3c9b90f049425b.tar.zst
nixlib-83e1400e0ce762a9932041977e3c9b90f049425b.zip
nixos/slim: Implement logging to journal
The main change here is a patch of SLiM to tread a log file of
/dev/stderr specially in that it now uses std::cerr instead of a file
for logging.

This allows us to set the logfile to stderr in NixOS for the generated
SLiM configuration file and we now get logging to the systemd journal.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'pkgs/applications/display-managers/slim')
-rw-r--r--pkgs/applications/display-managers/slim/default.nix4
-rw-r--r--pkgs/applications/display-managers/slim/no-logfile.patch80
2 files changed, 84 insertions, 0 deletions
diff --git a/pkgs/applications/display-managers/slim/default.nix b/pkgs/applications/display-managers/slim/default.nix
index fca84199e511..c75a8976b3fa 100644
--- a/pkgs/applications/display-managers/slim/default.nix
+++ b/pkgs/applications/display-managers/slim/default.nix
@@ -22,6 +22,10 @@ stdenv.mkDerivation rec {
       # Ensure that sessions appear in sort order, rather than in
       # directory order.
       ./sort-sessions.patch
+
+      # Allow to set logfile to a special "/dev/stderr" in order to continue
+      # logging to stderr and thus to the journal.
+      ./no-logfile.patch
     ];
 
   preConfigure = "substituteInPlace CMakeLists.txt --replace /lib $out/lib";
diff --git a/pkgs/applications/display-managers/slim/no-logfile.patch b/pkgs/applications/display-managers/slim/no-logfile.patch
new file mode 100644
index 000000000000..f2f5f1549930
--- /dev/null
+++ b/pkgs/applications/display-managers/slim/no-logfile.patch
@@ -0,0 +1,80 @@
+diff --git a/log.cpp b/log.cpp
+index b44677a..7c89dda 100644
+--- a/log.cpp
++++ b/log.cpp
+@@ -1,23 +1,31 @@
+ #include "log.h"
+ #include <iostream>
++#include <cstring>
+ 
+ bool
+ LogUnit::openLog(const char * filename)
+ {
+-	if (logFile.is_open()) {
++	if (isFile && logFile.is_open()) {
+ 		cerr << APPNAME
+ 			<< ": opening a new Log file, while another is already open"
+ 			<< endl;
+-		logFile.close();
++		closeLog();
+ 	}
+-	logFile.open(filename, ios_base::app);
+ 
+-	return !(logFile.fail());
++	if (strcmp(filename, "/dev/stderr") == 0) {
++		isFile = false;
++		return true;
++	} else {
++		logFile.open(filename, ios_base::app);
++		isFile = true;
++		return !(logFile.fail());
++	}
+ }
+ 
+ void
+ LogUnit::closeLog()
+ {
++	if (!isFile) return;
+ 	if (logFile.is_open())
+ 		logFile.close();
+ }
+diff --git a/log.h b/log.h
+index b7810be..ad548a2 100644
+--- a/log.h
++++ b/log.h
+@@ -9,11 +9,14 @@
+ #endif
+ #include "const.h"
+ #include <fstream>
++#include <iostream>
+ 
+ using namespace std;
+ 
+ static class LogUnit {
+ 	ofstream logFile;
++	bool isFile;
++	inline ostream &getStream() { return isFile ? logFile : cerr; }
+ public:
+ 	bool openLog(const char * filename);
+ 	void closeLog();
+@@ -22,17 +25,17 @@ public:
+ 
+ 	template<typename Type>
+ 	LogUnit & operator<<(const Type & text) {
+-		logFile << text; logFile.flush();
++		getStream() << text; getStream().flush();
+ 		return *this;
+ 	}
+ 
+ 	LogUnit & operator<<(ostream & (*fp)(ostream&)) {
+-		logFile << fp; logFile.flush();
++		getStream() << fp; getStream().flush();
+ 		return *this;
+ 	}
+ 
+ 	LogUnit & operator<<(ios_base & (*fp)(ios_base&)) {
+-		logFile << fp; logFile.flush();
++		getStream() << fp; getStream().flush();
+ 		return *this;
+ 	}
+ } logStream;