diff options
author | faust3 <faust3@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-03-26 15:21:44 +0000 |
---|---|---|
committer | faust3 <faust3@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2004-03-26 15:21:44 +0000 |
commit | dc5c9fc570112125012eead3a6b1f025ad9c522d (patch) | |
tree | 822d40b5c52a89e3c3d91fe214ffe79ef5310282 /osdep | |
parent | ddfdfafaf6da97e88c76d8b956f80351621c2c3f (diff) |
fseeko emulation patch by Steven M. Schultz <sms at 2bsd.com>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12072 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/Makefile | 2 | ||||
-rw-r--r-- | osdep/fseeko.c | 84 |
2 files changed, 85 insertions, 1 deletions
diff --git a/osdep/Makefile b/osdep/Makefile index cc3ea85487..6460c0f7d1 100644 --- a/osdep/Makefile +++ b/osdep/Makefile @@ -3,7 +3,7 @@ include ../config.mak LIBNAME = libosdep.a -SRCS= shmem.c strsep.c vsscanf.c scandir.c gettimeofday.c # timer.c +SRCS= shmem.c strsep.c vsscanf.c scandir.c gettimeofday.c fseeko.c # timer.c ifeq ($(TARGET_ARCH_X86),yes) ifeq ($(TARGET_OS),Linux) diff --git a/osdep/fseeko.c b/osdep/fseeko.c new file mode 100644 index 0000000000..14f601575a --- /dev/null +++ b/osdep/fseeko.c @@ -0,0 +1,84 @@ +/* + * fseeko.c + * 64-bit versions of fseeko/ftello() for systems which do not have them + */ + +#include "../config.h" + +#if !defined(HAVE_FSEEKO) || !defined(HAVE_FTELLO) +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> +#endif + +#ifdef WIN32 +#define flockfile +#define funlockfile +#endif + +/* + * On BSD/OS and NetBSD (and perhaps others), 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. + * + * This is thread-safe on BSD/OS using flockfile/funlockfile. + */ + +#ifndef HAVE_FSEEKO +int +fseeko(FILE *stream, off_t offset, int whence) +{ + off_t floc; + struct stat filestat; + + switch (whence) + { + case SEEK_CUR: + flockfile(stream); + if (fgetpos(stream, &floc) != 0) + goto failure; + floc += offset; + if (fsetpos(stream, &floc) != 0) + goto failure; + funlockfile(stream); + return 0; + break; + case SEEK_SET: + if (fsetpos(stream, &offset) != 0) + return -1; + return 0; + break; + case SEEK_END: + flockfile(stream); + if (fstat(fileno(stream), &filestat) != 0) + goto failure; + floc = filestat.st_size; + if (fsetpos(stream, &floc) != 0) + goto failure; + funlockfile(stream); + return 0; + break; + default: + errno = EINVAL; + return -1; + } + +failure: + funlockfile(stream); + return -1; +} +#endif + + +#ifndef HAVE_FTELLO +off_t +ftello(FILE *stream) +{ + off_t floc; + + if (fgetpos(stream, &floc) != 0) + return -1; + return floc; +} +#endif |