Annotation of 43BSDTahoe/new/news/src/nntp.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * This software is Copyright 1987 by Stan Barber. 
        !             3:  *
        !             4:  * Permission is hereby granted to copy, reproduce, redistribute or otherwise
        !             5:  * use this software as long as: there is no monetary profit gained
        !             6:  * specifically from the use or reproduction or this software, it is not
        !             7:  * sold, rented, traded or otherwise marketed, and this copyright notice is
        !             8:  * included prominently in any copy made. 
        !             9:  *
        !            10:  * The author make no claims as to the fitness or correctness of this software
        !            11:  * for any use whatsoever, and it is provided as is. Any use of this software
        !            12:  * is at the user's own risk. 
        !            13:  *
        !            14:  * this is a file full of functions used by the various news client programs 
        !            15:  */
        !            16: #ifdef SCCSID
        !            17: static char *SccsId = "@(#)nntp.c      2.2     10/15/87";
        !            18: #endif /* SCCSID */
        !            19: 
        !            20: #include "params.h"
        !            21: 
        !            22: static char *nntpserver;
        !            23: static char ser_line[256];
        !            24: static char active_file_name[512];
        !            25: static char article_file_name[512];
        !            26: static char last_group[256];
        !            27: /*
        !            28:  * open_server open a connection to the server 
        !            29:  */
        !            30: open_server()
        !            31: {
        !            32:        int response;
        !            33: 
        !            34:        /* open connection to nntpserver if appropriate */
        !            35: 
        !            36:        nntpserver = getserverbyfile(SERVER_FILE);
        !            37:        if (nntpserver == NULL) {
        !            38:                fprintf(stderr, "Can't get the name of the news server from %s\n",
        !            39:                        SERVER_FILE);
        !            40:                fprintf(stderr, "Either fix this file, or put NNTPSERVER in your environment.");
        !            41:                return -1;
        !            42:        }
        !            43:        response = server_init(nntpserver);
        !            44:        if (response < 0) {
        !            45:                fprintf(stderr, "Couldn't connect to %s news server, try again later.\n",
        !            46:                        nntpserver);
        !            47:                return -1;
        !            48:        }
        !            49:        if (handle_server_response(response, nntpserver) < 0) {
        !            50:                fprintf(stderr, "Cannot handle response from nntpserver.\n");
        !            51:                return -1;
        !            52:        }
        !            53:        return 0;
        !            54: }
        !            55: 
        !            56: /*
        !            57:  * open_active gets the active file and returns an open file descriptor to
        !            58:  * the calling program 
        !            59:  */
        !            60: 
        !            61: FILE *
        !            62: open_active()
        !            63: {
        !            64:        FILE *openfp;
        !            65:        bzero(active_file_name, sizeof(active_file_name));
        !            66:        put_server("LIST");     /* tell server we want the active file */
        !            67:        (void) get_server(ser_line, sizeof(ser_line));
        !            68:        if (*ser_line != CHAR_OK) {     /* and then see if that's ok */
        !            69:                xerror("Can't get active file from server: \n%s\n", ser_line);
        !            70:        }
        !            71:        strcpy(active_file_name, "/tmp/nsact.XXXXXX");
        !            72:        (void) mktemp(active_file_name);        /* make a temporary name */
        !            73:        openfp = fopen(active_file_name, "w+"); /* and get ready */
        !            74:        if (openfp == NULL)
        !            75:                return NULL;
        !            76: 
        !            77:        while (get_server(ser_line, sizeof(ser_line)) >= 0) {   /* while */
        !            78:                if (ser_line[0] == '.' && strlen(ser_line) == 1)
        !            79:                        /* there's another line */
        !            80:                        break;  /* get it and write it to */
        !            81:                fputs(ser_line, openfp);
        !            82:                putc('\n', openfp);
        !            83:        }
        !            84: 
        !            85:        fseek(openfp, 0L, 0);   /* just get to the beginning */
        !            86: 
        !            87:        return openfp;
        !            88: }
        !            89: 
        !            90: /*
        !            91:  * active_name() returns the name of the temporary file that contains the
        !            92:  * name of the current active file. 
        !            93:  */
        !            94: 
        !            95: char *
        !            96: active_name()
        !            97: {
        !            98:        if (active_file_name[0] == '\0')
        !            99:                return NULL;
        !           100:        return &active_file_name[0];
        !           101: }
        !           102: 
        !           103: /*
        !           104:  * set_group() set the current group returns NULL if failure "string" if
        !           105:  * successful 
        !           106:  */
        !           107: 
        !           108: char *
        !           109: set_group(newsgroup)
        !           110: char *newsgroup;
        !           111: {
        !           112:        char nntpbfr[256];
        !           113:        if (newsgroup == NULL || *newsgroup == '\0')
        !           114:                return NULL;
        !           115:        if (strcmp(newsgroup, last_group)) {
        !           116:                (void) sprintf(nntpbfr, "GROUP %s", newsgroup);
        !           117:                put_server(nntpbfr);
        !           118:                (void) get_server(ser_line, sizeof(ser_line));
        !           119:                if (*ser_line != CHAR_OK)
        !           120:                        return NULL;
        !           121:                strcpy(last_group, newsgroup);
        !           122:        }
        !           123:        return &ser_line[0];
        !           124: }
        !           125: 
        !           126: /*
        !           127:  * getarticle() returns an open file descriptor to the requested article. 
        !           128:  */
        !           129: 
        !           130: FILE *
        !           131: getarticle(newsgroup, number, command)
        !           132: char *newsgroup, *command;
        !           133: int number;
        !           134: {
        !           135:        FILE *fp;
        !           136:        char nntpbfr[256];
        !           137:        bzero(article_file_name, sizeof(article_file_name));
        !           138:        if (set_group(newsgroup) == NULL)
        !           139:                return NULL;
        !           140:        strcpy(article_file_name, "/tmp/nsart.XXXXXX");
        !           141:        if (mktemp(article_file_name) == NULL)
        !           142:                return NULL;
        !           143:        (void) sprintf(nntpbfr, "%s %ld", command, number);
        !           144:        put_server(nntpbfr);
        !           145:        (void) get_server(ser_line, sizeof(ser_line));
        !           146:        if (*ser_line != CHAR_OK)
        !           147:                return NULL;
        !           148:        if ((fp = fopen(article_file_name, "w+")) == NULL) {
        !           149:                /* and get ready */
        !           150:                sync_server();
        !           151:                return NULL;
        !           152:        }
        !           153:        while (get_server(ser_line, sizeof(ser_line)) >= 0) {   /* while */
        !           154:                if (ser_line[0] == '.' && strlen(ser_line) == 1)
        !           155:                        /* there's another line */
        !           156:                        break;  /* get it and write it to */
        !           157:                fputs(ser_line, fp);    /* the temp file */
        !           158:                putc('\n', fp);
        !           159:        }
        !           160:        fseek(fp, 0L, 0);       /* just get to the beginning */
        !           161:        return fp;
        !           162: }
        !           163: /*
        !           164:  * article_name() returns the name of the temporary file that contains the
        !           165:  * name of the current article file. 
        !           166:  */
        !           167: 
        !           168: char *
        !           169: article_name()
        !           170: {
        !           171:        if (article_file_name[0] == '\0')
        !           172:                return NULL;
        !           173:        return &article_file_name[0];
        !           174: }
        !           175: 
        !           176: /*
        !           177:  * group_name() returns the name of the last group accessed from nntp 
        !           178:  */
        !           179: 
        !           180: char *
        !           181: group_name()
        !           182: {
        !           183:        if (last_group[0] == '\0')
        !           184:                return NULL;
        !           185:        return &last_group[0];
        !           186: }
        !           187: 
        !           188: /*
        !           189:  * getartbyid retrieves an article by id number and returns an open file
        !           190:  * descriptor for that article 
        !           191:  */
        !           192: 
        !           193: FILE *
        !           194: getartbyid(id)
        !           195: char *id;
        !           196: {
        !           197:        FILE *fp;
        !           198:        char nntpbfr[256];
        !           199:        (void) sprintf(nntpbfr, "ARTICLE %s", id);
        !           200:        put_server(nntpbfr);
        !           201:        (void) get_server(ser_line, sizeof(ser_line));
        !           202:        if (*ser_line != CHAR_OK) {
        !           203:                fprintf(stderr, "Cannot fetch article %s\n", id);
        !           204:                return NULL;
        !           205:        }
        !           206:        strcpy(article_file_name, "/tmp/nsart.XXXXXX");
        !           207:        if (mktemp(article_file_name) == NULL)
        !           208:                return NULL;
        !           209:        if ((fp = fopen(article_file_name, "w+")) == NULL) {
        !           210:                /* and get ready */
        !           211:                sync_server();
        !           212:                return NULL;
        !           213:        }
        !           214:        while (get_server(ser_line, sizeof(ser_line)) >= 0) {   /* while */
        !           215:                if (ser_line[0] == '.' && strlen(ser_line) == 1)
        !           216:                        /* there's another line */
        !           217:                        break;  /* get it and write it to */
        !           218:                fputs(ser_line, fp);    /* the temp file */
        !           219:                putc('\n', fp);
        !           220:        }
        !           221:        fseek(fp, 0L, 0);       /* just get to the beginning */
        !           222:        return fp;
        !           223: }
        !           224: 
        !           225: /*
        !           226:  * sync_server gobbles up the rest of the server output until it sees the .
        !           227:  * on the beginning of a line by itself 
        !           228:  */
        !           229: 
        !           230: void
        !           231: sync_server()
        !           232: {
        !           233:        while (get_server(ser_line, sizeof(ser_line)) >= 0) {   /* while */
        !           234:                if (ser_line[0] == '.' && strlen(ser_line) == 1)
        !           235:                        /* there's another line */
        !           236:                        break;  /* get it and throw it away */
        !           237:        }
        !           238: 
        !           239: }
        !           240: 
        !           241: /*
        !           242:  * strindex returns location of tx in sx 
        !           243:  */
        !           244: int
        !           245: strindex(sx, tx)
        !           246: char *sx, *tx;
        !           247: {
        !           248:        int i, n;
        !           249:        n = strlen(tx);
        !           250:        for (i = 0; sx[i] != '\0'; i++)
        !           251:                if (strncmp(sx + i, tx, n) == 0)
        !           252:                        return i;
        !           253:        return -1;
        !           254: }

unix.superglobalmegacorp.com

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