mirror of
https://github.com/vdukhovni/postfix
synced 2025-08-30 21:55:20 +00:00
postfix-2.3-20050623
This commit is contained in:
committed by
Viktor Dukhovni
parent
980a7193ca
commit
df5802491a
@@ -10923,6 +10923,14 @@ Apologies for any names omitted.
|
|||||||
smtp_mx_session_limit = 2). Files: smtp/smtp_connect.c,
|
smtp_mx_session_limit = 2). Files: smtp/smtp_connect.c,
|
||||||
smtp/smtp_proto.c.
|
smtp/smtp_proto.c.
|
||||||
|
|
||||||
|
20050623
|
||||||
|
|
||||||
|
Cleanup: generalized the delegated attribute scan/print
|
||||||
|
interfaces, and updated the deliver_pass module with delegated
|
||||||
|
attribute scan/print support. Files: util/attr_scan0.c,
|
||||||
|
util/attr_print0.c, global/dsb_scan.c, global/dsn_print.c,
|
||||||
|
global/rcpt_buf,c global/rcpt_print.c, global/deliver_pass.c.
|
||||||
|
|
||||||
Open problems:
|
Open problems:
|
||||||
|
|
||||||
Laptop friendliness: make the qmgr remember when the next
|
Laptop friendliness: make the qmgr remember when the next
|
||||||
|
@@ -17,6 +17,19 @@ Incompatibility with Postfix 2.1 and earlier
|
|||||||
If you upgrade from Postfix 2.1 or earlier, read RELEASE_NOTES-2.2
|
If you upgrade from Postfix 2.1 or earlier, read RELEASE_NOTES-2.2
|
||||||
before proceeding.
|
before proceeding.
|
||||||
|
|
||||||
|
Incompatibility with snapshot 20050622
|
||||||
|
======================================
|
||||||
|
|
||||||
|
The Postfix SMTP client by default limits the number of MX server
|
||||||
|
addresses to smtp_mx_address_limit=5. Previously this limit was
|
||||||
|
disabled by default. The new limit prevents Postfix from spending
|
||||||
|
lots of time trying to connect to lots of bogus MX servers.
|
||||||
|
|
||||||
|
The Postfix SMTP error handling of [45]XX server greetings was
|
||||||
|
cleaned up. The server reply is now properly reported. As a side
|
||||||
|
effect, the failed session now counts towards the limit on the total
|
||||||
|
number of sessions per domain name (default: smtp_mx_session_limit=2).
|
||||||
|
|
||||||
Incompatibility with snapshot 20050615
|
Incompatibility with snapshot 20050615
|
||||||
======================================
|
======================================
|
||||||
|
|
||||||
|
@@ -106,6 +106,7 @@ bounce_append_service.o: ../../include/vstream.h
|
|||||||
bounce_append_service.o: ../../include/vstring.h
|
bounce_append_service.o: ../../include/vstring.h
|
||||||
bounce_append_service.o: bounce_append_service.c
|
bounce_append_service.o: bounce_append_service.c
|
||||||
bounce_append_service.o: bounce_service.h
|
bounce_append_service.o: bounce_service.h
|
||||||
|
bounce_cleanup.o: ../../include/attr.h
|
||||||
bounce_cleanup.o: ../../include/bounce_log.h
|
bounce_cleanup.o: ../../include/bounce_log.h
|
||||||
bounce_cleanup.o: ../../include/dsn.h
|
bounce_cleanup.o: ../../include/dsn.h
|
||||||
bounce_cleanup.o: ../../include/dsn_buf.h
|
bounce_cleanup.o: ../../include/dsn_buf.h
|
||||||
@@ -120,6 +121,7 @@ bounce_cleanup.o: ../../include/vstream.h
|
|||||||
bounce_cleanup.o: ../../include/vstring.h
|
bounce_cleanup.o: ../../include/vstring.h
|
||||||
bounce_cleanup.o: bounce_cleanup.c
|
bounce_cleanup.o: bounce_cleanup.c
|
||||||
bounce_cleanup.o: bounce_service.h
|
bounce_cleanup.o: bounce_service.h
|
||||||
|
bounce_notify_service.o: ../../include/attr.h
|
||||||
bounce_notify_service.o: ../../include/bounce.h
|
bounce_notify_service.o: ../../include/bounce.h
|
||||||
bounce_notify_service.o: ../../include/bounce_log.h
|
bounce_notify_service.o: ../../include/bounce_log.h
|
||||||
bounce_notify_service.o: ../../include/cleanup_user.h
|
bounce_notify_service.o: ../../include/cleanup_user.h
|
||||||
@@ -178,6 +180,7 @@ bounce_notify_util.o: ../../include/vstream.h
|
|||||||
bounce_notify_util.o: ../../include/vstring.h
|
bounce_notify_util.o: ../../include/vstring.h
|
||||||
bounce_notify_util.o: bounce_notify_util.c
|
bounce_notify_util.o: bounce_notify_util.c
|
||||||
bounce_notify_util.o: bounce_service.h
|
bounce_notify_util.o: bounce_service.h
|
||||||
|
bounce_notify_verp.o: ../../include/attr.h
|
||||||
bounce_notify_verp.o: ../../include/bounce.h
|
bounce_notify_verp.o: ../../include/bounce.h
|
||||||
bounce_notify_verp.o: ../../include/bounce_log.h
|
bounce_notify_verp.o: ../../include/bounce_log.h
|
||||||
bounce_notify_verp.o: ../../include/cleanup_user.h
|
bounce_notify_verp.o: ../../include/cleanup_user.h
|
||||||
@@ -201,6 +204,7 @@ bounce_notify_verp.o: ../../include/vstream.h
|
|||||||
bounce_notify_verp.o: ../../include/vstring.h
|
bounce_notify_verp.o: ../../include/vstring.h
|
||||||
bounce_notify_verp.o: bounce_notify_verp.c
|
bounce_notify_verp.o: bounce_notify_verp.c
|
||||||
bounce_notify_verp.o: bounce_service.h
|
bounce_notify_verp.o: bounce_service.h
|
||||||
|
bounce_one_service.o: ../../include/attr.h
|
||||||
bounce_one_service.o: ../../include/bounce.h
|
bounce_one_service.o: ../../include/bounce.h
|
||||||
bounce_one_service.o: ../../include/bounce_log.h
|
bounce_one_service.o: ../../include/bounce_log.h
|
||||||
bounce_one_service.o: ../../include/cleanup_user.h
|
bounce_one_service.o: ../../include/cleanup_user.h
|
||||||
@@ -222,6 +226,7 @@ bounce_one_service.o: ../../include/vstream.h
|
|||||||
bounce_one_service.o: ../../include/vstring.h
|
bounce_one_service.o: ../../include/vstring.h
|
||||||
bounce_one_service.o: bounce_one_service.c
|
bounce_one_service.o: bounce_one_service.c
|
||||||
bounce_one_service.o: bounce_service.h
|
bounce_one_service.o: bounce_service.h
|
||||||
|
bounce_trace_service.o: ../../include/attr.h
|
||||||
bounce_trace_service.o: ../../include/bounce_log.h
|
bounce_trace_service.o: ../../include/bounce_log.h
|
||||||
bounce_trace_service.o: ../../include/cleanup_user.h
|
bounce_trace_service.o: ../../include/cleanup_user.h
|
||||||
bounce_trace_service.o: ../../include/deliver_request.h
|
bounce_trace_service.o: ../../include/deliver_request.h
|
||||||
@@ -243,6 +248,7 @@ bounce_trace_service.o: ../../include/vstream.h
|
|||||||
bounce_trace_service.o: ../../include/vstring.h
|
bounce_trace_service.o: ../../include/vstring.h
|
||||||
bounce_trace_service.o: bounce_service.h
|
bounce_trace_service.o: bounce_service.h
|
||||||
bounce_trace_service.o: bounce_trace_service.c
|
bounce_trace_service.o: bounce_trace_service.c
|
||||||
|
bounce_warn_service.o: ../../include/attr.h
|
||||||
bounce_warn_service.o: ../../include/bounce_log.h
|
bounce_warn_service.o: ../../include/bounce_log.h
|
||||||
bounce_warn_service.o: ../../include/cleanup_user.h
|
bounce_warn_service.o: ../../include/cleanup_user.h
|
||||||
bounce_warn_service.o: ../../include/dsn.h
|
bounce_warn_service.o: ../../include/dsn.h
|
||||||
|
@@ -625,6 +625,7 @@ deliver_pass.o: ../../include/vstring.h
|
|||||||
deliver_pass.o: deliver_pass.c
|
deliver_pass.o: deliver_pass.c
|
||||||
deliver_pass.o: deliver_pass.h
|
deliver_pass.o: deliver_pass.h
|
||||||
deliver_pass.o: deliver_request.h
|
deliver_pass.o: deliver_request.h
|
||||||
|
deliver_pass.o: dsb_scan.h
|
||||||
deliver_pass.o: dsn.h
|
deliver_pass.o: dsn.h
|
||||||
deliver_pass.o: dsn_buf.h
|
deliver_pass.o: dsn_buf.h
|
||||||
deliver_pass.o: mail_params.h
|
deliver_pass.o: mail_params.h
|
||||||
|
@@ -67,6 +67,7 @@
|
|||||||
|
|
||||||
#include <mail_params.h>
|
#include <mail_params.h>
|
||||||
#include <deliver_pass.h>
|
#include <deliver_pass.h>
|
||||||
|
#include <dsb_scan.h>
|
||||||
|
|
||||||
/* deliver_pass_initial_reply - retrieve initial delivery process response */
|
/* deliver_pass_initial_reply - retrieve initial delivery process response */
|
||||||
|
|
||||||
@@ -130,24 +131,14 @@ static int deliver_pass_send_request(VSTREAM *stream, DELIVER_REQUEST *request,
|
|||||||
|
|
||||||
/* deliver_pass_final_reply - retrieve final delivery status response */
|
/* deliver_pass_final_reply - retrieve final delivery status response */
|
||||||
|
|
||||||
static int deliver_pass_final_reply(VSTREAM *stream, VSTRING *dsn_status,
|
static int deliver_pass_final_reply(VSTREAM *stream, DSN_BUF *dsb)
|
||||||
VSTRING *reason,
|
|
||||||
VSTRING *dsn_dtype,
|
|
||||||
VSTRING *dsn_dtext,
|
|
||||||
VSTRING *dsn_mtype,
|
|
||||||
VSTRING *dsn_mname)
|
|
||||||
{
|
{
|
||||||
int stat;
|
int stat;
|
||||||
|
|
||||||
if (attr_scan(stream, ATTR_FLAG_STRICT,
|
if (attr_scan(stream, ATTR_FLAG_STRICT,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_STATUS, dsn_status,
|
ATTR_TYPE_FUNC, dsb_scan, (void *) dsb,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_WHY, reason,
|
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTYPE, dsn_dtype,
|
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTEXT, dsn_dtext,
|
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_MTYPE, dsn_mtype,
|
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_MNAME, dsn_mname,
|
|
||||||
ATTR_TYPE_NUM, MAIL_ATTR_STATUS, &stat,
|
ATTR_TYPE_NUM, MAIL_ATTR_STATUS, &stat,
|
||||||
ATTR_TYPE_END) != 7) {
|
ATTR_TYPE_END) != 2) {
|
||||||
msg_warn("%s: malformed response", VSTREAM_PATH(stream));
|
msg_warn("%s: malformed response", VSTREAM_PATH(stream));
|
||||||
stat = -1;
|
stat = -1;
|
||||||
}
|
}
|
||||||
@@ -161,7 +152,7 @@ int deliver_pass(const char *class, const char *service,
|
|||||||
RECIPIENT *rcpt)
|
RECIPIENT *rcpt)
|
||||||
{
|
{
|
||||||
VSTREAM *stream;
|
VSTREAM *stream;
|
||||||
VSTRING *junk;
|
DSN_BUF *dsb;
|
||||||
int status;
|
int status;
|
||||||
char *saved_service;
|
char *saved_service;
|
||||||
char *transport;
|
char *transport;
|
||||||
@@ -181,7 +172,7 @@ int deliver_pass(const char *class, const char *service,
|
|||||||
* Initialize.
|
* Initialize.
|
||||||
*/
|
*/
|
||||||
stream = mail_connect_wait(class, transport);
|
stream = mail_connect_wait(class, transport);
|
||||||
junk = vstring_alloc(1);
|
dsb = dsb_create();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the delivery process initial response. Send the queue file info
|
* Get the delivery process initial response. Send the queue file info
|
||||||
@@ -196,14 +187,13 @@ int deliver_pass(const char *class, const char *service,
|
|||||||
if ((status = deliver_pass_initial_reply(stream)) == 0
|
if ((status = deliver_pass_initial_reply(stream)) == 0
|
||||||
&& (status = deliver_pass_send_request(stream, request, nexthop,
|
&& (status = deliver_pass_send_request(stream, request, nexthop,
|
||||||
rcpt)) == 0)
|
rcpt)) == 0)
|
||||||
status = deliver_pass_final_reply(stream, junk, junk, junk,
|
status = deliver_pass_final_reply(stream, dsb);
|
||||||
junk, junk, junk);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clean up.
|
* Clean up.
|
||||||
*/
|
*/
|
||||||
vstream_fclose(stream);
|
vstream_fclose(stream);
|
||||||
vstring_free(junk);
|
dsb_free(dsb);
|
||||||
myfree(saved_service);
|
myfree(saved_service);
|
||||||
|
|
||||||
return (status);
|
return (status);
|
||||||
|
@@ -6,13 +6,14 @@
|
|||||||
/* SYNOPSIS
|
/* SYNOPSIS
|
||||||
/* #include <dsb_scan.h>
|
/* #include <dsb_scan.h>
|
||||||
/*
|
/*
|
||||||
/* int dsb_scan(stream, flags, ptr)
|
/* int dsb_scan(scan_fn, stream, flags, ptr)
|
||||||
|
/* ATTR_SCAN_MASTER_FN scan_fn;
|
||||||
/* VSTREAM *stream;
|
/* VSTREAM *stream;
|
||||||
/* int flags;
|
/* int flags;
|
||||||
/* void *ptr;
|
/* void *ptr;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* dsb_scan() reads a DSN_BUF from the named stream using the
|
/* dsb_scan() reads a DSN_BUF from the named stream using the
|
||||||
/* default attribute scan routines. This function is meant
|
/* specified attribute scan routine. dsb_scan() is meant
|
||||||
/* to be passed as a call-back to attr_scan(), thusly:
|
/* to be passed as a call-back to attr_scan(), thusly:
|
||||||
/*
|
/*
|
||||||
/* ... ATTR_SCAN_FUNC, dsb_scan, (void *) &dsbuf, ...
|
/* ... ATTR_SCAN_FUNC, dsb_scan, (void *) &dsbuf, ...
|
||||||
@@ -44,7 +45,8 @@
|
|||||||
|
|
||||||
/* dsb_scan - read DSN_BUF from stream */
|
/* dsb_scan - read DSN_BUF from stream */
|
||||||
|
|
||||||
int dsb_scan(VSTREAM *fp, int flags, void *ptr)
|
int dsb_scan(ATTR_SCAN_MASTER_FN scan_fn, VSTREAM *fp,
|
||||||
|
int flags, void *ptr)
|
||||||
{
|
{
|
||||||
DSN_BUF *dsb = (DSN_BUF *) ptr;
|
DSN_BUF *dsb = (DSN_BUF *) ptr;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -53,14 +55,14 @@ int dsb_scan(VSTREAM *fp, int flags, void *ptr)
|
|||||||
* The attribute order is determined by backwards compatibility. It can
|
* The attribute order is determined by backwards compatibility. It can
|
||||||
* be sanitized after all the ad-hoc DSN read/write code is replaced.
|
* be sanitized after all the ad-hoc DSN read/write code is replaced.
|
||||||
*/
|
*/
|
||||||
ret = attr_scan(fp, flags | ATTR_FLAG_MORE,
|
ret = scan_fn(fp, flags | ATTR_FLAG_MORE,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_STATUS, dsb->status,
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_STATUS, dsb->status,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTYPE, dsb->dtype,
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTYPE, dsb->dtype,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTEXT, dsb->dtext,
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTEXT, dsb->dtext,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_MTYPE, dsb->mtype,
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_MTYPE, dsb->mtype,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_MNAME, dsb->mname,
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_MNAME, dsb->mname,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_ACTION, dsb->action,
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_ACTION, dsb->action,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_WHY, dsb->reason,
|
ATTR_TYPE_STR, MAIL_ATTR_WHY, dsb->reason,
|
||||||
ATTR_TYPE_END);
|
ATTR_TYPE_END);
|
||||||
return (ret == 7 ? 1 : -1);
|
return (ret == 7 ? 1 : -1);
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
* Utility library.
|
* Utility library.
|
||||||
*/
|
*/
|
||||||
#include <vstream.h>
|
#include <vstream.h>
|
||||||
|
#include <attr.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global library.
|
* Global library.
|
||||||
@@ -24,7 +25,7 @@
|
|||||||
/*
|
/*
|
||||||
* External interface.
|
* External interface.
|
||||||
*/
|
*/
|
||||||
extern int dsb_scan(VSTREAM *, int, void *);
|
extern int dsb_scan(ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *);
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
|
@@ -6,13 +6,14 @@
|
|||||||
/* SYNOPSIS
|
/* SYNOPSIS
|
||||||
/* #include <dsn_print.h>
|
/* #include <dsn_print.h>
|
||||||
/*
|
/*
|
||||||
/* int dsn_print(stream, flags, ptr)
|
/* int dsn_print(print_fn, stream, flags, ptr)
|
||||||
|
/* ATTR_PRINT_MASTER_FN print_fn;
|
||||||
/* VSTREAM *stream;
|
/* VSTREAM *stream;
|
||||||
/* int flags;
|
/* int flags;
|
||||||
/* void *ptr;
|
/* void *ptr;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* dsn_print() writes a DSN structure to the named stream using
|
/* dsn_print() writes a DSN structure to the named stream using
|
||||||
/* the default attribute print routines. This function is meant
|
/* the specified attribute print routine. dsn_print() is meant
|
||||||
/* to be passed as a call-back to attr_print(), thusly:
|
/* to be passed as a call-back to attr_print(), thusly:
|
||||||
/*
|
/*
|
||||||
/* ... ATTR_PRINT_FUNC, dsn_print, (void *) dsn, ...
|
/* ... ATTR_PRINT_FUNC, dsn_print, (void *) dsn, ...
|
||||||
@@ -44,7 +45,8 @@
|
|||||||
|
|
||||||
/* dsn_print - write DSN to stream */
|
/* dsn_print - write DSN to stream */
|
||||||
|
|
||||||
int dsn_print(VSTREAM *fp, int flags, void *ptr)
|
int dsn_print(ATTR_PRINT_MASTER_FN print_fn, VSTREAM *fp,
|
||||||
|
int flags, void *ptr)
|
||||||
{
|
{
|
||||||
DSN *dsn = (DSN *) ptr;
|
DSN *dsn = (DSN *) ptr;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -55,14 +57,14 @@ int dsn_print(VSTREAM *fp, int flags, void *ptr)
|
|||||||
* The attribute order is determined by backwards compatibility. It can
|
* The attribute order is determined by backwards compatibility. It can
|
||||||
* be sanitized after all the ad-hoc DSN read/write code is replaced.
|
* be sanitized after all the ad-hoc DSN read/write code is replaced.
|
||||||
*/
|
*/
|
||||||
ret = attr_print(fp, flags | ATTR_FLAG_MORE,
|
ret = print_fn(fp, flags | ATTR_FLAG_MORE,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_STATUS, dsn->status,
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_STATUS, dsn->status,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTYPE, S(dsn->dtype),
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTYPE, S(dsn->dtype),
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTEXT, S(dsn->dtext),
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_DTEXT, S(dsn->dtext),
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_MTYPE, S(dsn->mtype),
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_MTYPE, S(dsn->mtype),
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_MNAME, S(dsn->mname),
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_MNAME, S(dsn->mname),
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_ACTION, S(dsn->action),
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_ACTION, S(dsn->action),
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_WHY, dsn->reason,
|
ATTR_TYPE_STR, MAIL_ATTR_WHY, dsn->reason,
|
||||||
ATTR_TYPE_END);
|
ATTR_TYPE_END);
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
* Utility library.
|
* Utility library.
|
||||||
*/
|
*/
|
||||||
#include <vstream.h>
|
#include <vstream.h>
|
||||||
|
#include <attr.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global library.
|
* Global library.
|
||||||
@@ -24,7 +25,7 @@
|
|||||||
/*
|
/*
|
||||||
* External interface.
|
* External interface.
|
||||||
*/
|
*/
|
||||||
extern int dsn_print(VSTREAM *, int, void *);
|
extern int dsn_print(ATTR_PRINT_MASTER_FN, VSTREAM *, int, void *);
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
|
@@ -20,7 +20,7 @@
|
|||||||
* Patches change both the patchlevel and the release date. Snapshots have no
|
* Patches change both the patchlevel and the release date. Snapshots have no
|
||||||
* patchlevel; they change the release date only.
|
* patchlevel; they change the release date only.
|
||||||
*/
|
*/
|
||||||
#define MAIL_RELEASE_DATE "20050622"
|
#define MAIL_RELEASE_DATE "20050623"
|
||||||
#define MAIL_VERSION_NUMBER "2.3"
|
#define MAIL_VERSION_NUMBER "2.3"
|
||||||
|
|
||||||
#define VAR_MAIL_VERSION "mail_version"
|
#define VAR_MAIL_VERSION "mail_version"
|
||||||
|
@@ -21,13 +21,14 @@
|
|||||||
/* void rcpb_free(rcpt)
|
/* void rcpb_free(rcpt)
|
||||||
/* RCPT_BUF *rcpt;
|
/* RCPT_BUF *rcpt;
|
||||||
/*
|
/*
|
||||||
/* int rcpb_scan(stream, flags, ptr)
|
/* int rcpb_scan(scan_fn, stream, flags, ptr)
|
||||||
|
/* ATTR_SCAN_MASTER_FN scan_fn;
|
||||||
/* VSTREAM *stream;
|
/* VSTREAM *stream;
|
||||||
/* int flags;
|
/* int flags;
|
||||||
/* void *ptr;
|
/* void *ptr;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* rcpb_scan() reads a recipient buffer from the named stream
|
/* rcpb_scan() reads a recipient buffer from the named stream
|
||||||
/* using the default attribute scan routines. This function
|
/* using the specified attribute scan routine. rcpb_scan()
|
||||||
/* is meant to be passed as a call-back to attr_scan(), thusly:
|
/* is meant to be passed as a call-back to attr_scan(), thusly:
|
||||||
/*
|
/*
|
||||||
/* ... ATTR_SCAN_FUNC, rcpb_scan, (void *) rcpt_buf, ...
|
/* ... ATTR_SCAN_FUNC, rcpb_scan, (void *) rcpt_buf, ...
|
||||||
@@ -91,22 +92,22 @@ void rcpb_free(RCPT_BUF *rcpt)
|
|||||||
|
|
||||||
/* rcpb_scan - receive recipient buffer */
|
/* rcpb_scan - receive recipient buffer */
|
||||||
|
|
||||||
int rcpb_scan(VSTREAM *fp, int flags, void *ptr)
|
int rcpb_scan(ATTR_SCAN_MASTER_FN scan_fn, VSTREAM *fp,
|
||||||
|
int flags, void *ptr)
|
||||||
{
|
{
|
||||||
RCPT_BUF *rcpt = (RCPT_BUF *) ptr;
|
RCPT_BUF *rcpt = (RCPT_BUF *) ptr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* As with DSN, the order of attributes is determined by historical
|
* The order of attributes is determined by historical compatibility and
|
||||||
* compatibility and can be fixed after all the ad-hoc read/write code is
|
* can be fixed after all the ad-hoc read/write code is replaced.
|
||||||
* replaced.
|
|
||||||
*/
|
*/
|
||||||
ret = attr_scan(fp, flags | ATTR_FLAG_MORE,
|
ret = scan_fn(fp, flags | ATTR_FLAG_MORE,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_ORCPT, rcpt->orig_addr,
|
ATTR_TYPE_STR, MAIL_ATTR_ORCPT, rcpt->orig_addr,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_RECIP, rcpt->address,
|
ATTR_TYPE_STR, MAIL_ATTR_RECIP, rcpt->address,
|
||||||
ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, &rcpt->offset,
|
ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, &rcpt->offset,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_ORCPT, rcpt->dsn_orcpt,
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_ORCPT, rcpt->dsn_orcpt,
|
||||||
ATTR_TYPE_NUM, MAIL_ATTR_DSN_NOTIFY, &rcpt->dsn_notify,
|
ATTR_TYPE_NUM, MAIL_ATTR_DSN_NOTIFY, &rcpt->dsn_notify,
|
||||||
ATTR_TYPE_END);
|
ATTR_TYPE_END);
|
||||||
return (ret == 5 ? 1 : -1);
|
return (ret == 5 ? 1 : -1);
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <vstream.h>
|
#include <vstream.h>
|
||||||
#include <vstring.h>
|
#include <vstring.h>
|
||||||
|
#include <attr.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* External interface.
|
* External interface.
|
||||||
@@ -30,7 +31,7 @@ typedef struct {
|
|||||||
|
|
||||||
extern RCPT_BUF *rcpb_create(void);
|
extern RCPT_BUF *rcpb_create(void);
|
||||||
extern void rcpb_free(RCPT_BUF *);
|
extern void rcpb_free(RCPT_BUF *);
|
||||||
extern int rcpb_scan(VSTREAM *, int, void *);
|
extern int rcpb_scan(ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *);
|
||||||
|
|
||||||
#define RECIPIENT_FROM_RCPT_BUF(rcpt, buf) \
|
#define RECIPIENT_FROM_RCPT_BUF(rcpt, buf) \
|
||||||
((rcpt)->address = vstring_str((buf)->address), \
|
((rcpt)->address = vstring_str((buf)->address), \
|
||||||
|
@@ -6,16 +6,16 @@
|
|||||||
/* SYNOPSIS
|
/* SYNOPSIS
|
||||||
/* #include <rcpt_print.h>
|
/* #include <rcpt_print.h>
|
||||||
/*
|
/*
|
||||||
/* int rcpt_print(stream, flags, ptr)
|
/* int rcpt_print(print_fn, stream, flags, ptr)
|
||||||
|
/* ATTR_PRINT_MASTER_FN print_fn;
|
||||||
/* VSTREAM *stream;
|
/* VSTREAM *stream;
|
||||||
/* int flags;
|
/* int flags;
|
||||||
/* void *ptr;
|
/* void *ptr;
|
||||||
/* DESCRIPTION
|
/* DESCRIPTION
|
||||||
/* rcpt_print() writes the contents of a RECIPIENT structure
|
/* rcpt_print() writes the contents of a RECIPIENT structure
|
||||||
/* to the named stream using the default attribute print
|
/* to the named stream using the specified attribute print
|
||||||
/* routines. This function is meant to be passed as a call-back
|
/* routine. rcpt_print() is meant to be passed as a call-back
|
||||||
/* to attr_print(),
|
/* to attr_print(), thusly:
|
||||||
/* thusly:
|
|
||||||
/*
|
/*
|
||||||
/* ... ATTR_PRINT_FUNC, rcpt_print, (void *) recipient, ...
|
/* ... ATTR_PRINT_FUNC, rcpt_print, (void *) recipient, ...
|
||||||
/* DIAGNOSTICS
|
/* DIAGNOSTICS
|
||||||
@@ -44,7 +44,8 @@
|
|||||||
|
|
||||||
/* rcpt_print - write recipient to stream */
|
/* rcpt_print - write recipient to stream */
|
||||||
|
|
||||||
int rcpt_print(VSTREAM *fp, int flags, void *ptr)
|
int rcpt_print(ATTR_PRINT_MASTER_FN print_fn, VSTREAM *fp,
|
||||||
|
int flags, void *ptr)
|
||||||
{
|
{
|
||||||
RECIPIENT *rcpt = (RECIPIENT *) ptr;
|
RECIPIENT *rcpt = (RECIPIENT *) ptr;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -52,16 +53,17 @@ int rcpt_print(VSTREAM *fp, int flags, void *ptr)
|
|||||||
#define S(s) ((s) ? (s) : "")
|
#define S(s) ((s) ? (s) : "")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The attribute order is determined by backwards compatibility. It can
|
* The attribute order is determined by backwards compatibility. It can
|
||||||
* be sanitized after all the ad-hoc recipient read/write code is replaced.
|
* be sanitized after all the ad-hoc recipient read/write code is
|
||||||
|
* replaced.
|
||||||
*/
|
*/
|
||||||
ret =
|
ret =
|
||||||
attr_print(fp, flags | ATTR_FLAG_MORE,
|
print_fn(fp, flags | ATTR_FLAG_MORE,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_ORCPT, S(rcpt->orig_addr),
|
ATTR_TYPE_STR, MAIL_ATTR_ORCPT, S(rcpt->orig_addr),
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_RECIP, rcpt->address,
|
ATTR_TYPE_STR, MAIL_ATTR_RECIP, rcpt->address,
|
||||||
ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, rcpt->offset,
|
ATTR_TYPE_LONG, MAIL_ATTR_OFFSET, rcpt->offset,
|
||||||
ATTR_TYPE_STR, MAIL_ATTR_DSN_ORCPT, S(rcpt->dsn_orcpt),
|
ATTR_TYPE_STR, MAIL_ATTR_DSN_ORCPT, S(rcpt->dsn_orcpt),
|
||||||
ATTR_TYPE_NUM, MAIL_ATTR_DSN_NOTIFY, rcpt->dsn_notify,
|
ATTR_TYPE_NUM, MAIL_ATTR_DSN_NOTIFY, rcpt->dsn_notify,
|
||||||
ATTR_TYPE_END);
|
ATTR_TYPE_END);
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
* Utility library.
|
* Utility library.
|
||||||
*/
|
*/
|
||||||
#include <vstream.h>
|
#include <vstream.h>
|
||||||
|
#include <attr.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Global library.
|
* Global library.
|
||||||
@@ -24,7 +25,7 @@
|
|||||||
/*
|
/*
|
||||||
* External interface.
|
* External interface.
|
||||||
*/
|
*/
|
||||||
extern int rcpt_print(VSTREAM *, int, void *);
|
extern int rcpt_print(ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *);
|
||||||
|
|
||||||
/* LICENSE
|
/* LICENSE
|
||||||
/* .ad
|
/* .ad
|
||||||
|
@@ -147,13 +147,18 @@ VSTRING *tls_session_passivate(SSL_SESSION *session)
|
|||||||
|
|
||||||
SSL_SESSION *tls_session_activate(const char *session_data, int session_data_len)
|
SSL_SESSION *tls_session_activate(const char *session_data, int session_data_len)
|
||||||
{
|
{
|
||||||
|
#if (OPENSSL_VERSION_NUMBER < 0x0090707fL)
|
||||||
|
#define BOGUS_CONST
|
||||||
|
#else
|
||||||
|
#define BOGUS_CONST const
|
||||||
|
#endif
|
||||||
SSL_SESSION *session;
|
SSL_SESSION *session;
|
||||||
const unsigned char *ptr;
|
BOGUS_CONST unsigned char *ptr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Activate the SSL_SESSION object.
|
* Activate the SSL_SESSION object.
|
||||||
*/
|
*/
|
||||||
ptr = (const unsigned char *) session_data;
|
ptr = (BOGUS_CONST unsigned char *) session_data;
|
||||||
session = d2i_SSL_SESSION((SSL_SESSION **) 0, &ptr, session_data_len);
|
session = d2i_SSL_SESSION((SSL_SESSION **) 0, &ptr, session_data_len);
|
||||||
if (!session)
|
if (!session)
|
||||||
tls_print_errors();
|
tls_print_errors();
|
||||||
|
@@ -47,9 +47,12 @@
|
|||||||
#define ATTR_FLAG_ALL (07)
|
#define ATTR_FLAG_ALL (07)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Delegation for better data abstraction. */
|
* Delegation for better data abstraction.
|
||||||
typedef int (*ATTR_SCAN_FN)(VSTREAM *, int, void *);
|
*/
|
||||||
typedef int (*ATTR_PRINT_FN)(VSTREAM *, int, void *);
|
typedef int (*ATTR_SCAN_MASTER_FN) (VSTREAM *, int, ...);
|
||||||
|
typedef int (*ATTR_SCAN_SLAVE_FN) (ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *);
|
||||||
|
typedef int (*ATTR_PRINT_MASTER_FN) (VSTREAM *, int,...);
|
||||||
|
typedef int (*ATTR_PRINT_SLAVE_FN) (ATTR_PRINT_MASTER_FN, VSTREAM *, int, void *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default to null-terminated, as opposed to base64-encoded.
|
* Default to null-terminated, as opposed to base64-encoded.
|
||||||
|
@@ -54,7 +54,7 @@
|
|||||||
/* .IP "ATTR_TYPE_DATA (char *, int, char *)"
|
/* .IP "ATTR_TYPE_DATA (char *, int, char *)"
|
||||||
/* This argument is followed by an attribute name, an attribute value
|
/* This argument is followed by an attribute name, an attribute value
|
||||||
/* length, and an attribute value pointer.
|
/* length, and an attribute value pointer.
|
||||||
/* .IP "ATTR_TYPE_FUNC (ATTR_PRINT_FN, void *)"
|
/* .IP "ATTR_TYPE_FUNC (ATTR_PRINT_SLAVE_FN, void *)"
|
||||||
/* This argument is followed by a function pointer and generic data
|
/* This argument is followed by a function pointer and generic data
|
||||||
/* pointer.
|
/* pointer.
|
||||||
/* .IP "ATTR_TYPE_HASH (HTABLE *)"
|
/* .IP "ATTR_TYPE_HASH (HTABLE *)"
|
||||||
@@ -114,7 +114,7 @@ int attr_vprint0(VSTREAM *fp, int flags, va_list ap)
|
|||||||
HTABLE_INFO **ht;
|
HTABLE_INFO **ht;
|
||||||
int len_val;
|
int len_val;
|
||||||
static VSTRING *base64_buf;
|
static VSTRING *base64_buf;
|
||||||
ATTR_PRINT_FN print_fn;
|
ATTR_PRINT_SLAVE_FN print_fn;
|
||||||
void *print_arg;
|
void *print_arg;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -168,9 +168,9 @@ int attr_vprint0(VSTREAM *fp, int flags, va_list ap)
|
|||||||
msg_info("send attr %s = [data %d bytes]", attr_name, len_val);
|
msg_info("send attr %s = [data %d bytes]", attr_name, len_val);
|
||||||
break;
|
break;
|
||||||
case ATTR_TYPE_FUNC:
|
case ATTR_TYPE_FUNC:
|
||||||
print_fn = va_arg(ap, ATTR_PRINT_FN);
|
print_fn = va_arg(ap, ATTR_PRINT_SLAVE_FN);
|
||||||
print_arg = va_arg(ap, void *);
|
print_arg = va_arg(ap, void *);
|
||||||
print_fn(fp, flags | ATTR_FLAG_MORE, print_arg);
|
print_fn(attr_print0, fp, flags | ATTR_FLAG_MORE, print_arg);
|
||||||
break;
|
break;
|
||||||
case ATTR_TYPE_HASH:
|
case ATTR_TYPE_HASH:
|
||||||
ht_info_list = htable_list(va_arg(ap, HTABLE *));
|
ht_info_list = htable_list(va_arg(ap, HTABLE *));
|
||||||
|
@@ -93,7 +93,7 @@
|
|||||||
/* This argument is followed by an attribute name and a VSTRING pointer.
|
/* This argument is followed by an attribute name and a VSTRING pointer.
|
||||||
/* .IP "ATTR_TYPE_DATA (char *, VSTRING *)"
|
/* .IP "ATTR_TYPE_DATA (char *, VSTRING *)"
|
||||||
/* This argument is followed by an attribute name and a VSTRING pointer.
|
/* This argument is followed by an attribute name and a VSTRING pointer.
|
||||||
/* .IP "ATTR_TYPE_FUNC (ATTR_SCAN_FN, void *)"
|
/* .IP "ATTR_TYPE_FUNC (ATTR_SCAN_SLAVE_FN, void *)"
|
||||||
/* This argument is followed by a function pointer and a generic data
|
/* This argument is followed by a function pointer and a generic data
|
||||||
/* pointer.
|
/* pointer.
|
||||||
/* .IP "ATTR_TYPE_HASH (HTABLE *)"
|
/* .IP "ATTR_TYPE_HASH (HTABLE *)"
|
||||||
@@ -256,7 +256,7 @@ int attr_vscan0(VSTREAM *fp, int flags, va_list ap)
|
|||||||
HTABLE *hash_table;
|
HTABLE *hash_table;
|
||||||
int ch;
|
int ch;
|
||||||
int conversions;
|
int conversions;
|
||||||
ATTR_SCAN_FN scan_fn;
|
ATTR_SCAN_SLAVE_FN scan_fn;
|
||||||
void *scan_arg;
|
void *scan_arg;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -378,9 +378,9 @@ int attr_vscan0(VSTREAM *fp, int flags, va_list ap)
|
|||||||
return (-1);
|
return (-1);
|
||||||
break;
|
break;
|
||||||
case ATTR_TYPE_FUNC:
|
case ATTR_TYPE_FUNC:
|
||||||
scan_fn = va_arg(ap, ATTR_SCAN_FN);
|
scan_fn = va_arg(ap, ATTR_SCAN_SLAVE_FN);
|
||||||
scan_arg = va_arg(ap, void *);
|
scan_arg = va_arg(ap, void *);
|
||||||
if (scan_fn(fp, flags | ATTR_FLAG_MORE, scan_arg) < 0)
|
if (scan_fn(attr_scan0, fp, flags | ATTR_FLAG_MORE, scan_arg) < 0)
|
||||||
return (-1);
|
return (-1);
|
||||||
break;
|
break;
|
||||||
case ATTR_TYPE_HASH:
|
case ATTR_TYPE_HASH:
|
||||||
|
Reference in New Issue
Block a user