home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 35 Internet
/
35-Internet.zip
/
trn_12.zip
/
src
/
artio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-12-04
|
6KB
|
204 lines
/* $Id: artio.c,v 4.4.3.1 1992/02/01 03:09:32 sob PATCH_3 sob $
*
* $Log: artio.c,v $
* Revision 4.4.3.1 1992/02/01 03:09:32 sob
* Release 4.4 Patchlevel 3
*
* Revision 4.4 1991/09/09 20:18:23 sob
* release 4.4
*
*
*
*/
/* 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"
#ifdef SERVER
#include "server.h"
#endif
#include "INTERN.h"
#include "artio.h"
void
artio_init()
{
;
}
/* open an article, unless it's already open */
FILE *
artopen(artnum)
ART_NUM artnum;
{
#ifdef SERVER
return nntpopen(artnum,GET_ARTICLE);
#else
char artname[MAXFILENAME]; /* filename of current article */
if (artnum < 1)
return Nullfp;
if (openart == artnum) { /* this article is already open? */
/*** OS2: If the article is already open, we close it,
because it was perhaps opened in text mode, but
we want binarymode ***/
/* fseek(artfp,0L,0); /* just get to the beginning */
/* return artfp; /* and say we succeeded */
fclose(artfp);
artfp = NULL;
openart = 0;
}
if (artfp != Nullfp) { /* it was somebody else? */
fclose(artfp); /* put them out of their misery */
openart = 0; /* and remember them no more */
}
sprintf(artname,"%ld",(long)artnum);
/* produce the name of the article */
if (artfp = fos2open(artname,"r")) /* if we can open it */
openart = artnum; /* remember what we did here */
#ifdef LINKART
{
char tmpbuf[256];
char *s;
if (fstat(fileno(artfp),&filestat))
return artfp;
if (filestat.st_size < (sizeof tmpbuf)) {
fgets(tmpbuf,(sizeof tmpbuf),artfp);
/*** OS2: it is not so easy to determine if the filename
is fully qualified under OS/2 than under Unix ***/
if ((*tmpbuf == '/') ||
(*(tmpbuf+2) == '/') ||
(*tmpbuf == '\\') ||
(*(tmpbuf+2) == '\\')) { /* is a "link" to another article */
fclose(artfp);
if (s=index(tmpbuf,'\n'))
*s = '\0';
if (!(artfp = fos2open(tmpbuf,"r")))
openart = 0;
else {
if (*linkartname)
free(linkartname);
linkartname = savestr(tmpbuf);
}
}
else
fseek(artfp,0L,0); /* get back to the beginning */
}
}
#endif
return artfp; /* and return either fp or NULL */
#endif /* SERVER */
}
#ifdef SERVER
static long our_pid=0;
FILE *
nntpopen(artnum,function)
ART_NUM artnum;
ART_PART function;
{
char artname[MAXFILENAME]; /* filename of current article */
char intrpwork[MAXFILENAME]; /* filename of current article */
if (our_pid == 0)
our_pid = getpid();
if (artnum < 1)
return Nullfp;
if ((openart == artnum) && (openpart >= function))
{ /* 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 */
nntpclose();
openart = 0; /* and remember them no more */
}
interp(intrpwork,MAXFILENAME-1,"%P");
sprintf(artname,"%s/rrn%ld.%ld", intrpwork,(long) artnum, our_pid);
artfp = fos2open(artname, "w+"); /* create the temporary article */
if (artfp == Nullfp) {
UNLINK(artname);
return Nullfp;
}
switch (function){
case GET_STATUS:
function = GET_HEADER; /* fall through */
case GET_HEADER:
sprintf(ser_line, "HEAD %ld", (long)artnum);
break;
case GET_ARTICLE:
sprintf(ser_line, "ARTICLE %ld", (long)artnum);
break;
}
#ifdef DEBUGGING
if (debug & DEB_NNTP)
printf(">%s\n", ser_line) ; FLUSH;
#endif
put_server(ser_line); /* ask the server for the article */
if (nntp_get(ser_line, sizeof(ser_line)) < 0) {
fprintf(stderr, "\nrrn: Unexpected close of server socket.\n");
finalize(1);
}
#ifdef DEBUGGING
if (debug & DEB_NNTP)
printf("<%s\n", ser_line) ; FLUSH;
#endif
if (*ser_line == CHAR_FATAL) { /* Fatal error */
fprintf(stderr,"\nrrn: %s\n",ser_line);
finalize(1);
}
if (*ser_line != CHAR_OK) { /* and get it's reaction */
fclose(artfp);
artfp = Nullfp;
UNLINK(artname);
errno = ENOENT; /* Simulate file-not-found */
return Nullfp;
}
for (;;) {
if (nntp_get(ser_line, sizeof(ser_line)) < 0) {
fprintf(stderr, "\nrrn: Unexpected close of server socket.\n");
finalize(1);
}
if (ser_line[0] == '.' && ser_line[1] == '\0')
break;
fputs((ser_line[0] == '.' ? ser_line + 1 : ser_line), artfp);
putc('\n', artfp);
}
openpart = function;
if (function == GET_HEADER)
putc('\n', artfp); /* req'd blank line after header */
fseek(artfp, 0L, 0); /* Then get back to the start */
openart = artnum;
return artfp; /* and return either fp or NULL */
}
void
nntpclose()
{
char artname[MAXFILENAME]; /* filename of current article */
char intrpwork[MAXFILENAME]; /* filename of current article */
if (our_pid == 0)
our_pid = getpid();
interp(intrpwork,MAXFILENAME-1,"%P");
sprintf(artname, "%s/rrn%ld.%ld", intrpwork,(long) openart, our_pid);
UNLINK(artname);
}
#endif