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