home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / trn / part13 / artio.c < prev    next >
C/C++ Source or Header  |  1991-08-22  |  5KB  |  188 lines

  1. /* $Header: artio.c,v 4.3.3.3 91/01/16 02:20:48 davison Trn $
  2.  *
  3.  * $Log:    artio.c,v $
  4.  * Revision 4.3.3.3  91/01/16  02:20:48  davison
  5.  * Integrated rn patches 48-54.
  6.  * 
  7.  * Revision 4.3.3.2  90/08/20  16:25:50  davison
  8.  * Fixed bug in artopen ==> nntpopen interaction.
  9.  * 
  10.  * Revision 4.3.3.1  90/07/21  20:11:03  davison
  11.  * Initial Trn Release
  12.  * 
  13.  * Revision 4.3.2.6  90/11/22  16:06:57  sob
  14.  * Changes to make pickly C preprocessors happier.
  15.  * 
  16.  * Revision 4.3.2.5  90/03/22  23:04:04  sob
  17.  * Fixes provided by Wayne Davison <drivax!davison>
  18.  * 
  19.  * Revision 4.3.2.4  89/11/27  01:29:57  sob
  20.  * Altered NNTP code per ideas suggested by Bela Lubkin
  21.  * <filbo@gorn.santa-cruz.ca.us>
  22.  * 
  23.  * Revision 4.3.2.3  89/11/26  22:55:31  sob
  24.  * Add nntpopen() and nntpclose() routines to cut down on size of rrn
  25.  * 
  26.  * Revision 4.3.2.2  89/11/08  01:17:12  sob
  27.  * Added changes to insure that this will compile for RN or RRN with no
  28.  * changes to the source code.
  29.  * 
  30.  * Revision 4.3.2.1  89/11/06  00:07:25  sob
  31.  * Added RRN support from NNTP 1.5
  32.  * 
  33.  * Revision 4.3  85/05/01  11:35:39  lwall
  34.  * Baseline for release with 4.3bsd.
  35.  * 
  36.  */
  37.  
  38. #include "EXTERN.h"
  39. #include "common.h"
  40. #ifdef SERVER
  41. #include "server.h"
  42. #endif
  43. #include "INTERN.h"
  44. #include "artio.h"
  45.  
  46. void
  47. artio_init()
  48. {
  49.     ;
  50. }
  51.  
  52. /* open an article, unless it's already open */
  53.  
  54. FILE *
  55. artopen(artnum)
  56. ART_NUM artnum;
  57. {
  58. #ifdef SERVER
  59.     return nntpopen(artnum,GET_ARTICLE);
  60. #else
  61.     char artname[32];            /* filename of current article */
  62.  
  63.     if (artnum < 1)
  64.     return Nullfp;
  65.     if (openart == artnum) {        /* this article is already open? */
  66.     fseek(artfp,0L,0);        /* just get to the beginning */
  67.     return artfp;            /* and say we succeeded */
  68.     }
  69.     if (artfp != Nullfp) {        /* it was somebody else? */
  70.     fclose(artfp);            /* put them out of their misery */
  71.     openart = 0;            /* and remember them no more */
  72.     }
  73.     sprintf(artname,"%ld",(long)artnum);
  74.                     /* produce the name of the article */
  75.     if (artfp = fopen(artname,"r"))    /* if we can open it */
  76.     openart = artnum;        /* remember what we did here */
  77. #ifdef LINKART
  78.     {
  79.     char tmpbuf[256];
  80.     char *s;
  81.  
  82.     if (fstat(fileno(artfp),&filestat))
  83.         return artfp;
  84.     if (filestat.st_size < (sizeof tmpbuf)) {
  85.         fgets(tmpbuf,(sizeof tmpbuf),artfp);
  86.         if (*tmpbuf == '/') {    /* is a "link" to another article */
  87.         fclose(artfp);
  88.         if (s=index(tmpbuf,'\n'))
  89.             *s = '\0';
  90.         if (!(artfp = fopen(tmpbuf,"r")))
  91.             openart = 0;
  92.         else {
  93.             if (*linkartname)
  94.             free(linkartname);
  95.             linkartname = savestr(tmpbuf);
  96.         }
  97.         }
  98.         else
  99.         fseek(artfp,0L,0);        /* get back to the beginning */
  100.     }
  101.     }
  102. #endif
  103.     return artfp;            /* and return either fp or NULL */
  104. #endif /* SERVER */
  105. }
  106.  
  107. #ifdef SERVER
  108. static long our_pid=0;
  109.  
  110. FILE *
  111. nntpopen(artnum,function)
  112. ART_NUM artnum;
  113. ART_PART function;
  114. {
  115.     char ser_line[256];
  116.     char artname[32];            /* filename of current article */
  117.     if (our_pid == 0)
  118.     our_pid = getpid();
  119.     if (artnum < 1)
  120.     return Nullfp;
  121.     if ((openart == artnum) && (openpart >= function))
  122.     {                    /* this article is already open? */
  123.     fseek(artfp,0L,0);        /* just get to the beginning */
  124.     return artfp;            /* and say we succeeded */
  125.     }
  126.     if (artfp != Nullfp) {        /* it was somebody else? */
  127.     fclose(artfp);            /* put them out of their misery */
  128.     nntpclose();
  129.     openart = 0;            /* and remember them no more */
  130.     }
  131.     sprintf(artname,"/tmp/rrn%ld.%ld", (long) artnum, our_pid);
  132.     artfp = fopen(artname, "w+");    /* create the temporary article */
  133.     if (artfp == Nullfp) {
  134.     UNLINK(artname);
  135.     return Nullfp;
  136.     }
  137.     switch (function){
  138.         case GET_STATUS:
  139.         function = GET_HEADER;    /* fall through */
  140.         case GET_HEADER:
  141.         sprintf(ser_line, "HEAD %ld", (long)artnum);
  142.         break;
  143.         case GET_ARTICLE:
  144.         sprintf(ser_line, "ARTICLE %ld", (long)artnum);
  145.         break;
  146.     }        
  147.     put_server(ser_line);        /* ask the server for the article */
  148.     if (get_server(ser_line, sizeof(ser_line)) < 0) {
  149.     fprintf(stderr, "rrn: Unexpected close of server socket.\n");
  150.     finalize(1);
  151.     }
  152.     if (*ser_line != CHAR_OK) {        /* and get it's reaction */
  153.     fclose(artfp);
  154.     artfp = Nullfp;
  155.     UNLINK(artname);
  156.      errno = ENOENT;        /* Simulate file-not-found */
  157.         return Nullfp;
  158.     }
  159.  
  160.     for (;;) {
  161.         if (get_server(ser_line, sizeof(ser_line)) < 0) {
  162.         fprintf(stderr, "rrn: Unexpected close of server socket.\n");
  163.         finalize(1);
  164.     }
  165.     if (ser_line[0] == '.' && ser_line[1] == '\0')
  166.         break;
  167.     fputs((ser_line[0] == '.' ? ser_line + 1 : ser_line), artfp);
  168.     putc('\n', artfp);
  169.     }
  170.     openpart = function;
  171.     if (function == GET_HEADER)
  172.      putc('\n', artfp); /* req'd blank line after header */
  173.     fseek(artfp, 0L, 0);        /* Then get back to the start */
  174.     openart = artnum;
  175.     return artfp;            /* and return either fp or NULL */
  176. }
  177.  
  178. void
  179. nntpclose()
  180. {
  181.     char artname[32];            /* filename of current article */
  182.     if (our_pid == 0)
  183.     our_pid = getpid();
  184.     sprintf(artname, "/tmp/rrn%ld.%ld", (long) openart, our_pid);
  185.     UNLINK(artname);
  186. }
  187. #endif
  188.