[Dovecot] Need help with details for new Dovecot plugin

Geoffrey Broadwell geoffb at corp.sonic.net
Wed Jan 11 20:57:11 EET 2012


My sincere apologies for the subjectless email (my MUA should have
caught that!); the above is the corrected subject line.


-'f


On Wed, 2012-01-11 at 10:53 -0800, Geoffrey Broadwell wrote:
> I'm working on a Dovecot plugin, but I'm pretty new to Dovecot, so
> there's a LOT to learn about the code base and it's pretty slow going.
> I've got a few things coded so far, but I want to make sure I'm headed
> down the right path and get some advice before I go too much further.
> 
> A couple years ago, I wrote some code for our Courier implementation
> that sent a magic UDP packet to a small server each time a user modified
> their voicemail IMAP folder.  That UDP server would then connect back to
> Courier via IMAP again and check whether the folder had any unread
> messages left in it.  Finally, it would contact our phone switches to
> modify the state of the message waiting indicator (MWI) on that user's
> phone line appropriately.
> 
> Fast forward to now, and we want to migrate wholesale to Dovecot 2.x.
> The servers are all in place, they've been well tested and burned in
> (with Dovecot 2.0.15 I believe), and the final migration is pretty much
> waiting on a port to Dovecot of the MWI update functionality.
> 
> The good news is that I originally spent some effort to isolate the UDP
> packet generation and delivery, and I used purely standard portable code
> as per APUE2, so I think that chunk of code should be reusable with only
> minor modifications.  I'm aware that internally Dovecot has its own
> memory, buffer, and string management functions, but it doesn't feel
> like a win to try to convert the existing code.  It's small, completely
> isolated, and well reviewed -- I'd be more afraid of using the new (to
> me) Dovecot API incorrectly than I am that the existing code has bugs in
> buffer handling.
> 
> By cribbing from other plugins and editing appropriately, I've also
> created the skeleton for my plugin: Makefile, docs, conf snippet, .spec
> (I'll be deploying the plugin as an RPM), and so on.  I've got the
> beginnings of the .h and .c written, just enough to init and deinit the
> plugin by calling mail_storage_hooks_{add,remove}() with some stub hook
> functions.  This all seems good so far; test builds are error-free and
> seem sane.
> 
> So now the hard part is writing the piece that I can't just crib from
> elsewhere -- making sure that I hook every place in Dovecot that the
> user's voicemail folder can be changed in a way that would change it
> between having one or more unread messages, and not having any unread
> messages at all (or vice-versa, of course).  At the same time, I want to
> minimize the performance impact to Dovecot (and the load on the UDP
> server) by only hooking the places I need to, filtering out as many
> false positives as I can without introducing massive complexity, and
> only pinging the UDP server when it's most likely to notice a change in
> the state of that user's voicemail server.
> 
> It seems to me that I need to at least capture mailbox_allocated from
> the mail_storage hooks, for a couple reasons:
> 
>         1. The state of the voicemail folder could be changed because
>         the entire folder is created, destroyed, or renamed.
>         
>         2. I want to only do further checks when I'm sure I'm looking at
>         the voicemail folder.  There's no reason to do work when the
>         user is working with any other folder.
> 
> So now the questions:
> 
> Does all of the above seem sane so far?
> 
> Do I need to hook mail_allocated as well, or will I be able to see any
> change I need to monitor just from the mailbox?
> 
> Finally, I'm lost about what operations on the mailbox and the mails
> within it I need to check.  Can anyone offer some advice (or doc
> pointers) on this?
> 
> Thank you!
> 
> 
> -'f
> 
> 





More information about the dovecot mailing list