Annotation of 43BSD/contrib/rn/kfile.c, revision 1.1.1.1

1.1       root        1: /* $Header: kfile.c,v 4.3.1.3 85/05/29 09:11:52 lwall Exp $
                      2:  *
                      3:  * $Log:       kfile.c,v $
                      4:  * Revision 4.3.1.3  85/05/29  09:11:52  lwall
                      5:  * Suppressed some killing messages on -t.
                      6:  * 
                      7:  * Revision 4.3.1.2  85/05/10  14:21:29  lwall
                      8:  * Prevented THRU from setting art < absfirst.
                      9:  * 
                     10:  * Revision 4.3.1.1  85/05/10  11:34:33  lwall
                     11:  * Branch for patches.
                     12:  * 
                     13:  * Revision 4.3  85/05/01  11:41:53  lwall
                     14:  * Baseline for release with 4.3bsd.
                     15:  * 
                     16:  */
                     17: 
                     18: #include "EXTERN.h"
                     19: #include "common.h"
                     20: #include "term.h"
                     21: #include "util.h"
                     22: #include "artsrch.h"
                     23: #include "ng.h"
                     24: #include "bits.h"
                     25: #include "intrp.h"
                     26: #include "ngstuff.h"
                     27: #include "rcstuff.h"
                     28: #include "rn.h"
                     29: #include "INTERN.h"
                     30: #include "kfile.h"
                     31: 
                     32: static bool exitcmds = FALSE;
                     33: 
                     34: void
                     35: kfile_init()
                     36: {
                     37:     ;
                     38: }
                     39: 
                     40: #ifndef KILLFILES
                     41: int
                     42: edit_kfile()
                     43: {
                     44:     notincl("^K");
                     45:     return -1;
                     46: }
                     47: 
                     48: #else KILLFILES
                     49: 
                     50: char killglobal[] = KILLGLOBAL;
                     51: char killlocal[] = KILLLOCAL;
                     52: 
                     53: void
                     54: mention(str)
                     55: char *str;
                     56: {
                     57: #ifdef VERBOSE
                     58:     IF(verbose) {
                     59: #ifdef NOFIREWORKS
                     60:        no_sofire();
                     61: #endif
                     62:        standout();
                     63:        fputs(str,stdout);
                     64:        un_standout();
                     65:        putchar('\n');
                     66:     }
                     67:     ELSE
                     68: #endif
                     69: #ifdef TERSE
                     70:        putchar('.');
                     71: #endif
                     72:     fflush(stdout);
                     73: }
                     74: 
                     75: int
                     76: do_kfile(kfp,entering)
                     77: FILE *kfp;
                     78: int entering;
                     79: {
                     80:     art = lastart+1;
                     81:     fseek(kfp,0L,0);                   /* rewind file */
                     82:     while (fgets(buf,LBUFLEN,kfp) != Nullch) {
                     83:        buf[strlen(buf)-1] = '\0';
                     84:        if (strnEQ(buf,"THRU",4)) {
                     85:            ART_NUM tmpart;
                     86: 
                     87:            tmpart = atol(buf+4)+1;
                     88:            if (tmpart < absfirst)
                     89:                tmpart = absfirst;
                     90:            check_first(tmpart);
                     91:            firstart = tmpart;
                     92:            continue;
                     93:        }
                     94:        if (*buf == 'X') {              /* exit command? */
                     95:            if (entering) {
                     96:                exitcmds = TRUE;
                     97:                continue;
                     98:            }
                     99:            strcpy(buf,buf+1);
                    100:        }
                    101:        else {
                    102:            if (!entering)
                    103:                continue;
                    104:        }
                    105:        if (*buf == '&') {
                    106:            mention(buf);
                    107:            switcheroo();
                    108:        }
                    109:        else if (*buf == '/' && firstart <= lastart) {
                    110:            mention(buf);
                    111:            switch (art_search(buf, (sizeof buf), FALSE)) {
                    112:            case SRCH_ABORT:
                    113:                continue;
                    114:            case SRCH_INTR:
                    115: #ifdef VERBOSE
                    116:                IF(verbose)
                    117:                    printf("\n(Interrupted at article %ld)\n",(long)art)
                    118:                      FLUSH;
                    119:                ELSE
                    120: #endif
                    121: #ifdef TERSE
                    122:                    printf("\n(Intr at %ld)\n",(long)art) FLUSH;
                    123: #endif
                    124:                return -1;
                    125:            case SRCH_DONE:
                    126:                break;
                    127:            case SRCH_SUBJDONE:
                    128:                fputs("\tsubject not found (???)\n",stdout) FLUSH;
                    129:                break;
                    130:            case SRCH_NOTFOUND:
                    131:                fputs("\tnot found\n",stdout) FLUSH;
                    132:                break;
                    133:            case SRCH_FOUND:
                    134:                fputs("\tfound\n",stdout) FLUSH;
                    135:            }
                    136:        }
                    137:     }
                    138:     return 0;
                    139: }
                    140: 
                    141: void
                    142: kill_unwanted(starting,message,entering)
                    143: ART_NUM starting;
                    144: char *message;
                    145: int entering;
                    146: {
                    147:     bool intr = FALSE;                 /* did we get an interrupt? */
                    148:     ART_NUM oldfirst;
                    149:     bool anytokill = (toread[ng] > 0);
                    150: 
                    151:     if (localkfp || globkfp) {
                    152:        if (!entering && !exitcmds)
                    153:            return;
                    154:        exitcmds = FALSE;
                    155:        oldfirst = firstart;
                    156:        firstart = starting;
                    157:        clear();
                    158: #ifdef VERBOSE
                    159:        IF(verbose)
                    160:            if (message)
                    161:                fputs(message,stdout) FLUSH;
                    162: #endif
                    163:        if (localkfp)
                    164:            intr = do_kfile(localkfp,entering);
                    165:        if (globkfp && !intr)
                    166:            intr = do_kfile(globkfp,entering);
                    167:        if (entering && localkfp && !intr)
                    168:            setthru(lastart);
                    169:        putchar('\n') FLUSH;
                    170: #ifdef VERBOSE
                    171:        IF(verbose)
                    172:            if (entering)
                    173:                get_anything();
                    174: #endif
                    175:        if (anytokill)                  /* if there was anything to kill */
                    176:            forcelast = FALSE;          /* allow for having killed it all */
                    177:        firstart = oldfirst;
                    178:     }
                    179: }
                    180: 
                    181: void
                    182: setthru(thru)
                    183: ART_NUM thru;
                    184: {
                    185:     FILE *newkfp;
                    186: 
                    187:     fseek(localkfp,0L,0);              /* rewind current file */
                    188:     strcpy(buf,filexp(getval("KILLLOCAL",killlocal)));
                    189:     UNLINK(buf);                       /* to prevent file reuse */
                    190:     if (newkfp = fopen(buf,"w")) {
                    191:        fprintf(newkfp,"THRU %ld\n",(long)thru);
                    192:        while (fgets(buf,LBUFLEN,localkfp) != Nullch) {
                    193:            if (strnEQ(buf,"THRU",4))
                    194:                continue;
                    195:            fputs(buf,newkfp);
                    196:        }
                    197:        fclose(newkfp);
                    198:        open_kfile(KF_LOCAL);           /* and reopen local file */
                    199:     }
                    200:     else
                    201:        printf(cantcreate,buf) FLUSH;
                    202: }
                    203: 
                    204: /* edit KILL file for newsgroup */
                    205: 
                    206: int
                    207: edit_kfile()
                    208: {
                    209:     int r = -1;
                    210: 
                    211:     if (in_ng)
                    212:        strcpy(buf,filexp(getval("KILLLOCAL",killlocal)));
                    213:     else
                    214:        strcpy(buf,filexp(getval("KILLGLOBAL",killglobal)));
                    215:     if ((r = makedir(buf,MD_FILE)) >= 0) {
                    216:        sprintf(cmd_buf,"%s %s",
                    217:            filexp(getval("VISUAL",getval("EDITOR",defeditor))),buf);
                    218:        printf("\nEditing %s KILL file:\n%s\n",
                    219:            (in_ng?"local":"global"),cmd_buf) FLUSH;
                    220:        resetty();                      /* make sure tty is friendly */
                    221:        r = doshell(sh,cmd_buf);/* invoke the shell */
                    222:        noecho();                       /* and make terminal */
                    223:        crmode();                       /*   unfriendly again */
                    224:        open_kfile(in_ng);
                    225:     }
                    226:     else
                    227:        printf("Can't make %s\n",buf) FLUSH;
                    228:     return r;
                    229: }
                    230: 
                    231: void
                    232: open_kfile(local)
                    233: int local;
                    234: {
                    235:     char *kname = filexp(local ?
                    236:        getval("KILLLOCAL",killlocal) :
                    237:        getval("KILLGLOBAL",killglobal)
                    238:        );
                    239:     
                    240:     stat(kname,&filestat);
                    241:     if (!filestat.st_size)             /* nothing in the file? */
                    242:        UNLINK(kname);                  /* delete the file */
                    243:     if (local) {
                    244:        if (localkfp)
                    245:            fclose(localkfp);
                    246:        localkfp = fopen(kname,"r");
                    247:     }
                    248:     else {
                    249:        if (globkfp)
                    250:            fclose(globkfp);
                    251:        globkfp = fopen(kname,"r");
                    252:     }
                    253: }
                    254: 
                    255: void
                    256: kf_append(cmd)
                    257: char *cmd;
                    258: {
                    259:     strcpy(cmd_buf,filexp(getval("KILLLOCAL",killlocal)));
                    260:     if (makedir(cmd_buf,MD_FILE) >= 0) {
                    261: #ifdef VERBOSE
                    262:        IF(verbose)
                    263:            printf("\nDepositing command in %s...",cmd_buf);
                    264:        ELSE
                    265: #endif
                    266: #ifdef TERSE
                    267:            printf("\n--> %s...",cmd_buf);
                    268: #endif
                    269:        fflush(stdout);
                    270:        sleep(2);
                    271:        if ((tmpfp = fopen(cmd_buf,"a")) != Nullfp) {
                    272:            fseek(tmpfp,0L,2);          /* get to EOF for sure */
                    273:            fprintf(tmpfp,"%s\n",cmd);
                    274:            fclose(tmpfp);
                    275:            fputs("done\n",stdout) FLUSH;
                    276:        }
                    277:        else
                    278:            printf(cantopen,cmd_buf) FLUSH;
                    279:     }
                    280: }
                    281: #endif KILLFILES

unix.superglobalmegacorp.com

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