/*
 * xover.c
 * 
 * $Id: xover.c,v 1.2 2002/06/06 14:21:06 conrads Exp $
 *
 * get xover for a range of articles, save in file
 */

#include <string.h>
#include <unistd.h>

#include "msuck.h"
#include "nntp.h"

extern CONNECTION remote;

FILE *xoverfile;
char xoverpath[PATH_MAX + 1];

/*
 * get overview for a range of articles
 * 
 * returns number of overview records fetched or -1 on error
 * 
 * overview data left in /tmp/xover.GROUPNAME (file deleted if empty or error)
 * 
 * assumes remote connection is already open
 */

int
do_xover(const char *group, ARTNUM lo, ARTNUM hi)
{
	char buf[MAXXOVER + 1];
	int i;

	/* open the xover file we're writing to */
	snprintf(xoverpath, PATH_MAX, XOVER_PATH_TEMPLATE, group);

	if ((xoverfile = fopen(xoverpath, "w")) == NULL)
	{
		perror(xoverpath);
		quit_server(remote);
		return -1;
	}

	fprintf(remote.out, "xover %lu-%lu\r\n", lo, hi);
	if (fgets(buf, MAXXOVER, remote.in) == NULL)
	{
		perror("xover(): read error on socket after XOVER command");
		fclose(xoverfile);
		unlink(xoverpath);
		close_server(remote);
		return -1;
	}
	/* should have gotten "224" overview reply */
	if (strncmp(buf, NNTP_OVERVIEW_FOLLOWS, 3) != 0)
	{
		fprintf(stderr, "xover(): unexpected reply in %s to XOVER %lu-%lu: %s\n",
			group, lo, hi, buf);
		fclose(xoverfile);
		unlink(xoverpath);
		quit_server(remote);
		return -1;
	}

	/* just read and write everything up to the terminating "." */
	for (i = 0;; ++i)
	{
		if (fgets(buf, MAXXOVER, remote.in) == NULL)
		{
			perror("xover(): read error on socket while fetching overview data");
			fclose(xoverfile);
			unlink(xoverpath);
			quit_server(remote);
			return -1;
		}
		if (END_OF_OUTPUT(buf))
			break;
		if (fputs(buf, xoverfile) != 0)
		{
			perror("xover(): write error on xover file");
			fclose(xoverfile);
			unlink(xoverpath);
			quit_server(remote);
			return -1;
		}
	}

	fclose(xoverfile);

	if (i == 0)
		unlink(xoverpath);
	quit_server(remote);
	return i;
}


syntax highlighted by Code2HTML, v. 0.9.1