반응형
stdio
#include <fcntl.h> #include <unistd.h> #include <stdio.h> #include "local.h" /* * Small standard I/O/seek/close functions. * These maintain the `known seek offset' for seek optimisation. */ int __sread(void *cookie, char *buf, int n) { FILE *fp = cookie; int ret; ret = read(fp->_file, buf, n); /* if the read succeeded, update the current offset */ if (ret >= 0) fp->_offset += ret; else fp->_flags &= ~__SOFF; /* paranoia */ return (ret); } int __swrite(void *cookie, const char *buf, int n) { FILE *fp = cookie; if (fp->_flags & __SAPP) (void) lseek(fp->_file, (off_t)0, SEEK_END); fp->_flags &= ~__SOFF; /* in case FAPPEND mode is set */ return (write(fp->_file, buf, n)); } fpos_t __sseek(void *cookie, fpos_t offset, int whence) { FILE *fp = cookie; off_t ret; ret = lseek(fp->_file, (off_t)offset, whence); if (ret == (off_t)-1) fp->_flags &= ~__SOFF; else { fp->_flags |= __SOFF; fp->_offset = ret; } return (ret); } int __sclose(void *cookie) { return (close(((FILE *)cookie)->_file)); }
반응형