Commit 6b9d4969 authored by Bruce Momjian's avatar Bruce Momjian

Make BSD/OS fseeko thread-safe.

parent c9984ab7
...@@ -8,13 +8,14 @@ ...@@ -8,13 +8,14 @@
* *
* *
* IDENTIFICATION * 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__ #ifdef __bsdi__
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
...@@ -25,7 +26,7 @@ ...@@ -25,7 +26,7 @@
* off_t is an arithmetic type, but not necessarily integral, * off_t is an arithmetic type, but not necessarily integral,
* while fpos_t might be neither. * while fpos_t might be neither.
* *
* I don't think this is thread-safe. * This is thread-safe using flockfile/funlockfile.
*/ */
int int
...@@ -37,11 +38,19 @@ fseeko(FILE *stream, off_t offset, int whence) ...@@ -37,11 +38,19 @@ fseeko(FILE *stream, off_t offset, int whence)
switch (whence) switch (whence)
{ {
case SEEK_CUR: case SEEK_CUR:
flockfile(stream);
if (fgetpos(stream, &floc) != 0) if (fgetpos(stream, &floc) != 0)
{
funlockfile(stream);
return -1; return -1;
}
floc += offset; floc += offset;
if (fsetpos(stream, &floc) != 0) if (fsetpos(stream, &floc) != 0)
{
funlockfile(stream);
return -1; return -1;
}
flockfile(stream);
return 0; return 0;
break; break;
case SEEK_SET: case SEEK_SET:
...@@ -50,11 +59,19 @@ fseeko(FILE *stream, off_t offset, int whence) ...@@ -50,11 +59,19 @@ fseeko(FILE *stream, off_t offset, int whence)
return 0; return 0;
break; break;
case SEEK_END: case SEEK_END:
flockfile(stream);
if (fstat(fileno(stream), &filestat) != 0) if (fstat(fileno(stream), &filestat) != 0)
{
funlockfile(stream);
return -1; return -1;
}
floc = filestat.st_size; floc = filestat.st_size;
if (fsetpos(stream, &floc) != 0) if (fsetpos(stream, &floc) != 0)
{
funlockfile(stream);
return -1; return -1;
}
funlockfile(stream);
return 0; return 0;
break; break;
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment