* support socket group separated by effective group.
* if all alive child milters don't need to receive the
  command, children do nothing and leader returns response
  immediately not returning PROGRESS. For example:
Index: milter/manager/milter-manager-children.c
===================================================================
--- milter/manager/milter-manager-children.c	(revision 2280)
+++ milter/manager/milter-manager-children.c	(working copy)
@@ -2205,15 +2205,13 @@
     if (!milter_manager_children_check_alive(children))
         return FALSE;
 
+    priv = MILTER_MANAGER_CHILDREN_GET_PRIVATE(children);
+    priv->current_state = MILTER_SERVER_CONTEXT_STATE_DATA;
+
     if (!milter_manager_children_is_demanding_command(children,
-                                                      MILTER_COMMAND_DATA)) {
-        emit_no_demand_command_error(children, MILTER_COMMAND_DATA);
+                                                      MILTER_COMMAND_DATA))
         return FALSE;
-    }
 
-    priv = MILTER_MANAGER_CHILDREN_GET_PRIVATE(children);
-
-    priv->current_state = MILTER_SERVER_CONTEXT_STATE_DATA;
     init_command_waiting_child_queue(children, MILTER_COMMAND_DATA);
 
     return send_command_to_first_waiting_child(children, MILTER_COMMAND_DATA);
Index: milter/manager/milter-manager-leader.c
===================================================================
--- milter/manager/milter-manager-leader.c	(revision 2280)
+++ milter/manager/milter-manager-leader.c	(working copy)
@@ -783,10 +783,12 @@
     if (!priv->children)
         return MILTER_STATUS_NOT_CHANGE;
 
-    if (milter_manager_children_data(priv->children))
+    if (milter_manager_children_data(priv->children)) {
         return MILTER_STATUS_PROGRESS;
-    else
-        return MILTER_STATUS_NOT_CHANGE; /* FIXME: reject or accept */
+    } else {
+        priv->state = next_state(leader, priv->state);
+        return MILTER_STATUS_NOT_CHANGE;
+    }
 }
 
 MilterStatus
* where cutsom.conf should be used? readable and writabe file has the highest
  priority?
* bug? milter-manager sometimes doesn't finish child milter?
* change process name of forked process launcher.
* send quit command to launcher on manager dispose.
* support controller's UNIX socket mode changing.
* support controller's UNIX socket mode removing on close.
* use chroot
* add --disable-milter-manager configure option.
* add --disable-ruby configure option.
* tool/milter-test-server:
  * support --macro=CONTEXT:NAME:VALUE
  * support extracting multiple {reverse,forward}-paths from
    envelope-from and envelope-recipient address in --mail-file.
* tool/milter-test-client:
  * support outputting reply information.
  * support customizing reply by command line option.
* add default applicable conditions:
  ideas:
    * S25R
    * DNSBL: http://spam-champuru.livedoor.com/dnsbl/
    * remote network (local network may not be a spammer)
      * getifaddrs(3) can be used to determine local network.
    * detected as spam (X-Spam-Flag:, X-Bogosity:)
    * detected as virus (X-Virus-Status:)
    * unauthorized connection
* graphs:
  * child milters alive and dead.
    (This can not be drawn by rrdtool since rrdtool db does not handle variable items)
  * ...

* performance:
  * at least:
    * 50_000 mails/day (0.58 mails/sec)
      * 500 users
      * a user receives 100 mails/day
    * CPU: ???
    * Memory: ???
    * child milters:
      * milter-greylist
      * clamav-milter
      * spamass-milter
      * sid-milter
      * dkim-milter
      * dnsbl-milter

  * FYI:
    * BBSec Sentrion MP 4/8(2008/11)
      http://www.bbsec.co.jp/products/Sentrion_MP_48.html
      * 1_500_000 mails/day (17.36 mails/sec)
      * CPU: Quad Core Intel Xeon E5472,12M Cache,3.0GHz x 2 1600MHz FSB
      * Memory: 8GB

    * Sohpos Email Appliance (2008/11)
      http://sophos.com/sophos/docs/eng/factshts/sophos-email-appliances-dsus.pdf
      http://www.sophos.co.jp/sophos/docs/jpn/factshts/sophos-email-appliances-dsjp.pdf
     * ES1000:
       * 20_000 mails/hour (5.56 mails/sec)
       * CPU: Intel Celeron D 2.93GHz
       * Memory: 1GB
     * ES4000:
       * 80_000 mails/hour (22.22 mails/sec)
       * CPU: Intel Xeon 64-bit 3.2 GHz x 2
       * Memory: 2GB
    * HDE Anti-Spam for Gateway (2008/12)
      http://www.hde.co.jp/has/require/
      * 5_000 mails/hour (1.39 mails/sec)
      * CPU: Intel Pentium Xeon 2GHz
      * Memory: 2GB
* don't handle log event in Ruby/GLib.
* fix FIXME in data/applicable-conditions/remote-network.conf
  * add local network option?
* milter-manager can be ran as normal user if milter-manager process is
  invoked as root user. just only control connection handler and child
  milter process invoker can be ran as root user.
* write man for milter-manager, milter-test-client,
  milter-test-server and milter-log-tool.
* milter_manager_egg_to_xml_string(): add user name, timeouts and
  command options (<- needed?)
* milter-manager supports macros requests.
* milter-client-context should also close writer on timeout.
* support MAIL FROM/RCPT TO additional info parsing.
  (MilterClientContext::envelope-from, MilterClientContext::envelope-recipient)
  cited from ESMTP (RFC 1869) 6.1.:
       esmtp-cmd        ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
       esmtp-parameters ::= esmtp-parameter *(SP esmtp-parameter)
       esmtp-parameter  ::= esmtp-keyword ["=" esmtp-value]
       esmtp-keyword    ::= (ALPHA / DIGIT) *(ALPHA / DIGIT / "-")

			    ; syntax and values depend on esmtp-keyword
       esmtp-value      ::= 1*<any CHAR excluding "=", SP, and all
			       control characters (US ASCII 0-31
			       inclusive)>
			    ; The following commands are extended to

			    ; accept extended parameters.
       inner-esmtp-cmd  ::= ("MAIL FROM:" reverse-path)   /
			    ("RCPT TO:" forward-path)
* milter-client-context supports MilterStepFlags.
* check client context's modify operations (e.g. milter_client_add_header())
  are called on end-of-message state.
