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 provides Sendmail's libmilter compatible API. You can use this library instead of Sendmail's libmilter. See also API Documentation on milter.org.
#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
);
Creates the socket that is used to connect from MTA.
Normally, smfi_opensocket()
isn't needed to call
explicitly. The socket is created in smfi_main()
implicitly.
Here are the fail conditions:
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.
See also smfi_opensocket on milter.org.
int
smfi_register (struct smfiDesc description
);
Registers the milter implementation as callbacks.
Here are the fail conditions:
incompatible xxfi_version.
illegal xxfi_flags value.
See also smfi_register on milter.org.
int
smfi_main (void
);
Enters event loop. The milter should be initialized
with smfi_register()
, smfi_setconn()
and so on before
smfi_main()
is called.
Here are the fail conditions:
failed to create the socket.
See also smfi_main on milter.org.
int
smfi_setbacklog (int backlog
);
Sets the milters' backlog value that is used for listen(2).
Here are the fail conditions:
backlog
<= 0.
See also smfi_setbacklog on milter.org.
int
smfi_setdbg (int level
);
Sets the log level. If level
is 0, turns off any log
message. The greater value is specified, more log
messages are output.
See also smfi_setdbg on milter.org.
int
smfi_settimeout (int timeout
);
Sets the I/O timeout value in seconds. The default value
is 7210 seconds. timeout
== 0 means no wait, not "wait
forever".
See also smfi_settimeout on milter.org.
int
smfi_setconn (char *connection_spec
);
Sets the connection spec.
connection_spec
format is one of them:
"unix:/PATH/TO/SOCKET": UNIX domain socket.
"inet:PORT", "inet:PORT@HOST_NAME" or "inet:PORT@IP_ADDRESS": IPv4.
"inet6:PORT", "inet6:PORT@HOST_NAME" or "inet6:PORT@IP_ADDRESS": IPv6.
Here are the fail conditions:
invalid format.
connection_spec
is NULL
.
See also smfi_setconn on milter.org.
int
smfi_stop (void
);
Stops the milter. No more connections are accepted but processing connections are continued until they are finished.
See also smfi_stop on milter.org.
int smfi_version (unsigned int *major
,unsigned int *minor
,unsigned int *patch_level
);
Gets the libmilter version. The version is for using libmilter not built libmilter.
See also smfi_version on milter.org.
char * smfi_getsymval (SMFICTX *context
,char *name
);
Gets a value of the macro named name
in the current milter
session context. smfi_getsymval()
can be called in
xxfi_XXX callbacks. (e.g. xxfi_connect()
, xxfi_helo()
,
...)
name
should be enclosed in braces ("{" and "}") like
"{if_name}" except name
contains a character like "i".
See also smfi_getsymval on milter.org. Sendmail's default macros are also shown in the page.
int smfi_setreply (SMFICTX *context
,char *return_code
,char *extended_code
,char *message
);
Sets the error reply code. 4xx return_code
is used on
SMFIS_TEMPFAIL
. 5xx return_code
is used on
SMFIS_REJECT
.
Here are the fail conditions:
return_code
is neither 4xx nor 5xx.
extended_code
is neither 4.x.x nor 5.x.x.
See also smfi_setreply on milter.org.
context |
the context for the current milter session. |
|
return_code |
the three-digit SMTP error reply code. (RFC 2821) Only 4xx and 5xx are accepted. |
|
extended_code |
the extended reply code (RFC 1893/2034),
or |
|
message |
the text part of the SMTP reply, or |
int smfi_setmlreply (SMFICTX *context
,const char *return_code
,const char *extended_code
,...
);
Sets the error reply code. 4xx return_code
is used on
SMFIS_TEMPFAIL
. 5xx return_code
is used on
SMFIS_REJECT
.
Here are the fail conditions:
return_code
is neither 4xx nor 5xx.
extended_code
is neither 4.x.x nor 5.x.x.
See also smfi_setmlreply on milter.org.
context |
the context for the current milter session. |
|
return_code |
the three-digit SMTP error reply code. (RFC 2821) Only 4xx and 5xx are accepted. |
|
extended_code |
the extended reply code (RFC 1893/2034),
or |
|
... |
the single lines of text part of the SMTP reply,
terminated by |
int smfi_addheader (SMFICTX *context
,char *name
,char *value
);
Adds a header to the current message's header
list. smfi_addheader()
can be called in xxfi_eom()
.
Here are the fail conditions:
name
is NULL
.
value
is NULL
.
called in except xxfi_eom()
.
SMFIF_ADDHDRS
flag isn't set in smfi_register()
or
xxfi_negotiate()
.
network error is occurred.
See also smfi_addheader on milter.org.
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()
.
Here are the fail conditions:
name
is NULL
.
called in except xxfi_eom()
. FIXME: not-implemented yet.
SMFIF_CHGHDRS
flag isn't set in smfi_register()
or
xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_chgheader on milter.org.
int smfi_insheader (SMFICTX *context
,int index
,char *name
,char *value
);
Inserts a header to index
in headers. smfi_insheader()
can be called in xxfi_eom()
.
Here are the fail conditions:
name
is NULL
.
value
is NULL
. FIXME: not-implemented yet.
called in except xxfi_eom()
. FIXME: not-implemented yet.
SMFIF_ADDHDRS
flag isn't set in smfi_register()
or
xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_insheader on milter.org.
int smfi_chgfrom (SMFICTX *context
,char *mail
,char *arguments
);
Changes a sender address. smfi_chgfrom()
can be called in
xxfi_eom()
.
Here are the fail conditions:
mail
is NULL
. FIXME: not-implemented yet.
called in except xxfi_eom()
. FIXME: not-implemented yet.
SMFIF_CHGFROM
flag isn't set in smfi_register()
or
xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_chgfrom on milter.org.
int smfi_addrcpt (SMFICTX *context
,char *recipient
);
Adds a recipient address. smfi_addrcpt()
can be called in
xxfi_eom()
.
Here are the fail conditions:
recipient
is NULL
. FIXME: not-implemented yet.
called in except xxfi_eom()
. FIXME: not-implemented yet.
SMFIF_ADDRCPT
flag isn't set in smfi_register()
or
xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_addrcpt on milter.org.
int smfi_addrcpt_par (SMFICTX *context
,char *recipient
,char *arguments
);
Adds a recipient address with extra ESMTP
arguments. smfi_addrcpt_par()
can be called in
xxfi_eom()
.
Here are the fail conditions:
recipient
is NULL
. FIXME: not-implemented yet.
called in except xxfi_eom()
. FIXME: not-implemented yet.
SMFIF_ADDRCPT_PAR
flag isn't set in smfi_register()
or
xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_addrcpt_par on milter.org.
int smfi_delrcpt (SMFICTX *context
,char *recipient
);
Deletes a recipient address. smfi_delrcpt()
can be called in
xxfi_eom()
.
Here are the fail conditions:
recipient
is NULL
. FIXME: not-implemented yet.
called in except xxfi_eom()
. FIXME: not-implemented yet.
SMFIF_DELRCPT
flag isn't set in smfi_register()
or
xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_delrcpt on milter.org.
int
smfi_progress (SMFICTX *context
);
Keeps the current connection. smfi_progress()
can be called in
xxfi_eom()
.
Here are the fail conditions:
called in except xxfi_eom()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_progress on milter.org.
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()
.
Here are the fail conditions:
new_body
== NULL
and new_body_size
> 0. FIXME:
not-implemented yet.
called in except xxfi_eom()
. FIXME: not-implemented yet.
SMFIF_CHGBODY
flag isn't set in smfi_register()
or
xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_replacebody on milter.org.
int smfi_quarantine (SMFICTX *context
,char *reason
);
Quarantines the current message with
reason
. smfi_quarantine()
can be called in xxfi_eom()
.
Here are the fail conditions:
reason
is NULL
or empty. FIXME: not-implemented yet.
called in except xxfi_eom()
. FIXME: not-implemented yet.
SMFIF_QUARANTINE
flag isn't set in smfi_register()
or
xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_quarantine on milter.org.
int smfi_setpriv (SMFICTX *context
,void *data
);
Sets the private data.
Here are the fail conditions:
context
is invalid. FIXME: not-implemented yet.
See also smfi_setpriv on milter.org.
void *
smfi_getpriv (SMFICTX *context
);
Gets the private data.
Here are the fail conditions:
context
is invalid. FIXME: not-implemented yet.
See also smfi_getpriv on milter.org.
int smfi_setsymlist (SMFICTX *context
,int state
,char *macros
);
Sets the list of requested macros. smfi_setsymlist()
can
be called in xxfi_negotiate()
.
Here are the fail conditions:
state
is not a valid value. FIXME: not-implemented yet.
macros
is NULL
or empty. FIXME: not-implemented yet.
the macro list for state
has been set before. FIXME:
not-implemented yet.
called in except xxfi_negotiate()
. FIXME: not-implemented yet.
network error is occurred.
See also smfi_setsymlist on milter.org.
context |
the context for the current milter session. |
|
state |
the state defined as SMFIM_XXX like |
|
macros |
the space separated macro names like "{rcpt_mailer} {rcpt_host}". |
typedef struct smfi_str SMFICTX;
Holds information for a milter session. SMFICTX
is
created for each milter session. SMFICTX
is the most
important object in libmilter API.
typedef struct smfiDesc smfiDesc_str;
Holds information for the milter. smfiDesc_str
is
used by smfi_register()
.
typedef int sfsistat;
Indicates response status returned by callback.
Available response status is one of the followings:
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
The milter may call smfi_addheader()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIF_CHGBODY 0x00000002L
The milter may call smfi_chgbody()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIF_ADDRCPT 0x00000004L
The milter may call smfi_addrcpt()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIF_DELRCPT 0x00000008L
The milter may call smfi_delrcpt()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIF_CHGHDRS 0x00000010L
The milter may call smfi_chgheader()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIF_QUARANTINE 0x00000020L
The milter may call smfi_quarantine()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIF_CHGFROM 0x00000040L
The milter may call smfi_chgfrom()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIF_ADDRCPT_PAR 0x00000080L
The milter may call smfi_addrcpt_par()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIF_SETSYMLIST 0x00000100L
The milter may call smfi_setsymlist()
.
See also smfiDesc
, xxfi_negotiate()
and
smfi_register on milter.org.
#define SMFIS_CONTINUE 0
Continues the current process.
See each callback (xxfi_connect()
, xxfi_helo()
and so
on) and
callback return status description on milter.org.
#define SMFIS_REJECT 1
Rejects the current processing target.
See each callback (xxfi_connect()
, xxfi_helo()
and so
on) and
callback return status description on milter.org.
#define SMFIS_DISCARD 2
Accepts the current processing target and discards it silently.
See each callback (xxfi_envfrom()
, xxfi_envrcpt()
and so
on) and
callback return status description on milter.org.
#define SMFIS_ACCEPT 3
Accepts the current processing target.
See each callback (xxfi_connect()
, xxfi_helo()
and so
on) and
callback return status description on milter.org.
#define SMFIS_TEMPFAIL 4
Replies a temporary failure status for the current processing target.
See each callback (xxfi_connect()
, xxfi_helo()
and so
on) and
callback return status description on milter.org.
#define SMFIS_NOREPLY 7
Doesn't reply to the MTA.
See each callback (xxfi_connect()
, xxfi_helo()
and so
on) and
callback return status description on milter.org.
#define SMFIS_SKIP 8
Skips the rest body chunks. This can be used only in
xxfi_body()
.
See also callback return status description on milter.org.
#define SMFIS_ALL_OPTS 10
Uses the all negotiate options received from the
MTA. This can be used only in xxfi_negotiate()
.
#define SMFIM_CONNECT 0
Indicates the protocol stage for xxfi_connect()
.
See smfi_setsymlist()
.
#define SMFIM_HELO 1
Indicates the protocol stage for xxfi_helo()
.
See smfi_setsymlist()
.
#define SMFIM_ENVFROM 2
Indicates the protocol stage for xxfi_envfrom()
.
See smfi_setsymlist()
.
#define SMFIM_ENVRCPT 3
Indicates the protocol stage for xxfi_envrcpt()
.
See smfi_setsymlist()
.
#define SMFIM_DATA 4
Indicates the protocol stage for xxfi_data()
.
See smfi_setsymlist()
.
#define SMFIP_NOCONNECT 0x00000001L
Indicates that the MTA should not send information for
xxfi_connect()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NOHELO 0x00000002L
Indicates that the MTA should not send information for
xxfi_helo()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NOMAIL 0x00000004L
Indicates that the MTA should not send information for
xxfi_mail()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NORCPT 0x00000008L
Indicates that the MTA should not send information for
xxfi_rcpt()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NOHDRS 0x00000020L
Indicates that the MTA should not send information for
xxfi_header()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NOEOH 0x00000040L
Indicates that the MTA should not send information for
xxfi_eoh()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_HDR 0x00000080L
Indicates that the milter don't reply on xxfi_header()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NOUNKNOWN 0x00000100L
Indicates that the MTA should not send information for
xxfi_unknown()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NODATA 0x00000200L
Indicates that the MTA should not send information for
xxfi_data()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_SKIP 0x00000400L
Indicates that the MTA supports SMFIS_SKIP
in xxfi_body()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_RCPT_REJ 0x00000800L
Indicates that the MTA should send rejected envelope
recipients and xxfi_envrcpt()
is called for them.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_CONN 0x00001000L
Indicates that the milter don't reply on xxfi_connect()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_HELO 0x00002000L
Indicates that the milter don't reply on xxfi_helo()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_MAIL 0x00004000L
Indicates that the milter don't reply on xxfi_envfrom()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_RCPT 0x00008000L
Indicates that the milter don't reply on xxfi_envrcpt()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_DATA 0x00010000L
Indicates that the milter don't reply on xxfi_data()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_UNKN 0x00020000L
Indicates that the milter don't reply on xxfi_unknown()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_EOH 0x00040000L
Indicates that the milter don't reply on xxfi_eoh()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.
#define SMFIP_NR_BODY 0x00080000L
Indicates that the milter don't reply on xxfi_body()
.
This flag can be got/set to steps_output
of xxfi_negotiate()
.