|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.