summaryrefslogtreecommitdiff
path: root/package/system
diff options
context:
space:
mode:
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-07-19 17:12:44 +0000
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-07-19 17:12:44 +0000
commitff17ada833406551070d1a40befe126527b5fc28 (patch)
treed92fa36ea866e1eb110b94b06304e44400b4e07e /package/system
parent055c74e4d484e7ed91f60c1434038ddaa51a69c8 (diff)
procd: improve early console handling
The malta target is broken since procd is used as init. The initramfs image boots fine, however the console is not working. Improve the early console handling to fix the problem. Signed-off-by: Gabor Juhos <juhosg@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@37451 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/system')
-rw-r--r--package/system/procd/Makefile2
-rw-r--r--package/system/procd/patches/0001-early-keep-stdio-files-open.patch49
-rw-r--r--package/system/procd/patches/0002-early-remove-superfluous-close-of-stdio-file-descrip.patch40
3 files changed, 90 insertions, 1 deletions
diff --git a/package/system/procd/Makefile b/package/system/procd/Makefile
index 014e01caf9..0c5a34cbb9 100644
--- a/package/system/procd/Makefile
+++ b/package/system/procd/Makefile
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=procd
PKG_VERSION:=2013-07-14
-PKG_RELEASE=$(PKG_SOURCE_VERSION)
+PKG_RELEASE=$(PKG_SOURCE_VERSION)-1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=git://nbd.name/luci2/procd.git
diff --git a/package/system/procd/patches/0001-early-keep-stdio-files-open.patch b/package/system/procd/patches/0001-early-keep-stdio-files-open.patch
new file mode 100644
index 0000000000..74cca070c3
--- /dev/null
+++ b/package/system/procd/patches/0001-early-keep-stdio-files-open.patch
@@ -0,0 +1,49 @@
+From 13ebb50d2789de7bd47cebe57e3f6eba58fdcc7e Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Fri, 19 Jul 2013 08:43:35 +0200
+Subject: [PATCH 1/2] early: keep stdio files open
+
+At the end of the 'early_console' function, the
+file descriptor is closed unconditionally. This
+'close' call closes the stdio files if the fd
+returned by the 'open(dev/console)' call equals
+with any of the STD{IN,OUT,ERR}_FILENO values.
+When this happens, all subsequent accesses to
+the stdio files will fail and early console
+access won't work.
+
+To avoid this, don't close the file descriptor if
+that equals with any of the STD*_FILENO values.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+Note:
+
+The issue happens if Linux is unable to open the
+initial console before calling init. In this case,
+the 'open(dev/console)' call in the 'early_console'
+function returns with zero.
+---
+ early.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/early.c b/early.c
+index 27d0929..204623b 100644
+--- a/early.c
++++ b/early.c
+@@ -65,7 +65,11 @@ static void early_console(const char *dev)
+ dup2(dd, STDIN_FILENO);
+ dup2(dd, STDOUT_FILENO);
+ dup2(dd, STDERR_FILENO);
+- close(dd);
++
++ if (dd != STDIN_FILENO &&
++ dd != STDOUT_FILENO &&
++ dd != STDERR_FILENO)
++ close(dd);
+ }
+
+ static void early_env(void)
+--
+1.7.10
+
diff --git a/package/system/procd/patches/0002-early-remove-superfluous-close-of-stdio-file-descrip.patch b/package/system/procd/patches/0002-early-remove-superfluous-close-of-stdio-file-descrip.patch
new file mode 100644
index 0000000000..096983200c
--- /dev/null
+++ b/package/system/procd/patches/0002-early-remove-superfluous-close-of-stdio-file-descrip.patch
@@ -0,0 +1,40 @@
+From 1edd25cfa0a26dac1ca5d49bce479ebdea336437 Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Fri, 19 Jul 2013 08:21:17 +0200
+Subject: [PATCH 2/2] early: remove superfluous close of stdio file
+ descriptors
+
+'man dup2' says:
+
+ dup2() makes newfd be the copy of oldfd, closing newfd first if
+ necessary, but note the following:
+
+ * If oldfd is not a valid file descriptor, then the call fails,
+ and newfd is not closed.
+
+ * If oldfd is a valid file descriptor, and newfd has the same
+ value as oldfd, then dup2() does nothing, and returns newfd.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ early.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/early.c b/early.c
+index 204623b..f9e3277 100644
+--- a/early.c
++++ b/early.c
+@@ -53,10 +53,6 @@ static void early_console(const char *dev)
+ mkdev("*console", 0600);
+
+ dd = open(dev, O_RDWR);
+- close(STDIN_FILENO);
+- close(STDOUT_FILENO);
+- close(STDERR_FILENO);
+-
+ if (dd < 0) {
+ ERROR("Failed to open %s\n", dev);
+ return;
+--
+1.7.10
+