aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/error/elog.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/error/elog.c')
-rw-r--r--src/backend/utils/error/elog.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 3faef16851e..1c1203ec569 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -42,7 +42,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.155.4.7 2007/07/21 22:12:24 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.155.4.8 2008/07/08 22:18:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1170,6 +1170,7 @@ write_syslog(int level, const char *line)
static unsigned long seq = 0;
int len;
+ const char *nlpos;
if (!openlog_done)
{
@@ -1222,10 +1223,11 @@ write_syslog(int level, const char *line)
* smaller pieces.
*
* We divide into multiple syslog() calls if message is too long
- * or if the message contains embedded NewLine(s) '\n'.
+ * or if the message contains embedded newline(s).
*/
len = strlen(line);
- if (len > PG_SYSLOG_LIMIT || strchr(line, '\n') != NULL)
+ nlpos = strchr(line, '\n');
+ if (len > PG_SYSLOG_LIMIT || nlpos != NULL)
{
int chunk_nr = 0;
@@ -1240,15 +1242,19 @@ write_syslog(int level, const char *line)
{
line++;
len--;
+ /* we need to recompute the next newline's position, too */
+ nlpos = strchr(line, '\n');
continue;
}
- strncpy(buf, line, PG_SYSLOG_LIMIT);
- buf[PG_SYSLOG_LIMIT] = '\0';
- if (strchr(buf, '\n') != NULL)
- *strchr(buf, '\n') = '\0';
-
- buflen = strlen(buf);
+ /* copy one line, or as much as will fit, to buf */
+ if (nlpos != NULL)
+ buflen = nlpos - line;
+ else
+ buflen = len;
+ buflen = Min(buflen, PG_SYSLOG_LIMIT);
+ memcpy(buf, line, buflen);
+ buf[buflen] = '\0';
/* trim to multibyte letter boundary */
buflen = pg_mbcliplen(buf, buflen, buflen);