#include "lib_acl.h"
#include <stdio.h>
#include <stdlib.h>

static void init(void)
{
	acl_lib_init();
	acl_msg_stdout_enable(1);
}

static void end(void)
{
	acl_lib_end();
}

static void thread_run(void *arg)
{
	ACL_VSTREAM *client = (ACL_VSTREAM*) arg;
	char  buf[8192];
	int   ret;

	while (1) {
		ret = acl_vstream_read(client, buf, sizeof(buf));
		if (ret == ACL_VSTREAM_EOF) {
			break;
		}

		buf[ret] = 0;
		if (acl_vstream_write(client, buf, ret) <= 0) {
			break;
		}
	}

	printf("Close peer client fd=%d\r\n", ACL_VSTREAM_SOCK(client));
	acl_vstream_close(client);
}
	
static void run(const char *addr)
{
	unsigned flag = ACL_INET_FLAG_REUSEPORT;
	int bufsize = 4096, timeout = 10;
	ACL_VSTREAM *sstream = acl_vstream_listen_ex(addr, 128,
			flag, bufsize, timeout);
	acl_pthread_pool_t *pool;

	if (sstream == NULL) {
		acl_msg_error("listen %s error(%s)", addr, acl_last_serror());
		return;
	}

	printf("listening on %s ...\n", addr);
	pool = acl_thread_pool_create(100, 120);
	while (1) {
		ACL_VSTREAM *client = acl_vstream_accept(sstream, NULL, 0);
		if (client == NULL) {
			acl_msg_error("accept error(%s)", acl_last_serror());
			break;
		}
		printf("accept one client fd=%d\r\n", ACL_VSTREAM_SOCK(client));
		acl_pthread_pool_add(pool, thread_run, client);
	}

	acl_vstream_close(sstream);
}

int main(int argc, char *argv[])
{
	const char *addr = "0:8809";

	if (argc >= 2)
		addr = argv[1];
	init();
	run(addr);
	end();
	return (0);
}
