Annotation of 43BSD/contrib/rn/ngdata.c, revision 1.1

1.1     ! root        1: /* $Header: ngdata.c,v 4.3 85/05/01 11:44:38 lwall Exp $
        !             2:  *
        !             3:  * $Log:       ngdata.c,v $
        !             4:  * Revision 4.3  85/05/01  11:44:38  lwall
        !             5:  * Baseline for release with 4.3bsd.
        !             6:  * 
        !             7:  */
        !             8: 
        !             9: #include "EXTERN.h"
        !            10: #include "common.h"
        !            11: #include "ndir.h"
        !            12: #include "rcstuff.h"
        !            13: #include "rn.h"
        !            14: #include "intrp.h"
        !            15: #include "final.h"
        !            16: #include "rcln.h"
        !            17: #include "INTERN.h"
        !            18: #include "ngdata.h"
        !            19: 
        !            20: void
        !            21: ngdata_init()
        !            22: {
        !            23: /* The following is only for systems that do not zero globals properly */
        !            24: #ifdef ZEROGLOB
        !            25: # ifdef CACHEFIRST
        !            26:     for (i=0; i<MAXRCLINE; i++)
        !            27:        abs1st[i] = 0;
        !            28: # endif
        !            29: #endif /* ZEROGLOB */
        !            30: 
        !            31:     /* open the active file */
        !            32: 
        !            33:     actfp = fopen(filexp(ACTIVE),"r");
        !            34:     if (actfp == Nullfp) {
        !            35:        printf(cantopen,filexp(ACTIVE)) FLUSH;
        !            36:        finalize(1);
        !            37:     }
        !            38: }
        !            39: 
        !            40: /* find the maximum article number of a newsgroup */
        !            41: 
        !            42: ART_NUM
        !            43: getngsize(num)
        !            44: register NG_NUM num;
        !            45: {
        !            46:     register int len;
        !            47:     register char *nam;
        !            48:     char tmpbuf[80];
        !            49:     ART_POS oldsoft;
        !            50: 
        !            51:     nam = rcline[num];
        !            52:     len = rcnums[num] - 1;
        !            53:     softtries++;
        !            54: #ifdef DEBUGGING
        !            55:     if (debug & DEB_SOFT_POINTERS)
        !            56:        printf("Softptr = %ld\n",(long)softptr[num]) FLUSH;
        !            57: #endif
        !            58:     oldsoft = softptr[num];
        !            59:     if ((softptr[num] = findact(tmpbuf, nam, len, (long)oldsoft)) >= 0) {
        !            60:        if (softptr[num] != oldsoft) {
        !            61:            softmisses++;
        !            62:            writesoft = TRUE;
        !            63:        }
        !            64:     }
        !            65:     else {
        !            66:        softptr[num] = 0;
        !            67:        if (rcchar[num] == ':')         /* unsubscribe quietly */
        !            68:            rcchar[num] = NEGCHAR;
        !            69:        return TR_BOGUS;                /* well, not so quietly, actually */
        !            70:     }
        !            71:        
        !            72: #ifdef DEBUGGING
        !            73:     if (debug & DEB_SOFT_POINTERS) {
        !            74:        printf("Should be %ld\n",(long)softptr[num]) FLUSH;
        !            75:     }
        !            76: #endif
        !            77: #ifdef MININACT
        !            78:     {
        !            79:        register char *s;
        !            80:        ART_NUM tmp;
        !            81: 
        !            82:        for (s=tmpbuf+len+1; isdigit(*s); s++) ;
        !            83:        if (tmp = atol(s))
        !            84: #ifdef CACHEFIRST
        !            85:            abs1st[num] = tmp;
        !            86: #else
        !            87:            abs1st = tmp;
        !            88: #endif
        !            89:     }
        !            90: #endif
        !            91:     return atol(tmpbuf+len+1);
        !            92: }
        !            93: 
        !            94: ACT_POS
        !            95: findact(outbuf,nam,len,suggestion)
        !            96: char *outbuf;
        !            97: char *nam;
        !            98: int len;
        !            99: long suggestion;
        !           100: {
        !           101:     ACT_POS retval;
        !           102: 
        !           103:     fseek(actfp,100000L,1);    /* hopefully this forces a reread */
        !           104:     if (suggestion == 0L || fseek(actfp,suggestion,0) < 0 ||
        !           105:       fgets(outbuf,80,actfp) == Nullch ||
        !           106:       outbuf[len] != ' ' ||
        !           107:       strnNE(outbuf,nam,len)) {
        !           108: #ifdef DEBUGGING
        !           109:        if (debug & DEB_SOFT_POINTERS)
        !           110:            printf("Missed, looking for %s in %sLen = %d\n",nam,outbuf,len)
        !           111:              FLUSH;
        !           112: #endif
        !           113:        fseek(actfp,0L,0);
        !           114: #ifndef lint
        !           115:        retval = (ACT_POS)ftell(actfp);
        !           116: #else
        !           117:        retval = Null(ACT_POS);
        !           118: #endif lint
        !           119:        while (fgets(outbuf,80,actfp) != Nullch) {
        !           120:            if (outbuf[len] == ' ' && strnEQ(outbuf,nam,len))
        !           121:                return retval;
        !           122: #ifndef lint
        !           123:            retval = (ACT_POS) ftell(actfp);
        !           124: #endif lint
        !           125:        }
        !           126:        return (ACT_POS) -1;            /* well, not so quietly, actually */
        !           127:     }
        !           128:     else
        !           129: #ifndef lint
        !           130:        return (ACT_POS) suggestion;
        !           131: #else
        !           132:        return retval;
        !           133: #endif lint
        !           134:     /*NOTREACHED*/
        !           135: }
        !           136: 
        !           137: /* determine the absolutely first existing article number */
        !           138: 
        !           139: ART_NUM
        !           140: getabsfirst(ngnum,ngsize)
        !           141: register NG_NUM ngnum;
        !           142: ART_NUM ngsize;
        !           143: {
        !           144:     register ART_NUM a1st;
        !           145: #ifndef MININACT
        !           146:     char dirname[MAXFILENAME];
        !           147: #endif
        !           148: 
        !           149: #ifdef CACHEFIRST
        !           150:     if (a1st = abs1st[ngnum])
        !           151:        return a1st;
        !           152: #endif
        !           153: #ifdef MININACT
        !           154:     getngsize(ngnum);
        !           155: # ifdef CACHEFIRST
        !           156:     return abs1st[ngnum];
        !           157: # else
        !           158:     return abs1st;
        !           159: # endif
        !           160: #else not MININACT
        !           161:     sprintf(dirname,"%s/%s",spool,getngdir(rcline[ngnum]));
        !           162:     a1st = getngmin(dirname,0L);
        !           163:     if (!a1st)                         /* nothing there at all? */
        !           164:        a1st = ngsize+1;                /* aim them at end of newsgroup */
        !           165: # ifdef CACHEFIRST
        !           166:     abs1st[ngnum] = a1st;
        !           167: # endif
        !           168:     return a1st;
        !           169: #endif MININACT
        !           170: }
        !           171: 
        !           172: /* scan a directory for minimum article number greater than floor */
        !           173: 
        !           174: ART_NUM
        !           175: getngmin(dirname,floor)
        !           176: char *dirname;
        !           177: ART_NUM floor;
        !           178: {
        !           179:     register DIR *dirp;
        !           180:     register struct direct *dp;
        !           181:     register ART_NUM min = 1000000;
        !           182:     register ART_NUM maybe;
        !           183:     register char *p;
        !           184:     char tmpbuf[128];
        !           185:     
        !           186:     dirp = opendir(dirname);
        !           187:     if (!dirp)
        !           188:        return 0;
        !           189:     while ((dp = readdir(dirp)) != Null(struct direct *)) {
        !           190:        if ((maybe = atol(dp->d_name)) < min && maybe > floor) {
        !           191:            for (p = dp->d_name; *p; p++)
        !           192:                if (!isdigit(*p))
        !           193:                    goto nope;
        !           194:            if (*dirname == '.' && !dirname[1])
        !           195:                stat(dp->d_name, &filestat);
        !           196:            else {
        !           197:                sprintf(tmpbuf,"%s/%s",dirname,dp->d_name);
        !           198:                stat(tmpbuf, &filestat);
        !           199:            }
        !           200:            if (! (filestat.st_mode & S_IFDIR))
        !           201:                min = maybe;
        !           202:        }
        !           203:       nope:
        !           204:        ;
        !           205:     }
        !           206:     closedir(dirp);
        !           207:     return min==1000000 ? 0 : min;
        !           208: }
        !           209: 

unix.superglobalmegacorp.com

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