4.4BSD/usr/src/contrib/news/trn3/artio.c
/* $Id: artio.c,v 3.0 1992/02/01 03:09:32 davison Trn $
*/
/* This software is Copyright 1991 by Stan Barber.
*
* Permission is hereby granted to copy, reproduce, redistribute or otherwise
* use this software as long as: there is no monetary profit gained
* specifically from the use or reproduction of this software, it is not
* sold, rented, traded or otherwise marketed, and this copyright notice is
* included prominently in any copy made.
*
* The author make no claims as to the fitness or correctness of this software
* for any use whatsoever, and it is provided as is. Any use of this software
* is at the user's own risk.
*/
#include "EXTERN.h"
#include "common.h"
#include "cache.h"
#include "rthread.h"
#include "head.h"
#include "nntp.h"
#include "art.h"
#include "bits.h"
#include "final.h"
#include "INTERN.h"
#include "artio.h"
void
artio_init()
{
;
}
/* open an article, unless it's already open */
FILE *
artopen(artnum)
ART_NUM artnum;
{
#ifndef USE_NNTP
char artname[MAXFILENAME]; /* filename of current article */
#endif
ARTICLE *ap = find_article(artnum);
if (!ap || !artnum || (ap->flags & (AF_MISSING|AF_FAKE)) == AF_MISSING) {
errno = ENOENT;
return Nullfp;
}
if (openart == artnum) { /* this article is already open? */
fseek(artfp,0L,0); /* just get to the beginning */
return artfp; /* and say we succeeded */
}
if (artfp != Nullfp) { /* it was somebody else? */
fclose(artfp); /* put them out of their misery */
openart = 0; /* and remember them no more */
}
retry_open:
#ifdef USE_NNTP
artfp = nntp_body(artnum);
#else
sprintf(artname,"%ld",(long)artnum);
artfp = fopen(artname,"r");
#endif
if (!artfp) {
if (errno == ETIMEDOUT)
goto retry_open;
uncache_article(ap,FALSE);
} else {
#ifdef LINKART
char tmpbuf[256];
char *s;
if (!fstat(fileno(artfp),&filestat)
&& filestat.st_size < sizeof tmpbuf) {
fgets(tmpbuf,sizeof tmpbuf,artfp);
if (*tmpbuf == '/') { /* is a "link" to another article */
fclose(artfp);
if (s=index(tmpbuf,'\n'))
*s = '\0';
if (!(artfp = fopen(tmpbuf,"r"))) {
uncache_article(ap,FALSE);
} else {
if (*linkartname)
free(linkartname);
linkartname = savestr(tmpbuf);
}
} else
fseek(artfp,0L,0); /* get back to the beginning */
}
#endif
openart = artnum; /* remember what we did here */
}
return artfp; /* and return either fp or NULL */
}