Author: Geo Carncross
Date: March 16, 2006
-P: [pre]fork processes for handling children
-D: detach from console by closing fds 0..93 inclusive after starting
-B: put dbmail in the background (because for some reason you're starting dbmail from something that isn't a shell and you can't use &)
-G: start dbmail in its own process group (setpgid) so that stupid programs (like pppd) don't kill it when a user disconnects- even more useful if someone starts it from a serial console and has a SAK
-S: start dbmail in its own session (setsid)- implies -G, and requires -D (and the operations performed by -D must be done before setsid())
None of these definitions are negative; none of these switches “stop” dbmail from doing something. That's confusing.
If the “default” should be something else, I recommend using a wrapper script as I described earlier.
> It would kinda neat if you ran 'dbmail-imapd' and the program returned
“Dbmail-IMAPd ready to rock” and started speaking IMAP to you I'm
not sure if I like this, though. I'll marinate with it some more.
Supporting imap preauth isn't such a bad idea- it makes it so people can ssh-tunnel their IMAP mail without having to do port forwarding.
As a side note- there's a reason I listed fds 0..93 as should be closed by -D; I'm sure everyone guesses 0 through 2 easily enough, but there might be some pipelines, so close a bit further- fds 15 or 16 is usually what I see.
The Bourne shell (the REAL one) uses file descriptor 19 internally for reading scripts- we shouldn't close it in the parent- but after forking (-P) because the script running dbmail might not end in:
exec dbmail-start ....
but instead expect to be able to do some things afterwards.
HP-UX uses file descriptor 59 instead of file descriptor 19, but for the same reason.
I've heard reports of shells in this era using a descriptor as high as 92- but as you already know- I treat the detaching from the console as a significantly system-dependant, and non-portable thing, such that I let the administrator do it in the shell if they know they're using such a beast.
Besides, THESE days, UNIX has close-on-exec (or ioctl FIOCLEX), so the shell doesn't need to use magic file descriptors anymore.
so if -S is set and -D isn't, if we have FIOCLEX defined, or FD_CLOEXEC, setsid() will do the right thing otherwise, we need to close all file descriptors 0..93 otherwise if -D is set, we need to close all file descriptors 0..93
of course, if we DON'T have FD_CLOEXEC, then chances are we don't have setsid() either (FD_CLOEXEC and setsid() are both in POSIX 1003)- so really, this is more of a historical footnote- especially in case anyone wants to port dbmail to a V7 machine :)