/*****************************************************************************
 *
 * $Id$
 * Purpose ...............: Ping Service
 *
 *****************************************************************************
 * Copyright (C) 1997-2002
 *   
 * Michiel Broek		FIDO:		2:280/2802
 * Beekmansbos 10
 * 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 "../lib/libs.h"
#include "../lib/structs.h"
#include "../lib/users.h"
#include "../lib/records.h"
#include "../lib/common.h"
#include "../lib/clcomm.h"
#include "../lib/msg.h"
#include "../lib/msgtext.h"
#include "../lib/dbcfg.h"
#include "../lib/dbnode.h"
#include "../lib/dbtic.h"
#include "../lib/dbdupe.h"
#include "../lib/dbuser.h"
#include "../lib/dbftn.h"
#include "sendmail.h"
#include "mgrutil.h"
#include "postnetmail.h"
#include "ping.h"



/*
 * External declarations
 */
extern	int	do_quiet;



/*
 * Global variables
 */
extern	int	net_in;			/* Netmails received		    */
extern	int	net_out;		/* Netmails forwarded		    */
extern	int	net_bad;		/* Bad netmails (tracking errors    */
extern	char	*msgid;			/* Original message id		    */



int Ping(faddr *f, faddr *t, FILE *fp, int intransit)
{
	int		rc = 0;
	char		*Buf;
	FILE		*np;
	time_t		Now;
	faddr		*from;

	Now = time(NULL);
	if (SearchFidonet(f->zone))
		f->domain = xstrcpy(fidonet.domain);

	Syslog('+', "%s ping msg from %s", intransit ? "Intransit":"Final", ascfnode(f, 0xff));
	Buf = calloc(2049, sizeof(char));
	rewind(fp);

	np = tmpfile();
        from = bestaka_s(f);
	if (intransit) {
		from->name = xstrcpy((char *)"Ping TRACE service");
	} else {
		from->zone  = t->zone;
		from->net   = t->net;
		from->node  = t->node;
		from->point = t->point;
        	from->name  = xstrcpy((char *)"Ping service");
	}

	if (f->point)
		fprintf(np, "\001TOPT %d\r", f->point);
	if (from->point)
		fprintf(np, "\001FMPT %d\r", from->point);
	fprintf(np, "\001INTL %d:%d/%d %d:%d/%d\r", f->zone, f->net, f->node, from->zone, from->net, from->node);

        /*
         * Add MSGID, REPLY and PID
         */
	fprintf(np, "\001MSGID: %s %08lx\r", ascfnode(from, 0x1f), sequencer());
	while ((fgets(Buf, 2048, fp)) != NULL) {
		Striplf(Buf);
		if (strncmp(Buf, "\001MSGID:", 7) == 0) {
			fprintf(np, "\001REPLY:%s\r", Buf+7);
		}
	}
	fprintf(np, "\001PID: MBSE-FIDO %s\r", VERSION);
	fprintf(np, "\001TZUTC: %s\r", gmtoffset(Now));

	fprintf(np, "     Dear %s\r\r", MBSE_SS(f->name));
	if (intransit) {
		fprintf(np, "You did send a PING to %s\r", ascfnode(t, 0x1f));
		fprintf(np, "This is a TRACE response from \"%s\" aka %s\r", CFG.bbs_name, ascfnode(from, 0x1f));
		fprintf(np, "The time of arrival is %s\r", rfcdate(Now));
	} else
		fprintf(np, "Your Ping arrived here at %s\r", rfcdate(Now));
	fprintf(np, "Here are all the detected Via lines of the message from you:\r\r");
	fprintf(np, "======================================================================\r");

	rewind(fp);
	while ((fgets(Buf, 2048, fp)) != NULL) {
		Striplf(Buf);
		if (strncmp(Buf, "\1Via", 4) == 0) {
			fprintf(np, "%s\r", Buf+1);
		}
	}
	fprintf(np, "======================================================================\r");

	fprintf(np, "\rWith regards, %s\r\r", CFG.sysop_name);
	fprintf(np, "%s\r", TearLine());
	Now = time(NULL) - (gmt_offset((time_t)0) * 60);
	rc = postnetmail(np, from, f, NULL, (char *)"Re: Ping", Now, 0x0000, FALSE);
	tidy_faddr(from);

	fclose(np);

	free(Buf);
	return rc;
}