Annotation of researchv10no/cmd/netnews/src/readnews.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * readnews - read news articles.
                      3:  */
                      4: 
                      5: static char    *SccsId = "@(#)readnews.c       2.10    4/23/83";
                      6: 
                      7: #include "rparams.h"
                      8: 
                      9: /*
                     10:  * readnews - article reading program
                     11:  */
                     12: 
                     13: #ifndef SYSBUF
                     14: char   SYSBUF[BUFSIZ]; /* to buffer std out */
                     15: #endif
                     16: 
                     17: #define OPTION 0       /* pick up an option string */
                     18: #define STRING 1       /* pick up a string of arguments */
                     19: 
                     20: /*
                     21:  *     Authors:
                     22:  *             Matt Glickman   ucbvax!glickman
                     23:  *             Mark Horton     cbosg!mark
                     24:  *             Stephen Daniels duke!swd
                     25:  *             Tom Truscott    duke!trt
                     26:  */
                     27: 
                     28: main(argc, argv)
                     29: int    argc;
                     30: register char  **argv;
                     31: {
                     32:        register char   *ptr;   /* pointer to rest of buffer            */
                     33:        char    *user, *home;
                     34:        struct passwd *pw;
                     35:        struct group *gp;
                     36:        int     i, optflag = FALSE, space = FALSE;
                     37:        struct utsname ubuf;
                     38:        char    *myrc;
                     39: #ifdef NOTIFY
                     40:        FILE            *nfd;           /* notify file descriptor */
                     41: #endif
                     42: 
                     43:        /* set up defaults and initialize. */
                     44:        pathinit();
                     45:        mode = UNKNOWN;
                     46:        header.title[0] = header.nbuf[0] = '\0';
                     47:        titlebuf[0] = coptbuf[0] = datebuf[0] = '\0';
                     48:        uname(&ubuf);
                     49:        strcpy(SYSNAME, ubuf.nodename);
                     50:        SYSNAME[SNLN] = '\0';
                     51: 
                     52:        savmask = umask(N_UMASK);       /* set up mask */
                     53:        uid = getuid();
                     54:        gid = getgid();
                     55:        duid = 0;
                     56:        dgid = 0;
                     57: 
                     58: #ifndef V6
                     59: #ifndef SHELL
                     60:        if ((SHELL = getenv("SHELL")) == NULL)
                     61:                SHELL = "/bin/sh";
                     62: #endif
                     63: #ifndef IHCC
                     64:        /*
                     65:         * IHCC does not allow use of $LOGNAME to prevent forgery.
                     66:         * Note that this shouldn't matter in readnews, since inews
                     67:         * does all the actual posting of news.
                     68:         */
                     69:        if ((user = getenv("USER")) == NULL)
                     70:                user = getenv("LOGNAME");
                     71:        if ((home = getenv("HOME")) == NULL)
                     72:                home = getenv("LOGDIR");
                     73: #endif
                     74:        if (user == NULL || home == NULL)
                     75:                getuser();
                     76:        else {
                     77:                strcpy(username, user);
                     78:                strcpy(header.path, username);
                     79:                strcpy(userhome, home);
                     80:        }
                     81: 
                     82:        getuser();
                     83:        if (!(MAILER = getenv("MAILER")))
                     84:                MAILER = "mail";        /* was /bin/mail */
                     85: 
                     86: #ifdef PAGE
                     87:        if (myrc = getenv("PAGER"))
                     88:                strcpy(PAGER, myrc);
                     89:        else
                     90: # ifdef IHCC
                     91:                sprintf(PAGER,"%s/bin/%s",logdir(HOME),PAGE);
                     92: # else
                     93:                strcpy(PAGER, PAGE);
                     94: # endif
                     95: #else
                     96:        strcpy(PAGER, "");
                     97: #endif
                     98: 
                     99:        if (ptr = getenv("NEWSOPTS"))
                    100:                strcpy(rcbuf, ptr);
                    101:        else
                    102:                *rcbuf = '\0';
                    103:        if (*rcbuf) {
                    104:                strcat(rcbuf, " \1");
                    105:                ptr = rcbuf;
                    106:                while (*++ptr)
                    107:                        if (isspace(*ptr))
                    108:                                *ptr = '\0';
                    109:                for (ptr = rcbuf; ; ptr++) {
                    110:                        if (!*ptr)
                    111:                                continue;
                    112:                        if (*ptr == '\1')
                    113:                                break;
                    114:                        if (++line > LINES)
                    115:                                xerror("Too many options.\n");
                    116:                        if ((rcline[line] = malloc(strlen(ptr) + 1)) == NULL)
                    117:                                xerror("Not enough memory.\n");
                    118:                        argvrc[line] = rcline[line];
                    119:                        strcpy(rcline[line], ptr);
                    120:                        while (*ptr)
                    121:                                ptr++;
                    122:                }
                    123:        }
                    124: #else
                    125:        getuser();
                    126: #endif
                    127:        myrc = getenv("NEWSRC");
                    128:        if (myrc == NULL) {
                    129:                myrc = NEWSRC;
                    130:                sprintf(newsrc, "%s/%s", userhome, myrc);
                    131:        } else {
                    132:                strcpy(newsrc, myrc);
                    133:        }
                    134:        if (access(newsrc, 0))
                    135:                newrc(newsrc);
                    136:        if ((rcfp = fopen(newsrc, "r")) != NULL) {
                    137:                rcreadok = FALSE;
                    138:                while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) {
                    139:                        if (!(space = isspace(*rcbuf)))
                    140:                                optflag = FALSE;
                    141:                        if (!strncmp(rcbuf, "options ", 8))
                    142:                                optflag = TRUE;
                    143:                        if (optflag) {
                    144:                                strcat(rcbuf, "\1");
                    145:                                if (space)
                    146:                                        ptr = rcbuf - 1;
                    147:                                else
                    148:                                        ptr = &rcbuf[7];
                    149:                                while (*++ptr)
                    150:                                        if (isspace(*ptr))
                    151:                                                *ptr = '\0';
                    152:                                if (space)
                    153:                                        ptr = rcbuf;
                    154:                                else
                    155:                                        ptr = &rcbuf[8];
                    156:                                for (; ; ptr++) {
                    157:                                        if (!*ptr)
                    158:                                                continue;
                    159:                                        if (*ptr == '\1')
                    160:                                                break;
                    161:                                        if (++line > LINES)
                    162:                                                xerror("Too many options.\n");
                    163:                                        if ((rcline[line] = malloc(strlen(ptr) + 1)) == NULL)
                    164:                                                xerror("Not enough memory.\n");
                    165:                                        argvrc[line] = rcline[line];
                    166:                                        strcpy(rcline[line], ptr);
                    167:                                        while (*ptr)
                    168:                                                ptr++;
                    169:                                }
                    170:                        }
                    171:                }
                    172:                fclose(rcfp);
                    173:                rcreadok = TRUE;
                    174:        }
                    175:        if (line != -1) {
                    176: #ifdef DEBUG
                    177:                for (i = 0; i <= line; i++)
                    178:                        fprintf(stderr, "options:  %s\n", rcline[i]);
                    179: #endif
                    180:                process(line + 2, argvrc);
                    181:                do {
                    182: #ifdef DEBUG
                    183:                        fprintf(stderr, "Freeing %d\n", line);
                    184: #endif
                    185:                        free(rcline[line]);
                    186:                } while (line--);
                    187:        }
                    188: 
                    189:        argv++;
                    190:        strcat(header.nbuf, ADMSUB);
                    191:        ngcat(header.nbuf);
                    192:        process(argc, argv);
                    193:        if (!nflag) {
                    194:                strcpy(header.nbuf, DFLTSUB);
                    195:                ngcat(header.nbuf);
                    196:                strcat(header.nbuf, ADMSUB);
                    197:                ngcat(header.nbuf);
                    198:        }
                    199:        if (*header.nbuf)
                    200:                lcase(header.nbuf);
                    201:        makehimask(header.nbuf, "junk");
                    202:        makehimask(header.nbuf, "control");
                    203:        makehimask(header.nbuf, "test");
                    204: 
                    205:        setbuf(stdout, SYSBUF);
                    206:        sigtrap = FALSE;        /* true if a signal has been caught */
                    207:        if (!pflag && !lflag && !eflag) {
                    208:                signal(SIGQUIT, SIG_IGN);
                    209:                signal(SIGHUP, onsig);
                    210:                signal(SIGINT, onsig);
                    211:                signal(SIGPIPE, onsig);
                    212:        }
                    213: 
                    214:        /*
                    215:         * ALL of the command line has now been processed. (!)
                    216:         */
                    217: 
                    218:        if (!*header.nbuf)
                    219:                ngcat(strcpy(header.nbuf, DFLTSUB));
                    220:        if (sflag) {
                    221:                ngdel(header.nbuf);
                    222:                printf("Subscription list:  %s\n", header.nbuf);
                    223:                xxit(0);
                    224:        }
                    225:        if (!xflag && (rcfp = xfopen(newsrc, "r"))) {
                    226:                while (!sigtrap && fgets(rcbuf, LBUFLEN, rcfp) != NULL) {
                    227:                        if (!nstrip(rcbuf))
                    228:                                xerror(".newsrc line too long");
                    229:                        if (++line >= LINES)
                    230:                                xerror("Too many .newsrc lines");
                    231:                        if ((rcline[line] = malloc(strlen(rcbuf) + 1)) == NULL)
                    232:                                xerror("Not enough memory");
                    233:                        strcpy(rcline[line], rcbuf);
                    234:                }
                    235:                fclose(rcfp);
                    236:        }
                    237:        actfp = xfopen(ACTIVE, "r");
                    238: 
                    239: #ifdef DEBUG
                    240:        fprintf(stderr, "header.nbuf = %s\n", header.nbuf);
                    241: #endif
                    242:        switch (mode) {
                    243:        case UNKNOWN:
                    244:                readr();
                    245:                break;
                    246: #ifdef TMAIL
                    247:        case MAIL:
                    248:                Mail();
                    249:                break;
                    250: #endif
                    251:        }
                    252:        fflush(stdout);
                    253:        if (xflag || lflag || tflag)
                    254:                xxit(0);
                    255:        if (*groupdir && mode != MAIL)
                    256:                updaterc();
                    257:        writeoutrc();
                    258:        xxit(0);
                    259: 
                    260:        /* Camel, R.O.H. */
                    261: }
                    262: 
                    263: /*
                    264:  * Write out the .newsrc file.  We sort it into "active" file order,
                    265:  * for speed in future invocations, and to get rid of junk.
                    266:  */
                    267: writeoutrc()
                    268: {
                    269:        FILE *rcfp, *actfp;
                    270:        char afline[BUFLEN];
                    271:        register int i, c;
                    272:        register char *p;
                    273: 
                    274:        if (!rcreadok)
                    275:                return;
                    276: #ifdef VMS
                    277:        unlink(newsrc);
                    278: #endif
                    279: 
                    280:        rcfp = xfopen(newsrc, "w");
                    281:        actfp = xfopen(ACTIVE, "r");
                    282: 
                    283:        /* Write out options line, continuations, and comments. */
                    284:        for (i=0; ;i++) {
                    285:                c = rcline[i][0];
                    286:                if (c != 'o' && c != '#' && c != ' ' && c != '\t')
                    287:                        break;
                    288:                if (c == 'o' && strncmp(rcline[i], "options", 7) != 0)
                    289:                        break;
                    290:                fprintf(rcfp, "%s\n", rcline[i]);
                    291:        }
                    292: 
                    293:        /* For each newsgroup in active, find that newsrc line and write it out. */
                    294:        while (fgets(afline, sizeof afline, actfp)) {
                    295:                p = index(afline, ' ');
                    296:                if (p)
                    297:                        *p = 0;
                    298:                i = findrcline(afline);
                    299:                if (i >= 0)
                    300:                        fprintf(rcfp, "%s\n", rcline[i]);
                    301:        }
                    302:        fclose(rcfp);
                    303:        fclose(actfp);
                    304: }
                    305: 
                    306: /*
                    307:  * Forbid newsgroup ng, unless he asked for it in nbuf.
                    308:  */
                    309: makehimask(nbuf, ng)
                    310: char *nbuf, *ng;
                    311: {
                    312:        if (!findex(nbuf, ng)) {
                    313:                ngcat(nbuf);
                    314:                strcat(nbuf, "!");
                    315:                strcat(nbuf, ng);
                    316:                ngcat(nbuf);
                    317:        }
                    318: }
                    319: 
                    320: /*
                    321:  * Return true if the string searchfor is in string, but not if preceeded by !.
                    322:  */
                    323: findex(string, searchfor)
                    324: char *string, *searchfor;
                    325: {
                    326:        register char first;
                    327:        register char *p;
                    328: 
                    329:        first = *searchfor;
                    330:        for (p=index(string, first); p; p = index(p+1, first)) {
                    331:                if (p==string || (p>string && p[-1] != '!' && strncmp(p, searchfor, strlen(searchfor)) == 0))
                    332:                        return TRUE;
                    333:        }
                    334:        return FALSE;
                    335: }

unix.superglobalmegacorp.com

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