Commit | Line | Data |
---|---|---|
1d589cd1 C |
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 | } |