On Tue, Jul 24, 2007 at 01:44:31PM -0600, Eric Blake wrote:
> If gnulib's approach does not work on DragonFly, you are welcome to patch
> either DragonFly to comply with POSIX, or submit a patch to gnulib so that
> gnulib's approach will work on DragonFly.

Attached is a replacement version of fflush that is the least intrusive
version I can think of. No further replacements for ftello/fseeko are
needed. It should work with all BSD derived stdio implementations,
directly tested are NetBSD and DragonFly.

Joerg
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int
rpl_fflush(FILE *fp)
{
#if defined(__DragonFly__)
        struct __FILE_public *fp_ = (struct __FILE_public *)fp;
#else
#define fp_ fp
#endif
        off_t pos;

        /* NULL pointer or writeable stream: use normal fflush. */
        if (fp == NULL || (fp_->_flags & (__SWR | __SRW)) != 0)
                return fflush(fp);

        /* Get current position, possibly different from file pointer. */
        pos = ftello(fp);
        if (pos == -1) {
                errno = EBADF;
                return -1;
        }
        /* Purge buffers. */
        if (fpurge(fp) == EOF)
                return -1;

        /*
         * Disable seek optimisation.  This is forces the following
         * fseeko to seek the actual position and not realign
         * the file pointer on a block boundary.
         */
        fp_->_flags |= __SNPT;

        return fseeko(fp, pos, SEEK_SET);
}

Reply via email to