#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "lutil.h"
#include "ttyio.h"
#include "session.h"
#include "statetbl.h"
#include "config.h"
#include "emsi.h"

extern int made_request;
extern int zmsndfiles(file_list*);
extern int zmrcvfiles(void);
extern file_list *respond_wazoo(char*);

extern int rxwazoo(void);
extern int rxwazoo(void)
{
	int rc=0;
	fa_list *eff_remote,tmpl;
	file_list *tosend=NULL,**tmpfl;

	debug(10,"start rxwazoo transfer");
	if (emsi_remote_lcodes & LCODE_NPU)
	{
		loginf("remote requested \"no pickup\", no send");
		eff_remote=NULL;
	}
	else if (emsi_remote_lcodes & LCODE_PUP)
	{
		loginf("remote requested \"pickup primary\"");
		tmpl.addr=remote->addr;
		tmpl.next=NULL;
		eff_remote=&tmpl;
	}
	else eff_remote=remote;
	tosend=create_filelist(eff_remote,ALL_MAIL,0);

	if ((rc=zmrcvfiles()) == 0)
	{
		if ((emsi_local_opts & OPT_NRQ) == 0)
		{
			for (tmpfl=&tosend;*tmpfl;tmpfl=&((*tmpfl)->next));
			*tmpfl=respond_wazoo(NULL);
		}

		if ((tosend != NULL) || ((emsi_remote_lcodes & LCODE_NPU) == 0))
			rc=zmsndfiles(tosend);

		if ((rc == 0) && (made_request))
		{
			loginf("freq was made, trying to receive files");
			rc=zmrcvfiles();
		}
	}

	tidy_filelist(tosend,(rc == 0));
	debug(10,"rxwazoo transfer rc=%d",rc);
	return rc;
}

extern int txwazoo(void);
extern int txwazoo(void)
{
	int rc=0;
	file_list *tosend=NULL,*respond=NULL;
	char *nonhold_mail;

	debug(10,"start txwazoo transfer");
	if (localoptions & NOHOLD) nonhold_mail=ALL_MAIL;
	else nonhold_mail=NONHOLD_MAIL;
	if (emsi_remote_lcodes & LCODE_HAT)
	{
		loginf("remote asked to \"hold all traffic\", no send");
		tosend=NULL;
	}
	else tosend=create_filelist(remote,nonhold_mail,0);

	if ((tosend != NULL) || ((emsi_remote_lcodes & LCODE_NPU) == 0))
		rc=zmsndfiles(tosend);
	if (rc == 0)
		if ((rc=zmrcvfiles()) == 0)
			if ((emsi_local_opts & OPT_NRQ) == 0)
				if ((respond=respond_wazoo(NULL)))
					rc=zmsndfiles(respond);

	tidy_filelist(tosend,(rc == 0));
	tidy_filelist(respond,0);
	debug(10,"end txwazoo transfer");
	return rc;
}
