summaryrefslogtreecommitdiffstats
path: root/usr.bin/sed
diff options
context:
space:
mode:
authorpfg <pfg@FreeBSD.org>2013-06-26 04:14:19 +0000
committerpfg <pfg@FreeBSD.org>2013-06-26 04:14:19 +0000
commit4772ec77e6b43f0a2b80cb07645dab1096bc4eef (patch)
tree95bc779baf889563f9d2c722049204fca932ee05 /usr.bin/sed
parent5d588b2eef337c7d94616bb7f500e5b563f70733 (diff)
downloadFreeBSD-src-4772ec77e6b43f0a2b80cb07645dab1096bc4eef.zip
FreeBSD-src-4772ec77e6b43f0a2b80cb07645dab1096bc4eef.tar.gz
sed: use getline() instead of fgetln().
In BSD, fgetln() available in libc but in Illumos the Solaris port had to include it internally. It also seems to have caused problems [1]. Aid portability by using getline() instead. Reference: https://www.illumos.org/issues/3820 [1] Submitted by: Johann 'Myrkraverk' Oskarsson <johann@myrkraverk.com> Reviewed by: dds MFC after: 2 weeks
Diffstat (limited to 'usr.bin/sed')
-rw-r--r--usr.bin/sed/main.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/usr.bin/sed/main.c b/usr.bin/sed/main.c
index 049d2ea..2062c68 100644
--- a/usr.bin/sed/main.c
+++ b/usr.bin/sed/main.c
@@ -1,4 +1,5 @@
/*-
+ * Copyright (c) 2013 Johann 'Myrkraverk' Oskarsson.
* Copyright (c) 1992 Diomidis Spinellis.
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
@@ -57,6 +58,7 @@ static const char sccsid[] = "@(#)main.c 8.2 (Berkeley) 1/3/94";
#include <locale.h>
#include <regex.h>
#include <stddef.h>
+#define _WITH_GETLINE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -307,8 +309,9 @@ int
mf_fgets(SPACE *sp, enum e_spflag spflag)
{
struct stat sb;
- size_t len;
- char *p;
+ ssize_t len;
+ static char *p = NULL;
+ static size_t plen = 0;
int c;
static int firstfile;
@@ -424,13 +427,13 @@ mf_fgets(SPACE *sp, enum e_spflag spflag)
* We are here only when infile is open and we still have something
* to read from it.
*
- * Use fgetln so that we can handle essentially infinite input data.
- * Can't use the pointer into the stdio buffer as the process space
- * because the ungetc() can cause it to move.
+ * Use getline() so that we can handle essentially infinite input
+ * data. The p and plen are static so each invocation gives
+ * getline() the same buffer which is expanded as needed.
*/
- p = fgetln(infile, &len);
- if (ferror(infile))
- errx(1, "%s: %s", fname, strerror(errno ? errno : EIO));
+ len = getline(&p, &plen, infile);
+ if (len == -1)
+ err(1, "%s", fname);
if (len != 0 && p[len - 1] == '\n')
len--;
cspace(sp, p, len, spflag);
OpenPOWER on IntegriCloud