diff lib/getndelim2.c @ 10006:b0a275071b2c

Test getndelim2. * modules/getndelim2-tests: New file. * tests/test-getndelim2.c: Likewise. * lib/getndelim2.c (getndelim2): Never return 0. Lock the stream. * m4/getndelim2.m4 (gl_GETNDELIM2): Check for lock functions. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Mon, 28 Apr 2008 21:36:17 -0600 (2008-04-29)
parents bbbbbf4cd1c5
children e435c0a7bace
line wrap: on
line diff
--- a/lib/getndelim2.c
+++ b/lib/getndelim2.c
@@ -1,7 +1,7 @@
 /* getndelim2 - Read a line from a stream, stopping at one of 2 delimiters,
    with bounded memory allocation.
 
-   Copyright (C) 1993, 1996, 1997, 1998, 2000, 2003, 2004, 2006 Free
+   Copyright (C) 1993, 1996, 1997, 1998, 2000, 2003, 2004, 2006, 2008 Free
    Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -29,6 +29,14 @@
 #if USE_UNLOCKED_IO
 # include "unlocked-io.h"
 #endif
+#if !HAVE_FLOCKFILE
+# undef flockfile
+# define flockfile(x) ((void) 0)
+#endif
+#if !HAVE_FUNLOCKFILE
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+#endif
 
 #include <limits.h>
 #include <stdint.h>
@@ -73,6 +81,8 @@
   if (nbytes_avail == 0 && nmax <= size)
     goto done;
 
+  flockfile (stream);
+
   for (;;)
     {
       /* Here always ptr + size == read_pos + nbytes_avail.  */
@@ -95,14 +105,14 @@
 	    {
 	      size_t newsizemax = offset + GETNDELIM2_MAXIMUM + 1;
 	      if (size == newsizemax)
-		goto done;
+		goto unlock_done;
 	      newsize = newsizemax;
 	    }
 
 	  nbytes_avail = newsize - (read_pos - ptr);
 	  newptr = realloc (ptr, newsize);
 	  if (!newptr)
-	    goto done;
+	    goto unlock_done;
 	  ptr = newptr;
 	  size = newsize;
 	  read_pos = size - nbytes_avail + ptr;
@@ -113,7 +123,7 @@
 	{
 	  /* Return partial line, if any.  */
 	  if (read_pos == ptr)
-	    goto done;
+	    goto unlock_done;
 	  else
 	    break;
 	}
@@ -135,8 +145,11 @@
 
   bytes_stored = read_pos - (ptr + offset);
 
+ unlock_done:
+  funlockfile (stream);
+
  done:
   *lineptr = ptr;
   *linesize = size;
-  return bytes_stored;
+  return bytes_stored ? bytes_stored : -1;
 }