From 2fc6b0dd10a94cf365b48df7fe6b0518e5dabdd1 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Sat, 23 Dec 2006 21:50:40 +0000 Subject: [PATCH] Printing mailbox locations for vmail list --- src/mail/vmail.sig | 2 +- src/mail/vmail.sml | 15 ++++++++++++--- src/main-vmail.sml | 6 ++++-- src/msg.sml | 14 ++++++++++++-- src/msgTypes.sml | 2 +- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/mail/vmail.sig b/src/mail/vmail.sig index a70e525..4804911 100644 --- a/src/mail/vmail.sig +++ b/src/mail/vmail.sig @@ -24,7 +24,7 @@ signature VMAIL = sig datatype listing = Error of string - | Listing of string list + | Listing of {user : string, mailbox : string} list val list : string -> listing diff --git a/src/mail/vmail.sml b/src/mail/vmail.sml index 5801cb9..39566dd 100644 --- a/src/mail/vmail.sml +++ b/src/mail/vmail.sml @@ -24,7 +24,7 @@ fun rebuild () = Slave.shell [Config.Courier.postReload] datatype listing = Error of string - | Listing of string list + | Listing of {user : string, mailbox : string} list fun list domain = let @@ -36,9 +36,18 @@ fun list domain = NONE => Listing (rev users) | SOME line => case String.tokens Char.isSpace line of - [addr, _] => + [addr, fields] => (case String.fields (fn ch => ch = #"@") addr of - [user, _] => loop (user :: users) + [user, _] => + let + fun parseFields fields = + case fields of + "mail" :: mailbox :: _ => loop ({user = user, mailbox = mailbox} :: users) + | _ :: _ :: rest => parseFields rest + | _ => Error "Invalid fields in database" + in + parseFields (String.fields (fn ch => ch = #"|" orelse ch = #"=") fields) + end | _ => Error "Invalid e-mail address format in database") | _ => Error "Invalid entry in database" in diff --git a/src/main-vmail.sml b/src/main-vmail.sml index 05cb86f..8acb845 100644 --- a/src/main-vmail.sml +++ b/src/main-vmail.sml @@ -27,8 +27,10 @@ val _ = (case Main.requestListMailboxes domain of Vmail.Error msg => (print msg; print "\n") - | Vmail.Listing users => app (fn user => (print user; - print "\n")) users) + | Vmail.Listing users => app (fn {user, mailbox} => (print user; + print "\t"; + print mailbox; + print "\n")) users) | ["add", user, mailbox] => (case Client.getpass () of diff --git a/src/msg.sml b/src/msg.sml index 6fdda0a..747572a 100644 --- a/src/msg.sml +++ b/src/msg.sml @@ -139,7 +139,10 @@ fun send (bio, m) = OpenSSL.writeString (bio, domain)) | MsgMailboxes users => (OpenSSL.writeInt (bio, 22); - sendList OpenSSL.writeString (bio, users)) + sendList (fn (bio, {user, mailbox}) => + (OpenSSL.writeString (bio, user); + OpenSSL.writeString (bio, mailbox))) + (bio, users)) fun checkIt v = case v of @@ -215,7 +218,14 @@ fun recv bio = SOME (MsgRmMailbox {domain = domain, user = user}) | _ => NONE) | 21 => Option.map MsgListMailboxes (OpenSSL.readString bio) - | 22 => Option.map MsgMailboxes (recvList OpenSSL.readString bio) + | 22 => Option.map MsgMailboxes (recvList + (fn bio => + case (OpenSSL.readString bio, + OpenSSL.readString bio) of + (SOME user, SOME mailbox) => + SOME {user = user, mailbox = mailbox} + | _ => NONE) + bio) | _ => NONE) end diff --git a/src/msgTypes.sml b/src/msgTypes.sml index cc792ff..3d5997d 100644 --- a/src/msgTypes.sml +++ b/src/msgTypes.sml @@ -67,7 +67,7 @@ datatype msg = (* Remove a vmail mapping *) | MsgListMailboxes of string (* List all mailboxes for a domain *) - | MsgMailboxes of string list + | MsgMailboxes of {user : string, mailbox : string} list (* Reply to MsgListMailboxes *) end -- 2.20.1