home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
TELECOM
/
OSKBox.lzh
/
MAILBOX
/
CC
/
cleanup.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-02-19
|
6KB
|
271 lines
#include <stdio.h>
#include <ctype.h>
#include <direct.h>
#include <setjmp.h>
#include <signal.h>
#include <modes.h>
#include <errno.h>
#include "mailbox.h"
/* #define WPCLEAN */
#define msg_size (sizeof (struct msg_header))
struct userstruct user;
int run_date, run_time;
char *maildir = "MAIL/";
int orphanflag;
main (argc, argv)
char *argv[];
{
int day, tick;
while (--argc > 0 && (++argv)[0][0]=='-')
{
char *cp = argv[0] + 1;
while (*cp)
switch (*cp++)
{
case 'o':
orphanflag++;
continue;
default:
fprintf(stderr, "Unknown flag '%c'\n", *(cp-1));
continue;
}
}
chdir (HOME);
read_dist_list ();
strcpy (user.uscall, "CLEAN");
user.usopt = ISSUPER;
_sysdate (0, &run_time, &run_date, &day, &tick);
clean_killed ();
if (!orphanflag)
{
clean_read ();
clean_old ();
clean_ncwp ();
clean_owners ();
clean_users ();
}
clean_orphan ();
}
int kill_list[MAXMAIL], kill_num = 0;
clean_killed ()
{
extern struct msg_header *mail_dir;
struct msg_header *head1, *head2;
int i, f;
printf ("Removing the following files:\n\n");
open_mail ();
write_lock ();
head1 = head2 = mail_dir;
while (head1 - mail_dir < MAXMAIL)
if (head1->mhstat != ' ' &&
(head1->mhstat == 'X' && (age (head1) > 2 || head1->mhsize == 0 ||
#ifdef WPCLEAN
strcmp (head1->mhfrom, "WP") == 0 || strcmp (head1->mhto, "WP") == 0 ||
#endif
*(head1->mhto) == '\0' || head1->mhtype == 'B'))) {
print_header (head1, 1, 0);
head1->mhstat = ' ';
kill_list[kill_num++] = head1->mhnr;
head1++;
}
else {
if (head1 != head2)
_strass (head2, head1, msg_size);
head1++; head2++;
}
for ( ; head2 < head1; head2++)
head2->mhstat = ' ';
if ((f = open ("mail_dir", S_IWRITE)) < 0)
printf ("Error %d opening mail_dir.\n", errno);
else {
write (f, mail_dir, MAXMAIL * sizeof (struct msg_header));
close (f);
}
write_unlock ();
close_mail ();
for (i = 0; i < kill_num; i++)
{
char name[80];
struct msg_header hd;
strcpy (name, maildir);
hd.mhnr = kill_list[i];
header_to_name (&hd, name + strlen (name));
if (unlink (name) == -1)
printf ("Error %d unlinking %s.\n", errno, name);
}
}
clean_read ()
{
struct msg_header *head;
open_mail ();
while ((head = next_mail (is_read, 0)) != NULL)
if (age (head) > 7) {
head->mhstat = 'X';
update_mail ();
log ("K %d", head->mhnr);
}
close_mail ();
}
clean_old ()
{
struct msg_header *head;
int time, date, tick;
short day;
int d, t = 0;
_sysdate (1, &time, &date, &day, &tick);
open_mail ();
while ((head = next_mail (is_gnum, 0)) != NULL) {
d = head->mhdate_xpir;
t = 0;
_julian (&t, &d);
if ((strcmp (head->mhto, "SALE") == 0 && age2 (head) > 7) ||
(strcmp (head->mhto, "WANTED") == 0 && age2 (head) > 14) ||
(head->mhdate_xpir && date > d)) {
head->mhstat = 'X';
update_mail ();
log ("K %d", head->mhnr);
}
}
close_mail ();
}
clean_ncwp ()
{
struct msg_header *head;
open_mail ();
while ((head = next_mail (is_gnum, 0)) != NULL) {
if (is_to (head, "WP") && is_at (head, "NCWP") && head->mhstat == 'F') {
head->mhstat = 'X';
update_mail ();
log ("K %d", head->mhnr);
}
}
close_mail ();
}
clean_orphan ()
{
struct msg_header *head;
int f, mhnr;
char str[80];
int flag = 1;
open_mail ();
while ((head = next_mail (is_gnum, 0)) != NULL)
if (age (head) > 1 && !bulletin (head))
break;
if (head) {
int time, date, day, tick;
head = new_mail (0);
mhnr = head->mhnr;
strcpy (head->mhfrom, user.uscall);
strcpy (head->mhto, MYCALL);
head->mhtype = 'P';
head->mhstat = 'N';
head->mhbbs[0] = '\0';
strcpy (head->mhtit, "Orphan report");
strcpy (head->mhbid, "");
_sysdate (1, &time, &date, &day, &tick);
gregorian (&time, &date);
head->mhdate_xpir = date; /* orphan reports live 24 hours */
update_mail ();
log_send (head, 0);
strcpy (str, maildir);
header_to_name (head, str + strlen (str));
f = create (str, S_IWRITE, S_IREAD+S_IWRITE);
sprintf (str, "The following orphan messages have been detected:\n\n");
write (f, str, strlen (str));
reset_mail ();
while ((head = next_mail (is_gnum, 0)) != NULL)
if (age (head) > 3 && !bulletin (head)
&& strcmp (head->mhto, MYCALL) != 0) {
print_header (head, f, flag);
flag = 0;
}
sprintf (str, "\n73 DE %s \"cleanup\"\n", MYCALL);
write (f, str, strlen (str));
reset_mail ();
head = next_mail (is_num, mhnr);
head->mhsize = _gs_size (f);
update_mail ();
close (f);
}
close_mail ();
}
age (head)
struct msg_header *head;
{
int j1time, j1date;
int j2time, j2date;
j1time = run_time; j1date = run_date;
_julian (&j1time, &j1date);
j2time = 0; j2date = head->mhdate_mod;
_julian (&j2time, &j2date);
return (j1date - j2date);
}
age2 (head)
struct msg_header *head;
{
int j1time, j1date;
int j2time, j2date;
j1time = run_time; j1date = run_date;
_julian (&j1time, &j1date);
j2time = 0; j2date = head->mhdate;
_julian (&j2time, &j2date);
return (j1date - j2date);
}
clean_owners ()
{
int f1, f2;
char line[80];
int len;
if ((f1 = open ("file_owners", 1)) < 0) return;
f2 = creat ("file_owners.tmp", 3);
while (len = readln (f1, line, 80))
if (*line != '*')
write (f2, line, len);
close (f1);
close (f2);
unlink ("file_owners");
rename_file ("file_owners.tmp", "file_owners");
}
clean_users ()
{
struct userstruct user;
int f1, f2;
if ((f1 = open ("users", 1)) < 0) return;
f2 = creat ("users.tmp", 3);
while (read (f1, &user, sizeof (user)))
if (!(user.usopt & ISDELETED))
write (f2, &user, sizeof (user));
close (f1);
close (f2);
unlink ("users");
rename_file ("users.tmp", "users");
}