/*
 * Copyright (c) 2002, 2004, 2005 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-filecat.c,v 1.11 2006/07/16 02:07:39 ca Exp $")
#include "sm/error.h"
#include "sm/io.h"
#include "sm/test.h"
#include <stdio.h>

#define SM_BUFSIZE	8192

static void
prterr(char *msg, sm_ret_T res)
{
	if (res != SM_IO_EOF)
	{
		fprintf(stderr, "%s: res=%x, type=%d, value=%d\n", msg,
			res, sm_error_type(res), sm_error_value(res));
#if HAVE_STRERROR
		fprintf(stderr, "%s: %s\n", msg, strerror(sm_error_value(res)));
#endif /* HAVE_STRERROR */
	}
	else
		fprintf(stderr, "%s: EOF\n", msg);
}

static void
filecopy(sm_file_T *inf, sm_file_T *outf)
{
	size_t l;
	ssize_t rr, rw;
	sm_ret_T res;
	uchar buf[SM_BUFSIZE];

	for (;;)
	{
		l = sizeof(buf);
		res = sm_io_read(inf, buf, l, &rr);
		if (sm_is_err(res))
		{
			prterr("read", res);
			return;
		}
		SM_TEST((size_t) rr == l);
		l = rr;
		res = sm_io_write(outf, buf, rr, &rw);
		if (sm_is_err(res))
		{
			prterr("write", res);
			return;
		}
		SM_TEST((size_t) rw == l);
	}
}

int
main(int argc, char *argv[])
{
	sm_ret_T res;
	int timeout;

	timeout = 1;
	sm_test_begin(argc, argv, "test file read/write");
	res = sm_io_setinfo(smioin, SM_IO_WHAT_TIMEOUT, &timeout);
	SM_TEST(sm_is_success(res));
	res = sm_fp_nonblock(smioin, true);
	SM_TEST(sm_is_success(res));
	res = sm_fp_nonblock(smioout, true);
	SM_TEST(sm_is_success(res));
	res = sm_io_setinfo(smioout, SM_IO_WHAT_TIMEOUT, &timeout);
	SM_TEST(sm_is_success(res));
	filecopy(smioin, smioout);
	res = sm_io_flush(smioout);
	SM_TEST(sm_is_success(res));
	res = sm_io_close(smioout, SM_IO_CF_NONE);
	SM_TEST(sm_is_success(res));
	res = sm_io_close(smioin, SM_IO_CF_NONE);
	SM_TEST(sm_is_success(res));
	return sm_test_end();
}


syntax highlighted by Code2HTML, v. 0.9.1