Annotation of 43BSDTahoe/new/rn/rcln.c, revision 1.1

1.1     ! root        1: /* $Header: rcln.c,v 4.3.1.3 86/11/04 15:57:03 lwall Exp $
        !             2:  *
        !             3:  * $Log:       rcln.c,v $
        !             4:  * Revision 4.3.1.3  86/11/04  15:57:03  lwall
        !             5:  * realloc attempted on unalloced area.
        !             6:  * 
        !             7:  * Revision 4.3.1.2  85/07/23  17:39:08  lwall
        !             8:  * Oops, was freeing a static buf on -c in checkexpired.
        !             9:  * 
        !            10:  * Revision 4.3.1.1  85/05/10  11:37:08  lwall
        !            11:  * Branch for patches.
        !            12:  * 
        !            13:  * Revision 4.3  85/05/01  11:45:36  lwall
        !            14:  * Baseline for release with 4.3bsd.
        !            15:  * 
        !            16:  */
        !            17: 
        !            18: #include "EXTERN.h"
        !            19: #include "common.h"
        !            20: #include "util.h"
        !            21: #include "rcstuff.h"
        !            22: #include "ngdata.h"
        !            23: #include "INTERN.h"
        !            24: #include "rcln.h"
        !            25: 
        !            26: void
        !            27: rcln_init()
        !            28: {
        !            29:     ;
        !            30: }
        !            31: 
        !            32: #ifdef CATCHUP
        !            33: void
        !            34: catch_up(ngx)
        !            35: NG_NUM ngx;
        !            36: {
        !            37:     char tmpbuf[128];
        !            38:     
        !            39: #ifdef VERBOSE
        !            40:     IF(verbose)
        !            41:        printf("\nMarking %s as all read.\n",rcline[ngx]) FLUSH;
        !            42:     ELSE
        !            43: #endif
        !            44: #ifdef TERSE
        !            45:        fputs("\nMarked read\n",stdout) FLUSH;
        !            46: #endif
        !            47:     sprintf(tmpbuf,"%s: 1-%ld", rcline[ngx],(long)getngsize(ngx));
        !            48:     free(rcline[ngx]);
        !            49:     rcline[ngx] = savestr(tmpbuf);
        !            50:     *(rcline[ngx] + rcnums[ngx] - 1) = '\0';
        !            51:     write_rc();
        !            52: }
        !            53: #endif
        !            54: 
        !            55: /* add an article number to a newsgroup, if it isn't already read */
        !            56: 
        !            57: int
        !            58: addartnum(artnum,ngnam)
        !            59: ART_NUM artnum;
        !            60: char *ngnam;
        !            61: {
        !            62:     register NG_NUM ngnum = find_ng(ngnam);
        !            63:     register char *s, *t, *maxt = Nullch;
        !            64:     ART_NUM min = 0, max = -1, lastnum = 0;
        !            65:     char *mbuf;
        !            66:     bool morenum;
        !            67: 
        !            68:     if (!artnum)
        !            69:        return 0;
        !            70:     if (ngnum == nextrcline || !rcnums[ngnum])
        !            71:                                        /* not found in newsrc? */
        !            72:        return 0;
        !            73: #ifdef CACHEFIRST
        !            74:     if (!abs1st[ngnum])
        !            75: #else
        !            76:     if (!toread[ngnum])
        !            77: #endif
        !            78:                                        /* now is a good time to trim down */
        !            79:        set_toread(ngnum);              /* the list due to expires if we */
        !            80:                                        /* have not yet. */
        !            81: #ifdef DEBUGGING
        !            82:     if (artnum > ngmax[ngnum] + 10     /* allow for incoming articles */
        !            83:        ) {
        !            84:        printf("\nCorrupt Xref line!!!  %ld --> %s(1..%ld)\n",
        !            85:            artnum,ngnam,
        !            86:            ngmax[ngnum]) FLUSH;
        !            87:        paranoid = TRUE;                /* paranoia reigns supreme */
        !            88:        return -1;                      /* hope this was the first newsgroup */
        !            89:     }
        !            90: #endif
        !            91: 
        !            92:     if (toread[ngnum] == TR_BOGUS)
        !            93:        return 0;
        !            94: #ifdef DEBUGGING
        !            95:     if (debug & DEB_XREF_MARKER) {
        !            96:        printf("%ld->\n%s%c%s\n",(long)artnum,rcline[ngnum],rcchar[ngnum],
        !            97:          rcline[ngnum] + rcnums[ngnum]) FLUSH;
        !            98:     }
        !            99: #endif
        !           100:     s = rcline[ngnum] + rcnums[ngnum];
        !           101:     while (*s == ' ') s++;             /* skip spaces */
        !           102:     t = s;
        !           103:     while (isdigit(*s) && artnum >= (min = atol(s))) {
        !           104:                                        /* while it might have been read */
        !           105:        for (t = s; isdigit(*t); t++) ; /* skip number */
        !           106:        if (*t == '-') {                /* is it a range? */
        !           107:            t++;                        /* skip to next number */
        !           108:            if (artnum <= (max = atol(t)))
        !           109:                return 0;               /* it is in range => already read */
        !           110:            lastnum = max;              /* remember it */
        !           111:            maxt = t;                   /* remember position in case we */
        !           112:                                        /* want to overwrite the max */
        !           113:            while (isdigit(*t)) t++;    /* skip second number */
        !           114:        }
        !           115:        else {
        !           116:            if (artnum == min)          /* explicitly a read article? */
        !           117:                return 0;
        !           118:            lastnum = min;              /* remember what the number was */
        !           119:            maxt = Nullch;              /* last one was not a range */
        !           120:        }
        !           121:        while (*t && !isdigit(*t)) t++; /* skip comma and any spaces */
        !           122:        s = t;
        !           123:     }
        !           124:     
        !           125:     /* we have not read it, so insert the article number before s */
        !           126:     
        !           127:     morenum = isdigit(*s);             /* will it need a comma after? */
        !           128:     *(rcline[ngnum] + rcnums[ngnum] - 1) = rcchar[ngnum];
        !           129:     mbuf = safemalloc((MEM_SIZE)(strlen(s) + (s-rcline[ngnum]) + 8));
        !           130:     strcpy(mbuf,rcline[ngnum]);                /* make new rc line */
        !           131:     if (maxt && lastnum && artnum == lastnum+1)
        !           132:                                        /* can we just extend last range? */
        !           133:        t = mbuf + (maxt-rcline[ngnum]);/* then overwrite previous max */
        !           134:     else {
        !           135:        t = mbuf + (t-rcline[ngnum]);   /* point t into new line instead */
        !           136:        if (lastnum) {                  /* have we parsed any line? */
        !           137:            if (!morenum)               /* are we adding to the tail? */
        !           138:                *t++ = ',';             /* supply comma before */
        !           139:            if (!maxt && artnum == lastnum+1 && *(t-1) == ',')
        !           140:                                        /* adjacent singletons? */
        !           141:                *(t-1) = '-';           /* turn them into a range */
        !           142:        }
        !           143:     }
        !           144:     if (morenum) {                     /* is there more to life? */
        !           145:        if (min == artnum+1) {          /* can we consolidate further? */
        !           146:            bool range_before = (*(t-1) == '-');
        !           147:            bool range_after;
        !           148:            char *nextmax;
        !           149: 
        !           150:            for (nextmax = s; isdigit(*nextmax); nextmax++) ;
        !           151:            range_after = *nextmax++ == '-';
        !           152:            
        !           153:            if (range_before)
        !           154:                *t = '\0';              /* artnum is redundant */
        !           155:            else
        !           156:                sprintf(t,"%ld-",(long)artnum);/* artnum will be new min */
        !           157:            
        !           158:            if (range_after)
        !           159:                s = nextmax;            /* *s is redundant */
        !           160:        /*  else
        !           161:                s = s */                /* *s is new max */
        !           162:        }
        !           163:        else
        !           164:            sprintf(t,"%ld,",(long)artnum);     /* put the number and comma */
        !           165:     }
        !           166:     else
        !           167:        sprintf(t,"%ld",(long)artnum);  /* put the number there (wherever) */
        !           168:     strcat(t,s);                       /* copy remainder of line */
        !           169: #ifdef DEBUGGING
        !           170:     if (debug & DEB_XREF_MARKER) {
        !           171:        printf("%s\n",mbuf) FLUSH;
        !           172:     }
        !           173: #endif
        !           174:     free(rcline[ngnum]);
        !           175:     rcline[ngnum] = mbuf;              /* pull the switcheroo */
        !           176:     *(rcline[ngnum] + rcnums[ngnum] - 1) = '\0';
        !           177:                                        /* wipe out : or ! */
        !           178:     if (toread[ngnum] > TR_NONE)       /* lest we turn unsub into bogus */
        !           179:        --toread[ngnum];
        !           180:     return 0;
        !           181: }
        !           182: 
        !           183: #ifdef MCHASE
        !           184: /* delete an article number from a newsgroup, if it is there */
        !           185: 
        !           186: void
        !           187: subartnum(artnum,ngnam)
        !           188: register ART_NUM artnum;
        !           189: char *ngnam;
        !           190: {
        !           191:     register NG_NUM ngnum = find_ng(ngnam);
        !           192:     register char *s, *t;
        !           193:     register ART_NUM min, max;
        !           194:     char *mbuf;
        !           195:     int curlen;
        !           196: 
        !           197:     if (!artnum)
        !           198:        return;
        !           199:     if (ngnum == nextrcline || !rcnums[ngnum])
        !           200:        return;                         /* not found in newsrc? */
        !           201: #ifdef DEBUGGING
        !           202:     if (debug & DEB_XREF_MARKER) {
        !           203:        printf("%ld<-\n%s%c%s\n",(long)artnum,rcline[ngnum],rcchar[ngnum],
        !           204:          rcline[ngnum] + rcnums[ngnum]) FLUSH;
        !           205:     }
        !           206: #endif
        !           207:     s = rcline[ngnum] + rcnums[ngnum];
        !           208:     while (*s == ' ') s++;             /* skip spaces */
        !           209:     
        !           210:     /* a little optimization, since it is almost always the last number */
        !           211:     
        !           212:     for (t=s; *t; t++) ;               /* find end of string */
        !           213:     curlen = t-rcline[ngnum];
        !           214:     for (t--; isdigit(*t); t--) ;      /* find previous delim */
        !           215:     if (*t == ',' && atol(t+1) == artnum) {
        !           216:        *t = '\0';
        !           217:        if (toread[ngnum] >= TR_NONE)
        !           218:            ++toread[ngnum];
        !           219: #ifdef DEBUGGING
        !           220:        if (debug & DEB_XREF_MARKER)
        !           221:            printf("%s%c %s\n",rcline[ngnum],rcchar[ngnum],s) FLUSH;
        !           222: #endif
        !           223:        return;
        !           224:     }
        !           225: 
        !           226:     /* not the last number, oh well, we may need the length anyway */
        !           227: 
        !           228:     while (isdigit(*s) && artnum >= (min = atol(s))) {
        !           229:                                        /* while it might have been read */
        !           230:        for (t = s; isdigit(*t); t++) ; /* skip number */
        !           231:        if (*t == '-') {                /* is it a range? */
        !           232:            t++;                        /* skip to next number */
        !           233:            max = atol(t);
        !           234:            while (isdigit(*t)) t++;    /* skip second number */
        !           235:            if (artnum <= max) {
        !           236:                                        /* it is in range => already read */
        !           237:                if (artnum == min) {
        !           238:                    min++;
        !           239:                    artnum = 0;
        !           240:                }
        !           241:                else if (artnum == max) {
        !           242:                    max--;
        !           243:                    artnum = 0;
        !           244:                }
        !           245:                *(rcline[ngnum] + rcnums[ngnum] - 1) = rcchar[ngnum];
        !           246:                mbuf = safemalloc((MEM_SIZE)(curlen + (artnum?15:2)));
        !           247:                *s = '\0';
        !           248:                strcpy(mbuf,rcline[ngnum]);     /* make new rc line */
        !           249:                s = mbuf + (s-rcline[ngnum]);
        !           250:                                        /* point s into mbuf now */
        !           251:                if (artnum) {           /* split into two ranges? */
        !           252:                    prange(s,min,artnum-1);
        !           253:                    s += strlen(s);
        !           254:                    *s++ = ',';
        !           255:                    prange(s,artnum+1,max);
        !           256:                }
        !           257:                else                    /* only one range */
        !           258:                    prange(s,min,max);
        !           259:                s += strlen(s);
        !           260:                strcpy(s,t);            /* copy remainder over */
        !           261: #ifdef DEBUGGING
        !           262:                if (debug & DEB_XREF_MARKER) {
        !           263:                    printf("%s\n",mbuf) FLUSH;
        !           264:                }
        !           265: #endif
        !           266:                free(rcline[ngnum]);
        !           267:                rcline[ngnum] = mbuf;   /* pull the switcheroo */
        !           268:                *(rcline[ngnum] + rcnums[ngnum] - 1) = '\0';
        !           269:                                        /* wipe out : or ! */
        !           270:                if (toread[ngnum] >= TR_NONE)
        !           271:                    ++toread[ngnum];
        !           272:                return;
        !           273:            }
        !           274:        }
        !           275:        else {
        !           276:            if (artnum == min) {        /* explicitly a read article? */
        !           277:                if (*t == ',')          /* pick a comma, any comma */
        !           278:                    t++;
        !           279:                else if (s[-1] == ',')
        !           280:                    s--;
        !           281:                else if (s[-2] == ',')  /* (in case of space) */
        !           282:                    s -= 2;
        !           283:                strcpy(s,t);            /* no need to realloc */
        !           284:                if (toread[ngnum] >= TR_NONE)
        !           285:                    ++toread[ngnum];
        !           286: #ifdef DEBUGGING
        !           287:                if (debug & DEB_XREF_MARKER) {
        !           288:                    printf("%s%c%s\n",rcline[ngnum],rcchar[ngnum],
        !           289:                      rcline[ngnum] + rcnums[ngnum]) FLUSH;
        !           290:                }
        !           291: #endif
        !           292:                return;
        !           293:            }
        !           294:        }
        !           295:        while (*t && !isdigit(*t)) t++; /* skip comma and any spaces */
        !           296:        s = t;
        !           297:     }
        !           298: }
        !           299: 
        !           300: void
        !           301: prange(where,min,max)
        !           302: char *where;
        !           303: ART_NUM min,max;
        !           304: {
        !           305:     if (min == max)
        !           306:        sprintf(where,"%ld",(long)min);
        !           307:     else
        !           308:        sprintf(where,"%ld-%ld",(long)min,(long)max);
        !           309: }
        !           310: #endif
        !           311: 
        !           312: /* calculate the number of unread articles for a newsgroup */
        !           313: 
        !           314: void
        !           315: set_toread(ngnum)
        !           316: register NG_NUM ngnum;
        !           317: {
        !           318:     register char *s, *c, *h;
        !           319:     char tmpbuf[64], *mybuf = tmpbuf;
        !           320:     char *nums;
        !           321:     int length;
        !           322: #ifdef CACHEFIRST
        !           323:     bool virgin_ng = (!abs1st[ngnum]);
        !           324: #endif
        !           325:     ART_NUM ngsize = getngsize(ngnum);
        !           326:     ART_NUM unread = ngsize;
        !           327:     ART_NUM newmax;
        !           328: 
        !           329: #ifdef DEBUGGING
        !           330:     ngmax[ngnum] = ngsize;             /* for checking out-of-range Xrefs */
        !           331: #endif
        !           332:     if (ngsize == TR_BOGUS) {
        !           333:        printf("Warning!  Bogus newsgroup: %s\n",rcline[ngnum]) FLUSH;
        !           334:        paranoid = TRUE;
        !           335:        toread[ngnum] = TR_BOGUS;
        !           336:        return;
        !           337:     }
        !           338: #ifdef CACHEFIRST
        !           339:     if (virgin_ng)
        !           340: #else
        !           341:     if (!toread[ngnum])
        !           342: #endif
        !           343:     {
        !           344:        sprintf(tmpbuf," 1-%ld",(long)ngsize);
        !           345:        if (strNE(tmpbuf,rcline[ngnum]+rcnums[ngnum]))
        !           346:            checkexpired(ngnum,ngsize); /* this might realloc rcline */
        !           347:     }
        !           348:     nums = rcline[ngnum]+rcnums[ngnum];
        !           349:     length = strlen(nums);
        !           350:     if (length >= 60)
        !           351:        mybuf = safemalloc((MEM_SIZE)(length+5));
        !           352:     strcpy(mybuf,nums);
        !           353:     mybuf[length++] = ',';
        !           354:     mybuf[length] = '\0';
        !           355:     for (s = mybuf; isspace(*s); s++)
        !           356:            ;
        !           357:     for ( ; (c = index(s,',')) != Nullch ; s = ++c) {
        !           358:                                    /* for each range */
        !           359:        *c = '\0';                      /* keep index from running off */
        !           360:        if ((h = index(s,'-')) != Nullch)       /* find - in range, if any */
        !           361:            unread -= (newmax = atol(h+1)) - atol(s) + 1;
        !           362:        else if (newmax = atol(s))
        !           363:            unread--;           /* recalculate length */
        !           364:        if (newmax > ngsize) {  /* paranoia check */
        !           365:            unread = -1;
        !           366:            break;
        !           367:        }
        !           368:     }
        !           369:     if (unread >= 0)           /* reasonable number? */
        !           370:        toread[ngnum] = (ART_UNREAD)unread;
        !           371:                                        /* remember how many are left */
        !           372:     else {                             /* SOMEONE RESET THE NEWSGROUP!!! */
        !           373:        toread[ngnum] = (ART_UNREAD)ngsize;
        !           374:                                        /* assume nothing carried over */
        !           375:        printf("Warning!  Somebody reset %s--assuming nothing read.\n",
        !           376:            rcline[ngnum]) FLUSH;
        !           377:        *(rcline[ngnum] + rcnums[ngnum]) = '\0';
        !           378:        paranoid = TRUE;                /* enough to make a guy paranoid */
        !           379:     }
        !           380:     if (mybuf != tmpbuf)
        !           381:        free(mybuf);
        !           382:     if (rcchar[ngnum] == NEGCHAR)
        !           383:        toread[ngnum] = TR_UNSUB;
        !           384: }
        !           385: 
        !           386: /* make sure expired articles are marked as read */
        !           387: 
        !           388: void
        !           389: checkexpired(ngnum,ngsize)
        !           390: register NG_NUM ngnum;
        !           391: ART_NUM ngsize;
        !           392: {
        !           393:     register ART_NUM a1st = getabsfirst(ngnum,ngsize);
        !           394:     register char *s, *t;
        !           395:     register ART_NUM num, lastnum = 0;
        !           396:     char *mbuf, *newnum;
        !           397: 
        !           398:     if (a1st<=1)
        !           399:        return;
        !           400: #ifdef DEBUGGING
        !           401:     if (debug & DEB_XREF_MARKER) {
        !           402:        printf("1-%ld->\n%s%c%s\n",(long)(a1st-1),rcline[ngnum],rcchar[ngnum],
        !           403:          rcline[ngnum] + rcnums[ngnum]) FLUSH;
        !           404:     }
        !           405: #endif
        !           406:     for (s = rcline[ngnum] + rcnums[ngnum]; isspace(*s); s++);
        !           407:     while (*s && (num = atol(s)) <= a1st) {
        !           408:        while (isdigit(*s)) s++;
        !           409:        while (*s && !isdigit(*s)) s++;
        !           410:        lastnum = num;
        !           411:     }
        !           412:     if (*s) {
        !           413:        if (s[-1] == '-') {                     /* landed in a range? */
        !           414:            if (lastnum != 1)
        !           415:                sprintf(rcline[ngnum]+rcnums[ngnum]," 1-%s",s);
        !           416:            goto ret;
        !           417:        }
        !           418:     }
        !           419:     /* s now points to what should follow first range */
        !           420:     if (s - rcline[ngnum] > rcnums[ngnum] + 10) 
        !           421:        mbuf = rcline[ngnum];
        !           422:     else {
        !           423:        mbuf = safemalloc((MEM_SIZE)(rcnums[ngnum] + strlen(s) + 10));
        !           424:        strcpy(mbuf,rcline[ngnum]);
        !           425:     }
        !           426:     newnum = t = mbuf+rcnums[ngnum];
        !           427:     sprintf(t," 1-%ld",(long)(a1st - (lastnum != a1st)));
        !           428:     if (*s) {
        !           429:        t += strlen(t);
        !           430:        *t++ = ',';
        !           431:        strcpy(t,s);
        !           432:     }
        !           433:     if (!checkflag && mbuf == rcline[ngnum]) {
        !           434:        rcline[ngnum] = saferealloc(rcline[ngnum],
        !           435:            (MEM_SIZE)(rcnums[ngnum] + strlen(newnum) + 1));
        !           436:     }
        !           437:     else {
        !           438:        if (!checkflag)
        !           439:            free(rcline[ngnum]);
        !           440:        rcline[ngnum] = mbuf;
        !           441:     }
        !           442: 
        !           443: ret:;          /* semicolon in case DEBUGGING undefined */
        !           444: #ifdef DEBUGGING
        !           445:     if (debug & DEB_XREF_MARKER) {
        !           446:        printf("%s%c%s\n",rcline[ngnum],rcchar[ngnum],
        !           447:          rcline[ngnum] + rcnums[ngnum]) FLUSH;
        !           448:     }
        !           449: #endif
        !           450: }
        !           451: 

unix.superglobalmegacorp.com

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