/* * Copyright (c) 2002, 2004 Sendmail, Inc. and its suppliers. * All rights reserved. * * By using this file, you agree to the terms and conditions set * forth in the LICENSE file which can be found at the top level of * the sendmail distribution. */ #include "sm/generic.h" SM_IDSTR(id, "@(#)$Id: t-bf-0.c,v 1.8 2006/07/16 02:07:39 ca Exp $") #include "sm/io.h" #include "sm/bf.h" #include "sm/stat.h" #include "sm/test.h" #include /* ** Test buffered file I/O */ #define BFBSIZ 8192 #define FN "bf1" int main(int argc, char *argv[]) { sm_ret_T res; size_t l; ssize_t n; sm_file_T *fp; int r, m; char *str = "foo\n"; uchar buf[1024]; uchar in[16]; struct stat sb; sm_test_begin(argc, argv, "test bf I/O"); (void) unlink(FN); res = sm_io_open(&SmBfIO, FN, SM_IO_RDWR, &fp, SM_IO_WHAT_FMODE, 0644, SM_IO_WHAT_BF_BUFSIZE, (size_t) BFBSIZ, SM_IO_WHAT_END); SM_TEST(SM_SUCCESS == res); SM_TEST(fp != NULL); l = 0; if (SM_SUCCESS == res) { res = sm_io_write(fp, (uchar *) str, (size_t)4, &n); SM_TEST(SM_SUCCESS == res); SM_TEST(4 == n); l += n; for (r = 0; r < sizeof(buf); r++) buf[r] = ' ' + (r % 96); do { r = stat(FN, &sb); if (l < BFBSIZ) { SM_TEST(r < 0); SM_TEST(ENOENT == errno); } res = sm_io_write(fp, buf, sizeof(buf), &n); SM_TEST(SM_SUCCESS == res); SM_TEST(sizeof(buf) == n); l += n; } while (l <= 2 * BFBSIZ + sizeof(buf)); r = stat(FN, &sb); SM_TEST(0 == r); res = sm_io_setinfo(fp, SM_IO_WHAT_BF_COMMIT, NULL); SM_TEST(SM_SUCCESS == res); res = sm_io_close(fp, SM_IO_CF_NONE); SM_TEST(SM_SUCCESS == res); res = sm_io_open(SmStStdio, FN, SM_IO_RDONLY, &fp, SM_IO_WHAT_END); SM_TEST(SM_SUCCESS == res); SM_TEST(fp != NULL); if (SM_SUCCESS == res) { r = sm_io_getinfo(fp, SM_IO_IS_READABLE, &m); SM_TEST(r > 0); res = sm_io_read(fp, in, (size_t)4, &n); SM_TEST(SM_SUCCESS == res); SM_TEST(4 == n); SM_TEST(strncmp(str, (char *) in, 4) == 0); r = sm_io_getinfo(fp, SM_IO_WHAT_MODE, &m); SM_TEST(0 == r); SM_TEST(SM_IO_RDONLY == m); res = sm_io_close(fp, SM_IO_CF_NONE); SM_TEST(SM_SUCCESS == res); } SM_TEST(0 == unlink(FN)); } return sm_test_end(); }