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

Defined functions

findact defined in line 94; used 3 times
getabsfirst defined in line 139; used 3 times
getngmin defined in line 174; used 4 times
getngsize defined in line 42; used 6 times
ngdata_init defined in line 20; used 2 times
Last modified: 1985-06-21
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1329
Valid CSS Valid XHTML 1.0 Strict