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