Top | ![]() |
![]() |
![]() |
![]() |
#define | SM_LM_VRS_MAJOR() |
#define | SM_LM_VRS_MINOR() |
#define | SM_LM_VRS_PLVL() |
int | smfi_opensocket () |
int | smfi_register () |
int | smfi_main () |
int | smfi_setbacklog () |
int | smfi_setdbg () |
int | smfi_settimeout () |
int | smfi_setconn () |
int | smfi_stop () |
int | smfi_version () |
char * | smfi_getsymval () |
int | smfi_setreply () |
int | smfi_setmlreply () |
int | smfi_addheader () |
int | smfi_chgheader () |
int | smfi_insheader () |
int | smfi_chgfrom () |
int | smfi_addrcpt () |
int | smfi_addrcpt_par () |
int | smfi_delrcpt () |
int | smfi_progress () |
int | smfi_replacebody () |
int | smfi_quarantine () |
int | smfi_setpriv () |
void * | smfi_getpriv () |
int | smfi_setsymlist () |
libmilter/mfapi.hはSendmailのlibmilter互換APIを提供します。Sendmailのlibmilterの代わりにこのライブラリを使用することができます。milter.orgのAPIドキュメントもみてください。
#define SM_LM_VRS_MAJOR(version) (((version) & 0x7f000000) >> 24)
Extracts major version number from version
.
#define SM_LM_VRS_MINOR(version) (((version) & 0x007fff00) >> 8)
Extracts minor version number from version
.
#define SM_LM_VRS_PLVL(version) ((version) & 0x0000007f)
Extracts patch level from version
.
int
smfi_opensocket (bool remove_socket
);
MTAからの接続されるソケットを作成します。
通常は、smfi_opensocket()
を明示的に呼ぶ必要はありません。ソケットはsmfi_main()
の中で暗黙的に作られます。
失敗条件は以下の通りです。
smfi_register() hasn't called successfully.
smfi_setconn() hasn't called successfully.
smfi_opensocket() fails to remove existing UNIX domain socket if connection spec is for UNIX domain socket and remove_socket
is true.
smfi_opensocket() fails to create the new socket.
milter.orgの smfi_opensocketも見てください。
int
smfi_register (struct smfiDesc description
);
milterの実装をコールバックとして登録します。
失敗条件は以下の通りです。
互換性のないxxfi_version。
不正なxxfi_flagsの値。
milter.orgの smfi_registerも見てください。
int
smfi_main (void
);
イベントループに入ります。milterはsmfi_main()
を呼ぶ前に、smfi_register()
、smfi_setconn()
などで初期化していなければいけません。
失敗条件は以下の通りです。
ソケットの作成に失敗したとき。
milter.orgの smfi_mainも見てください。
int
smfi_setbacklog (int backlog
);
listen(2)で使われるmilterの接続キューの最大長を設定します。
失敗条件は以下の通りです。
backlog
<= 0.
milter.orgの smfi_setbacklogも見てください。
int
smfi_setdbg (int level
);
ログレベルを設定します。level
が0ならすべてのログメッセージが抑制されます。大きい値を指定すればするほど多くのログメッセージが出力されます。
milter.orgの smfi_setdbgも見てください。
int
smfi_settimeout (int timeout
);
入出力のタイムアウト時間を秒で設定します。既定値は7210秒です。timeout
== 0は待たないことを意味します。"永遠に待つ"ではありません。
milter.orgの smfi_settimeoutも見てください。
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も見てください。
int
smfi_stop (void
);
milterを中止します。これ以上の接続を受け付けませんが、処理中の接続は最後まで続けます。
milter.orgの smfi_stopも見てください。
int smfi_version (unsigned int *major
,unsigned int *minor
,unsigned int *patch_level
);
libmilterのバージョンを取得します。バージョンはビルド時のlibmilterのバージョンではなくて、実行時に使用しているバージョンです。
milter.orgの smfi_versionも見てください。
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の既定のマクロもそのページに載っています。
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も見てください。
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も見てください。
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も見てください。
int smfi_chgheader (SMFICTX *context
,char *name
,int index
,char *value
);
Changes a header that is located at index
in headers that all of them are named name
. If value
is NULL
, the header is deleted. smfi_chgheader()
can be called in xxfi_eom()
.
失敗条件は以下の通りです。
name
がNULL
。
xxfi_eom()
以外で呼ばれた。FIXME: 未実装。
smfi_register()
あるいはxxfi_negotiate()
でSMFIF_CHGHDRS
フラグが設定されていない。FIXME: 未実装。
ネットワークエラー発生。
milter.orgの smfi_chgheaderも見てください。
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も見てください。
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も見てください。
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も見てください。
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も見てください。
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も見てください。
int
smfi_progress (SMFICTX *context
);
現在の接続を維持します。smfi_progress()
はxxfi_eom()
の中で呼ぶことができます。
失敗条件は以下の通りです。
xxfi_eom()
以外で呼ばれた。FIXME: 未実装。
ネットワークエラー発生。
milter.orgの smfi_progressも見てください。
int smfi_replacebody (SMFICTX *context
,unsigned char *new_body
,int new_body_size
);
Replaces the current body data with new_body
. smfi_replacebody()
can be called in xxfi_eom()
.
失敗条件は以下の通りです。
new_body
== NULL
and new_body_size
> 0. FIXME: not-implemented yet.
xxfi_eom()
以外で呼ばれた。FIXME: 未実装。
smfi_register()
あるいはxxfi_negotiate()
でSMFIF_CHGBODY
が設定されていない。FIXME: 未実装。
ネットワークエラー発生。
milter.orgの smfi_replacebodyも見てください。
int smfi_quarantine (SMFICTX *context
,char *reason
);
Quarantines the current message with reason
. smfi_quarantine()
can be called in xxfi_eom()
.
失敗条件は以下の通りです。
reason
がNULL
または空。FIXME: 未実装。
xxfi_eom()
以外で呼ばれた。FIXME: 未実装。
smfi_register()
あるいはxxfi_negotiate()
でSMFIF_QUARANTINE
が設定されていない。FIXME: 未実装。
ネットワークエラー発生。
milter.orgの smfi_quarantineも見てください。
int smfi_setpriv (SMFICTX *context
,void *data
);
プライベートなデータを設定します。
失敗条件は以下の通りです。
context
が不正。FIXME: 未実装。
milter.orgの smfi_setprivも見てください。
void *
smfi_getpriv (SMFICTX *context
);
プライベートなデータを取得します。
失敗条件は以下の通りです。
context
が不正。FIXME: 未実装。
milter.orgの smfi_getprivも見てください。
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 |
|
|
macros |
"{rcpt_mailer} {rcpt_host}"のような空白で区切られたマクロ名のリスト。 |
typedef struct smfi_str SMFICTX;
milterセッションの情報を持っています。SMFICTX
は各milterセッション毎に作成されます。SMFICTX
はlibmilter APIの中でもっとも重要なオブジェクトです。
typedef struct smfiDesc smfiDesc_str;
milterの情報を持っています。smfi_register()
でsmfiDesc_str
使います。
struct smfiDesc { char *xxfi_name; int xxfi_version; unsigned long xxfi_flags; 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); };
smfiDesc
is used by smfi_register()
to register a milter.
If xxfi_name
is NULL
, "Unknown" is used as default milter name.
xxfi_version
must be specified SMFI_VERSION
.
Here are the available xxfi_flags
values:
SMFIF_ADDHDRS
: The milter may call smfi_addheader()
.
SMFIF_CHGHDRS
: The milter may call smfi_chgheader()
.
SMFIF_CHGBODY
: The milter may call smfi_chgbody()
.
SMFIF_ADDRCPT
: The milter may call smfi_addrcpt()
.
SMFIF_ADDRCPT_PAR
: The milter may call smfi_addrcpt_par()
.
SMFIF_DELRCPT
: The milter may call smfi_delrcpt()
.
SMFIF_QUARANTINE
: The milter may call smfi_quarantine()
.
SMFIF_CHGFROM
: The milter may call smfi_chgfrom()
.
SMFIF_SETSMLIST
: The milter may call smfi_setsymlist()
.
They can be used together by bitwise OR.
All callbacks (e.g. xxfi_helo()
, xxfi_envfrom()
and so on) may be NULL
. If a callback is NULL
, the event is just ignored the milter.
The name of the milter. |
||
The version code of the milter. |
||
The flags of the milter. Available values are SMFIF_*. |
||
See |
||
See |
||
See |
||
See |
||
See |
||
See |
||
See |
||
See |
||
See |
||
See |
||
See |
||
See |
||
See |
#define SMFIF_ADDHDRS 0x00000001L
milterはsmfi_addheader()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIF_CHGBODY 0x00000002L
milterはsmfi_chgbody()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIF_ADDRCPT 0x00000004L
milterはsmfi_addrcpt()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIF_DELRCPT 0x00000008L
milterはsmfi_delrcpt()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIF_CHGHDRS 0x00000010L
milterはsmfi_chgheader()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIF_QUARANTINE 0x00000020L
milterはsmfi_quarantine()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIF_CHGFROM 0x00000040L
milterはsmfi_chgfrom()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIF_ADDRCPT_PAR 0x00000080L
milterはsmfi_addrcpt_par()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIF_SETSYMLIST 0x00000100L
milterはsmfi_setsymlist()
を呼ぶかもしれません。
smfiDesc
とxxfi_negotiate()
とmilter.orgのsmfi_registerも見てください。
#define SMFIS_CONTINUE 0
現在の処理を継続します。
各コールバック(xxfi_connect()
、xxfi_helo()
など)とmilter.orgのコールバックの返値の説明も見てください。
#define SMFIS_REJECT 1
現在処理中のターゲットを拒否します。
各コールバック(xxfi_connect()
、xxfi_helo()
など)とmilter.orgのコールバックの返値の説明も見てください。
#define SMFIS_DISCARD 2
現在処理中のターゲットを受け入れて、だまって破棄します。
各コールバック(xxfi_envfrom()
、xxfi_envrcpt()
など)とmiler.orgのコールバックの返値の説明も見てください。
#define SMFIS_ACCEPT 3
現在処理中のターゲットを受け入れます。
各コールバック(xxfi_connect()
、xxfi_helo()
など)とmilter.orgのコールバックの返値の説明も見てください。
#define SMFIS_TEMPFAIL 4
現在のターゲットに対して、一時的な障害ステータスを返します。
各コールバック(xxfi_connect()
、xxfi_helo()
など)とmilter.orgのコールバックの返値の説明も見てください。
#define SMFIS_NOREPLY 7
MTAに返答しません。
各コールバック(xxfi_connect()
、xxfi_helo()
など)とmilter.orgのコールバックの返値の説明も見てください。
#define SMFIS_ALL_OPTS 10
MTAから受け取ったすべてのネゴシエーションオプションを使います。これはxxfi_negotiate()
の中でだけ使えます。
#define SMFIP_NOCONNECT 0x00000001L
MTAはxxfi_connect()
の情報を送信しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NOHELO 0x00000002L
MTAがxxfi_helo()
の情報を送信しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NOMAIL 0x00000004L
MTAがxxfi_mail()
の情報を送信しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NORCPT 0x00000008L
MTAがxxfi_rcpt()
の情報を送信しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NOHDRS 0x00000020L
MTAがxxfi_header()
の情報を送信しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NOEOH 0x00000040L
MTAがxxfi_eoh()
の情報を送信しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_HDR 0x00000080L
milterがxxfi_header()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NOUNKNOWN 0x00000100L
MTAがxxfi_unknown()
の情報を送信しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NODATA 0x00000200L
MTAがxxfi_data()
の情報を送信しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_SKIP 0x00000400L
MTAがxxfi_body()
でのSMFIS_SKIP
をサポートしていることを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_RCPT_REJ 0x00000800L
MTAは拒否した宛先も送信し、xxfi_envrcpt()
が呼び出されることを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_CONN 0x00001000L
milterがxxfi_connect()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_HELO 0x00002000L
milterがxxfi_helo()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_MAIL 0x00004000L
milterがxxfi_envfrom()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_RCPT 0x00008000L
milterがxxfi_envrcpt()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_DATA 0x00010000L
milterがxxfi_data()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_UNKN 0x00020000L
milterがxxfi_unknown()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_EOH 0x00040000L
milterがxxfi_eoh()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。
#define SMFIP_NR_BODY 0x00080000L
milterがxxfi_body()
に返答しないことを示します。
このフラグはxxfi_negotiate()
のsteps_output
で取得・設定できます。