Subject: Re: TRN/INN Repeatedly asking about same "new" newsgroups

From: [email-masked] (Michael Hucka)
Date: 07 Feb 1996 20:11:33 -0500

>>>>> On 7 Feb 1996, [email-masked] (Todd D. Taft) wrote:

  taft> Recently our news reader programs (primarily trn) have started
  taft> telling our users that new newsgroups have been created, and asking
  taft> users if they would like to subscribe to these certain newsgroups
  taft> every time that they start up the program.  It will only ask about
  taft> newsgroups that are not listed in the user's .newsrc file, but it
  taft> won't ask about every newsgroup not listed in the .newsrc file.  The
  taft> only pattern that I can detect is that the ones that users keep
  taft> getting prompted about have been newgrouped on our server relatively
  taft> recently.  Our server used to allow users to list only the newsgroups

  taft> .... [rest deleted] ....

This kind of sounds like the trn leap year bug.  Attached is the patch 
posted last month:

 From: [email-masked] ( Anne Bennett )
 Subject: Re: trn-3.4.1 keeps asking about new groups!
 Date: 11 Jan 1996 20:44:37 GMT
 Newsgroups: news.software.readers,news.admin.misc,news.software.nntp
 Organization: Concordia University, Montreal, Canada
 Lines: 124
 Message-ID: <[email-masked]>
 References: <[email-masked]> <[email-masked]> <[email-masked]>

I wrote:

> That patch is not correct [...]
> A better patch is being
> elaborated on the trn testers' mailing list.  I can post it here when
> it's done.

1)  I was wrong; the patch was OK, at least until 2100.  I re-append it here
    as the "simple patch".
2)  A more correct but more complicated patch, appended here as "fancy
    patch", was submitted, which will work until 2400.

Wayne Davison, author of trn, writes that he will go with the simple patch
because the resulting calculation is faster, and he hopes no-one will still
be using trn in the year 2100.  :-)   I am using the fancy patch at my site.

Pick your own favourite; either will work.  BTW, you should have no trouble
applying these patches to strn-0.9.2, if that's what you're using, though
the line numbers are for trn-3.6.

Anne.
--
Ms. Anne Bennett          [email-masked]            (514) 848-7606
Computing Services,   Concordia University,   Montreal QC,   Canada H3G 1M8
(Administrator for Concordia University mail relay and news transfer) 
----------------------------------------------------------------------------
SIMPLE PATCH THAT WORKS UNTIL 2100

Submitted by Miquel van Smoorenburg <[email-masked]>, reposted
to trn-test list by [email-masked] (John Line)>

===== the patch (to nntp.c, line numbers are for trn 3.6)

------- nntp.c -------
*** /tmp/da005NK	Thu Jan  1 00:00:00 1970
--- nntp.c	Wed Jan  3 20:43:11 1996
***************
*** 319,326 ****
      for (month--; month; month--)
  	day += maxdays[month];

!     ss = ((((year-1970) * 365 + (year-1968)/4 + day - 1) * 24L + hh) * 60
! 	  + mm) * 60 + ss;

      return ss;
  }
--- 319,326 ----
      for (month--; month; month--)
  	day += maxdays[month];

!     ss = ((((year-1970) * 365 + (year-1969)/4 + day - 1) * 24L + hh) * 60
!         + mm) * 60 + ss;

      return ss;
  }

----------------------------------------------------------------------------
FANCY PATCH THAT WORKS UNTIL 2400

From: [email-masked] (Paul Close)
Subject: Re: trn (3.6 & 4.0-test38) listing "new groups" that aren't new
To: [email-masked] (TRN mailing list)
Date: Fri, 5 Jan 1996 16:43:27 -0800 (PST)

Okay, here's my fix.  This uses a proper leap year calculation, and should
work for a very long time :-)

--- trn-3.6/nntp.c	Fri Nov 18 22:01:23 1994
+++ nntp.c.leap	Fri Jan  5 16:38:33 1996
@@ -285,12 +285,13 @@
 
 /* This is a 1-relative list */
 static int maxdays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
 
 time_t
 nntp_time()
 {
     char *s;
-    int year, month, day, hh, mm;
+    int year, month, day, hh, mm, y;
     time_t ss;
 
     nntp_command("XDATE" + (CompliantServer? 0 : 1));
@@ -306,11 +307,11 @@
     s[4] = '\0';
     year = atoi(s);
 
-    /* This simple algorithm will be valid until the year 2400 */
-    if (year % 4)
-	maxdays[2] = 28;
-    else
+    if (isleap(year))
 	maxdays[2] = 29;
+    else
+	maxdays[2] = 28;
+
     if (month < 1 || month > 12 || day < 1 || day > maxdays[month]
      || hh < 0 || hh > 23 || mm < 0 || mm > 59
      || ss < 0 || ss > 59)
@@ -319,8 +320,12 @@
     for (month--; month; month--)
 	day += maxdays[month];
 
-    ss = ((((year-1970) * 365 + (year-1968)/4 + day - 1) * 24L + hh) * 60
-	  + mm) * 60 + ss;
+    for (y = 1970; y < year; y++)
+	if (isleap(y))
+	    day += 366;
+	else
+	    day += 365;
+    ss += (((day - 1) * 24L + hh) * 60 + mm) * 60;
 
     return ss;
 }

----------------------------------------------------------------------------
-- 
Mike Hucka                   University of Michigan Artificial Intelligence Lab
[email-masked] (X.500)            and EECS Departmental Computing Organization
http://ai.eecs.umich.edu/people/hucka/        Ann Arbor, Michigan 48109, U.S.A.