On 02 Dec 2008, at 10:54, Juergen Wolf wrote:
> The mlookup
> thing is indeed very simple and already working. The cmd_append() part
> is a bit tricky tho, as the LMTPD does not have any imap connection to
> the backend as far as I see. I guess LMTP will be the wrong way to
> transport the mail to the right backend server.

Right, you'd want an IMAP connection, I would think.

> +    /* Mailbox not existent, and murder setup ? */
> +    if (r == IMAP_MAILBOX_NONEXISTENT && config_mupdate_server) {
> +      /* check the mupdate master */

You don't really want to talk to the mupdate master.  You want to  
look in the local mailboxes.db (this only works in a unified murder,  
obviously).

If you look at cmd_append() in imapd.c, you see mlookup() used to  
obtain mailbox information.  sieve_fileinto() in lmtp_sieve.c is  
structurally similar: it internalizes the mailbox, and then delivers  
it.  The deliver_mailbox() in lmtpd.c is just an append, just like  
cmd_append() is!  At least the part after:

        /* local mailbox */

in cmd_append() is analogous to the append code in deliver_mailbox 
().  The portion of cmd_append() that's missing from deliver_mailbox 
() is the first bit:

     if (!r && (mbtype & MBTYPE_REMOTE)) {
        /* remote mailbox */
        struct backend *s = NULL;
...
        s = proxy_findserver(newserver, &imap_protocol,
                             proxy_userid, &backend_cached,
                             &backend_current, &backend_inbox, imapd_in);
        if (!s) r = IMAP_SERVER_UNAVAILABLE;

        if (!r) {
            int is_active = 1;
            s->context = (void*) &is_active;
            if (imapd_mailbox) {
                prot_printf(s->out, "%s Localappend {" SIZE_T_FMT "+}\r\n%s"
                            " {" SIZE_T_FMT "+}\r\n%s ",
                            tag, strlen(name), name,
                            strlen(imapd_mailbox->name), imapd_mailbox->name);
            } else {
                prot_printf(s->out, "%s Localappend {" SIZE_T_FMT "+}\r\n%s"
                            " {" SIZE_T_FMT "+}\r\n%s ",
                            tag, strlen(name), name, 0, "");
            }
            if (!(r = pipe_command(s, 16384))) {
                pipe_including_tag(s, tag, 0);
            }
            s->context = NULL;
        } else {
            eatline(imapd_in, prot_getc(imapd_in));
        }

        if (r) {
            prot_printf(imapd_out, "%s NO %s\r\n", tag,
                        prot_error(imapd_in) ? prot_error(imapd_in) :
                        error_message(r));
        }

        return;
     }

Obviously, it would need a little work to merge this in, but I think  
it's pretty trivial.

:wes
----
Cyrus Home Page: http://cyrusimap.web.cmu.edu/
Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki
List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html

Reply via email to