diff -rc coolmail-1.3.org/Makefile coolmail-1.3/Makefile *** coolmail-1.3.org/Makefile Thu Jan 11 18:55:40 1996 --- coolmail-1.3/Makefile Fri Jul 3 09:02:25 1998 *************** *** 22,52 **** # your linker where to find the libraries it will need, and BINDIR and # MANDIR specify the places to install the binary executable and manpage # files for coolmail when you type `make install'. ! CFLAGS = LINK = $(CC) ! INCLUDES = -I/usr/X11R5/include ! LIB_DIRS = -L/usr/X11R5/lib BINDIR = /usr/local/bin MANDIR = /usr/local/man/man1 # Comment these out if you can't or don't want to use the digitized audio # feature. ! AUDIO = -DAUDIO ! AUDIO_MODULE = audio.o #### You really don't need to read past this point. #### LIBS = $(LIB_DIRS) -lXt -lX11 -lm -lXext ! COPTS = $(CFLAGS) $(AUDIO) all: coolmail # Done. ! new: ! rm -f *.o coolmail core clean: ! rm -f *.o core install: @if [ -w $(BINDIR) ] ; then \ --- 22,58 ---- # your linker where to find the libraries it will need, and BINDIR and # MANDIR specify the places to install the binary executable and manpage # files for coolmail when you type `make install'. ! CFLAGS = -DNO_CUSERID LINK = $(CC) ! INCLUDES = -I/usr/X11R6/include ! LIB_DIRS = -L/usr/X11R6/lib BINDIR = /usr/local/bin MANDIR = /usr/local/man/man1 # Comment these out if you can't or don't want to use the digitized audio # feature. ! # AUDIO = -DAUDIO ! # AUDIO_MODULE = audio.o ! ! # Comment these out if you don't want Maildir support ! MAILDIR = -DSUPPORT_MAILDIR ! # for debugging: ! #MAILDIR = $(MAILDIR) -DSUPPORT_MAILDIR_DEBUG ! # normally ignores non-regular files in the Maildir; uncomment to change ! #MAILDIR = $(MAILDIR) -DSUPPORT_MAILDIR_STRICTER #### You really don't need to read past this point. #### LIBS = $(LIB_DIRS) -lXt -lX11 -lm -lXext ! COPTS = $(CFLAGS) $(AUDIO) $(MAILDIR) all: coolmail # Done. ! new: clean all clean: ! rm -f *.o core coolmail install: @if [ -w $(BINDIR) ] ; then \ diff -rc coolmail-1.3.org/audio.c coolmail-1.3/audio.c *** coolmail-1.3.org/audio.c Thu Jan 11 18:56:40 1996 --- coolmail-1.3/audio.c Fri Jul 3 08:47:51 1998 *************** *** 128,133 **** --- 128,134 ---- INIT_FD; audiofd = open( "/dev/audio", O_WRONLY | O_NDELAY ); if (audiofd < 0) { + perror("/dev/audio"); fprintf(stderr, "%s: Problem opening /dev/audio.\n", "Coolmail"); END_FD; diff -rc coolmail-1.3.org/coolmail.c coolmail-1.3/coolmail.c *** coolmail-1.3.org/coolmail.c Thu Jan 11 18:57:24 1996 --- coolmail-1.3/coolmail.c Fri Jul 3 09:01:05 1998 *************** *** 25,32 **** --- 25,34 ---- #include #include #include + #include #include + #ifdef AUDIO #include #endif *************** *** 34,41 **** #include "render1.h" #include "mailbox.h" ! #define DEFAULT_MAIL_DIR "/var/spool/mail/" ! #define DEFAULT_COMMAND "xterm -n Elm -e mail\0" #define DEFAULT_INTERVAL 30 #define DEFAULT_FRAMES 15 --- 36,44 ---- #include "render1.h" #include "mailbox.h" ! #define DEFAULT_MAIL_DIR "/var/mail/" ! ! #define DEFAULT_COMMAND "xterm -n Elm -e elm\0" #define DEFAULT_INTERVAL 30 #define DEFAULT_FRAMES 15 *************** *** 96,102 **** --- 99,107 ---- int main(int argc, char *argv[]) { int reason; + #ifndef NO_CUSERID char username[L_cuserid]; + #endif /* Quickly scan for the -h option -- if it is present don't do anything * but print out some help and exit. */ *************** *** 104,110 **** return(0); /* Get the username and use it to create a default mailfile name */ ! strcat(mailfile_str, cuserid(username)); /* Initialize the renderer */ rend_init(&argc, argv, (float)150.0); --- 109,126 ---- return(0); /* Get the username and use it to create a default mailfile name */ ! #ifdef SUPPORT_MAILDIR ! if (getenv("MAILDIR") && strlen(getenv("MAILDIR"))) { ! strcpy(mailfile_str,getenv("MAILDIR")); ! } else if (getenv("MAIL") && strlen(getenv("MAIL"))) { ! strcpy(mailfile_str,getenv("MAIL")); ! } else ! #endif ! #ifndef NO_CUSERID ! strcat(mailfile_str, cuserid(username)); ! #else ! strcat(mailfile_str, getlogin()); ! #endif /* Initialize the renderer */ rend_init(&argc, argv, (float)150.0); *************** *** 432,438 **** printf(" -e command Specifies a command (usually in quotes) which\n"); printf(" is used to invoke your favorite mail-reading\n"); printf(" program.\n\n"); ! printf(" -f filename Watch filename, instead of the default mail\n"); printf(" file, %s.\n\n", DEFAULT_MAIL_DIR); printf(" -fr n Number of frames to generate for each animation.\n"); printf(" Set to an appropriate value for your machine's.\n"); --- 448,454 ---- printf(" -e command Specifies a command (usually in quotes) which\n"); printf(" is used to invoke your favorite mail-reading\n"); printf(" program.\n\n"); ! printf(" -f filename Watch filename/maildir, instead of the default mail\n"); printf(" file, %s.\n\n", DEFAULT_MAIL_DIR); printf(" -fr n Number of frames to generate for each animation.\n"); printf(" Set to an appropriate value for your machine's.\n"); *************** *** 626,631 **** --- 642,680 ---- /* Get file modification time */ + + /* Maildir notes (aqua@sonoma.net, Sun Jan 18 19:42:27 PST 1998): + * + * The maildir mail-storage standard is a replacement for the traditional + * 'mbox' format, intended to remove problems with file contention, locking, + * reduce corruption in the case of a program or system crash, etc, etc. + * Fairly detailed description of it can be had as part of the Qmail MTA + * documentation, http://www.qmail.org/qmail-manual-html/man5/maildir.html. + * + * The general gist of the maildir approach is that mail is stored, one + # message per file, in a subtree of ~/Maildir. New mail goes in /new, + * the "spool" goes in /cur, and /tmp is available to MUAs &c. Mail is + * theoretically supposed to be removed from /new immediately by the + * MUA, but I've observed that with mutt 0.88, at least, it isn't if + * the mailfile was generated by an import script (e.g. mbox2maildir) + * rather than the normal delivery agent, presumably due to naming + * differences. + * + * Checking for new mail mostly entails checking the mtime vs. atime of + * every file in /new, and the number of messages in /new; if the latter + * increases, new mail was delivered -- if not, but the files' atimes + * are all later than their mtimes, the MUA read the /new spool. + * + * The specifications suggest skipping over every .file, but reading all + * the others -- I've extended this to include skipping of all non-regular + * files, which seemed to make sense -- define SUPPORT_MAILDIR_STRICTER to + * override this behavior. + * + * This process is more resource-intensive than the old scheme of merely + * calling stat() for a single file -- it's an O(n) rather than O(1) + * operation. + * + */ void cool_get_inboxstatus(char *filename, int *anymail, int *unreadmail, int *newmail) { *************** *** 633,670 **** off_t newsize; struct stat st; int fd; - fd = open (filename, O_RDONLY, 0); - if (fd < 0) - { - *anymail = 0; - *newmail = 0; - *unreadmail = 0; - newsize = 0; - } - else - { - fstat(fd, &st); - close(fd); - newsize = st.st_size; - - if (newsize > 0) - *anymail = 1; - else - *anymail = 0; - - if (st.st_mtime >= st.st_atime && newsize > 0) - *unreadmail = 1; - else - *unreadmail = 0; ! if (newsize > oldsize && *unreadmail) ! *newmail = 1; ! else ! *newmail = 0; ! } ! ! oldsize = newsize; } /*---------------------------------------------------------------------------*/ --- 682,800 ---- off_t newsize; struct stat st; int fd; + #ifdef SUPPORT_MAILDIR + DIR *d; + struct dirent *de; + char maildir[256],mfn[256]; + #endif ! #ifdef SUPPORT_MAILDIR_DEBUG ! printf("B anymail=%d, newmail=%d, unreadmail=%d, oldsize=%d, newsize=%d\n", ! *anymail,*newmail,*unreadmail,oldsize,newsize); ! #endif ! #ifdef SUPPORT_MAILDIR ! if (stat(filename,&st)==-1) { ! *anymail = *newmail = *unreadmail = 0; ! newsize = oldsize = 0; ! perror(filename); ! return; ! } ! if (S_ISDIR(st.st_mode)) { ! /* likely a maildir */ ! strcpy(maildir,filename); ! if (maildir[strlen(maildir)-1]!='/') ! strcat(maildir,"/"); ! strcat(maildir,"new"); ! if (stat(maildir,&st)==-1) { ! perror(maildir); ! printf("%s is not a maildir (missing/inaccessible %s)\n",filename,maildir); ! *anymail = *newmail = *unreadmail = 0; ! newsize = oldsize = 0; ! return; ! } ! if (!S_ISDIR(st.st_mode)) { ! printf("%s is not a directory (mode %d)\n",maildir,st.st_mode); ! *anymail = *newmail = *unreadmail = 0; ! newsize = oldsize = 0; ! return; ! } ! d=opendir(maildir); ! newsize=0; ! *unreadmail = 0; ! while ((de=readdir(d))) { ! if (de->d_name[0]=='.') /* dotfiles ignored per the maildir specs */ ! continue; ! strcpy(mfn,maildir); ! if (mfn[strlen(mfn)-1]!='/') ! strcat(mfn,"/"); ! strcat(mfn,de->d_name); ! if (stat(mfn,&st)==-1) { ! perror(mfn); ! continue; ! } ! #ifndef SUPPORT_MAILDIR_STRICTER ! if (S_ISREG(st.st_mode)) ! #endif ! newsize++; ! if (st.st_mtime>=st.st_atime) { ! #ifdef SUPPORT_MAILDIR_DEBUG ! printf("unread: %s mtime = %d, atime = %d\n",de->d_name,st.st_mtime,st.st_atime); ! #endif ! *unreadmail = 1; ! } ! } ! closedir(d); ! if (newsize) { ! *anymail = 1; ! if (newsize>oldsize && *unreadmail) ! *newmail = 1; ! else ! *newmail = 0; ! } else { ! *anymail = *newmail = *unreadmail = 0; ! newsize = 0; ! } ! #ifdef SUPPORT_MAILDIR_DEBUG ! printf("A anymail=%d, newmail=%d, unreadmail=%d, oldsize=%d, newsize=%d\n", ! *anymail,*newmail,*unreadmail,oldsize,newsize); ! #endif ! oldsize=newsize; ! } else { ! #endif /* SUPPORT_MAILDIR */ ! fd = open (filename, O_RDONLY, 0); ! if (fd < 0) ! { ! *anymail = 0; ! *newmail = 0; ! *unreadmail = 0; ! newsize = 0; ! } ! else ! { ! fstat(fd, &st); ! close(fd); ! newsize = st.st_size; ! ! if (newsize > 0) ! *anymail = 1; ! else ! *anymail = 0; ! ! if (st.st_mtime >= st.st_atime && newsize > 0) ! *unreadmail = 1; ! else ! *unreadmail = 0; ! ! if (newsize > oldsize && *unreadmail) ! *newmail = 1; ! else ! *newmail = 0; ! } ! #ifdef SUPPORT_MAILDIR ! } ! #endif ! oldsize = newsize; } /*---------------------------------------------------------------------------*/