#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <stdio.h> #define THE_COOKIE ((void *) 0xdeadbeeful) static int errors; static int cookieread_called; static ssize_t cookieread (void *cookie, char *buf, size_t count) { printf ("`%s' called with cookie %#lx\n", __FUNCTION__, (unsigned long int) cookie); if (cookie != THE_COOKIE) ++errors; cookieread_called = 1; return 42; } static int cookiewrite_called; static ssize_t cookiewrite (void *cookie, const char *buf, size_t count) { printf ("`%s' called with cookie %#lx\n", __FUNCTION__, (unsigned long int) cookie); if (cookie != THE_COOKIE) ++errors; cookiewrite_called = 1; return 43; } static int cookieseek_called; static int cookieseek (void *cookie, off64_t *offset, int whence) { printf ("`%s' called with cookie %#lx\n", __FUNCTION__, (unsigned long int) cookie); if (cookie != THE_COOKIE) ++errors; cookieseek_called = 1; return 44; } static int cookieclose_called; static int cookieclose (void *cookie) { printf ("`%s' called with cookie %#lx\n", __FUNCTION__, (unsigned long int) cookie); if (cookie != THE_COOKIE) ++errors; cookieclose_called = 1; return 45; } int main (void) { cookie_io_functions_t fcts; char buf[1]; FILE *f; fcts.read = cookieread; fcts.seek = cookieseek; fcts.close = cookieclose; fcts.write = cookiewrite; f = fopencookie (THE_COOKIE, "r+", fcts); fread (buf, 1, 1, f); fwrite (buf, 1, 1, f); fseek (f, 0, SEEK_CUR); fclose (f); if (cookieread_called == 0 || cookiewrite_called == 0 || cookieseek_called == 0 || cookieclose_called == 0) ++errors; return errors != 0; }