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