BSD 4_3 development
[unix-history] / usr / contrib / nntp / rrn / init.c
CommitLineData
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
46bool
47initialize(argc,argv)
48int argc;
49char *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
230void
231lock_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\
258That process does not seem to exist anymore. The count of read articles\n\
259may be incorrect in the last newsgroup accessed by that other (defunct)\n\
260process.\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\
284You 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
304void
305newsnews_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
321void
322version_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}