]> granicus.if.org Git - postgresql/commitdiff
Add fseeko/ftello using fsetpos/fgetpos for BSD/OS.
authorBruce Momjian <bruce@momjian.us>
Wed, 23 Oct 2002 20:56:24 +0000 (20:56 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 23 Oct 2002 20:56:24 +0000 (20:56 +0000)
configure
configure.in
src/port/fseeko.c [new file with mode: 0644]

index 40ff59975b1bc704ca873a58f3f7b329440d9e52..d4b1134f3ac1107414a071050b13b869a7a02de0 100755 (executable)
--- a/configure
+++ b/configure
@@ -10463,7 +10463,8 @@ fi
 
 
 
-for ac_func in gethostname getrusage inet_aton random srandom strcasecmp strdup strerror strtol strtoul
+
+for ac_func in fseeko gethostname getrusage inet_aton random srandom strcasecmp strdup strerror strtol strtoul
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 echo "$as_me:$LINENO: checking for $ac_func" >&5
@@ -11470,6 +11471,9 @@ fi
 done
 
 
+case $host_os in bsdi*)
+ac_cv_func_fseeko=yes
+esac
 echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5
 echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6
 if test "${ac_cv_sys_largefile_source+set}" = set; then
index 8d6cf496188bda22c69389e344b1d4f943ac4d25..1fd159c36b23fed02901cbff4e130aedf0e81ba4 100644 (file)
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-dnl $Header: /cvsroot/pgsql/configure.in,v 1.211 2002/09/25 13:23:15 momjian Exp $
+dnl $Header: /cvsroot/pgsql/configure.in,v 1.212 2002/10/23 20:56:24 momjian Exp $
 dnl
 dnl Developers, please strive to achieve this order:
 dnl
@@ -835,7 +835,7 @@ else
   AC_CHECK_FUNCS([fpclass fp_class fp_class_d class], [break])
 fi
 
-AC_REPLACE_FUNCS([gethostname getrusage inet_aton random srandom strcasecmp strdup strerror strtol strtoul])
+AC_REPLACE_FUNCS([fseeko gethostname getrusage inet_aton random srandom strcasecmp strdup strerror strtol strtoul])
 
 # Solaris has a very slow qsort in certain cases.
 case $host_os in 
@@ -903,6 +903,9 @@ AC_CHECK_FUNCS(atexit, [],
                [AC_CHECK_FUNCS(on_exit, [],
                                [AC_MSG_ERROR([neither atexit() nor on_exit() found])])])
 
+case $host_os in bsdi*)
+ac_cv_func_fseeko=yes
+esac
 AC_FUNC_FSEEKO
 
 
diff --git a/src/port/fseeko.c b/src/port/fseeko.c
new file mode 100644 (file)
index 0000000..22aa80c
--- /dev/null
@@ -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