[arch-commits] Commit in sysvinit/trunk (2 files)

Florian Pritz bluewind at archlinux.org
Tue Jun 12 20:52:54 UTC 2012


    Date: Tuesday, June 12, 2012 @ 16:52:54
  Author: bluewind
Revision: 161640

[bootlogd] Remove handling of special chars; fix per line buffer problem (FS#30005)

upgpkg: sysvinit 2.88-4

Added:
  sysvinit/trunk/Remove-handling-of-special-chars-fix-per-line-buffer.patch
Modified:
  sysvinit/trunk/PKGBUILD

------------------------------------------------------------+
 PKGBUILD                                                   |   12 
 Remove-handling-of-special-chars-fix-per-line-buffer.patch |  216 +++++++++++
 2 files changed, 225 insertions(+), 3 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2012-06-12 18:43:54 UTC (rev 161639)
+++ PKGBUILD	2012-06-12 20:52:54 UTC (rev 161640)
@@ -3,7 +3,7 @@
 
 pkgname=sysvinit
 pkgver=2.88
-pkgrel=3
+pkgrel=4
 pkgdesc="Linux System V Init"
 arch=('i686' 'x86_64')
 url="http://savannah.nongnu.org/projects/sysvinit"
@@ -11,11 +11,17 @@
 groups=('base')
 depends=('util-linux' 'coreutils' 'glibc' 'awk')
 install=sysvinit.install
-source=(http://download.savannah.gnu.org/releases/sysvinit/${pkgname}-${pkgver}dsf.tar.bz2)
-sha1sums=('f2ca149df1314a91f3007cccd7a0aa47d990de26')
+source=(http://download.savannah.gnu.org/releases/sysvinit/${pkgname}-${pkgver}dsf.tar.bz2
+        "Remove-handling-of-special-chars-fix-per-line-buffer.patch")
+sha1sums=('f2ca149df1314a91f3007cccd7a0aa47d990de26'
+          'cb1180009cc2ff3ba1bc4fa5609f3d279fed9d0e')
 
 build() {
   cd "${srcdir}/${pkgname}-${pkgver}dsf"
+
+  # FS#30005
+  patch -p1 -d "src" -i "${srcdir}/Remove-handling-of-special-chars-fix-per-line-buffer.patch"
+
   make 
 }
 

Added: Remove-handling-of-special-chars-fix-per-line-buffer.patch
===================================================================
--- Remove-handling-of-special-chars-fix-per-line-buffer.patch	                        (rev 0)
+++ Remove-handling-of-special-chars-fix-per-line-buffer.patch	2012-06-12 20:52:54 UTC (rev 161640)
@@ -0,0 +1,216 @@
+From 4d2b17f47073e0491f9dfa62797cc727d4530f22 Mon Sep 17 00:00:00 2001
+From: Florian Pritz <bluewind at xinu.at>
+Date: Tue, 22 May 2012 22:14:52 +0200
+Subject: [PATCH] Remove handling of special chars; fix per line buffer
+ problem
+
+The linebuffer was only 256 chars so longer lines were truncated.
+
+By removing the handling of special chars (for example: /n/r/t) and
+simply writing everything we read as is to the logfile we fix this bug,
+make the code much smaller and allow users to write userspace tools that
+correctly handle rendering.
+
+Signed-off-by: Florian Pritz <bluewind at xinu.at>
+---
+ bootlogd.c |  139 +++++++++---------------------------------------------------
+ 1 file changed, 19 insertions(+), 120 deletions(-)
+
+diff --git a/bootlogd.c b/bootlogd.c
+index 570d382..5df8fb9 100644
+--- a/bootlogd.c
++++ b/bootlogd.c
+@@ -58,21 +58,10 @@ char *Version = "@(#) bootlogd 2.86 03-Jun-2004 miquels at cistron.nl";
+ 
+ #define LOGFILE	"/var/log/boot"
+ 
+-char ringbuf[32768];
+-char *endptr = ringbuf + sizeof(ringbuf);
+-char *inptr  = ringbuf;
+-char *outptr = ringbuf;
+-
+ int got_signal = 0;
+-int didnl = 1;
+ int createlogfile = 0;
+ int syncalot = 0;
+ 
+-struct line {
+-	char buf[256];
+-	int pos;
+-} line;
+-
+ /*
+  *	Console devices as listed on the kernel command line and
+  *	the mapping to actual devices in /dev
+@@ -345,83 +334,6 @@ int consolename(char *res, int rlen)
+ 	return -1;
+ }
+ 
+-
+-/*
+- *	Write data and make sure it's on disk.
+- */
+-void writelog(FILE *fp, unsigned char *ptr, int len)
+-{
+-	time_t		t;
+-	char		*s;
+-	char		tmp[8];
+-	int		olen = len;
+-	int		dosync = 0;
+-	int		tlen;
+-
+-	while (len > 0) {
+-		tmp[0] = 0;
+-		if (didnl) {
+-			time(&t);
+-			s = ctime(&t);
+-			fprintf(fp, "%.24s: ", s);
+-			didnl = 0;
+-		}
+-		switch (*ptr) {
+-			case 27: /* ESC */
+-				strcpy(tmp, "^[");
+-				break;
+-			case '\r':
+-				line.pos = 0;
+-				break;
+-			case 8: /* ^H */
+-				if (line.pos > 0) line.pos--;
+-				break;
+-			case '\n':
+-				didnl = 1;
+-				dosync = 1;
+-				break;
+-			case '\t':
+-				line.pos += (line.pos / 8 + 1) * 8;
+-				if (line.pos >= (int)sizeof(line.buf))
+-					line.pos = sizeof(line.buf) - 1;
+-				break;
+-			case  32 ... 127:
+-			case 161 ... 255:
+-				tmp[0] = *ptr;
+-				tmp[1] = 0;
+-				break;
+-			default:
+-				sprintf(tmp, "\\%03o", *ptr);
+-				break;
+-		}
+-		ptr++;
+-		len--;
+-
+-		tlen = strlen(tmp);
+-		if (tlen && (line.pos + tlen < (int)sizeof(line.buf))) {
+-			memcpy(line.buf + line.pos, tmp, tlen);
+-			line.pos += tlen;
+-		}
+-		if (didnl) {
+-			fprintf(fp, "%s\n", line.buf);
+-			memset(&line, 0, sizeof(line));
+-		}
+-	}
+-
+-	if (dosync) {
+-		fflush(fp);
+-		if (syncalot) {
+-			fdatasync(fileno(fp));
+-		}
+-	}
+-
+-	outptr += olen;
+-	if (outptr >= endptr)
+-		outptr = ringbuf;
+-
+-}
+-
+-
+ /*
+  *	Print usage message and exit.
+  */
+@@ -481,7 +393,6 @@ int main(int argc, char **argv)
+ 	int		ptm, pts;
+ 	int		realfd;
+ 	int		n, m, i;
+-	int		todo;
+ 
+ 	fp = NULL;
+ 	logfile = LOGFILE;
+@@ -615,13 +526,13 @@ int main(int argc, char **argv)
+ 			/*
+ 			 *	See how much space there is left, read.
+ 			 */
+-			if ((n = read(ptm, inptr, endptr - inptr)) >= 0) {
++			if ((n = read(ptm, buf, sizeof(buf))) >= 0) {
+ 				/*
+ 				 *	Write data (in chunks if needed)
+ 				 *	to the real output device.
+ 				 */
+ 				m = n;
+-				p = inptr;
++				p = buf;
+ 				while (m > 0) {
+ 					i = write(realfd, p, m);
+ 					if (i >= 0) {
+@@ -641,43 +552,31 @@ int main(int argc, char **argv)
+ 				}
+ 
+ 				/*
+-				 *	Increment buffer position. Handle
+-				 *	wraps, and also drag output pointer
+-				 *	along if we cross it.
++				 *	Perhaps we need to open the logfile.
+ 				 */
+-				inptr += n;
+-				if (inptr - n < outptr && inptr > outptr)
+-					outptr = inptr;
+-				if (inptr >= endptr)
+-					inptr = ringbuf;
+-				if (outptr >= endptr)
+-					outptr = ringbuf;
+-			}
+-		}
++				if (fp == NULL && access(logfile, F_OK) == 0) {
++					if (rotate) {
++						snprintf(buf, sizeof(buf), "%s~", logfile);
++						rename(logfile, buf);
++					}
++					fp = fopen(logfile, "a");
++				}
++				if (fp == NULL && createlogfile)
++					fp = fopen(logfile, "a");
+ 
+-		/*
+-		 *	Perhaps we need to open the logfile.
+-		 */
+-		if (fp == NULL && access(logfile, F_OK) == 0) {
+-			if (rotate) {
+-				snprintf(buf, sizeof(buf), "%s~", logfile);
+-				rename(logfile, buf);
++				if (fp) {
++					write(fileno(fp), buf, n);
++				}
++
++				if (syncalot) {
++					fdatasync(fileno(fp));
++				}
+ 			}
+-			fp = fopen(logfile, "a");
+ 		}
+-		if (fp == NULL && createlogfile)
+-			fp = fopen(logfile, "a");
+ 
+-		if (inptr >= outptr)
+-			todo = inptr - outptr;
+-		else
+-			todo = endptr - outptr;
+-		if (fp && todo)
+-			writelog(fp, (unsigned char *)outptr, todo);
+ 	}
+ 
+ 	if (fp) {
+-		if (!didnl) fputc('\n', fp);
+ 		fclose(fp);
+ 	}
+ 
+-- 
+1.7.10.2
+




More information about the arch-commits mailing list