Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tools/compat Switch to a version that does not suffer from r...



details:   https://anonhg.NetBSD.org/src/rev/b7156b224282
branches:  trunk
changeset: 340889:b7156b224282
user:      christos <christos%NetBSD.org@localhost>
date:      Thu Oct 08 20:20:45 2015 +0000

description:
Switch to a version that does not suffer from reporting the wrong length
if the file contains NULs. From OpenBSD.

diffstat:

 tools/compat/fgetln.c |  117 +++++++++++++++++++++----------------------------
 1 files changed, 50 insertions(+), 67 deletions(-)

diffs (144 lines):

diff -r 91bb918adbbf -r b7156b224282 tools/compat/fgetln.c
--- a/tools/compat/fgetln.c     Thu Oct 08 18:20:31 2015 +0000
+++ b/tools/compat/fgetln.c     Thu Oct 08 20:20:45 2015 +0000
@@ -1,32 +1,23 @@
-/*     $NetBSD: fgetln.c,v 1.9 2008/04/29 06:53:03 martin Exp $        */
+/*     $NetBSD: fgetln.c,v 1.10 2015/10/08 20:20:45 christos Exp $     */
 
-/*-
- * Copyright (c) 1998 The NetBSD Foundation, Inc.
- * All rights reserved.
+/*
+ * Copyright (c) 2015 Joerg Jung <jung%openbsd.org@localhost>
  *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Christos Zoulas.
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * portable fgetln() version, reentrant
  */
 
 #ifdef HAVE_NBTOOL_CONFIG_H
@@ -38,57 +29,49 @@
 #ifndef HAVE_NBTOOL_CONFIG_H
 /* These headers are required, but included from nbtool_config.h */
 #include <stdio.h>
-#include <unistd.h>
+#include <stdlib.h>
 #include <errno.h>
-#include <string.h>
 #endif
 
 char *
 fgetln(FILE *fp, size_t *len)
 {
        static char *buf = NULL;
-       static size_t bufsiz = 0;
-       char *ptr;
-
-
-       if (buf == NULL) {
-               bufsiz = BUFSIZ;
-               if ((buf = malloc(bufsiz)) == NULL)
-                       return NULL;
-       }
-
-       if (fgets(buf, bufsiz, fp) == NULL)
-               return NULL;
-
-       *len = 0;
-       while ((ptr = strchr(&buf[*len], '\n')) == NULL) {
-               size_t nbufsiz = bufsiz + BUFSIZ;
-               char *nbuf = realloc(buf, nbufsiz);
+       static size_t bufsz = 0;
+       size_t r = 0;
+       char *p;
+       int c, e;
 
-               if (nbuf == NULL) {
-                       int oerrno = errno;
-                       free(buf);
-                       errno = oerrno;
-                       buf = NULL;
+       if (!fp || !len) {
+               errno = EINVAL;
+               return NULL;
+       }
+       if (!buf) {
+               if (!(buf = calloc(1, BUFSIZ)))
                        return NULL;
-               } else
-                       buf = nbuf;
+               bufsz = BUFSIZ;
+       }
+       while ((c = getc(fp)) != EOF) {
+               buf[r++] = c;
+               if (r == bufsz) {
+                       // Original uses reallocarray() but we don't have it
+                       // in tools.
+                       if (!(p = realloc(buf, 2 * bufsz))) {
+                               e = errno;
+                               free(buf);
+                               errno = e;
+                               buf = NULL, bufsz = 0;
+                               return NULL;
+                       }
+                       buf = p, bufsz = 2 * bufsz;
+               }
+               if (c == '\n')
+                       break;
+       }
+       return (*len = r) ? buf : NULL;
+}
+#endif
 
-               if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL) {
-                       buf[bufsiz] = '\0';
-                       *len = strlen(buf);
-                       return buf;
-               }
-
-               *len = bufsiz;
-               bufsiz = nbufsiz;
-       }
-
-       *len = (ptr - buf) + 1;
-       return buf;
-}
-
-#endif
 
 #ifdef TEST
 int



Home | Main Index | Thread Index | Old Index