Annotation of 43BSD/contrib/rn/init.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.