Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Jun 2013 04:14:19 +0000 (UTC)
From:      "Pedro F. Giffuni" <pfg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r252231 - head/usr.bin/sed
Message-ID:  <201306260414.r5Q4EJb9078670@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pfg
Date: Wed Jun 26 04:14:19 2013
New Revision: 252231
URL: http://svnweb.freebsd.org/changeset/base/252231

Log:
  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

Modified:
  head/usr.bin/sed/main.c

Modified: head/usr.bin/sed/main.c
==============================================================================
--- head/usr.bin/sed/main.c	Wed Jun 26 04:00:52 2013	(r252230)
+++ head/usr.bin/sed/main.c	Wed Jun 26 04:14:19 2013	(r252231)
@@ -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
 #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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306260414.r5Q4EJb9078670>