diff -urN epic4-1.0.1.orig/source/mail.c epic4-1.0.1/source/mail.c --- epic4-1.0.1.orig/source/mail.c Tue Dec 5 01:11:57 2000 +++ epic4-1.0.1/source/mail.c Sun Apr 14 12:28:16 2002 @@ -5,7 +5,10 @@ * Written by Jeremy Nelson * Copyright 1996 EPIC Software Labs */ - +/* + * Maildirs are also supported. + * Written by Olgierd Pieczul + */ #include "irc.h" #include "mail.h" #include "lastlog.h" @@ -18,7 +21,8 @@ #endif #include #include - +#include +#include static char *mail_path = (char *) 0; /* @@ -31,7 +35,6 @@ static time_t old_stat = 0; struct stat sb; struct stat * stat_buf; - if (ptr) stat_buf = (struct stat *)ptr; else @@ -51,9 +54,14 @@ if (!(tmp_mail_path = getenv("MAIL"))) tmp_mail_path = path_search(username, mail_path_list); - if (tmp_mail_path) + if (tmp_mail_path) { mail_path = m_strdup(tmp_mail_path); - + if (stat(mail_path, stat_buf) == -1) + return 0; + /* Check whether mailbox is a directory (Maildir) and add "new/" suffix */ + if ((stat_buf->st_mode & S_IFMT) == S_IFDIR) + mail_path = m_2dup(mail_path, "/new/"); + } else mail_path = m_strdup(""); } @@ -70,22 +78,35 @@ { old_stat = stat_buf->st_ctime; if (stat_buf->st_size) - return 2; + return 2; } /* * If there is something in the mailbox */ - if (stat_buf->st_size) - return 1; - + if (stat_buf->st_size) { + /* if maildir - how many files */ + if ((stat_buf->st_mode & S_IFMT) == S_IFDIR) { + DIR *dir; + int i = -2; + if ((dir = opendir(mail_path)) == NULL) + return 0; + while (readdir(dir) != NULL) + i++; + closedir(dir); + if (i > 0) + return 1; + else + return 0; + } + return 1; + } /* * The mailbox is empty. */ return 0; } - /* * check_mail: report on status of inbox. * @@ -142,8 +163,10 @@ case 3: { FILE * mail; + DIR * dir; char buffer[255]; int count = 0; + static int old_count = 0; static char ret_str[12]; struct utimbuf ts; @@ -152,34 +175,43 @@ { case 2: { - if (!(mail = fopen(mail_path, "r"))) - return NULL; - - while (fgets(buffer, 254, mail)) - if (!strncmp("From ", buffer, 5)) - count++; - - fclose(mail); - - if (state == 3) + /* if maildir */ + if ((stat_buf.st_mode & S_IFMT) == S_IFDIR) { + if ((dir = opendir(mail_path)) == NULL) + return NULL; + while (readdir(dir) != NULL) + count++; + closedir(dir); + count -= 2; + } + else + { + if (!(mail = fopen(mail_path, "r"))) + return NULL; + + while (fgets(buffer, 254, mail)) + if (!strncmp("From ", buffer, 5)) + count++; + fclose(mail); + } + if (state == 3) { - /* XXX Ew. Evil. Gross. */ - ts.actime = stat_buf.st_atime; - ts.modtime = stat_buf.st_mtime; - utime(mail_path, &ts); /* XXX Ick. Gross */ + /* XXX Ew. Evil. Gross. */ + ts.actime = stat_buf.st_atime; + ts.modtime = stat_buf.st_mtime; + utime(mail_path, &ts); /* XXX Ick. Gross */ } - - if (count > old_count) - { - if (do_hook(MAIL_LIST, "%d %d", - count - old_count, count)) - { - int lastlog_level = + if (count > old_count) + { + if (do_hook(MAIL_LIST, "%d %d", + count - old_count, count)) + { + int lastlog_level = set_lastlog_msg_level(LOG_CRAP); say("You have new email."); set_lastlog_msg_level(lastlog_level); } - } + } old_count = count; sprintf(ret_str, "%d", old_count);