Mercurial > hg > Members > kono > nitros9-code
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); +}