diff options
author | Martin Wilke <miwi@FreeBSD.org> | 2009-04-11 08:09:54 +0000 |
---|---|---|
committer | Martin Wilke <miwi@FreeBSD.org> | 2009-04-11 08:09:54 +0000 |
commit | acf18bc5f983a824d4224ade4425e4912b2ec09e (patch) | |
tree | e1bdfa21a2e1ef2e25aac8ae4cb927d8e841b3ef /mail/coolmail/files/patch-coolmail.c | |
parent | - Update to 4.1.6 (diff) |
- Fix the "-vol" option for the system beep.
- Delete non-FreeBSD feature from the man-page.
- Bump PORTREVISION and re-organize the patch-files.
PR: 133535
Submitted by: Udo Schweigert <udo.schweigert@siemens.com> (maintainer)
Notes
Notes:
svn path=/head/; revision=232059
Diffstat (limited to 'mail/coolmail/files/patch-coolmail.c')
-rw-r--r-- | mail/coolmail/files/patch-coolmail.c | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/mail/coolmail/files/patch-coolmail.c b/mail/coolmail/files/patch-coolmail.c new file mode 100644 index 000000000000..5f9ff7356a74 --- /dev/null +++ b/mail/coolmail/files/patch-coolmail.c @@ -0,0 +1,287 @@ +--- coolmail.c.orig 1996-01-11 18:57:24.000000000 +0100 ++++ coolmail.c 2009-04-08 09:14:08.000000000 +0200 +@@ -25,8 +25,10 @@ + #include <sys/wait.h> + #include <sys/types.h> + #include <sys/stat.h> ++#include <dirent.h> + #include <fcntl.h> + ++ + #ifdef AUDIO + #include <string.h> + #endif +@@ -34,14 +36,13 @@ + #include "render1.h" + #include "mailbox.h" + +-#define DEFAULT_MAIL_DIR "/var/spool/mail/" +-#define DEFAULT_COMMAND "xterm -n Elm -e mail\0" ++#define DEFAULT_MAIL_DIR "/var/mail/" ++ ++#define DEFAULT_COMMAND "xterm -n Elm -e elm\0" + #define DEFAULT_INTERVAL 30 + #define DEFAULT_FRAMES 15 + +-#ifdef AUDIO + #define DEFAULT_VOLUME 50 +-#endif + + #ifndef PI + #define PI 3.1415926536 +@@ -60,9 +61,9 @@ + unsigned int frames = DEFAULT_FRAMES; + int verbose = 0; + ++int cool_vol = DEFAULT_VOLUME; + #ifdef AUDIO + char *sndfile = NULL; /* default system sound */ +-int cool_vol = DEFAULT_VOLUME; + #endif + + float flag_angle = 0.0; +@@ -96,7 +97,9 @@ + 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,7 +107,18 @@ + return(0); + + /* Get the username and use it to create a default mailfile name */ +- strcat(mailfile_str, cuserid(username)); ++#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); +@@ -379,7 +393,6 @@ + { + verbose++; + } +-#ifdef AUDIO + else if (!strcmp(argv[i], "-vol")) + { + i++; +@@ -387,6 +400,7 @@ + if (cool_vol < 0) cool_vol = 0; + else if (cool_vol > 100) cool_vol = 100; + } ++#ifdef AUDIO + else if (!strcmp(argv[i], "-af")) + { + i++; +@@ -432,7 +446,7 @@ + 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(" -f filename Watch filename/maildir, instead of the default mail\n"); + printf(" file, %s<username>.\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,6 +640,39 @@ + + /* 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,38 +680,119 @@ + off_t newsize; + struct stat st; + int fd; ++#ifdef SUPPORT_MAILDIR ++ DIR *d; ++ struct dirent *de; ++ char maildir[256],mfn[256]; ++#endif + +- 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; ++#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; + } + + /*---------------------------------------------------------------------------*/ |