diff 3rdparty/packages/uucpbb/src/expgroup.c @ 1772:5ba8e711a1a3

source added
author boisy
date Fri, 01 Apr 2005 22:04:25 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3rdparty/packages/uucpbb/src/expgroup.c	Fri Apr 01 22:04:25 2005 +0000
@@ -0,0 +1,193 @@
+/*  expgroup.c   This routine deletes a newsgroup's old articles.
+    Copyright (C) 1990, 1993  Rick Adams and Bob Billson
+
+    This file is part of the OS-9 UUCP package, UUCPbb.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+    The author of UUCPbb, Bob Billson, can be contacted at:
+    bob@kc2wz.bubble.org  or  uunet!kc2wz!bob  or  by snail mail:
+    21 Bates Way, Westfield, NJ 07090
+*/
+
+#include "uucp.h"
+#include <modes.h>
+#include <direct.h>
+#include <time.h>
+
+#define BRUTE_LIMIT  32                         /* EK */
+
+extern QQ int expireflag, debuglvl;             /* made direct page -- REB */
+extern QQ FILE *log;                            /* Added -- REB */
+extern char sender[];                           /*              */
+extern struct active groups[];
+
+
+int expgroup (grp, limit)
+struct active *grp;
+int limit;                           /* how many days old the article needs */
+{                                    /* be before it is expired.            */
+     char filename[33];
+     int age, min, mid, max;                                     /* EK */
+     register int i;
+     struct fildes finfo;
+     struct sgtbuf date;
+
+     /* get today's date and time */
+     getime (&date);
+
+     /* expire articles */
+
+     /* Use brute force if less than BRUTE_LIMIT articles exist. */
+     if (grp->seq - grp->index < BRUTE_LIMIT)
+       {
+          if (debuglvl > 3)
+               fputs ("expgroup: using brute-force to expire articles\n",
+                      log);
+
+          /* expire articles -- brute force, linear search */
+          for (i = grp->index;  i <= grp->seq;  i++)
+            {
+               /* get filename */
+               sprintf (filename, "a%d", i);
+
+               if (debuglvl > 3)
+                    fprintf (log, "expgroup: checking article %s\n",
+                                  filename);
+
+               /* was the article already deleted? */
+               if ((age = getage (filename, &date)) == ERROR)
+                 {
+                    if (debuglvl > 3)
+                         fprintf (log, "expire: unable to get age of article: %s\n",
+                                       filename);
+                    continue;
+                 }
+
+               if (age > limit)
+                 {
+                    if (debuglvl > 2)
+                         fprintf (log, "%s %s expiring %s\n",
+                                       sender, gtime(), filename);
+
+                    if (expireflag)
+                         unlink (filename);
+                    else
+                         fprintf (log, "article %s/%s would have been deleted\n",
+                                  grp->newsgroup, filename);
+                 }
+               else
+                 {
+                    if (!expireflag)                 /* added --REB */
+                         fprintf (log, "article %s/%s too new\n",
+                                  grp->newsgroup, filename);
+
+                    break;                /* Found first non-expirable file */
+                 }
+            }
+       }
+     else
+       {
+          /* expire articles -- binary search */
+          min = grp->index;
+          max = grp->seq;
+
+          if (debuglvl > 3)
+               fputs ("expgroup: using binary search to expire articles\n",
+                      log);
+
+          while (max - min > 1)
+            {
+               mid = min + (max - min)/2; 
+               i = 0;
+               sprintf (filename, "a%d", mid);
+
+               /* if midpoint file doesn't exist */
+               while ((age = getage (filename, &date)) == ERROR
+                       &&   mid - i > min)
+                 {
+                    if (debuglvl > 3)
+                         fprintf (log, "expire: unable to get age of article: %s\n",
+                                       filename);
+                    ++i;
+                    sprintf (filename, "a%d", mid - i);
+                 }
+                 
+               if (age == ERROR)
+                    age = 32767;          /* No files between min and mid */
+
+               if (age > limit)           /* would we expire this file? */
+                    min = mid;            /* yes, search forward */
+               else
+                    max = mid;            /* no, search backward */
+            }
+
+          if (debuglvl > 1)
+               fprintf (log, "expire: expiring articles %d to %d\n",
+                             grp->index, min);
+
+          /* Now delete all articles, grp->index to min */
+          for (i = grp->index;  i <= min; i++)
+            {
+               sprintf (filename, "a%d", i);
+               
+               if (debuglvl > 2)
+                    fprintf (log, "expiring article: %s\n", filename);
+
+               if (expireflag)
+                    unlink (filename);
+            }
+       }
+     /* if deleting files, set lowest # index in active file */
+     if (expireflag)
+          grp->index = i;
+}
+
+
+
+/* getage -- return age of file 'filename' in days */
+
+int getage (filename, date)
+char *filename;
+struct sgtbuf *date;
+{
+     struct fildes finfo;
+     int path, stat, year, mon, day, age;
+
+     /* get the file info sector */
+     if ((path = open (filename, S_IREAD)) == -1)
+          return (ERROR);                        /* Must already be deleted */
+
+     stat = _gs_gfd (path, &finfo, sizeof (finfo));
+     close (path);
+
+     if (stat == ERROR)                          /* Error getting FD */
+          return (ERROR);
+
+     /* get file modification date and time */
+     year = finfo.fd_date[0];
+     mon  = finfo.fd_date[1];
+     day  = finfo.fd_date[2];
+
+     /* how old is this article? */
+     age  = (date->t_year - year) * 365;
+     age += (date->t_month - mon) * 31;
+     age += (date->t_day - day);
+
+     if (debuglvl > 2)
+          fprintf (log, "article %s age is %d days\n", filename, age);
+
+     return (age);
+}