Annotation of 43BSD/contrib/nntp/rrn/artio.c, revision 1.1

1.1     ! root        1: /* $Header: artio.c,v 4.3 85/05/01 11:35:39 lwall Exp $
        !             2:  *
        !             3:  * $Log:       artio.c,v $
        !             4:  * Revision 4.3  85/05/01  11:35:39  lwall
        !             5:  * Baseline for release with 4.3bsd.
        !             6:  * 
        !             7:  */
        !             8: 
        !             9: #include "EXTERN.h"
        !            10: #include "common.h"
        !            11: #include "server.h"
        !            12: #include "INTERN.h"
        !            13: #include "artio.h"
        !            14: 
        !            15: void
        !            16: artio_init()
        !            17: {
        !            18:     ;
        !            19: }
        !            20: 
        !            21: /* open an article, unless it's already open */
        !            22: 
        !            23: FILE *
        !            24: artopen(artnum)
        !            25: ART_NUM artnum;
        !            26: {
        !            27: #ifdef SERVER
        !            28:     static long our_pid;
        !            29:     char ser_line[256];
        !            30: #endif
        !            31:     char artname[32];                  /* filename of current article */
        !            32: 
        !            33: #ifdef SERVER
        !            34:     if (our_pid == 0)
        !            35:        our_pid = getpid();
        !            36: #endif
        !            37: 
        !            38:     if (artnum < 1)
        !            39:        return Nullfp;
        !            40:     if (openart == artnum) {           /* this article is already open? */
        !            41:        fseek(artfp,0L,0);              /* just get to the beginning */
        !            42:        return artfp;                   /* and say we succeeded */
        !            43:     }
        !            44:     if (artfp != Nullfp) {             /* it was somebody else? */
        !            45:        fclose(artfp);                  /* put them out of their misery */
        !            46: #ifdef SERVER
        !            47:        sprintf(artname, "/tmp/rrn%ld.%ld", (long) openart, our_pid);
        !            48:        UNLINK(artname);
        !            49: #endif
        !            50:        openart = 0;                    /* and remember them no more */
        !            51:     }
        !            52: 
        !            53: #ifdef SERVER
        !            54:     sprintf(artname,"/tmp/rrn%ld.%ld", (long) artnum, our_pid);
        !            55:     artfp = fopen(artname, "w+");      /* create the temporary article */
        !            56:     if (artfp == Nullfp) {
        !            57:        UNLINK(artname);
        !            58:        return Nullfp;
        !            59:     }
        !            60:     sprintf(ser_line, "ARTICLE %d", (long)artnum);
        !            61:     put_server(ser_line);              /* ask the server for the article */
        !            62:     if (get_server(ser_line, sizeof(ser_line)) < 0) {
        !            63:        fprintf(stderr, "rrn: Unexpected close of server socket.\n");
        !            64:        finalize(1);
        !            65:     }
        !            66:     if (*ser_line != CHAR_OK) {                /* and get it's reaction */
        !            67:        UNLINK(artname);
        !            68:         return Nullfp;
        !            69:     }
        !            70: 
        !            71:     for (;;) {
        !            72:         if (get_server(ser_line, sizeof(ser_line)) < 0) {
        !            73:            fprintf(stderr, "rrn: Unexpected close of server socket.\n");
        !            74:            finalize(1);
        !            75:        }
        !            76:        if (ser_line[0] == '.' && ser_line[1] == '\0')
        !            77:                break;
        !            78:        fputs((ser_line[0] == '.' ? ser_line + 1 : ser_line), artfp);
        !            79:        putc('\n', artfp);
        !            80:     }
        !            81: 
        !            82:     fseek(artfp, 0L, 0);               /* Then get back to the start */
        !            83:     openart = artnum;
        !            84: #else  /* not SERVER */
        !            85:     sprintf(artname,"%ld",(long)artnum);
        !            86:                                        /* produce the name of the article */
        !            87:     if (artfp = fopen(artname,"r"))    /* if we can open it */
        !            88:        openart = artnum;               /* remember what we did here */
        !            89: #endif /* SERVER */
        !            90: #ifdef LINKART
        !            91:     {
        !            92:        char tmpbuf[256];
        !            93:        char *s;
        !            94: 
        !            95:        if (fstat(artfp->_file,&filestat))
        !            96:            return artfp;
        !            97:        if (filestat.st_size < (sizeof tmpbuf)) {
        !            98:            fgets(tmpbuf,(sizeof tmpbuf),artfp);
        !            99:            if (*tmpbuf == '/') {       /* is a "link" to another article */
        !           100:                fclose(artfp);
        !           101:                if (s=index(tmpbuf,'\n'))
        !           102:                    *s = '\0';
        !           103:                if (!(artfp = fopen(tmpbuf,"r")))
        !           104:                    openart = 0;
        !           105:                else {
        !           106:                    if (*linkartname)
        !           107:                        free(linkartname);
        !           108:                    linkartname = savestr(tmpbuf);
        !           109:                }
        !           110:            }
        !           111:            else
        !           112:                fseek(artfp,0L,0);              /* get back to the beginning */
        !           113:        }
        !           114:     }
        !           115: #endif
        !           116:     return artfp;                      /* and return either fp or NULL */
        !           117: }
        !           118: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.