diff options
Diffstat (limited to 'testing/sysvinit/Remove-handling-of-special-chars-fix-per-line-buffer.patch')
-rw-r--r-- | testing/sysvinit/Remove-handling-of-special-chars-fix-per-line-buffer.patch | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/testing/sysvinit/Remove-handling-of-special-chars-fix-per-line-buffer.patch b/testing/sysvinit/Remove-handling-of-special-chars-fix-per-line-buffer.patch new file mode 100644 index 000000000..b573b9a6d --- /dev/null +++ b/testing/sysvinit/Remove-handling-of-special-chars-fix-per-line-buffer.patch @@ -0,0 +1,216 @@ +From 4d2b17f47073e0491f9dfa62797cc727d4530f22 Mon Sep 17 00:00:00 2001 +From: Florian Pritz <bluewind@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@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@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 + |