4.4BSD/usr/src/contrib/news/trn3/artio.c

Compare this file to the similar file:
Show the results in this format:

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