/*
* Mail check routines. Based on EPIC's mail check
*/
#include "irc.h"
static char cvsrevision[] = "$Id: mail.c,v 1.1.1.1 2003/04/11 01:09:07 dan Exp $";
CVS_REVISION(mail_c)
#include "struct.h"
#include "mail.h"
#include "lastlog.h"
#include "hook.h"
#include "vars.h"
#include "ircaux.h"
#include "output.h"
#include "window.h"
#include "status.h"
#include "misc.h"
#include "module.h"
#define MAIN_SOURCE
#include "modval.h"
#include <sys/stat.h>
#if !defined(HAVE_QMAIL)
static char *mail_path = NULL;
#endif
#if defined(HAVE_QMAIL)
/*
* count_maildir_mail: counts total # of mails (in cur and new)
*/
int count_maildir_mail(void)
{
int count = 0;
DIR *dp;
struct dirent *dir;
char *mail_path, *m;
m = m_sprintf("%s/cur", UNIX_MAIL);
mail_path = expand_twiddle(m);
new_free(&m);
if ((dp = opendir(mail_path)))
{
while ((dir = readdir(dp)))
{
if (!dir->d_ino || (dir->d_name[0] == '.'))
continue;
count++;
}
closedir(dp);
}
new_free(&mail_path);
m = m_sprintf("%s/new", UNIX_MAIL);
mail_path = expand_twiddle(m);
new_free(&m);
if ((dp = opendir(mail_path)))
{
while ((dir = readdir(dp)))
{
if (!dir->d_ino || (dir->d_name[0] == '.'))
continue;
count++;
}
closedir(dp);
}
new_free(&mail_path);
return count;
}
#endif
#ifndef UNIX_MAIL
#define UNIX_MAIL "/var/spool/mail"
#endif
#ifndef MAIL_DELIMITER
#define MAIL_DELIMITER "From "
#endif
#ifdef WANT_DLL
#define check_ext_mail global_table[CHECK_EXT_MAIL]
#define check_ext_mail_status global_table[CHECK_EXT_MAIL_STATUS]
#endif
/*
* check_mail_status: returns 0 if mail status has not changed, 1 if mail
* status has changed
*/
#ifdef PUBLIC_ACCESS
int check_mail_status(void)
{
return 0;
}
#else
int check_mail_status(void)
{
#if defined(HAVE_QMAIL)
int count = 0;
static int c = 0;
#else
static time_t old_stat = 0;
struct stat stat_buf;
#endif
#ifdef WANT_DLL
if (check_ext_mail)
return (*check_ext_mail_status)();
#endif
if (!get_int_var(MAIL_VAR))
{
#if defined(HAVE_QMAIL)
c = 0;
#else
old_stat = 0;
#endif
return (0);
}
#if defined(HAVE_QMAIL)
count = count_maildir_mail();
if (count > c)
{
c = count;
return c;
}
if (count < c)
{
int diff;
diff = count - c;
c = count;
return diff;
}
#else
if (!mail_path)
{
char *tmp_mail_path;
if ((tmp_mail_path = getenv("MAIL")) != NULL)
mail_path = m_strdup(tmp_mail_path);
else
#ifdef __EMX__
mail_path = m_sprintf("%s/mqueue", getenv("ETC"));
#else
mail_path = m_3dup(UNIX_MAIL, "/", username);
#endif
}
if (stat(mail_path, &stat_buf) == -1)
return 0;
if (stat_buf.st_ctime > old_stat)
{
old_stat = stat_buf.st_ctime;
if (stat_buf.st_size)
return 2;
}
if (stat_buf.st_size)
return 1;
#endif
return 0;
}
#endif
/*
* check_mail: This here thing counts up the number of pieces of mail and
* returns it as static string. If there are no mail messages, null is
* returned.
*/
char *check_mail (void)
{
static int old_count = 0;
static char ret_str[12];
static int i = 0;
#ifdef WANT_DLL
if (check_ext_mail)
return (char *)(*check_ext_mail)();
#endif
switch (get_int_var(MAIL_VAR))
{
case 0:
return NULL;
case 1:
{
char this[] = "\\|/-";
#if defined(HAVE_QMAIL)
int count = check_mail_status();
if (count > 0)
{
set_display_target(NULL, LOG_CRAP);
if (do_hook(MAIL_LIST, "%s %s", "Mail", "Yes"))
put_it("%s", convert_output_format(fget_string_var(FORMAT_MAIL_FSET), "%s %s %s", update_clock(GET_TIME), "Mail", "Yes"));
++i;
reset_display_target();
if (i == 4)
i = 0;
}
sprintf(ret_str, "%c", this[i]);
return ret_str;
#else
switch(check_mail_status())
{
case 2:
set_display_target(NULL, LOG_CRAP);
if (do_hook(MAIL_LIST, "%s %s", "Mail", "Yes"))
put_it("%s", convert_output_format(fget_string_var(FORMAT_MAIL_FSET), "%s %s %s", update_clock(GET_TIME), "Mail", "Yes"));
reset_display_target();
if (i == 4)
i = 0;
sprintf(ret_str, "%c", this[i++]);
case 1:
if (!*ret_str)
return NULL;
return ret_str;
case 0:
i = 0;
return NULL;
}
#endif
}
case 2:
{
register int count = 0;
#if defined(HAVE_QMAIL)
count = count_maildir_mail();
if (count == 0)
{
old_count = 0;
return NULL;
}
if (count > old_count)
{
set_display_target(NULL, LOG_CRAP);
if (do_hook(MAIL_LIST, "%d %d", count - old_count, count))
say("You have new email.");
reset_display_target();
}
old_count = count;
sprintf(ret_str, "%d", old_count);
return ret_str;
#else
FILE *mail;
char buffer[255];
switch(check_mail_status())
{
case 0:
old_count = 0;
return NULL;
case 2:
{
if (!(mail = fopen(mail_path, "r")))
return NULL;
while (fgets(buffer, 254, mail))
if (!strncmp(MAIL_DELIMITER, buffer, 5))
count++;
fclose(mail);
if (count > old_count)
{
set_display_target(NULL, LOG_CRAP);
if (do_hook(MAIL_LIST, "%d %d", count - old_count, count))
say("You have new email.");
reset_display_target();
}
old_count = count;
sprintf(ret_str, "%d", old_count);
}
case 1:
if (*ret_str)
return ret_str;
}
#endif
}
}
return NULL;
}
syntax highlighted by Code2HTML, v. 0.9.1