|
|
1.1 root 1: /* $Header: init.c,v 4.3.1.3 85/07/23 18:08:36 lwall Exp $
2: *
3: * $Log: init.c,v $
4: * Revision 4.3.1.3 85/07/23 18:08:36 lwall
5: * Fixed up NOLINEBUF option to work.
6: *
7: * Revision 4.3.1.2 85/05/21 14:22:46 lwall
8: * Sped up "rn -c" by avoiding unnecessary initialization.
9: *
10: * Revision 4.3.1.1 85/05/10 11:33:39 lwall
11: * Branch for patches.
12: *
13: * Revision 4.3 85/05/01 16:16:13 lwall
14: * Baseline for release with 4.3bsd.
15: *
16: */
17:
18: #include "EXTERN.h"
19: #include "common.h"
20: #include "util.h"
21: #include "final.h"
22: #include "term.h"
23: #include "last.h"
24: #include "rn.h"
25: #include "rcstuff.h"
26: #include "ngdata.h"
27: #include "only.h"
28: #include "intrp.h"
29: #include "addng.h"
30: #include "sw.h"
31: #include "art.h"
32: #include "artsrch.h"
33: #include "artio.h"
34: #include "backpage.h"
35: #include "bits.h"
36: #include "cheat.h"
37: #include "head.h"
38: #include "help.h"
39: #include "kfile.h"
40: #include "ngsrch.h"
41: #include "ngstuff.h"
42: #include "rcln.h"
43: #include "respond.h"
44: #include "ng.h"
45: #include "INTERN.h"
46: #include "init.h"
47:
48: bool
49: initialize(argc,argv)
50: int argc;
51: char *argv[];
52: {
53: char *tcbuf;
54: register bool foundany = FALSE;
55: long time();
56: #ifdef NOLINEBUF
57: static char std_out_buf[BUFSIZ]; /* must be static or malloced */
58:
59: setbuf(stdout, std_out_buf);
60: #endif
61:
62: tcbuf = safemalloc(1024); /* make temp buffer for termcap and */
63: /* other initialization stuff */
64:
65: /* init terminal */
66:
67: term_init(); /* must precede sw_init() so that */
68: /* ospeed is set for baud-rate */
69: /* switches. Actually terminal */
70: /* mode setting is in term_set() */
71:
72: /* we have to know rnlib to look up global switches in %X/INIT */
73:
74: lib = savestr(filexp(LIB));
75: rnlib = savestr(filexp(RNLIB));
76:
77: /* decode switches */
78:
79: sw_init(argc,argv,&tcbuf); /* must not do % interps! */
80: /* (but may mung environment) */
81:
82: /* init signals, status flags */
83:
84: final_init();
85:
86: /* start up file expansion and the % interpreter */
87:
88: intrp_init(tcbuf);
89:
90: /* now make sure we have a current working directory */
91:
92: if (!checkflag)
93: cwd_check();
94:
95: /* now that we know where to save things, cd to news directory */
96:
97: if (chdir(spool)) {
98: printf(nocd,spool) FLUSH;
99: finalize(1);
100: }
101:
102: /* if we aren't just checking, turn off echo */
103:
104: if (!checkflag)
105: term_set(tcbuf);
106:
107: /* get info on last rn run, if any */
108:
109: if (!checkflag)
110: last_init(tcbuf);
111:
112: free(tcbuf); /* recover 1024 bytes */
113:
114: /* make sure we are the right version */
115:
116: if (!checkflag)
117: version_check();
118:
119: /* make sure we are the sole possessors of .newsrc */
120:
121: if (!checkflag)
122: lock_check();
123:
124: /* check for news news */
125:
126: if (!checkflag)
127: newsnews_check();
128:
129: /* open active file, etc. */
130:
131: ngdata_init();
132:
133: /* now read in the .newsrc file */
134:
135: foundany = rcstuff_init();
136:
137: /* it looks like we will actually read something, so init everything */
138:
139: addng_init();
140: art_init();
141: artio_init();
142: artsrch_init();
143: backpage_init();
144: bits_init();
145: cheat_init();
146: /* final_init(); already done */
147: head_init();
148: help_init();
149: /* intrp_init(); already done */
150: kfile_init();
151: /* last_init(); already done */
152: ng_init();
153: /* ngdata_init(); already done */
154: ngsrch_init();
155: ngstuff_init();
156: only_init();
157: rcln_init();
158: /* rcstuff_init(); already done */
159: respond_init();
160: rn_init();
161: search_init();
162: /* sw_init(); already done */
163: /* term_init(); already done */
164: util_init();
165:
166: #ifdef FINDNEWNG
167: fstat(actfp->_file,&filestat); /* did active file grow? */
168: if (filestat.st_size != lastactsiz) {
169: long actsiz = filestat.st_size; /* remember new size */
170: NG_NUM oldnext = nextrcline; /* remember # lines in newsrc */
171: #ifdef FASTNEW
172: bool munged = writesoft || !lastactsiz;
173: /* bad soft ptrs -> edited active */
174: #else
175: bool munged = TRUE; /* just assume .newsrc munged */
176: #endif
177:
178: #ifdef VERBOSE
179: IF(verbose)
180: fputs("\nChecking active list for new newsgroups...\n",stdout)
181: FLUSH;
182: ELSE
183: #endif
184: #ifdef TERSE
185: fputs("\nNew newsgroups:\n",stdout) FLUSH;
186: #endif
187: #ifdef FASTNEW
188: if (!munged) { /* maybe just do tail of file? */
189: fseek(actfp,lastactsiz-1,0);
190: fgets(buf,LBUFLEN,actfp);
191: munged = (*buf != '\n');
192: if (!munged)
193: munged = newlist(munged,FALSE);
194: }
195: #endif
196: if (munged) { /* must we scan entire file? */
197: fseek(actfp,0L,0); /* rewind active file */
198: newlist(munged,FALSE); /* sure hope they use hashing... */
199: }
200: lastactsiz = actsiz; /* remember for .rnlast */
201: if (nextrcline != oldnext) { /* did we add any new groups? */
202: foundany = TRUE; /* let main() know */
203: starthere = 0; /* and start ng scan from the top */
204: }
205: }
206: #endif
207: time(&lasttime); /* remember when we inited-- */
208: /* ends up back in .rnlast */
209: writelast(); /* in fact, put it there now */
210:
211: #ifdef FINDNEWNG
212: # ifdef ONLY
213: if (maxngtodo) /* patterns on command line? */
214: foundany |= scanactive();
215: # endif
216: #endif
217:
218: return foundany;
219: }
220:
221: /* make sure there is no rn out there already */
222:
223: void
224: lock_check()
225: {
226: lockname = savestr(filexp(LOCKNAME));
227: if (!checkflag) {
228: tmpfp = fopen(lockname,"r");
229: if (tmpfp != Nullfp) {
230: int processnum;
231:
232: fgets(buf,LBUFLEN,tmpfp);
233: fclose(tmpfp);
234: processnum = atoi(buf);
235: #ifdef VERBOSE
236: IF(verbose)
237: printf("You seem to have left an rn running, process %d.\n",
238: processnum) FLUSH;
239: ELSE
240: #endif
241: #ifdef TERSE
242: printf("Rn left running, #%d.\n", processnum) FLUSH;
243: #endif
244: if (kill(processnum, SIGEMT)) {
245: /* does process not exist? */
246: /* (rn ignores SIGEMT) */
247: sleep(2);
248: #ifdef VERBOSE
249: IF(verbose)
250: fputs("\n\
251: That process does not seem to exist anymore. The count of read articles\n\
252: may be incorrect in the last newsgroup accessed by that other (defunct)\n\
253: process.\n\n",stdout) FLUSH;
254: ELSE
255: #endif
256: #ifdef TERSE
257: fputs("\nProcess crashed.\n",stdout) FLUSH;
258: #endif
259: if (*lastngname) {
260: #ifdef VERBOSE
261: IF(verbose)
262: printf("(The last newsgroup accessed was %s.)\n\n",
263: lastngname) FLUSH;
264: ELSE
265: #endif
266: #ifdef TERSE
267: printf("(In %s.)\n\n",lastngname) FLUSH;
268: #endif
269: }
270: get_anything();
271: putchar('\n') FLUSH;
272: }
273: else {
274: #ifdef VERBOSE
275: IF(verbose)
276: fputs("\n\
277: You may not have two copies of rn running simultaneously. Goodbye.\n\
278: ",stdout) FLUSH;
279: ELSE
280: #endif
281: #ifdef TERSE
282: fputs("\nCan't start another.\n",stdout) FLUSH;
283: #endif
284: finalize(0);
285: }
286: }
287: tmpfp = fopen(lockname,"w");
288: if (tmpfp == Nullfp) {
289: printf(cantcreate,lockname) FLUSH;
290: sig_catcher(0);
291: }
292: fprintf(tmpfp,"%d\n",getpid());
293: fclose(tmpfp);
294: }
295: }
296:
297: void
298: newsnews_check()
299: {
300: char *newsnewsname = filexp(NEWSNEWSNAME);
301:
302: if ((tmpfp = fopen(newsnewsname,"r")) != Nullfp) {
303: fstat(tmpfp->_file,&filestat);
304: if (filestat.st_mtime > lasttime) {
305: while (fgets(buf,sizeof(buf),tmpfp) != Nullch)
306: fputs(buf,stdout) FLUSH;
307: get_anything();
308: putchar('\n') FLUSH;
309: }
310: fclose(tmpfp);
311: }
312: }
313:
314: void
315: version_check()
316: {
317: set_ngname("net.announce");
318: if (access(ngdir,0)) {
319: #ifdef VERBOSE
320: IF(verbose)
321: fputs("Can't find net.announce. Wrong news version?\n",stdout)
322: FLUSH;
323: ELSE
324: #endif
325: #ifdef TERSE
326: fputs("Wrong version?\n",stdout) FLUSH;
327: #endif
328: finalize(1);
329: }
330: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.