/*****************************************************************************
 *
 * File ..................: mbcico/sendbark.c
 * Purpose ...............: Fidonet mailer 
 * Last modification date : 21-Jul-1999
 *
 *****************************************************************************
 * Copyright (C) 1997-1999
 *   
 * Michiel Broek		FIDO:		2:2801/16
 * Beekmansbos 10		Internet:	mbroek@ux123.pttnwb.nl
 * 1971 BV IJmuiden
 * the Netherlands
 *
 * This file is part of MBSE BBS.
 *
 * This BBS is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * MBSE BBS is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with MBSE BBS; see the file COPYING.  If not, write to the Free
 * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *****************************************************************************/

#include "../include/libs.h"
#include "../include/structs.h"
#include "../common/common.h"
#include "ttyio.h"
#include "session.h"
#include "statetbl.h"
#include "sendbark.h"
#include "xmrecv.h"



static int send_bark(void);
static char *nm,*pw,*dt;


int sendbark(void)
{
	char	*fn;
	FILE	*fp;
	char	buf[256], *p;
	int	rc = 0;

	fn = reqname(remote->addr);
	if ((fp = fopen(fn,"r")) == NULL) {
		Syslog('s', "no request file for this node");
		PUTCHAR(ETB);
		return 0;
	}

	while (fgets(buf,sizeof(buf)-1,fp)) {
		nm = buf;
		pw = strchr(buf, '!');
		dt = strchr(buf, '+');

		if (pw) 
			*pw++= '\0';
		if (dt) 
			*dt++= '\0';

		if (nm) {
			while (isspace(*nm)) 
				nm++;
			for (p = nm; (*p != '!') && (*p != '+') && (!isspace(*p)); p++);
			*p = '\0';
		}

		if (pw) {
			while (isspace(*pw)) 
				pw++;
			for (p = pw; (*p != '!') && (*p != '+') && (!isspace(*p)); p++);
			*p = '\0';
		} else
			pw = (char *)"";

		if (dt) {
			while (isspace(*nm)) 
				nm++;
			for (p = nm; (*p != '!') && (*p != '+') && (*p != '-') && (!isspace(*p)); p++);
			*p = '\0';
		} else
			dt = (char *)"0";

		if (*nm == ';') 
			continue;

		Syslog('+', "sending bark request for \"%s\", password \"%s\", update \"%s\"",
			S(nm),S(pw),S(dt));
		if ((rc = send_bark())) 
			break;
	}
	if (rc == 0) 
		PUTCHAR(ETB);
	fclose(fp);
	if (rc == 0) 
		unlink(fn);

	return rc;
}



SM_DECL(send_bark,(char *)"sendbark")
SM_STATES
	Send,
	waitack,
	getfile
SM_NAMES
	(char *)"send",
	(char *)"waitack",
	(char *)"getfile"
SM_EDECL

	int		c;
	char		buf[256];
	unsigned short	crc;
	int		count = 0;

	sprintf(buf,"%s %s %s",nm,dt,pw);
	crc = crc16xmodem(buf, strlen(buf));
	Syslog('s', "sending bark packet \"%s\", crc = 0x%04x", buf, crc);

SM_START(Send)

SM_STATE(Send)

	if (count++ > 6) {
		Syslog('+', "Bark request failed");
		SM_ERROR;
	}

	PUTCHAR(ACK);
	PUT(buf, strlen(buf));
	PUTCHAR(ETX);
	PUTCHAR(crc & 0xff);
	PUTCHAR((crc >> 8) & 0xff);
	if (STATUS) {
		SM_ERROR;
	} else {
		SM_PROCEED(waitack);
	}

SM_STATE(waitack)

	c=GETCHAR(15);
	if (c == TIMEOUT) {
		Syslog('s', "sendbark got timeout waiting for ACK");
		SM_PROCEED(Send);
	} else if (c < 0) {
		SM_PROCEED(Send);
	} else if (c == ACK) {
		SM_PROCEED(getfile);
	} else if (c == NAK) {
		SM_PROCEED(Send);
	} else {
		Syslog('s', "sendbark got %s waiting for ACK", printablec(c));
		SM_PROCEED(Send);
	}

SM_STATE(getfile)

	switch (xmrecv(NULL)) {
		case 0:		SM_PROCEED(getfile); 
				break;
		case 1:		SM_SUCCESS; 
				break;
		default:	SM_ERROR; 
				break;
	}

SM_END
SM_RETURN


