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