Annotation of 43BSD/contrib/nntp/rrn/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:  * 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: 

unix.superglobalmegacorp.com

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