libmilter/mfapi.h 3 milter managerライブラリ
libmilter/mfapi.h libmilter互換API

## 概要

    #define             SMFI_VERSION
    #define             SM_LM_VRS_MAJOR                     (version)
    #define             SM_LM_VRS_MINOR                     (version)
    #define             SM_LM_VRS_PLVL                      (version)
    #define             MI_SUCCESS
    #define             MI_FAILURE
    typedef             SMFICTX;
    typedef             SMFICTX_PTR;
    typedef             smfiDesc_str;
    typedef             smfiDesc_ptr;
    typedef             sfsistat;
    #define             bool
    #define             true
    #define             false
    sfsistat            (*xxfi_connect)                     (SMFICTX *context,
                                                             char *host_name,
                                                             _SOCK_ADDR *address);
    sfsistat            (*xxfi_helo)                        (SMFICTX *context,
                                                             char *fqdn);
    sfsistat            (*xxfi_envfrom)                     (SMFICTX *context,
                                                             char **arguments);
    sfsistat            (*xxfi_envrcpt)                     (SMFICTX *context,
                                                             char **arguments);
    sfsistat            (*xxfi_header)                      (SMFICTX *context,
                                                             char *name,
                                                             char *value);
    sfsistat            (*xxfi_eoh)                         (SMFICTX *context);
    sfsistat            (*xxfi_body)                        (SMFICTX *context,
                                                             unsigned char *data,
                                                             size_t data_size);
    sfsistat            (*xxfi_eom)                         (SMFICTX *context);
    sfsistat            (*xxfi_abort)                       (SMFICTX *context);
    sfsistat            (*xxfi_close)                       (SMFICTX *context);
    sfsistat            (*xxfi_unknown)                     (SMFICTX *context,
                                                             const char *command);
    sfsistat            (*xxfi_data)                        (SMFICTX *context);
    sfsistat            (*xxfi_negotiate)                   (SMFICTX *context,
                                                             unsigned long  actions,
                                                             unsigned long  steps,
                                                             unsigned long  unused0,
                                                             unsigned long  unused1,
                                                             unsigned long *actions_output,
                                                             unsigned long *steps_output,
                                                             unsigned long *unused0_output,
                                                             unsigned long *unused1_output);
    int                 smfi_opensocket                     (bool remove_socket);
    int                 smfi_register                       (struct smfiDesc description);
    int                 smfi_main                           (void);
    int                 smfi_setbacklog                     (int backlog);
    int                 smfi_setdbg                         (int level);
    int                 smfi_settimeout                     (int timeout);
    int                 smfi_setconn                        (char *connection_spec);
    int                 smfi_stop                           (void);
    int                 smfi_version                        (unsigned int *major,
                                                             unsigned int *minor,
                                                             unsigned int *patch_level);
    #define             SMFIF_ADDHDRS
    #define             SMFIF_CHGBODY
    #define             SMFIF_MODBODY
    #define             SMFIF_ADDRCPT
    #define             SMFIF_DELRCPT
    #define             SMFIF_CHGHDRS
    #define             SMFIF_QUARANTINE
    #define             SMFIF_CHGFROM
    #define             SMFIF_ADDRCPT_PAR
    #define             SMFIF_SETSYMLIST
    #define             SMFIS_CONTINUE
    #define             SMFIS_REJECT
    #define             SMFIS_DISCARD
    #define             SMFIS_ACCEPT
    #define             SMFIS_TEMPFAIL
    #define             SMFIS_NOREPLY
    #define             SMFIS_SKIP
    #define             SMFIS_ALL_OPTS
    #define             SMFIM_CONNECT
    #define             SMFIM_HELO
    #define             SMFIM_ENVFROM
    #define             SMFIM_ENVRCPT
    #define             SMFIM_DATA
    #define             SMFIM_EOM
    #define             SMFIM_EOH
    #define             SMFIP_NOCONNECT
    #define             SMFIP_NOHELO
    #define             SMFIP_NOMAIL
    #define             SMFIP_NORCPT
    #define             SMFIP_NOBODY
    #define             SMFIP_NOHDRS
    #define             SMFIP_NOEOH
    #define             SMFIP_NR_HDR
    #define             SMFIP_NOHREPL
    #define             SMFIP_NOUNKNOWN
    #define             SMFIP_NODATA
    #define             SMFIP_SKIP
    #define             SMFIP_RCPT_REJ
    #define             SMFIP_NR_CONN
    #define             SMFIP_NR_HELO
    #define             SMFIP_NR_MAIL
    #define             SMFIP_NR_RCPT
    #define             SMFIP_NR_DATA
    #define             SMFIP_NR_UNKN
    #define             SMFIP_NR_EOH
    #define             SMFIP_NR_BODY
    #define             SMFIP_HDR_LEADSPC
    char *              smfi_getsymval                      (SMFICTX *context,
                                                             char *name);
    int                 smfi_setreply                       (SMFICTX *context,
                                                             char *return_code,
                                                             char *extended_code,
                                                             char *message);
    int                 smfi_setmlreply                     (SMFICTX *context,
                                                             const char *return_code,
                                                             const char *extended_code,
                                                             ...);
    int                 smfi_addheader                      (SMFICTX *context,
                                                             char *name,
                                                             char *value);
    int                 smfi_chgheader                      (SMFICTX *context,
                                                             char *name,
                                                             int index,
                                                             char *value);
    int                 smfi_insheader                      (SMFICTX *context,
                                                             int index,
                                                             char *name,
                                                             char *value);
    int                 smfi_chgfrom                        (SMFICTX *context,
                                                             char *mail,
                                                             char *arguments);
    int                 smfi_addrcpt                        (SMFICTX *context,
                                                             char *recipient);
    int                 smfi_addrcpt_par                    (SMFICTX *context,
                                                             char *recipient,
                                                             char *arguments);
    int                 smfi_delrcpt                        (SMFICTX *context,
                                                             char *recipient);
    int                 smfi_progress                       (SMFICTX *context);
    int                 smfi_replacebody                    (SMFICTX *context,
                                                             unsigned char *new_body,
                                                             int new_body_size);
    int                 smfi_quarantine                     (SMFICTX *context,
                                                             char *reason);
    int                 smfi_setpriv                        (SMFICTX *context,
                                                             void *data);
    void *              smfi_getpriv                        (SMFICTX *context);
    int                 smfi_setsymlist                     (SMFICTX *context,
                                                             int state,
                                                             char *macros);

## 説明

libmilter/mfapi.hはSendmailのlibmilter互換APIを提供します。Sendmailのlibmilterの代わりにこのライブラリを使用することができます。milter.orgのAPIドキュメントもみてください。

## 詳細

### SMFI_VERSION

    #  define SMFI_VERSION 0x01000001

libmilterのバージョン番号。

SMFI_VERSION

### SM_LM_VRS_MAJOR()

    #define SM_LM_VRS_MAJOR(version) (((version) & 0x7f000000) >> 24)

versionからメジャーバージョン番号を取りだします。

version :

  バージョン番号。

返値 :

  メジャーバージョン番号。

SM_LM_VRS_MAJOR

### SM_LM_VRS_MINOR()

    #define SM_LM_VRS_MINOR(version) (((version) & 0x007fff00) >> 8)

versionからマイナーバージョン番号を取りだします。

version :

  バージョン番号。

返値 :

  マイナーバージョン番号。

SM_LM_VRS_MINOR

### SM_LM_VRS_PLVL()

    #define SM_LM_VRS_PLVL(version)		((version) & 0x0000007f)

versionからパッチレベルを取りだします。

version :

  バージョン番号。

返値 :

  パッチレベル。

SM_LM_VRS_PLVL

### MI_SUCCESS

    #define MI_SUCCESS 0

操作が成功したことを示します。

MI_SUCCESS

### MI_FAILURE

    #define MI_FAILURE (-1)

操作が失敗したことを示します。

MI_FAILURE

### SMFICTX

    typedef struct smfi_str  SMFICTX;

milterセッションの情報を持っています。`SMFICTX`は各milterセッション毎に作成されます。`SMFICTX`はlibmilter APIの中でもっとも重要なオブジェクトです。

SMFICTX

### SMFICTX_PTR

    typedef struct smfi_str *SMFICTX_PTR;

`SMFICTX`のポインタ型。

SMFICTX_PTR

### smfiDesc_str

    typedef struct smfiDesc smfiDesc_str;

milterの情報を持っています。`smfi_register()`で`smfiDesc_str`使います。

smfiDesc_str

### smfiDesc_ptr

    typedef struct smfiDesc *smfiDesc_ptr;

`smfiDesc_str`のポインタ型です。

smfiDesc_ptr

### sfsistat

    typedef int sfsistat;

コールバックが返す応答ステータスを示します。

利用可能な応答ステータスは以下のどれかです。

- `SMFIS_CONTINUE`

- `SMFIS_REJECT`

- `SMFIS_DISCARD`

- `SMFIS_ACCEPT`

- `SMFIS_TEMPFAIL`

- `SMFIS_NOREPLY`

- `SMFIS_SKIP`

- `SMFIS_ALL_OPTS`

sfsistat

### bool

    #      define bool int

真偽値型。

bool

### true

    #      define true 1

真の値。

true

### false

    #      define false 0

偽の値。

false

### xxfi_connect ()

    sfsistat            (*xxfi_connect)                     (SMFICTX *context,
                                                             char *host_name,
                                                             _SOCK_ADDR *address);

各milterセッションの最初に呼ばれるコールバック。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在の接続に対する処理を続行します。

`SMFIS_REJECT`

  現在の接続を拒否します。

`SMFIS_ACCEPT`

  これ以上処理を続けずに、現在の接続を受け入れます。

`SMFIS_TEMPFAIL`

  現在の接続を一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxのステータスコードになります。）

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`SMFIP_NR_CONN`フラグを`smfiDesc`::xxfi_flagsに設定していなければいけません。

milter.orgのxxfi_connectも見てください。

context :

  現在のmilterセッションのコンテキスト。

host_name :

  SMTPクライアントのホスト名。

address :

  SMTPクライアントのアドレス。

返値 :

  応答ステータス。

xxfi_connect

### xxfi_helo ()

    sfsistat            (*xxfi_helo)                        (SMFICTX *context,
                                                             char *fqdn);

このコールバックはSMTPの"HELO"/"EHLO"コマンドのときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在の接続に対する処理を続行します。

`SMFIS_REJECT`

  現在の接続を拒否します。

`SMFIS_ACCEPT`

  これ以上処理を続けずに、現在の接続を受け入れます。

`SMFIS_TEMPFAIL`

  現在の接続を一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxのステータスコードになります。）

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`smfiDesc`::xxfi_flagsに`SMFIP_NR_HELO`フラグを設定しなければいけません。

milter.orgの xxfi_heloも見てください。

context :

  現在のmilterセッションのコンテキスト。

fqdn :

  SMTPの"HELO"/"EHLO"コマンドでのFQDN。

返値 :

  応答ステータス。

xxfi_helo

### xxfi_envfrom ()

    sfsistat            (*xxfi_envfrom)                     (SMFICTX *context,
                                                             char **arguments);

このコールバックはSMTPの"MAIL FROM"コマンドのときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在のメッセージに対する処理を続けます。

`SMFIS_REJECT`

  現在の差出人とメッセージを拒否します。新しい差出人が指定されるかもしれません。

`SMFIS_DISCARD`

  現在のメッセージを受け入れて、だまって破棄します。

`SMFIS_ACCEPT`

  これ以上処理を続けずに、現在のメッセージを受け入れます。

`SMFIS_TEMPFAIL`

  現在の差出人とメッセージを一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxのステータスコードになります。）新しい差出人が指定されるかもしれません。

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`smfiDesc`::xxfi_flagsに`SMFIP_NR_MAIL`フラグを設定しなければいけません。

milter.orgの xxfi_envfromも見てください。

context :

  現在のmilterセッションのコンテキスト。

arguments :

  SMTPの"MAIL FROM"コマンドの引数。最初の要素は差出人のアドレスです。`NULL`終端しています。

返値 :

  応答ステータス。

xxfi_envfrom

### xxfi_envrcpt ()

    sfsistat            (*xxfi_envrcpt)                     (SMFICTX *context,
                                                             char **arguments);

このコールバックはSMTPの"RCPT TO"コマンドのときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在のメッセージに対する処理を続けます。

`SMFIS_REJECT`

  現在の宛先を拒否します。現在のメッセージの処理は続きます。

`SMFIS_DISCARD`

  現在のメッセージを受け入れて、だまって破棄します。

`SMFIS_ACCEPT`

  現在の宛先を受け入れます。

`SMFIS_TEMPFAIL`

  現在の宛先を一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxのステータスコードになります。）現在のメッセージの処理は継続します。

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`SMFIP_NR_RCPT`フラグを`smfiDesc`::xxfi_flagsに設定していなければいけません。

milter.orgの xxfi_envrcptも見てください。

context :

  現在のmilterセッションのコンテキスト。

arguments :

  SMTPの"RCPT TO"コマンドの引数。最初の要素は宛先です。`NULL`終端しています。

返値 :

  応答ステータス。

xxfi_envrcpt

### xxfi_header ()

    sfsistat            (*xxfi_header)                      (SMFICTX *context,
                                                             char *name,
                                                             char *value);

このコールバックは各ヘッダに対して呼ばれます。もし、`smfiDesc`::xxfi_flagsに`SMFIP_HDR_LEADSPC`フラグが設定されていれば、valueはヘッダ名と値を区切る":"の後ろにあるスペースも含みます。

例:

    From: from <from@example.com>
    To: recipient <recipient@example.com>
    Subject:a subject

`SMFIP_HDR_LEADSPC`あり:

    "From", " from <from@example.com>"
    "To", " recipient <recipient@example.com>"
    "Subject", "a subject"

`SMFIP_HDR_LEADSPC`なし:

    "From", "from <from@example.com>"
    "To", "recipient <recipient@example.com>"
    "Subject", "a subject"

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在のメッセージに対する処理を続けます。

`SMFIS_REJECT`

  現在のメッセージを拒否します。

`SMFIS_DISCARD`

  現在のメッセージを受け入れて、だまって破棄します。

`SMFIS_ACCEPT`

  これ以上処理を続けずに、現在のメッセージを受け入れます。

`SMFIS_TEMPFAIL`

  現在のメッセージを一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxステータスコードになります。）

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`smfiDesc`::xxfi_flagsに`SMFIP_NR_HDR`フラグを設定しなければいけません。

milter.orgの xxfi_headerも見てください。

context :

  現在のmilterセッションのコンテキスト。

name :

  ヘッダ名。

value :

  ヘッダ値。valueは折り返し時に挿入された空白を含むかもしれません。

返値 :

  応答ステータス。

xxfi_header

### xxfi_eoh ()

    sfsistat            (*xxfi_eoh)                         (SMFICTX *context);

このコールバックはすべてのヘッダが処理されたときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在のメッセージに対する処理を続けます。

`SMFIS_REJECT`

  現在のメッセージを拒否します。

`SMFIS_DISCARD`

  現在のメッセージを受け入れて、だまって破棄します。

`SMFIS_ACCEPT`

  これ以上処理を続けずに、現在のメッセージを受け入れます。

`SMFIS_TEMPFAIL`

  現在のメッセージを一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxステータスコードになります。）

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`smfiDesc`::xxfi_flagsに`SMFIP_NR_EOH`フラグを設定しなければいけません。

milter.orgの xxfi_eofも見てください。

context :

  現在のmilterセッションのコンテキスト。

返値 :

  応答ステータス。

xxfi_eoh

### xxfi_body ()

    sfsistat            (*xxfi_body)                        (SMFICTX *context,
                                                             unsigned char *data,
                                                             size_t data_size);

このコールバックは本文のデータを受け取ったときに呼ばれます。このコールバックは`xxfi_eoh()`と`xxfi_eom()`の間に0回以上呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在のメッセージに対する処理を続けます。

`SMFIS_REJECT`

  現在のメッセージを拒否します。

`SMFIS_DISCARD`

  現在のメッセージを受け入れて、だまって破棄します。

`SMFIS_ACCEPT`

  これ以上処理を続けずに、現在のメッセージを受け入れます。

`SMFIS_TEMPFAIL`

  現在のメッセージを一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxステータスコードになります。）

`SMFIS_SKIP`

  これ以上の本文の処理を省略します。`xxfi_eom()`は呼ばれます。

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`SMFIP_NR_BODY`フラグを`smfiDesc`::xxfi_flagsに設定していなければいけません。

milter.orgの xxfi_bodyも見てください。

context :

  現在のmilterセッションのコンテキスト。

data :

  本文の1かたまり。

data_size :

  dataのサイズ。

返値 :

  応答ステータス。

xxfi_body

### xxfi_eom ()

    sfsistat            (*xxfi_eom)                         (SMFICTX *context);

このコールバックはすべての`xxfi_body()`呼び出しが終わった後に呼ばれます。すべてのメッセージ変更はこのコールバックの中でだけ行えます。変更は`smfi_addheader()`、`smfi_chgfrom()`などです。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在のメッセージに対する処理を続けます。

`SMFIS_DISCARD`

  現在のメッセージを受け入れて、だまって破棄します。

`SMFIS_ACCEPT`

  これ以上処理を続けずに、現在のメッセージを受け入れます。

`SMFIS_TEMPFAIL`

  現在のメッセージを一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxステータスコードになります。）

milter.orgの xxfi_eomも見てください。

context :

  現在のmilterセッションのコンテキスト。

返値 :

  応答ステータス。

xxfi_eom

### xxfi_abort ()

    sfsistat            (*xxfi_abort)                       (SMFICTX *context);

このコールバックは `xxfi_envfrom()`から`xxfi_eom()`の間のどこかのタイミングで呼び出される可能性があります。このコールバックはmilter内部でエラーが発生し、かつ、メッセージ処理が完了していないときだけ実行されます。例えば、milterが`SMFIS_ACCEPT`、`SMFIS_REJECT`、`SMFIS_DISCARD`、`SMFIS_TEMPFAIL`を返しているときはこのコールバックは呼ばれません。

milterが`xxfi_envfrom()`から`xxfi_eom()`の間にメッセージのために割り当てたリソースがある場合は、このコールバックの中で解放してください。しかし、接続用に割り当てられたリソースは解放しないで下さい。そのリソースは`xxfi_close()`で解放してください。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在のメッセージに対する処理を続けます。

`SMFIS_DISCARD`

  現在のメッセージを受け入れて、だまって破棄します。

`SMFIS_ACCEPT`

  これ以上処理を続けずに、現在のメッセージを受け入れます。

`SMFIS_TEMPFAIL`

  現在のメッセージを一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxステータスコードになります。）

milter.orgの xxfi_abortも見てください。

context :

  現在のmilterセッションのコンテキスト。

返値 :

  応答ステータス。

xxfi_abort

### xxfi_close ()

    sfsistat            (*xxfi_close)                       (SMFICTX *context);

このコールバックは各milterセッションの最後に呼ばれます。milterがセッション中で割り当てたリソースはこのコールバックの中で解放してください。

すべての応答ステータスは無視されます。`SMFIS_CONTINUE`を使って下さい。

milter.orgの xxfi_closeも見てください。

context :

  現在のmilterセッションのコンテキスト。

返値 :

  応答ステータス。

xxfi_close

### xxfi_unknown ()

    sfsistat            (*xxfi_unknown)                     (SMFICTX *context,
                                                             const char *command);

このコールバックは未知のSMTPコマンドまたは未実装のSMTPコマンドが送られてきた場合に呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_REJECT`

  現在のメッセージを拒否します。

`SMFIS_TEMPFAIL`

  現在のメッセージを一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxステータスコードになります。）

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`SMFIP_NR_UNKN`フラグを`smfiDesc`::xxfi_flagsに設定していなければいけません。

MTAは、未知のSMTPコマンドまたは未実装のSMTPコマンドは常に拒否することに中してください。

milter.orgの xxfi_unknownも見てください。

context :

  現在のmilterセッションのコンテキスト。

command :

  未知のSMTPコマンド。

返値 :

  応答ステータス。

xxfi_unknown

### xxfi_data ()

    sfsistat            (*xxfi_data)                        (SMFICTX *context);

このコールバックはSMTPの"DATA"コマンドのときに呼ばれます。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_CONTINUE`

  現在のメッセージに対する処理を続けます。

`SMFIS_REJECT`

  現在のメッセージを拒否します。

`SMFIS_DISCARD`

  現在のメッセージを受け入れて、だまって破棄します。

`SMFIS_ACCEPT`

  現在の宛先を受け入れます。

`SMFIS_TEMPFAIL`

  現在のメッセージを一時的な障害が発生したとして拒否します。（つまり、SMTPでは4xxステータスコードになります。）

`SMFIS_NOREPLY`

  MTAに返答しません。

  milterは`SMFIP_NR_DATA`フラグを`smfiDesc`::xxfi_flagsに設定していなければいけません。

milter.orgの xxfi_dataも見てください。

context :

  現在のmilterセッションのコンテキスト。

返値 :

  応答ステータス。

xxfi_data

### xxfi_negotiate ()

    sfsistat            (*xxfi_negotiate)                   (SMFICTX *context,
                                                             unsigned long  actions,
                                                             unsigned long  steps,
                                                             unsigned long  unused0,
                                                             unsigned long  unused1,
                                                             unsigned long *actions_output,
                                                             unsigned long *steps_output,
                                                             unsigned long *unused0_output,
                                                             unsigned long *unused1_output);

このコールバックはMTAからネゴシエーション要求があったときに呼ばれます。MTAから受け取ったactionsとstepsを変更したい場合は、actions_outputとsteps_outputを設定して、`SMFIS_CONTINUE`を返してください。もし、actionsとstepsの両方を変更しない場合は、たんに`SMFIS_ALL_OPTS`を返してください。

すべての利用可能な応答ステータスは以下の通りです。

`SMFIS_ALL_OPTS`

  すべての利用可能なアクションとステップを有効にします。

`SMFIS_REJECT`

  現在のセッションを拒否します。

`SMFIS_CONTINUE`

  actions_outputとsteps_outputを使って、現在のセッションの処理を継続します。

milter.orgの xxfi_negotiateも見てください。

context :

  現在のmilterセッションのコンテキスト。

actions :

  MTAから受け取ったアクション。

steps :

  MTAから提案されたmilterプロトコルの実行ステップ。

unused0 :

  使われません。

unused1 :

  使われません。

actions_output :

  MTAに要求するアクション。

steps_output :

  MTAに要求するmilterプロトコルの実行ステップ。

unused0_output :

  使われません。

unused1_output :

  使われません。

返値 :

  応答ステータス。

xxfi_negotiate

### smfi_opensocket ()

    int                 smfi_opensocket                     (bool remove_socket);

MTAからの接続されるソケットを作成します。

通常は、`smfi_opensocket()`を明示的に呼ぶ必要はありません。ソケットは`smfi_main()`の中で暗黙的に作られます。

失敗条件は以下の通りです。

- `smfi_register()`の呼び出しに成功していない。

- `smfi_setconn()`の呼び出しに成功していない。

- 接続指定がUNIXドメインソケットでremove_socketが真のとき、`smfi_opensocket()`が既存のUNIXドメインソケットの削除に失敗した場合。

- `smfi_opensocket()`が新しいソケットの作成に失敗した場合。

milter.orgの smfi_opensocketも見てください。

remove_socket :

  新しいソケットを作る前に、既存のUNIXドメインソケットを削除しようとするかどうか。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_opensocket

### smfi_register ()

    int                 smfi_register                       (struct smfiDesc description);

milterの実装をコールバックとして登録します。

失敗条件は以下の通りです。

- 互換性のないxxfi_version。

- 不正なxxfi_flagsの値。

milter.orgの smfi_registerも見てください。

description :

  milterの説明。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_register

### smfi_main ()

    int                 smfi_main                           (void);

イベントループに入ります。milterは`smfi_main()`を呼ぶ前に、`smfi_register()`、`smfi_setconn()`などで初期化していなければいけません。

失敗条件は以下の通りです。

- ソケットの作成に失敗したとき。

milter.orgの smfi_mainも見てください。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_main

### smfi_setbacklog ()

    int                 smfi_setbacklog                     (int backlog);

listen(2)で使われるmilterの接続キューの最大長を設定します。

失敗条件は以下の通りです。

- backlog &lt;= 0.

milter.orgの smfi_setbacklogも見てください。

backlog :

  処理待ちの接続キューの最大長。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_setbacklog

### smfi_setdbg ()

    int                 smfi_setdbg                         (int level);

ログレベルを設定します。levelが0ならすべてのログメッセージが抑制されます。大きい値を指定すればするほど多くのログメッセージが出力されます。

milter.orgの smfi_setdbgも見てください。

level :

  ログレベル。

返値 :

  常に`MI_SUCCESS`。

smfi_setdbg

### smfi_settimeout ()

    int                 smfi_settimeout                     (int timeout);

入出力のタイムアウト時間を秒で設定します。既定値は7210秒です。timeout == 0は待たないことを意味します。"永遠に待つ"ではありません。

milter.orgの smfi_settimeoutも見てください。

timeout :

  タイムアウト値を秒で指定します。

返値 :

  常に`MI_SUCCESS`。

smfi_settimeout

### smfi_setconn ()

    int                 smfi_setconn                        (char *connection_spec);

接続指定を設定します。

connection_specの書式は以下のいずれかです。

- "unix:/PATH/TO/SOCKET": UNIXドメインソケット。

- "inet:PORT"、"inet:PORT@HOST_NAME"、"inet:PORT@IP_ADDRESS": IPv4。

- "inet6:PORT"、"inet6:PORT@HOST_NAME"、"inet6:PORT@IP_ADDRESS": IPv6。

失敗条件は以下の通りです。

- 不正な形式。

- connection_specが`NULL`。

milter.orgの smfi_setconnも見てください。

connection_spec :

  MTAと通信するための接続指定。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_setconn

### smfi_stop ()

    int                 smfi_stop                           (void);

milterを中止します。これ以上の接続を受け付けませんが、処理中の接続は最後まで続けます。

milter.orgの smfi_stopも見てください。

返値 :

  常に`MI_SUCCESS`。

smfi_stop

### smfi_version ()

    int                 smfi_version                        (unsigned int *major,
                                                             unsigned int *minor,
                                                             unsigned int *patch_level);

libmilterのバージョンを取得します。バージョンはビルド時のlibmilterのバージョンではなくて、実行時に使用しているバージョンです。

milter.orgの smfi_versionも見てください。

major :

  メジャーバージョンを返すアドレス。

minor :

  マイナーバージョンを返すアドレス。

patch_level :

  パッチレベルを返すアドレス。

返値 :

  常に`MI_SUCCESS`。

smfi_version

### SMFIF_ADDHDRS

    #define SMFIF_ADDHDRS     0x00000001L

milterは`smfi_addheader()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_ADDHDRS

### SMFIF_CHGBODY

    #define SMFIF_CHGBODY     0x00000002L

milterは`smfi_chgbody()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_CHGBODY

### SMFIF_MODBODY

    #define SMFIF_MODBODY     SMFIF_CHGBODY

`SMFIF_CHGBODY`と同じ。

SMFIF_MODBODY

### SMFIF_ADDRCPT

    #define SMFIF_ADDRCPT     0x00000004L

milterは`smfi_addrcpt()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_ADDRCPT

### SMFIF_DELRCPT

    #define SMFIF_DELRCPT     0x00000008L

milterは`smfi_delrcpt()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_DELRCPT

### SMFIF_CHGHDRS

    #define SMFIF_CHGHDRS     0x00000010L

milterは`smfi_chgheader()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_CHGHDRS

### SMFIF_QUARANTINE

    #define SMFIF_QUARANTINE  0x00000020L

milterは`smfi_quarantine()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_QUARANTINE

### SMFIF_CHGFROM

    #define SMFIF_CHGFROM     0x00000040L

milterは`smfi_chgfrom()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_CHGFROM

### SMFIF_ADDRCPT_PAR

    #define SMFIF_ADDRCPT_PAR 0x00000080L

milterは`smfi_addrcpt_par()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_ADDRCPT_PAR

### SMFIF_SETSYMLIST

    #define SMFIF_SETSYMLIST  0x00000100L

milterは`smfi_setsymlist()`を呼ぶかもしれません。

`smfiDesc`と`xxfi_negotiate()`とmilter.orgのsmfi_registerも見てください。

SMFIF_SETSYMLIST

### SMFIS_CONTINUE

    #define SMFIS_CONTINUE    0

現在の処理を継続します。

各コールバック（`xxfi_connect()`、`xxfi_helo()`など）とmilter.orgのコールバックの返値の説明も見てください。

SMFIS_CONTINUE

### SMFIS_REJECT

    #define SMFIS_REJECT      1

現在処理中のターゲットを拒否します。

各コールバック（`xxfi_connect()`、`xxfi_helo()`など）とmilter.orgのコールバックの返値の説明も見てください。

SMFIS_REJECT

### SMFIS_DISCARD

    #define SMFIS_DISCARD     2

現在処理中のターゲットを受け入れて、だまって破棄します。

各コールバック（`xxfi_envfrom()`、`xxfi_envrcpt()`など）とmiler.orgのコールバックの返値の説明も見てください。

SMFIS_DISCARD

### SMFIS_ACCEPT

    #define SMFIS_ACCEPT      3

現在処理中のターゲットを受け入れます。

各コールバック（`xxfi_connect()`、`xxfi_helo()`など）とmilter.orgのコールバックの返値の説明も見てください。

SMFIS_ACCEPT

### SMFIS_TEMPFAIL

    #define SMFIS_TEMPFAIL    4

現在のターゲットに対して、一時的な障害ステータスを返します。

各コールバック（`xxfi_connect()`、`xxfi_helo()`など）とmilter.orgのコールバックの返値の説明も見てください。

SMFIS_TEMPFAIL

### SMFIS_NOREPLY

    #define SMFIS_NOREPLY     7

MTAに返答しません。

各コールバック（`xxfi_connect()`、`xxfi_helo()`など）とmilter.orgのコールバックの返値の説明も見てください。

SMFIS_NOREPLY

### SMFIS_SKIP

    #define SMFIS_SKIP        8

残りの本文を省略します。`xxfi_body()`の中でだけ使えます。

milter.orgのコールバックの返値の説明も見てください。

SMFIS_SKIP

### SMFIS_ALL_OPTS

    #define SMFIS_ALL_OPTS    10

MTAから受け取ったすべてのネゴシエーションオプションを使います。これは`xxfi_negotiate()`の中でだけ使えます。

SMFIS_ALL_OPTS

### SMFIM_CONNECT

    #define SMFIM_CONNECT	  0

`xxfi_connect()`のプロトコル段階であることを示します。

`smfi_setsymlist()`も見てください。

SMFIM_CONNECT

### SMFIM_HELO

    #define SMFIM_HELO	  1

`xxfi_helo()`のプロトコル段階であることを示します。

`smfi_setsymlist()`も見てください。

SMFIM_HELO

### SMFIM_ENVFROM

    #define SMFIM_ENVFROM	  2

`xxfi_envfrom()`のプロトコル段階であることを示します。

`smfi_setsymlist()`も見てください。

SMFIM_ENVFROM

### SMFIM_ENVRCPT

    #define SMFIM_ENVRCPT	  3

`xxfi_envrcpt()`のプロトコル段階であることを示します。

`smfi_setsymlist()`も見てください。

SMFIM_ENVRCPT

### SMFIM_DATA

    #define SMFIM_DATA	  4

`xxfi_data()`のプロトコル段階であることを示します。

`smfi_setsymlist()`も見てください。

SMFIM_DATA

### SMFIM_EOM

    #define SMFIM_EOM	  5

`xxfi_eom()`のプロトコル段階であることを示します。

`smfi_setsymlist()`も見てください。

SMFIM_EOM

### SMFIM_EOH

    #define SMFIM_EOH	  6

`xxfi_eoh()`のプロトコル段階であることを示します。

`smfi_setsymlist()`も見てください。

SMFIM_EOH

### SMFIP_NOCONNECT

    #define SMFIP_NOCONNECT       0x00000001L

MTAは`xxfi_connect()`の情報を送信しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NOCONNECT

### SMFIP_NOHELO

    #define SMFIP_NOHELO          0x00000002L

MTAが`xxfi_helo()`の情報を送信しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NOHELO

### SMFIP_NOMAIL

    #define SMFIP_NOMAIL          0x00000004L

MTAが`xxfi_mail()`の情報を送信しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NOMAIL

### SMFIP_NORCPT

    #define SMFIP_NORCPT          0x00000008L

MTAが`xxfi_rcpt()`の情報を送信しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NORCPT

### SMFIP_NOBODY

    #define SMFIP_NOBODY          0x00000010L

SMFIP_NOBODY

### SMFIP_NOHDRS

    #define SMFIP_NOHDRS          0x00000020L

MTAが`xxfi_header()`の情報を送信しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NOHDRS

### SMFIP_NOEOH

    #define SMFIP_NOEOH           0x00000040L

MTAが`xxfi_eoh()`の情報を送信しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NOEOH

### SMFIP_NR_HDR

    #define SMFIP_NR_HDR          0x00000080L

milterが`xxfi_header()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_HDR

### SMFIP_NOHREPL

    #define SMFIP_NOHREPL         SMFIP_NR_HDR

`SMFIP_NR_HDR`と同じ。

SMFIP_NOHREPL

### SMFIP_NOUNKNOWN

    #define SMFIP_NOUNKNOWN       0x00000100L

MTAが`xxfi_unknown()`の情報を送信しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NOUNKNOWN

### SMFIP_NODATA

    #define SMFIP_NODATA          0x00000200L

MTAが`xxfi_data()`の情報を送信しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NODATA

### SMFIP_SKIP

    #define SMFIP_SKIP            0x00000400L

MTAが`xxfi_body()`での`SMFIS_SKIP`をサポートしていることを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_SKIP

### SMFIP_RCPT_REJ

    #define SMFIP_RCPT_REJ        0x00000800L

MTAは拒否した宛先も送信し、`xxfi_envrcpt()`が呼び出されることを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_RCPT_REJ

### SMFIP_NR_CONN

    #define SMFIP_NR_CONN         0x00001000L

milterが`xxfi_connect()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_CONN

### SMFIP_NR_HELO

    #define SMFIP_NR_HELO         0x00002000L

milterが`xxfi_helo()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_HELO

### SMFIP_NR_MAIL

    #define SMFIP_NR_MAIL         0x00004000L

milterが`xxfi_envfrom()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_MAIL

### SMFIP_NR_RCPT

    #define SMFIP_NR_RCPT         0x00008000L

milterが`xxfi_envrcpt()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_RCPT

### SMFIP_NR_DATA

    #define SMFIP_NR_DATA         0x00010000L

milterが`xxfi_data()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_DATA

### SMFIP_NR_UNKN

    #define SMFIP_NR_UNKN         0x00020000L

milterが`xxfi_unknown()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_UNKN

### SMFIP_NR_EOH

    #define SMFIP_NR_EOH          0x00040000L

milterが`xxfi_eoh()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_EOH

### SMFIP_NR_BODY

    #define SMFIP_NR_BODY         0x00080000L

milterが`xxfi_body()`に返答しないことを示します。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_NR_BODY

### SMFIP_HDR_LEADSPC

    #define SMFIP_HDR_LEADSPC     0x00100000L

`xxfi_header()`コールバックが':'の後のスペース付きでヘッダの値を受けとることを示します。例は`xxfi_header()`を見てください。

このフラグは`xxfi_negotiate()`のsteps_outputで取得・設定できます。

SMFIP_HDR_LEADSPC

### smfi_getsymval ()

    char *              smfi_getsymval                      (SMFICTX *context,
                                                             char *name);

現在のmilterセッションコンテキスト中でのnameというマクロ名の値を返します。`smfi_getsymval()`はxxfi_XXXコールバックの中で使えます。（例えば、`xxfi_connect()`、`xxfi_helo()`など）

nameが"i"のように1文字でない場合は、"{if_name}"のようにかっこ（"{"と"}"）で囲みます。

milter.orgの smfi_getsymvalも見てください。Sendmailの既定のマクロもそのページに載っています。

context :

  現在のmilterセッションのコンテキスト。

name :

  マクロ名。

返値 :

  もしあればnameというマクロ名の値、なければ`NULL`。

smfi_getsymval

### smfi_setreply ()

    int                 smfi_setreply                       (SMFICTX *context,
                                                             char *return_code,
                                                             char *extended_code,
                                                             char *message);

エラー応答コードを設定します。4xx return_codeは`SMFIS_TEMPFAIL`のときに使います。5xx return_codeは`SMFIS_REJECT`のときに使います。

失敗条件は以下の通りです。

- return_codeが4xxでも5xxでもない。

- extended_codeが4.x.xでも5.x.xでもない。

milter.orgの smfi_setreplyも見てください。

context :

  現在のmilterセッションのコンテキスト。

return_code :

  3桁のSMTPエラー応答コード。（RFC 2821）4xxと5xxだけが使えます。

extended_code :

  拡張応答コード（RFC 1893/2034）または`NULL`。4.x.xと5.x.xだけが使えます。

message :

  SMTP応答のテキスト部分または`NULL`。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_setreply

### smfi_setmlreply ()

    int                 smfi_setmlreply                     (SMFICTX *context,
                                                             const char *return_code,
                                                             const char *extended_code,
                                                             ...);

エラー応答コードを設定します。4xx return_codeは`SMFIS_TEMPFAIL`のときに使います。5xx return_codeは`SMFIS_REJECT`のときに使います。

失敗条件は以下の通りです。

- return_codeが4xxでも5xxでもない。

- extended_codeが4.x.xでも5.x.xでもない。

milter.orgの smfi_setmlreplyも見てください。

context :

  現在のmilterセッションのコンテキスト。

return_code :

  3桁のSMTPエラー応答コード。（RFC 2821）4xxと5xxだけが使えます。

extended_code :

  拡張応答コード（RFC 1893/2034）または`NULL`。4.x.xと5.x.xだけが使えます。

... :

  SMTP応答のテキスト部分の一行。最後に`NULL`を指定すること。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_setmlreply

### smfi_addheader ()

    int                 smfi_addheader                      (SMFICTX *context,
                                                             char *name,
                                                             char *value);

現在のメッセージのヘッダリストにヘッダを追加します。`smfi_addheader()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- nameが`NULL`。

- valueが`NULL`。

- `xxfi_eom()`以外のところで呼ばれた。

- `SMFIF_ADDHDRS`フラグが`smfi_register()`の中でも、`xxfi_negotiate()`でも指定されていない。

- ネットワークエラー発生。

milter.orgの smfi_addheaderも見てください。

context :

  現在のmilterセッションのコンテキスト。

name :

  ヘッダ名。

value :

  ヘッダ値。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_addheader

### smfi_chgheader ()

    int                 smfi_chgheader                      (SMFICTX *context,
                                                             char *name,
                                                             int index,
                                                             char *value);

nameという名前のヘッダのうち、index番目にあるヘッダを変更します。valueが`NULL`ならそのヘッダは削除されます。`smfi_chgheader()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- nameが`NULL`。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- `smfi_register()`あるいは`xxfi_negotiate()`で`SMFIF_CHGHDRS`フラグが設定されていない。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_chgheaderも見てください。

context :

  現在のmilterセッションのコンテキスト。

name :

  ヘッダ名。

index :

  名前がnameのすべてのヘッダの中の位置。（1ベース）

value :

  ヘッダ値。ターゲットのヘッダを削除する場合は`NULL`を指定してください。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_chgheader

### smfi_insheader ()

    int                 smfi_insheader                      (SMFICTX *context,
                                                             int index,
                                                             char *name,
                                                             char *value);

ヘッダのindex番目にヘッダを挿入します。`smfi_insheader()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- nameが`NULL`。

- valueが`NULL`。FIXME: 未実装。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- `smfi_register()`あるいは`xxfi_negotiate()`で`SMFIF_ADDHDRS`フラグが設定されていない。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_insheaderも見てください。

context :

  現在のmilterセッションのコンテキスト。

index :

  挿入されるヘッダの位置。0は先頭に追加するという意味になります。

name :

  ヘッダ名。

value :

  ヘッダ値。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_insheader

### smfi_chgfrom ()

    int                 smfi_chgfrom                        (SMFICTX *context,
                                                             char *mail,
                                                             char *arguments);

送信者のアドレスを変更します。`smfi_chgfrom()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- mailが`NULL`。FIXME: 未実装。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- `smfi_register()`あるいは`xxfi_negotiate()`で`SMFIF_CHGFROM`フラグが設定されていない。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_chgfromも見てください。

context :

  現在のmilterセッションのコンテキスト。

mail :

  新しい送信者のアドレス。

arguments :

  ESMTPの追加の引数。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_chgfrom

### smfi_addrcpt ()

    int                 smfi_addrcpt                        (SMFICTX *context,
                                                             char *recipient);

宛先アドレスを追加します。`smfi_addrcpt()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- recipientが`NULL`。FIXME: 未実装。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- `smfi_register()`あるいは`xxfi_negotiate()`で`SMFIF_ADDRCPT`フラグが設定されていない。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_addrcptも見てください。

context :

  現在のmilterセッションのコンテキスト。

recipient :

  新しい宛先アドレス。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_addrcpt

### smfi_addrcpt_par ()

    int                 smfi_addrcpt_par                    (SMFICTX *context,
                                                             char *recipient,
                                                             char *arguments);

追加のESMTP引数付きで宛先アドレスを追加します。`smfi_addrcpt_par()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- recipientが`NULL`。FIXME: 未実装。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- `smfi_register()`あるいは`xxfi_negotiate()`で`SMFIF_ADDRCPT_PAR`フラグが設定されていない。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_addrcpt_parも見てください。

context :

  現在のmilterセッションのコンテキスト。

recipient :

  宛先アドレス。

arguments :

  ESMTPの追加の引数。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_addrcpt_par

### smfi_delrcpt ()

    int                 smfi_delrcpt                        (SMFICTX *context,
                                                             char *recipient);

宛先のアドレスを削除します。`smfi_delrcpt()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- recipientが`NULL`。FIXME: 未実装。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- `smfi_register()`あるいは`xxfi_negotiate()`で`SMFIF_DELRCPT`フラグが設定されていない。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_delrcptも見てください。

context :

  現在のmilterセッションのコンテキスト。

recipient :

  宛先アドレス。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_delrcpt

### smfi_progress ()

    int                 smfi_progress                       (SMFICTX *context);

現在の接続を維持します。`smfi_progress()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_progressも見てください。

context :

  現在のmilterセッションのコンテキスト。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_progress

### smfi_replacebody ()

    int                 smfi_replacebody                    (SMFICTX *context,
                                                             unsigned char *new_body,
                                                             int new_body_size);

現在の本文のデータをnew_bodyで置き換えます。`smfi_replacebody()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- new_body == `NULL`でnew_body_size > 0のとき。FIXME: 未実装。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- `smfi_register()`あるいは`xxfi_negotiate()`で`SMFIF_CHGBODY`が設定されていない。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_replacebodyも見てください。

context :

  現在のmilterセッションのコンテキスト。

new_body :

  新しい本文のデータ。

new_body_size :

  new_bodyのサイズ。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_replacebody

### smfi_quarantine ()

    int                 smfi_quarantine                     (SMFICTX *context,
                                                             char *reason);

現在のメッセージをreasonという理由で隔離します。`smfi_quarantine()`は`xxfi_eom()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- reasonが`NULL`または空。FIXME: 未実装。

- `xxfi_eom()`以外で呼ばれた。FIXME: 未実装。

- `smfi_register()`あるいは`xxfi_negotiate()`で`SMFIF_QUARANTINE`が設定されていない。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_quarantineも見てください。

context :

  現在のmilterセッションのコンテキスト。

reason :

  隔離理由。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_quarantine

### smfi_setpriv ()

    int                 smfi_setpriv                        (SMFICTX *context,
                                                             void *data);

プライベートなデータを設定します。

失敗条件は以下の通りです。

- contextが不正。FIXME: 未実装。

milter.orgの smfi_setprivも見てください。

context :

  現在のmilterセッションのコンテキスト。

data :

  プライベートなデータ。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_setpriv

### smfi_getpriv ()

    void *              smfi_getpriv                        (SMFICTX *context);

プライベートなデータを取得します。

失敗条件は以下の通りです。

- contextが不正。FIXME: 未実装。

milter.orgの smfi_getprivも見てください。

context :

  現在のmilterセッションのコンテキスト。

返値 :

  `smfi_setpriv()`で設定したプライベートなデータか`NULL`。

smfi_getpriv

### smfi_setsymlist ()

    int                 smfi_setsymlist                     (SMFICTX *context,
                                                             int state,
                                                             char *macros);

要求するマクロのリストを設定します。`smfi_setsymlist()`は`xxfi_negotiate()`の中で呼ぶことができます。

失敗条件は以下の通りです。

- stateが不正。FIXME: 未実装。

- macrosが`NULL`または空。FIXME: 未実装。

- stateの要求マクロリストがすでに設定されている。FIXME: 未実装。

- `xxfi_negotiate()`以外から呼ばれた。FIXME: 未実装。

- ネットワークエラー発生。

milter.orgの smfi_setsymlistも見てください。

context :

  現在のmilterセッションのコンテキスト。

state :

  `SMFIM_CONNECT`のようなSMFIM_XXXとして定義された状態。

macros :

  "{rcpt_mailer} {rcpt_host}"のような空白で区切られたマクロ名のリスト。

返値 :

  成功した場合は`MI_SUCCESS`、そうでない場合は`MI_FAILURE`。

smfi_setsymlist