Rn bug patch #22 (REPOSTED)
Jonathan Biggar
jonab at sdcrdcf.UUCP
Sat Nov 17 10:06:20 AEST 1984
System: rn version 4.1
Bug #: 22
Priority: LOW
Subject: unread article count can get off when articles expire
Index: bits.c
Prereq: 4.1
From: uddeborg at chalmers.UUCP (G|ran Uddeborg)
Description:
Rn makes a faulty assumption about the read/unread status of
certain expired articles when entering a newsgroup, with the
result that the number of articles reported as remaining to be read
will be low, and possibly even negative. This doesn't hurt anything
in particular, but it is somewhat disconcerting.
Repeat-By:
Find a newsgroup in which the first existing article is followed
by a range of expired articles. If for instance, you have a newsgroup
in which article 100 exists, as well as articles 200-300, edit your
.newsrc to read:
net.blurfl: 1-100,110-190,200-299
If you then enter this newsgroup with rn, in trying to process
expired articles 101-199 it will forget that you have read 110-190,
and count them twice when it marks 101-199 as read. In this example
you would end up with rn saying there are about -80 unread articles.
Fix: From rn, say "| patch -d DIR", where DIR is your rn source directory.
Outside of rn, say "cd DIR; patch <thisarticle". If you don't have
the patch program, apply the following by hand, or get patch.
*** /tmp/,RCSt1015166 Wed Oct 31 12:01:42 1984
--- /tmp/,RCSt2015166 Wed Oct 31 12:01:45 1984
***************
*** 1,4
! /* $Header: bits.c,v 4.1 84/09/24 11:43:17 lwall Exp $
*
* $Log: bits.c,v $
* Revision 4.1 84/09/24 11:43:17 lwall
--- 1,4 -----
! /* $Header: bits.c,v 4.1.1.2 84/10/31 11:58:50 lwall Exp $
*
* $Log: bits.c,v $
* Revision 4.1.1.2 84/10/31 11:58:50 lwall
***************
*** 1,6
/* $Header: bits.c,v 4.1 84/09/24 11:43:17 lwall Exp $
*
* $Log: bits.c,v $
* Revision 4.1 84/09/24 11:43:17 lwall
* Real baseline.
*
--- 1,14 -----
/* $Header: bits.c,v 4.1.1.2 84/10/31 11:58:50 lwall Exp $
*
* $Log: bits.c,v $
+ * Revision 4.1.1.2 84/10/31 11:58:50 lwall
+ * initctl() wrongly assumed that expired articles were unread when trying
+ * to adjust firstart, and misadjusted toread[ng]. toread[ng] is now
+ * recomputed from scratch.
+ *
+ * Revision 4.1.1.1 84/09/25 13:20:31 lwall
+ * Branch for sdcrdcf changes.
+ *
* Revision 4.1 84/09/24 11:43:17 lwall
* Real baseline.
*
***************
*** 370,375
char *mybuf = buf; /* place to decode rc line */
register char *s, *c, *h;
register long i;
#ifdef DELAYMARK
dmcount = 0;
--- 378,384 -----
char *mybuf = buf; /* place to decode rc line */
register char *s, *c, *h;
register long i;
+ register ART_NUM unread;
#ifdef DELAYMARK
dmcount = 0;
***************
*** 403,409
else
firstart = 1; /* all the bits are valid for now */
if (absfirst > firstart) { /* do we know already? */
- toread[ng] -= (ART_UNREAD)(absfirst - firstart);
firstart = absfirst; /* no point calling getngmin again */
}
else if (artopen(firstart) == Nullfp) {
--- 412,417 -----
else
firstart = 1; /* all the bits are valid for now */
if (absfirst > firstart) { /* do we know already? */
firstart = absfirst; /* no point calling getngmin again */
}
else if (artopen(firstart) == Nullfp) {
***************
*** 410,416
/* first unread article missing? */
i = getngmin(".",firstart); /* see if expire has been busy */
if (i) { /* avoid a bunch of extra opens */
- toread[ng] -= (ART_UNREAD)(i - firstart);
firstart = i;
}
}
--- 418,423 -----
/* first unread article missing? */
i = getngmin(".",firstart); /* see if expire has been busy */
if (i) { /* avoid a bunch of extra opens */
firstart = i;
}
}
***************
*** 419,424
subj_to_get = firstart;
# endif
#endif
for (i=OFFSET(firstart)/BITSPERBYTE; i<ctlsize; i++)
ctlarea[i] = 0; /* assume unread */
#ifdef DEBUGGING
--- 426,432 -----
subj_to_get = firstart;
# endif
#endif
+ unread = lastart - firstart + 1; /* assume this range unread */
for (i=OFFSET(firstart)/BITSPERBYTE; i<ctlsize; i++)
ctlarea[i] = 0; /* assume unread */
#ifdef DEBUGGING
***************
*** 442,447
min = firstart;
if (max > lastart)
max = lastart;
for (i=min; i<=max; i++) /* for all articles in range */
/*NOSTRICT*/
ctl_set(i); /* mark them read */
--- 450,457 -----
min = firstart;
if (max > lastart)
max = lastart;
+ if (min <= max) /* non-null range? */
+ unread -= max - min + 1;/* adjust unread count */
for (i=min; i<=max; i++) /* for all articles in range */
/*NOSTRICT*/
ctl_set(i); /* mark them read */
***************
*** 446,452
/*NOSTRICT*/
ctl_set(i); /* mark them read */
}
! else if ((i = atol(s)) >= firstart && i <= lastart)
/* is single number reasonable? */
/*NOSTRICT*/
ctl_set(i); /* mark it read */
--- 456,462 -----
/*NOSTRICT*/
ctl_set(i); /* mark them read */
}
! else if ((i = atol(s)) >= firstart && i <= lastart) {
/* is single number reasonable? */
/*NOSTRICT*/
ctl_set(i); /* mark it read */
***************
*** 450,455
/* is single number reasonable? */
/*NOSTRICT*/
ctl_set(i); /* mark it read */
#ifdef DEBUGGING
if (debug & DEB_CTLAREA_BITMAP) {
printf("\n%s\n",s);
--- 460,467 -----
/* is single number reasonable? */
/*NOSTRICT*/
ctl_set(i); /* mark it read */
+ unread--; /* decrement articles to read */
+ }
#ifdef DEBUGGING
if (debug & DEB_CTLAREA_BITMAP) {
printf("\n%s\n",s);
***************
*** 468,473
#endif
if (mybuf != buf)
free(mybuf);
return 0;
}
--- 480,486 -----
#endif
if (mybuf != buf)
free(mybuf);
+ toread[ng] = unread;
return 0;
}
More information about the Comp.sources.bugs
mailing list