![]() |
![]() |
![]() |
milter managerリファレンスマニュアル | ![]() |
---|---|---|---|---|
#define MILTER_CLIENT_ERROR enum MilterClientError; MilterClient; GQuark milter_client_error_quark (void); MilterClient* milter_client_new (void); gchar* milter_client_get_default_connection_spec (MilterClient *client); gboolean milter_client_set_connection_spec (MilterClient *client, const gchar *spec, GError **error); GIOChannel* milter_client_get_listen_channel (MilterClient *client); void milter_client_set_listen_channel (MilterClient *client, GIOChannel *channel); void milter_client_set_listen_backlog (MilterClient *client, gint backlog); gboolean milter_client_is_remove_unix_socket_on_create (MilterClient *client); void milter_client_set_remove_unix_socket_on_create (MilterClient *client, gboolean remove); void milter_client_set_timeout (MilterClient *client, guint timeout); guint milter_client_get_unix_socket_mode (MilterClient *client); guint milter_client_get_default_unix_socket_mode (MilterClient *client); void milter_client_set_default_unix_socket_mode (MilterClient *client, guint mode); const gchar* milter_client_get_unix_socket_group (MilterClient *client); const gchar* milter_client_get_default_unix_socket_group (MilterClient *client); void milter_client_set_default_unix_socket_group (MilterClient *client, const gchar *group); gboolean milter_client_is_remove_unix_socket_on_close (MilterClient *client); gboolean milter_client_get_default_remove_unix_socket_on_close (MilterClient *client); void milter_client_set_default_remove_unix_socket_on_close (MilterClient *client, gboolean remove); gboolean milter_client_main (MilterClient *client); void milter_client_shutdown (MilterClient *client);
milter-clientライブラリはクライアント側のすべてのmilterプロトコルを処理する機能を提供します。「クライアント側」というのは「milter側」ということで、「MTA側」ではありません。
milter-clientライブラリでの主要なクラスはMilterClient
とMilterClientContext
です。MilterClient
はMTAからの複数の接続を受け付け、各接続はMilterClientContext
が処理します。
メインループに入る前に、接続指定をし、"connection-established"シグナルに接続します。
接続指定はMTAがMilterClient
に接続するためのエントリポイントです。接続指定は「プロトコル:情報」という形式になっています。IPv4ソケットでは「inet:ポート番号」、「inet:ポート番号@ホスト名」、「inet:ポート番号@[IPv4アドレス]」が正しい形式です。IPv6ソケットでは、「inet6:ポート番号」、「inet6:ポート番号@ホスト名」、「inet6:ポート番号@[IPv6アドレス]」が正しい形式です。UNIXドメインソケットでは「unix:パス」が正しい形式です。
MilterClient
は"connection-established"シグナルを発行します。MilterClientContext
のセットアップはこのシグナルの中で行います。多くの場合、渡されたMilterClientContext
にコールバックを接続します。利用可能なシグナルはMilterClientContext
を見てください。
milter_client_main()
はメインループ関数です。MilterClient
の準備が終わったらメインループには行ってください。
milter-clientライブラリを使った例です。tool/milter-test-client.cも見てください。milter-test-client.cはmilter-clientライブラリを使ったmilterの実装例です。
#include <stdlib.h> #include <milter/client.h> static void cb_connection_established (MilterClient *client, MilterClientContext *context, gpointer user_data) { connect_to_your_interesting_signals(client, context, user_data); } int main (int argc, char **argv) { gboolean success; const gchar spec[] = "inet:10025@localhost"; MilterClient *client; GError *error = NULL; milter_init(); client = milter_client_new(); if (!milter_client_set_connection_spec(client, spec, &error)) { g_print("%s\n", error->message); g_error_free(error); return EXIT_FAILURE; } g_signal_connect(client, "connection-established", G_CALLBACK(cb_connection_established), NULL); milter_client_main(client); milter_quit(); return success ? EXIT_SUCCESS : EXIT_FAILURE; }
Sendmailが提供するlibmilterは各接続毎にスレッドを生成するモデルです。しかし、milter-clientライブラリはこのモデルを使いません。milter-clientライブラリは2つのスレッドを使います。1つのスレッドはMilterClient
用のスレッドで、もう1つのスレッドはMilterClientContext
用のスレッドです。1つ目のスレッドではMilterClient
がMTAからの接続を受け付けて、それを割り振るだけです。MilterClientContext
GMainLoop
libmilterのモデルは接続を受け付けるためにmilter-clientライブラリのモデルよりも多くコストがかかります。これは、libmilterのモデルがスレッドを生成するのに対して、milter-clientライブラリは単にMilterClientContext
オブジェクトを生成するだけだからです。ただし、多くの場合、この違いはボトルネックとはなりません。:-|
#define MILTER_CLIENT_ERROR (milter_client_error_quark())
MilterClientのエラー用のGErrorクォークを取得するために使われます。
typedef enum { MILTER_CLIENT_ERROR_RUNNING, MILTER_CLIENT_ERROR_UNIX_SOCKET, MILTER_CLIENT_ERROR_IO_ERROR } MilterClientError;
MilterClient
の関数呼び出し中に発生するエラーを識別します。
typedef struct { GObject object; } MilterClient;
MilterClient
は前面にでるオブジェクトです。このオブジェクトがMTAからの接続を受け付けて、各コンテキストに割り振ります。
MilterClient* milter_client_new (void);
新しいクライアントを生成します。
返値 : |
新しいMilterClient オブジェクト。 |
gchar* milter_client_get_default_connection_spec (MilterClient *client);
既定の接続指定を取得します。必要がなくなったら、既定の接続指定を開放してください。
|
MilterClient 。 |
返値 : |
既定の接続指定のコピー。 |
gboolean milter_client_set_connection_spec (MilterClient *client, const gchar *spec, GError **error);
接続指定を設定します。spec
が不正な形式で、error
がNULL
でない場合は、エラーの詳細はerror
に設定されます。
|
MilterClient 。 |
|
inet:10025のような接続指定。 |
|
エラーを受け取る場所のアドレス、またはNULL 。 |
返値 : |
成功時はTRUE 。 |
GIOChannel* milter_client_get_listen_channel (MilterClient *client);
接続待ち用のチャンネルを取得します。
|
MilterClient 。 |
返値 : |
接続待ち用チャンネル。 |
void milter_client_set_listen_channel (MilterClient *client, GIOChannel *channel);
接続待ち用チャンネルを設定します。
|
MilterClient 。 |
|
接続待ち用のチャンネル。 |
void milter_client_set_listen_backlog (MilterClient *client, gint backlog);
listen(2)用のバックログを設定します。
|
MilterClient 。 |
|
listen(2)用のバックログ。 |
gboolean milter_client_is_remove_unix_socket_on_create (MilterClient *client);
新しいUNIXドメインソケットを作成する前に既存のUNIXドメインソケットを削除するかどうかを取得します。
|
MilterClient 。 |
返値 : |
作成時に既存のUNIXドメインソケットを削除する場合はTRUE 、そうでない場合はFALSE 。 |
void milter_client_set_remove_unix_socket_on_create (MilterClient *client, gboolean remove);
新しいUNIXドメインソケットを作成する前に既存のUNIXドメインソケットを削除するかどうかを設定します。
|
MilterClient 。 |
|
新しいUNIXドメインソケットを作成する前に既存のUNIXドメインソケットを削除するならTRUE 。 |
void milter_client_set_timeout (MilterClient *client, guint timeout);
接続が確立したMilterClientContext
に設定するタイムアウト値を設定します。
|
MilterClient 。 |
|
秒単位でのタイムアウト。 |
guint milter_client_get_unix_socket_mode (MilterClient *client);
UNIXドメインソケットのモードを取得します。
|
MilterClient 。 |
返値 : |
UNIXドメインソケットのモード。 |
guint milter_client_get_default_unix_socket_mode (MilterClient *client);
既定のUNIXドメインソケットのモードを取得します。
|
MilterClient 。 |
返値 : |
既定のUNIXドメインソケットのモード。 |
void milter_client_set_default_unix_socket_mode (MilterClient *client, guint mode);
既定のUNIXドメインソケットモードを設定します。
|
MilterClient 。 |
|
UNIXドメインソケットのモード。 |
const gchar* milter_client_get_unix_socket_group (MilterClient *client);
UNIXドメインソケットのグループを設定します。
|
MilterClient 。 |
返値 : |
UNIXドメインソケットのグループ名。 |
const gchar* milter_client_get_default_unix_socket_group (MilterClient *client);
既定のUNIXドメインソケットグループを取得します。
|
MilterClient 。 |
返値 : |
既定のUNIXドメインソケットグループ名。 |
void milter_client_set_default_unix_socket_group (MilterClient *client, const gchar *group);
既定のUNIXドメインソケットグループを設定します。
|
MilterClient 。 |
|
グループ名。 |
gboolean milter_client_is_remove_unix_socket_on_close (MilterClient *client);
UNIXドメインソケットを閉じた後に削除するかどうかを取得します。
|
MilterClient 。 |
返値 : |
UNIXドメインソケットを閉じたときに削除するならTRUE 、そうでなければFALSE 。 |
gboolean milter_client_get_default_remove_unix_socket_on_close (MilterClient *client);
ソケットを閉じた後にUNIXドメインソケットを削除するかどうかの既定の値を取得します。
|
MilterClient 。 |
返値 : |
UNIXドメインソケットを閉じたときに削除するならTRUE 、そうでなければFALSE 。 |
void milter_client_set_default_remove_unix_socket_on_close (MilterClient *client, gboolean remove);
ソケットを閉じた後にUNIXドメインソケットを削除するかどうかの既定の値を取得します。
|
MilterClient 。 |
|
ソケットを閉じた後にUNIXドメインソケットを削除するならTRUE 。 |
gboolean milter_client_main (MilterClient *client);
メインループをはじめます。
|
MilterClient 。 |
返値 : |
メインループが正常終了したらTRUE 、そうでなければFALSE 。 |
void milter_client_shutdown (MilterClient *client);
メインループを終了します。
|
MilterClient 。 |