Mercurial > mplayer.hg
view osdep/fseeko.c @ 22096:076ff9697bc7
r21959: Apply ancient double-click patch that nobody cares to comment on.
r21989: fix typo
r22008: Address age-old FIXMEs about tdfx_vid, tdfxfb and 3dfx vo drivers.
r22014: Clarify -delay.
r22016: Remove confusing line about forcing MP3 demuxing.
r22060: describe -psprobe
r22061: typo, new sentences on lines of their own
r22113: insert line break for readability
author | kraymer |
---|---|
date | Sat, 03 Feb 2007 18:51:30 +0000 |
parents | e268886eb13d |
children |
line wrap: on
line source
/* * fseeko.c * 64-bit versions of fseeko/ftello() for systems which do not have them */ #include "config.h" #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #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. */ int fseeko(FILE *stream, off_t offset, int whence) { fpos_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; }