From 7603066e73d31aab84657bc4c0806f11856f672f Mon Sep 17 00:00:00 2001 From: Akshat Kumar Date: Fri, 6 Sep 2013 16:19:57 -0400 Subject: acme Mail: add Search command Introduces the Search command for mailboxes. Arguments passed are treated as one space- separated string, passed on to mailfs' IMAP search interface. R=rsc, david.ducolombier CC=plan9port.codebot https://codereview.appspot.com/13238044 --- src/cmd/acme/mail/dat.h | 1 + src/cmd/acme/mail/mail.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cmd/acme/mail/dat.h b/src/cmd/acme/mail/dat.h index 9a6be955..a7ac6a0b 100644 --- a/src/cmd/acme/mail/dat.h +++ b/src/cmd/acme/mail/dat.h @@ -142,6 +142,7 @@ extern Message* mesglookupfile(Message*, char*, char*); extern void mesgfreeparts(Message*); extern int mesgcommand(Message*, char*); +extern char* info(Message*, int, int); extern char* readfile(char*, char*, int*); extern char* readbody(char*, char*, int*); extern void ctlprint(CFid*, char*, ...); diff --git a/src/cmd/acme/mail/mail.c b/src/cmd/acme/mail/mail.c index 474d8497..d79721f8 100644 --- a/src/cmd/acme/mail/mail.c +++ b/src/cmd/acme/mail/mail.c @@ -395,9 +395,11 @@ int mboxcommand(Window *w, char *s) { char *args[10], **targs, *save; + Window *sbox; Message *m, *next; int ok, nargs, i, j; - char buf[128]; + CFid *searchfd; + char buf[128], *res; nargs = tokenize(s, args, nelem(args)); if(nargs == 0) @@ -415,6 +417,10 @@ mboxcommand(Window *w, char *s) fprint(2, "mail: mailbox not written\n"); return 1; } + if(w != mbox.w){ + windel(w, 1); + return 1; + } ok = 1; for(m=mbox.head; m!=nil; m=next){ next = m->next; @@ -475,6 +481,61 @@ mboxcommand(Window *w, char *s) free(targs); return 1; } + if(strcmp(s, "Search") == 0){ + if(nargs <= 1) + return 1; + s = estrstrdup(mboxname, "/search"); + searchfd = fsopen(mailfs, s, ORDWR); + if(searchfd == nil) + return 1; + save = estrdup(args[1]); + for(i=2; iname) != 0; m=m->prev); + free(save); + if(m == nil) + break; + fsprint(sbox->body, "%s%s\n", m->name, info(m, 0, 0)); + m = m->prev; + } + free(res); + winclean(sbox); + winclosebody(sbox); + return 1; + } return 0; } -- cgit v1.2.3