#include "maildir.h" #include #include #include #include "direntry.h" #include "env.h" #include "logmsg.h" #include "str.h" #include "stralloc.h" #include "datetime.h" #include "now.h" #include "prioq.h" #define WHO "maildir" int maildir_chdir() { char *maildir; maildir = env_get("MAILDIR"); if (!maildir) logmsg(WHO, 111, ERROR, "MAILDIR not set"); if (chdir(maildir) == -1) logmsg(WHO, 110, FATAL, B("unable to chdir to: ", maildir)); return 0; } void maildir_clean(stralloc *tmpname) { DIR *dir; direntry *d; datetime_sec time; struct stat st; time = now(); dir = opendir("tmp"); if (!dir) return; while ((d = readdir(dir))) { if (d->d_name[0] == '.') continue; if (!stralloc_copys(tmpname, "tmp/")) break; if (!stralloc_cats(tmpname, d->d_name)) break; if (!stralloc_0(tmpname)) break; if (stat(tmpname->s, &st) == 0) if (time > st.st_atime + 129600) unlink(tmpname->s); } closedir(dir); } static int append(prioq *pq, stralloc *filenames, char *subdir, datetime_sec time) { DIR *dir; direntry *d; struct prioq_elt pe; unsigned int pos; struct stat st; dir = opendir(subdir); if (!dir) logmsg(WHO, 112, FATAL, B("unable to scan $MAILDIR/:", subdir)); while ((d = readdir(dir))) { if (d->d_name[0] == '.') continue; pos = filenames->len; if (!stralloc_cats(filenames, subdir)) break; if (!stralloc_cats(filenames, "/")) break; if (!stralloc_cats(filenames, d->d_name)) break; if (!stralloc_0(filenames)) break; if (stat(filenames->s + pos, &st) == 0) if (st.st_mtime < time) { /* don't want to mix up the order */ pe.dt = st.st_mtime; pe.id = pos; if (!prioq_insert(pq, &pe)) break; } } closedir(dir); if (d) logmsg(WHO, 112, FATAL, B("unable to read $MAILDIR/:", subdir)); return 0; } int maildir_scan(prioq *pq, stralloc *filenames, int flagnew, int flagcur) { struct prioq_elt pe; datetime_sec time; if (!stralloc_copys(filenames, "")) return 0; while (prioq_min(pq, &pe)) prioq_delmin(pq); time = now(); if (flagnew) if (append(pq, filenames, "new", time) == -1) return -1; if (flagcur) if (append(pq, filenames, "cur", time) == -1) return -1; return 0; }