home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume23 / trn / part11 / init.c < prev    next >
C/C++ Source or Header  |  1991-08-22  |  9KB  |  384 lines

  1. /* $Header: init.c,v 4.3.3.2 91/01/16 02:43:39 davison Trn $
  2.  *
  3.  * $Log:    init.c,v $
  4.  * Revision 4.3.3.2  91/01/16  02:43:39  davison
  5.  * Integrated rn patches 48-54.  Twiddled 'rn' to 'trn'.
  6.  * 
  7.  * Revision 4.3.3.1  90/06/20  22:37:39  davison
  8.  * Initial Trn Release
  9.  * 
  10.  * Revision 4.3.2.8  90/11/22  13:51:39  sob
  11.  * Removed some cruft trailing the #endif directive to make more compilers
  12.  * happy.
  13.  * 
  14.  * Revision 4.3.2.7  90/10/30  22:42:23  sob
  15.  * Used fileno() instead of _file to increase portability.
  16.  * 
  17.  * Revision 4.3.2.6  90/05/08  22:05:55  sob
  18.  * Added quick startup (-q) flag.
  19.  * 
  20.  * Revision 4.3.2.5  90/05/04  23:10:01  sob
  21.  * Fix for exiting "second" rn such that tty will be left in correct state.
  22.  * Provided by glenn@mathcs.emory.edu
  23.  * 
  24.  * Revision 4.3.2.4  90/03/22  23:04:32  sob
  25.  * Fixes provided by Wayne Davison <drivax!davison>
  26.  * 
  27.  * Revision 4.3.2.3  90/03/17  21:34:04  sob
  28.  * Cleaned up a bit.
  29.  * 
  30.  * Revision 4.3.2.2  89/11/08  01:17:48  sob
  31.  * Added changes to insure that this will compile for RN or RRN with no
  32.  * changes to the source code.
  33.  * 
  34.  * Revision 4.3.2.1  89/11/06  00:39:14  sob
  35.  * Added RRN support from NNTP 1.5
  36.  * 
  37.  * Revision 4.3.1.4  86/09/05  14:24:02  lwall
  38.  * Removed net.announce dependency.
  39.  * 
  40.  * Revision 4.3.1.3  85/07/23  18:08:36  lwall
  41.  * Fixed up NOLINEBUF option to work.
  42.  * 
  43.  * Revision 4.3.1.2  85/05/21  14:22:46  lwall
  44.  * Sped up "rn -c" by avoiding unnecessary initialization.
  45.  * 
  46.  * Revision 4.3.1.1  85/05/10  11:33:39  lwall
  47.  * Branch for patches.
  48.  * 
  49.  * Revision 4.3  85/05/01  16:16:13  lwall
  50.  * Baseline for release with 4.3bsd.
  51.  * 
  52.  */
  53.  
  54. #include "EXTERN.h"
  55. #include "common.h"
  56. #include "util.h"
  57. #include "final.h"
  58. #include "term.h"
  59. #include "last.h"
  60. #include "rn.h"
  61. #include "rcstuff.h"
  62. #include "ngdata.h"
  63. #include "only.h"
  64. #include "intrp.h"
  65. #include "addng.h"
  66. #include "sw.h"
  67. #include "art.h"
  68. #include "artsrch.h"
  69. #include "artio.h"
  70. #include "backpage.h"
  71. #include "bits.h"
  72. #include "cheat.h"
  73. #include "head.h"
  74. #include "help.h"
  75. #include "kfile.h"
  76. #include "ngsrch.h"
  77. #include "ngstuff.h"
  78. #include "rcln.h"
  79. #include "respond.h"
  80. #ifdef SERVER
  81. #include "server.h"
  82. #endif
  83. #ifdef USETHREADS
  84. #include "rthreads.h"
  85. #endif
  86. #include "ng.h"
  87. #include "INTERN.h"
  88. #include "init.h"
  89.  
  90. bool
  91. initialize(argc,argv)
  92. int argc;
  93. char *argv[];
  94. {
  95.     char *tcbuf;
  96.     register bool foundany = FALSE;
  97.     long time();
  98. #ifdef SERVER
  99.     char *server;
  100.     int response;
  101. #endif
  102. #ifdef NOLINEBUF
  103.     static char std_out_buf[BUFSIZ];    /* must be static or malloced */
  104.  
  105.     setbuf(stdout, std_out_buf);
  106. #endif
  107.  
  108.     tcbuf = safemalloc(1024);        /* make temp buffer for termcap and */
  109.                     /* other initialization stuff */
  110.     
  111.     /* init terminal */
  112.     
  113.     term_init();            /* must precede sw_init() so that */
  114.                     /* ospeed is set for baud-rate */
  115.                     /* switches.  Actually terminal */
  116.                     /* mode setting is in term_set() */
  117.  
  118.     /* we have to know rnlib to look up global switches in %X/INIT */
  119.  
  120.     lib = savestr(filexp(LIB));
  121.     rnlib = savestr(filexp(RNLIB));
  122.  
  123.     /* decode switches */
  124.  
  125.     sw_init(argc,argv,&tcbuf);          /* must not do % interps! */
  126.                     /* (but may mung environment) */
  127.  
  128.     /* init signals, status flags */
  129.  
  130.     final_init();
  131.     
  132.     /* start up file expansion and the % interpreter */
  133.  
  134.     intrp_init(tcbuf);
  135.     
  136.     /* now make sure we have a current working directory */
  137.  
  138.     if (!checkflag)
  139.     cwd_check();
  140.     
  141.     /* now that we know where to save things, cd to news directory */
  142.  
  143.     if (chdir(spool)) {
  144.     printf(nocd,spool) FLUSH;
  145.     finalize(1);
  146.     }
  147.  
  148.     /* if we aren't just checking, turn off echo */
  149.  
  150.     if (!checkflag)
  151.     term_set(tcbuf);
  152.  
  153.     /* get info on last rn run, if any */
  154.  
  155.     if (!checkflag)
  156.     last_init(tcbuf);
  157.  
  158.     free(tcbuf);            /* recover 1024 bytes */
  159.  
  160.     /* make sure we are the sole possessors of .newsrc */
  161.  
  162.     if (!checkflag)
  163.     lock_check();
  164.  
  165.     /* check for news news */
  166.  
  167.     if (!checkflag)
  168.     newsnews_check();
  169.  
  170. #ifdef SERVER
  171.  
  172.     /* open connection to server if appropriate */
  173.  
  174.     server = getserverbyfile(SERVER_FILE);
  175.     if (server == NULL) {
  176.     fprintf(stderr, "Can't get the name of the news server from %s\n",
  177.         SERVER_FILE);
  178.     fprintf(stderr,
  179.       "Either fix this file, or put NNTPSERVER in your environment.\n");
  180.     finalize(1);
  181.     }
  182.  
  183.     response = server_init(server);
  184.     if (response < 0) {
  185.     fprintf(stderr,
  186.         "Couldn't connect to %s news server, try again later.\n",
  187.         server);
  188.     finalize(1);
  189.     }
  190.  
  191.     if (handle_server_response(response, server) < 0)
  192.     finalize(1);
  193.  
  194. #endif
  195.  
  196.     /* open active file, etc. */
  197.  
  198.     ngdata_init();
  199.  
  200.     /* now read in the .newsrc file */
  201.  
  202.     foundany = rcstuff_init();
  203.  
  204.     /* it looks like we will actually read something, so init everything */
  205.  
  206.     addng_init();
  207.     art_init();
  208.     artio_init();
  209.     artsrch_init();
  210.     backpage_init();
  211.     bits_init();
  212.     cheat_init();
  213.     head_init();
  214.     help_init();
  215.     kfile_init();
  216.     ng_init();
  217.     ngsrch_init();
  218.     ngstuff_init();
  219.     only_init();
  220.     rcln_init();
  221.     respond_init();
  222.     rn_init();
  223.     search_init();
  224. #ifdef USETHREADS
  225.     thread_init();
  226. #endif
  227.     util_init();
  228.  
  229. #ifdef FINDNEWNG
  230. /*  fstat(actfp->_file,&filestat);    ... does not work on Apollos */
  231.     fstat(fileno(actfp),&filestat);    /* did active file grow? */
  232.     /*
  233.      * Skip this check if the -q flag was given.
  234.      */
  235.     
  236.     if (!quickstart && filestat.st_size != lastactsiz) {
  237.     long actsiz = filestat.st_size;    /* remember new size */
  238.     NG_NUM oldnext = nextrcline;    /* remember # lines in newsrc */
  239. #ifdef FASTNEW
  240.     bool munged = writesoft || !lastactsiz;
  241.                     /* bad soft ptrs -> edited active */
  242. #else
  243.     bool munged = TRUE;        /* just assume .newsrc munged */
  244. #endif
  245.  
  246. #ifdef VERBOSE
  247.     IF(verbose)
  248.         fputs("\nChecking active list for new newsgroups...\n",stdout)
  249.           FLUSH;
  250.     ELSE
  251. #endif
  252. #ifdef TERSE
  253.         fputs("\nNew newsgroups:\n",stdout) FLUSH;
  254. #endif
  255. #ifdef FASTNEW
  256.     if (!munged) {            /* maybe just do tail of file? */
  257.         fseek(actfp,lastactsiz-NL_SIZE,0);
  258.         fgets(buf,LBUFLEN,actfp);
  259.         munged = (*buf != '\n');
  260.         if (!munged)
  261.         munged = newlist(munged,FALSE);
  262.     }
  263. #endif
  264.     if (munged) {            /* must we scan entire file? */
  265.         fseek(actfp,0L,0);        /* rewind active file */
  266.         newlist(munged,FALSE);      /* sure hope they use hashing... */
  267.     }
  268.     lastactsiz = actsiz;        /* remember for .rnlast */
  269.     if (nextrcline != oldnext) {    /* did we add any new groups? */
  270.         foundany = TRUE;        /* let main() know */
  271.         starthere = 0;              /* and start ng scan from the top */
  272.     }
  273.     }
  274. #endif
  275.     time(&lasttime);            /* remember when we inited-- */
  276.                     /* ends up back in .rnlast */
  277.     writelast();                       /* in fact, put it there now */
  278.     
  279. #ifdef FINDNEWNG
  280. # ifdef ONLY
  281.     if (maxngtodo)            /* patterns on command line? */
  282.     foundany |= scanactive();
  283. # endif
  284. #endif
  285.  
  286.     return foundany;
  287. }
  288.  
  289. /* make sure there is no rn out there already */
  290.  
  291. void
  292. lock_check()
  293. {
  294.     lockname = savestr(filexp(LOCKNAME));
  295.     if (!checkflag) {
  296.     tmpfp = fopen(lockname,"r");
  297.     if (tmpfp != Nullfp) {
  298.         int processnum;
  299.     
  300.         fgets(buf,LBUFLEN,tmpfp);
  301.         fclose(tmpfp);
  302.         processnum = atoi(buf);
  303. #ifdef VERBOSE
  304.         IF(verbose)
  305.         printf("You seem to have left a trn running, process %d.\n",
  306.             processnum) FLUSH;
  307.         ELSE
  308. #endif
  309. #ifdef TERSE
  310.         printf("Trn left running, #%d.\n", processnum) FLUSH;
  311. #endif
  312.         if (kill(processnum, SIGEMT)) {
  313.                     /* does process not exist? */
  314.                     /* (rn ignores SIGEMT) */
  315.         sleep(2);
  316. #ifdef VERBOSE
  317.         IF(verbose)
  318.             fputs("\n\
  319. That process does not seem to exist anymore.  The count of read articles\n\
  320. may be incorrect in the last newsgroup accessed by that other (defunct)\n\
  321. process.\n\n",stdout) FLUSH;
  322.         ELSE
  323. #endif
  324. #ifdef TERSE
  325.             fputs("\nProcess crashed.\n",stdout) FLUSH;
  326. #endif
  327.         if (*lastngname) {
  328. #ifdef VERBOSE
  329.             IF(verbose)
  330.             printf("(The last newsgroup accessed was %s.)\n\n",
  331.             lastngname) FLUSH;
  332.             ELSE
  333. #endif
  334. #ifdef TERSE
  335.             printf("(In %s.)\n\n",lastngname) FLUSH;
  336. #endif
  337.         }
  338.         get_anything();
  339.         putchar('\n') FLUSH;
  340.         }
  341.         else {
  342. #ifdef VERBOSE
  343.         IF(verbose)
  344.             fputs("\n\
  345. You may not have two copies of [t]rn running simultaneously.  Goodbye.\n\
  346. ",stdout) FLUSH;
  347.         ELSE
  348. #endif
  349. #ifdef TERSE
  350.             fputs("\nCan't start another.\n",stdout) FLUSH;
  351. #endif
  352.                if (bizarre)
  353.                  resetty();
  354.         exit(0);
  355.         }
  356.     }
  357.     tmpfp = fopen(lockname,"w");
  358.     if (tmpfp == Nullfp) {
  359.         printf(cantcreate,lockname) FLUSH;
  360.         sig_catcher(0);
  361.     }
  362.     fprintf(tmpfp,"%d\n",getpid());
  363.     fclose(tmpfp);
  364.     }
  365. }
  366.  
  367. void
  368. newsnews_check()
  369. {
  370.     char *newsnewsname = filexp(NEWSNEWSNAME);
  371.  
  372.     if ((tmpfp = fopen(newsnewsname,"r")) != Nullfp) {
  373. /*    fstat(tmpfp->_file,&filestat);   .... does not work on Apollos */
  374.     fstat(fileno(tmpfp),&filestat);
  375.     if (filestat.st_mtime > lasttime) {
  376.         while (fgets(buf,sizeof(buf),tmpfp) != Nullch)
  377.         fputs(buf,stdout) FLUSH;
  378.         get_anything();
  379.         putchar('\n') FLUSH;
  380.     }
  381.     fclose(tmpfp);
  382.     }
  383. }
  384.