BSD 4_3 development
[unix-history] / usr / contrib / rn / init.c
CommitLineData
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
48bool
49initialize(argc,argv)
50int argc;
51char *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
223void
224lock_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\
251That process does not seem to exist anymore. The count of read articles\n\
252may be incorrect in the last newsgroup accessed by that other (defunct)\n\
253process.\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\
277You 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
297void
298newsnews_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
314void
315version_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}