Annotation of 43BSD/contrib/news/src/readnews.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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