/* * 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 #include #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; }