Make BSD/OS fseeko thread-safe.
authorBruce Momjian
Wed, 23 Oct 2002 21:16:17 +0000 (21:16 +0000)
committerBruce Momjian
Wed, 23 Oct 2002 21:16:17 +0000 (21:16 +0000)
src/port/fseeko.c

index 22aa80c98dd0a21d7642a47667c9f1a96e343c40..60a0ae4102923e79899b4971d92eafe303ecd235 100644 (file)
@@ -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 
 #include 
 #include 
 #include 
@@ -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: