From 6b9d496988f143553d4226a81651154aa7a1e1ed Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Wed, 23 Oct 2002 21:16:17 +0000
Subject: [PATCH] Make BSD/OS fseeko thread-safe.

---
 src/port/fseeko.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/port/fseeko.c b/src/port/fseeko.c
index 22aa80c98dd..60a0ae41029 100644
--- a/src/port/fseeko.c
+++ b/src/port/fseeko.c
@@ -8,13 +8,14 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/port/fseeko.c,v 1.1 2002/10/23 20:56:24 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/port/fseeko.c,v 1.2 2002/10/23 21:16:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #ifdef __bsdi__
 
+#include <pthread.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -25,7 +26,7 @@
  *	off_t is an arithmetic type, but not necessarily integral,
  *	while fpos_t might be neither.
  *
- *	I don't think this is thread-safe.
+ *	This is thread-safe using flockfile/funlockfile.
  */
 
 int
@@ -37,11 +38,19 @@ fseeko(FILE *stream, off_t offset, int whence)
 	switch (whence)
 	{
 		case SEEK_CUR:
+			flockfile(stream);
 			if (fgetpos(stream, &floc) != 0)
+			{
+				funlockfile(stream);
 				return -1;
+			}
 			floc += offset;
 			if (fsetpos(stream, &floc) != 0)
+			{
+				funlockfile(stream);
 				return -1;
+			}
+			flockfile(stream);
 			return 0;
 			break;
 		case SEEK_SET:
@@ -50,11 +59,19 @@ fseeko(FILE *stream, off_t offset, int whence)
 			return 0;
 			break;
 		case SEEK_END:
+			flockfile(stream);
 			if (fstat(fileno(stream), &filestat) != 0)
+			{
+				funlockfile(stream);
 				return -1;
+			}
 			floc = filestat.st_size;
 			if (fsetpos(stream, &floc) != 0)
+			{
+				funlockfile(stream);
 				return -1;
+			}
+			funlockfile(stream);
 			return 0;
 			break;
 		default:
-- 
GitLab