aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--mail.c113
1 files changed, 54 insertions, 59 deletions
diff --git a/mail.c b/mail.c
index 408398c..180f9e1 100644
--- a/mail.c
+++ b/mail.c
@@ -1,4 +1,4 @@
-/* $Id: mail.c,v 1.2 2001/02/19 00:15:46 reinelt Exp $
+/* $Id: mail.c,v 1.3 2001/02/21 04:48:13 reinelt Exp $
*
* email specific functions
*
@@ -20,6 +20,11 @@
*
*
* $Log: mail.c,v $
+ * Revision 1.3 2001/02/21 04:48:13 reinelt
+ *
+ * big mailbox patch from Axel Ehnert
+ * thanks to herp for his idea to check mtime of mailbox
+ *
* Revision 1.2 2001/02/19 00:15:46 reinelt
*
* integrated mail and seti client
@@ -50,6 +55,7 @@
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/time.h>
+#include <sys/stat.h>
#include "cfg.h"
#include "debug.h"
@@ -59,90 +65,79 @@ int Mail (int index, int *num)
{
FILE *fstr;
char buffer[32];
- static time_t cntfreq[MAILBOXES+1]; // Time of last calculation
- static int cfgmbx[MAILBOXES+1]={[0 ... MAILBOXES]=TRUE,};
+ static int cfgmbx[MAILBOXES+1]={[0 ... MAILBOXES]=TRUE,}; // Mailbox #index configured?
+ static time_t mbxlt[MAILBOXES+1]={[0 ... MAILBOXES]=0,}; // mtime of Mailbox #index
+ static int mbxnum[MAILBOXES+1]={[0 ... MAILBOXES]=0,}; // Last calculated # of mails
+ static time_t now[MAILBOXES+1]={[0 ... MAILBOXES]=0,}; // Last call to procedure at
+ // for Mailbox #index
char *fnp1;
int v1=0;
int last_line_blank1; // Was the last line blank?
- int interv=-1; // Interval in sec.
- char *cinterv;
+ struct stat fst;
+ int rc;
char *txt;
char txt1[100];
if (index<1 || index>MAILBOXES) return -1;
- /*
- Interval set?
- */
- if (interv < 0) {
- cinterv = cfg_get("pollintmail");
- if ( cinterv == NULL ) {
- interv=DEFMAILPOLLEXT;
- }
- else {
- interv = atoi(cinterv);
- }
- }
- /*
- Is it time to look into the files?
- */
- if (time(NULL)>cntfreq[index]+interv-1) {
- cntfreq[index]=time(NULL);
- }
- else {
- return 0;
- }
- /*
- Reread pollext, because it could be changed due to reading a new conf file
- */
- cinterv = cfg_get("pollintmail");
- if ( cinterv == NULL ) {
- interv=DEFMAILPOLLEXT;
- }
- else {
- interv = atoi(cinterv);
- }
+
+ if (time(NULL)==now[index]) return 0; // More then 1 second after last check
+ time(&now[index]); // for Mailbox #index
/*
Build the filename from the config
*/
snprintf(buffer, 32, "Mailbox%d", index);
fnp1=cfg_get(buffer);
if (fnp1==NULL || *fnp1=='\0') {
- cfgmbx[index]=FALSE;
+ cfgmbx[index]=FALSE; // There is now entry for Mailbox #index
}
- v1=0;
+ v1=mbxnum[index];
/*
Open the file
*/
if (cfgmbx[index]==TRUE) {
- fstr=fopen(fnp1,"r");
+ /*
+ Check the last touch of mailbox. Changed?
+ */
+ rc=stat(fnp1, &fst);
+ if ( rc != 0 ) {
+ error ("Error getting stat of Mailbox%d", index );
+ return (-1);
+ }
+ if ( mbxlt[index] != fst.st_mtime ) {
+ mbxlt[index]=fst.st_mtime;
- if (fstr != NULL) {
- txt=&txt1[0];
- last_line_blank1=TRUE;
+ fstr=fopen(fnp1,"r");
- while ( ( fgets ( txt1, 100, fstr ) ) != NULL ) {
- txt1[strlen(txt1)-1]='\0'; // cut the newline
- /*
- Is there a "From ..." line. Count only, if a blank line was directly before this
- */
- if ( strncmp (txt1, "From ", 5 ) == 0 ) {
- if ( last_line_blank1 == TRUE ) {
- v1++;
- debug ("mailbox%d found mail %d",index, v1);
- last_line_blank1 = FALSE;
+ if (fstr != NULL) {
+ txt=&txt1[0];
+ last_line_blank1=TRUE;
+ v1=0;
+
+ while ( ( fgets ( txt1, 100, fstr ) ) != NULL ) {
+ txt1[strlen(txt1)-1]='\0'; // cut the newline
+ /*
+ Is there a "From ..." line. Count only, if a blank line was directly before this
+ */
+ if ( strncmp (txt1, "From ", 5 ) == 0 ) {
+ if ( last_line_blank1 == TRUE ) {
+ v1++;
+ debug ("mailbox%d found mail %d",index, v1);
+ last_line_blank1 = FALSE;
+ }
+ }
+ if ( strlen (txt1) == 0 ) {
+ last_line_blank1 = TRUE;
+ }
+ else {
+ last_line_blank1 = FALSE;
}
}
- if ( strlen (txt1) == 0 ) {
- last_line_blank1 = TRUE;
- }
- else {
- last_line_blank1 = FALSE;
- }
+ fclose (fstr);
}
}
- fclose (fstr);
}
+ mbxnum[index]=v1;
*num=v1;
return (0);
}