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
/
sortmail.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-01-01
|
4KB
|
207 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/";
main (argc, argv)
char *argv[];
{
int day, tick;
chdir (HOME);
strcpy (user.uscall, "CLEAN");
user.usopt = ISSUPER;
_sysdate (0, &run_time, &run_date, &day, &tick);
sort_mail ();
}
head_comp (head1, head2)
struct msg_header *head1, *head2;
{
if (head1->mhstat == ' ') {
if (head2->mhstat == ' ')
return 0;
else
return (1);
}
else if (head2->mhstat == ' ')
return (-1);
else
return (head1->mhnr - head2->mhnr);
}
sort_mail ()
{
extern struct msg_header *mail_dir;
struct msg_header *head;
open_mail ();
write_lock ();
qsort (mail_dir, MAXMAIL, sizeof (struct msg_header), head_comp);
for (head = mail_dir; head - mail_dir < MAXMAIL; head++)
if (head->mhstat != ' ')
head->mhdirty = 1;
write_unlock ();
close_mail ();
}
clean_killed ()
{
extern struct msg_header *mail_dir;
struct msg_header *head1, *head2;
char name[40];
int 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 ||
#ifdef WPCLEAN
strcmp (head1->mhfrom, "WP") == 0 || strcmp (head1->mhto, "WP") == 0 ||
#endif
*(head1->mhto) == '\0'))) {
print_header (head1, 1, 0);
head1->mhstat = ' ';
strcpy (name, maildir);
header_to_name (head1, name + strlen (name));
if (unlink (name) == -1)
printf ("Error %d unlinking %s.\n", errno, name);
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 ();
}
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_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) > 3 && head->mhtype != 'B' && head->mhbbs[0] &&
strcmp (head->mhbbs, "NCPA") != 0)
break;
if (head) {
head = new_mail ();
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");
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 && head->mhtype != 'B' && head->mhbbs[0] &&
strcmp (head->mhbbs, "NCPA") != 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);
}
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");
}