|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.