From 5538f2e0324be41577568029030d097a8a468e6e Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 4 Feb 2013 02:36:36 +0100 Subject: [PATCH] big-todo.103 --- hier.c | 2 ++ qmail-clean.c | 14 +++++++++----- qmail-qstat.sh | 4 ++-- qmail-queue.c | 4 ++-- qmail-send.c | 38 ++++++++++++++++---------------------- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/hier.c b/hier.c index 5e5db8f..9fb518f 100644 --- a/hier.c +++ b/hier.c @@ -55,6 +55,8 @@ void hier() d(auto_qmail,"queue/bounce",auto_uids,auto_gidq,0700); dsplit("queue/mess",auto_uidq,0750); + dsplit("queue/todo",auto_uidq,0750); + dsplit("queue/intd",auto_uidq,0700); dsplit("queue/info",auto_uids,0700); dsplit("queue/local",auto_uids,0700); dsplit("queue/remote",auto_uids,0700); diff --git a/qmail-clean.c b/qmail-clean.c index 7539007..4926f86 100644 --- a/qmail-clean.c +++ b/qmail-clean.c @@ -73,22 +73,26 @@ void main() if (line.len < 7) { respond("x"); continue; } if (line.len > 100) { respond("x"); continue; } if (line.s[line.len - 1]) { respond("x"); continue; } /* impossible */ - for (i = 5;i < line.len - 1;++i) + for (i = line.len - 2;i > 4;--i) + { + if (line.s[i] == '/') break; if ((unsigned char) (line.s[i] - '0') > 9) { respond("x"); continue; } - if (!scan_ulong(line.s + 5,&id)) { respond("x"); continue; } + } + if (line.s[i] == '/') + if (!scan_ulong(line.s + i + 1,&id)) { respond("x"); continue; } if (byte_equal(line.s,5,"foop/")) { #define U(prefix,flag) fmtqfn(fnbuf,prefix,id,flag); \ if (unlink(fnbuf) == -1) if (errno != error_noent) { respond("!"); continue; } - U("intd/",0) + U("intd/",1) U("mess/",1) respond("+"); } else if (byte_equal(line.s,4,"todo/")) { - U("intd/",0) - U("todo/",0) + U("intd/",1) + U("todo/",1) respond("+"); } else diff --git a/qmail-qstat.sh b/qmail-qstat.sh index 26a6d3f..243f29c 100644 --- a/qmail-qstat.sh +++ b/qmail-qstat.sh @@ -1,7 +1,7 @@ cd QMAIL messdirs=`echo queue/mess/* | wc -w` messfiles=`find queue/mess/* -print | wc -w` -tododirs=`echo queue/todo | wc -w` -todofiles=`find queue/todo -print | wc -w` +tododirs=`echo queue/todo/* | wc -w` +todofiles=`find queue/todo/* -print | wc -w` echo messages in queue: `expr $messfiles - $messdirs` echo messages in queue but not yet preprocessed: `expr $todofiles - $tododirs` diff --git a/qmail-queue.c b/qmail-queue.c index 4b39a8f..7d5ed67 100644 --- a/qmail-queue.c +++ b/qmail-queue.c @@ -180,8 +180,8 @@ void main() messnum = pidst.st_ino; messfn = fnnum("mess/",1); - todofn = fnnum("todo/",0); - intdfn = fnnum("intd/",0); + todofn = fnnum("todo/",1); + intdfn = fnnum("intd/",1); if (link(pidfn,messfn) == -1) die(64); if (unlink(pidfn) == -1) die(63); diff --git a/qmail-send.c b/qmail-send.c index c31b522..7e6a8ac 100644 --- a/qmail-send.c +++ b/qmail-send.c @@ -96,7 +96,7 @@ void fnmake_init() } void fnmake_info(id) unsigned long id; { fn.len = fmtqfn(fn.s,"info/",id,1); } -void fnmake_todo(id) unsigned long id; { fn.len = fmtqfn(fn.s,"todo/",id,0); } +void fnmake_todo(id) unsigned long id; { fn.len = fmtqfn(fn.s,"todo/",id,1); } void fnmake_mess(id) unsigned long id; { fn.len = fmtqfn(fn.s,"mess/",id,1); } void fnmake_foop(id) unsigned long id; { fn.len = fmtqfn(fn.s,"foop/",id,0); } void fnmake_split(id) unsigned long id; { fn.len = fmtqfn(fn.s,"",id,1); } @@ -1216,7 +1216,8 @@ void pass_do() /* this file is too long ---------------------------------------------- TODO */ datetime_sec nexttodorun; -DIR *tododir; /* if 0, have to opendir again */ +int flagtododir = 0; /* if 0, have to readsubdir_init again */ +readsubdir todosubdir; stralloc todoline = {0}; char todobuf[SUBSTDIO_INSIZE]; char todobufinfo[512]; @@ -1224,7 +1225,7 @@ char todobufchan[CHANNELS][1024]; void todo_init() { - tododir = 0; + flagtododir = 0; nexttodorun = now(); trigger_set(); } @@ -1236,7 +1237,7 @@ datetime_sec *wakeup; { if (flagexitasap) return; trigger_selprep(nfds,rfds); - if (tododir) *wakeup = 0; + if (flagtododir) *wakeup = 0; if (*wakeup > nexttodorun) *wakeup = nexttodorun; } @@ -1253,8 +1254,7 @@ fd_set *rfds; char ch; int match; unsigned long id; - unsigned int len; - direntry *d; + int z; int c; unsigned long uid; unsigned long pid; @@ -1265,32 +1265,26 @@ fd_set *rfds; if (flagexitasap) return; - if (!tododir) + if (!flagtododir) { if (!trigger_pulled(rfds)) if (recent < nexttodorun) return; trigger_set(); - tododir = opendir("todo"); - if (!tododir) - { - pausedir("todo"); - return; - } + readsubdir_init(&todosubdir, "todo", pausedir); + flagtododir = 1; nexttodorun = recent + SLEEP_TODO; } - d = readdir(tododir); - if (!d) + switch(readsubdir_next(&todosubdir, &id)) { - closedir(tododir); - tododir = 0; - return; + case 1: + break; + case 0: + flagtododir = 0; + default: + return; } - if (str_equal(d->d_name,".")) return; - if (str_equal(d->d_name,"..")) return; - len = scan_ulong(d->d_name,&id); - if (!len || d->d_name[len]) return; fnmake_todo(id); -- cgit v1.2.3