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 >
C/C++ Source or Header  |  1990-01-01  |  4KB  |  207 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <direct.h>
  4. #include <setjmp.h>
  5. #include <signal.h>
  6. #include <modes.h>
  7. #include <errno.h>
  8. #include "mailbox.h"
  9.  
  10. #define WPCLEAN
  11.  
  12. #define msg_size (sizeof (struct msg_header))
  13.  
  14. struct userstruct user;
  15. int run_date, run_time;
  16. char *maildir = "MAIL/";
  17.  
  18. main (argc, argv)
  19. char *argv[];
  20. {
  21.     int day, tick;
  22.  
  23.     chdir (HOME);
  24.     strcpy (user.uscall, "CLEAN");
  25.     user.usopt = ISSUPER;
  26.     _sysdate (0, &run_time, &run_date, &day, &tick);
  27.     sort_mail ();
  28.     }
  29.  
  30. head_comp (head1, head2)
  31. struct msg_header *head1, *head2;
  32. {
  33.     if (head1->mhstat == ' ') {
  34.         if (head2->mhstat == ' ')
  35.             return 0;
  36.         else
  37.             return (1);
  38.         }
  39.     else if (head2->mhstat == ' ')
  40.         return (-1);
  41.     else
  42.         return (head1->mhnr - head2->mhnr);
  43.     }
  44.  
  45. sort_mail ()
  46. {
  47.     extern struct msg_header *mail_dir;
  48.     struct msg_header *head;
  49.  
  50.     open_mail ();
  51.     write_lock ();
  52.     qsort (mail_dir, MAXMAIL, sizeof (struct msg_header), head_comp);
  53.     for (head = mail_dir; head - mail_dir < MAXMAIL; head++)
  54.         if (head->mhstat != ' ')
  55.             head->mhdirty = 1;
  56.     write_unlock ();
  57.     close_mail ();
  58.     }
  59.  
  60. clean_killed ()
  61. {
  62.     extern struct msg_header *mail_dir;
  63.     struct msg_header *head1, *head2;
  64.     char name[40];
  65.     int f;
  66.  
  67. printf ("Removing the following files:\n\n");
  68.     open_mail ();
  69.     write_lock ();
  70.     head1 = head2 = mail_dir;
  71.     while (head1 - mail_dir < MAXMAIL)
  72.         if (/* head1->mhstat == ' ' || */ (head1->mhstat == 'X' && (age (head1) > 2 ||
  73. #ifdef WPCLEAN
  74.             strcmp (head1->mhfrom, "WP") == 0 || strcmp (head1->mhto, "WP") == 0 ||
  75. #endif
  76.                                 *(head1->mhto) == '\0'))) {
  77. print_header (head1, 1, 0);
  78.             head1->mhstat = ' ';
  79.             strcpy (name, maildir);
  80.             header_to_name (head1, name + strlen (name));
  81.             if (unlink (name) == -1)
  82.                 printf ("Error %d unlinking %s.\n", errno, name);
  83.             head1++;
  84.             }
  85.         else {
  86.             if (head1 != head2)
  87.                 _strass (head2, head1, msg_size);
  88.             head1++;  head2++;
  89.             }
  90.     for ( ; head2 < head1; head2++)
  91.         head2->mhstat = ' ';
  92.     if ((f = open ("mail_dir", S_IWRITE)) < 0)
  93.         printf ("Error %d opening mail_dir.\n", errno);
  94.     else {
  95.         write (f, mail_dir, MAXMAIL * sizeof (struct msg_header));
  96.         close (f);
  97.         }
  98.     write_unlock ();
  99.     close_mail ();
  100.     }
  101.  
  102. clean_read ()
  103. {
  104.     struct msg_header *head;
  105.  
  106.     open_mail ();
  107.     while ((head = next_mail (is_read, 0)) != NULL)
  108.         if (age (head) > 7) {
  109.             head->mhstat = 'X';
  110.             update_mail ();
  111.             log ("K %d", head->mhnr);
  112.             }
  113.     close_mail ();
  114.     }
  115.  
  116. clean_orphan ()
  117. {
  118.     struct msg_header *head;
  119.     int f, mhnr;
  120.     char str[80];
  121.     int flag = 1;
  122.  
  123.     open_mail ();
  124.     while ((head = next_mail (is_gnum, 0)) != NULL)
  125.         if (age (head) > 3 && head->mhtype != 'B' && head->mhbbs[0] &&
  126.                 strcmp (head->mhbbs, "NCPA") != 0)
  127.             break;
  128.     if (head) {
  129.         head = new_mail ();
  130.         mhnr = head->mhnr;
  131.         strcpy (head->mhfrom, user.uscall);
  132.         strcpy (head->mhto, MYCALL);
  133.         head->mhtype = 'P';
  134.         head->mhstat = 'N';
  135.         head->mhbbs[0] = '\0';
  136.         strcpy (head->mhtit, "Orphan report");
  137.         update_mail ();
  138.         log_send (head, 0);
  139.         strcpy (str, maildir);
  140.         header_to_name (head, str + strlen (str));
  141.         f = create (str, S_IWRITE, S_IREAD+S_IWRITE);
  142.         sprintf (str, "The following orphan messages have been detected:\n\n");
  143.         write (f, str, strlen (str));
  144.         reset_mail ();
  145.         while ((head = next_mail (is_gnum, 0)) != NULL)
  146.             if (age (head) > 3 && head->mhtype != 'B' && head->mhbbs[0] &&
  147.                     strcmp (head->mhbbs, "NCPA") != 0) {
  148.                 print_header (head, f, flag);
  149.                 flag = 0;
  150.                 }
  151.         sprintf (str, "\n73 DE %s \"cleanup\"\n", MYCALL);
  152.         write (f, str, strlen (str));
  153.         reset_mail ();
  154.         head = next_mail (is_num, mhnr);
  155.         head->mhsize = _gs_size (f);
  156.         update_mail ();
  157.         close (f);
  158.         }
  159.     close_mail ();
  160.     }
  161.  
  162. age (head)
  163. struct msg_header *head;
  164. {
  165.     int j1time, j1date;
  166.     int j2time, j2date;
  167.  
  168.     j1time = run_time;  j1date = run_date;
  169.     _julian (&j1time, &j1date);
  170.     j2time = 0;  j2date = head->mhdate_mod;
  171.     _julian (&j2time, &j2date);
  172.     return (j1date - j2date);
  173.     }
  174.  
  175. clean_owners ()
  176. {
  177.     int f1, f2;
  178.     char line[80];
  179.     int len;
  180.  
  181.     if ((f1 = open ("file_owners", 1)) < 0) return;
  182.     f2 = creat ("file_owners.tmp", 3);
  183.     while (len = readln (f1, line, 80))
  184.         if (*line != '*')
  185.             write (f2, line, len);
  186.     close (f1);
  187.     close (f2);
  188.     unlink ("file_owners");
  189.     rename_file ("file_owners.tmp", "file_owners");
  190.     }
  191.  
  192. clean_users ()
  193. {
  194.     struct userstruct user;
  195.     int f1, f2;
  196.  
  197.     if ((f1 = open ("users", 1)) < 0) return;
  198.     f2 = creat ("users.tmp", 3);
  199.     while (read (f1, &user, sizeof (user)))
  200.         if (!(user.usopt & ISDELETED))
  201.             write (f2, &user, sizeof (user));
  202.     close (f1);
  203.     close (f2);
  204.     unlink ("users");
  205.     rename_file ("users.tmp", "users");
  206.     }
  207.