/*
* 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