|
|
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.