commit 7603066e73d31aab84657bc4c0806f11856f672f from: Akshat Kumar via: Russ Cox date: Fri Sep 06 20:19:57 2013 UTC 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 commit - 951fef52c99ad174f9cfb413ba7fd831d1ee5e4b commit + 7603066e73d31aab84657bc4c0806f11856f672f blob - 9a6be955fd3cf2b3d7e56d000464c50507794eba blob + a7ac6a0bb1fa569d192b77f0286495c9580624cb --- src/cmd/acme/mail/dat.h +++ 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*, ...); blob - 474d8497285776ea3f248e2a8f6e8e67b899ad43 blob + d79721f80c0d79f5b2bea731d85fa67cc82d1e24 --- src/cmd/acme/mail/mail.c +++ 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; }