aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2002-10-23 20:56:24 +0000
committerBruce Momjian <bruce@momjian.us>2002-10-23 20:56:24 +0000
commitdc4d18e0567eee4af09a1d146a92fd7b59c353a2 (patch)
treea054507e41f6095e564147e14d4756a4bda6ac1b /src
parent641b658c26f927bf59d38ecba9c8ab45544a2816 (diff)
downloadpostgresql-dc4d18e0567eee4af09a1d146a92fd7b59c353a2.tar.gz
postgresql-dc4d18e0567eee4af09a1d146a92fd7b59c353a2.zip
Add fseeko/ftello using fsetpos/fgetpos for BSD/OS.
Diffstat (limited to 'src')
-rw-r--r--src/port/fseeko.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/port/fseeko.c b/src/port/fseeko.c
new file mode 100644
index 00000000000..22aa80c98dd
--- /dev/null
+++ b/src/port/fseeko.c
@@ -0,0 +1,76 @@
+/*-------------------------------------------------------------------------
+ *
+ * fseeko.c
+ * 64-bit versions of fseeko/ftello()
+ *
+ * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ *
+ * IDENTIFICATION
+ * $Header: /cvsroot/pgsql/src/port/fseeko.c,v 1.1 2002/10/23 20:56:24 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifdef __bsdi__
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+/*
+ * On BSD/OS, off_t and fpos_t are the same. Standards say
+ * off_t is an arithmetic type, but not necessarily integral,
+ * while fpos_t might be neither.
+ *
+ * I don't think this is thread-safe.
+ */
+
+int
+fseeko(FILE *stream, off_t offset, int whence)
+{
+ off_t floc;
+ struct stat filestat;
+
+ switch (whence)
+ {
+ case SEEK_CUR:
+ if (fgetpos(stream, &floc) != 0)
+ return -1;
+ floc += offset;
+ if (fsetpos(stream, &floc) != 0)
+ return -1;
+ return 0;
+ break;
+ case SEEK_SET:
+ if (fsetpos(stream, &offset) != 0)
+ return -1;
+ return 0;
+ break;
+ case SEEK_END:
+ if (fstat(fileno(stream), &filestat) != 0)
+ return -1;
+ floc = filestat.st_size;
+ if (fsetpos(stream, &floc) != 0)
+ return -1;
+ return 0;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+
+off_t
+ftello(FILE *stream)
+{
+ off_t floc;
+
+ if (fgetpos(stream, &floc) != 0)
+ return -1;
+ return floc;
+}
+#endif